From 122a16fb95e480126319844d94196ea3327b71e8 Mon Sep 17 00:00:00 2001 From: Andrea Frittoli Date: Thu, 14 Aug 2014 08:18:40 +0100 Subject: [PATCH 0001/3333] Tempest allow_tenant_isolation in auth section Tempest change 107685 moves allow_tenant_isolation from compute group to auth group, making the old format deprecated. Switching to the new format. Change-Id: Iff79986c2564610efde4791b7e61df3db859e199 --- lib/tempest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/tempest b/lib/tempest index d6d6020adf..4fc064c56d 100644 --- a/lib/tempest +++ b/lib/tempest @@ -272,8 +272,10 @@ function configure_tempest { iniset $TEMPEST_CONFIG image http_image $TEMPEST_HTTP_IMAGE fi + # Auth + iniset $TEMPEST_CONFIG auth allow_tenant_isolation ${TEMPEST_ALLOW_TENANT_ISOLATION:-True} + # Compute - iniset $TEMPEST_CONFIG compute allow_tenant_isolation ${TEMPEST_ALLOW_TENANT_ISOLATION:-True} iniset $TEMPEST_CONFIG compute ssh_user ${DEFAULT_INSTANCE_USER:-cirros} # DEPRECATED iniset $TEMPEST_CONFIG compute network_for_ssh $PRIVATE_NETWORK_NAME iniset $TEMPEST_CONFIG compute ip_version_for_ssh 4 From ac937bc06eb68cb1c94804995325b9fa8b850959 Mon Sep 17 00:00:00 2001 From: Julie Pichon Date: Mon, 29 Sep 2014 04:55:21 +0100 Subject: [PATCH 0002/3333] Install ldappool when LDAP is enabled Keystone expects ldappool to be installed when using the LDAP backend. Change-Id: I35e6585ec8416153ed6d0c6fa8c10c992bf0de6d Closes-Bug: #1373750 --- lib/ldap | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/ldap b/lib/ldap index 2bb8a4cc9c..a6fb82f6f2 100644 --- a/lib/ldap +++ b/lib/ldap @@ -139,6 +139,8 @@ function install_ldap { sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif fi + pip_install ldappool + rm -rf $tmp_ldap_dir } From 062a3c3e707e69778d2bb95e3e861e7bd65114b7 Mon Sep 17 00:00:00 2001 From: Kenneth Giusti Date: Tue, 30 Sep 2014 10:14:08 -0400 Subject: [PATCH 0003/3333] Configure an authorized user for the QPID broker If QPID_USERNAME is set, add the user to the QPID broker's authentication database. Use the value of QPID_PASSWORD as the password for the user, prompting for a password if QPID_PASSWORD is not set. This requires that all clients provide this username and password when connecting to the QPID broker, or the connection will be rejected. If QPID_USERNAME is not set (the default), disable QPID broker authentication. This allows any client to connect to the QPID broker without needing authentication. Change-Id: Ibd79873379740930ce5f598018c1ca1fffda7c31 Closes-Bug: 1272399 --- files/apts/qpid | 1 + files/rpms/qpid | 1 + lib/rpc_backend | 109 +++++++++++++++++++++++++++++++++++------------- 3 files changed, 82 insertions(+), 29 deletions(-) create mode 100644 files/apts/qpid diff --git a/files/apts/qpid b/files/apts/qpid new file mode 100644 index 0000000000..e3bbf0961c --- /dev/null +++ b/files/apts/qpid @@ -0,0 +1 @@ +sasl2-bin # NOPRIME diff --git a/files/rpms/qpid b/files/rpms/qpid index 62148ba231..9e3f10af13 100644 --- a/files/rpms/qpid +++ b/files/rpms/qpid @@ -1,3 +1,4 @@ qpid-proton-c-devel # NOPRIME python-qpid-proton # NOPRIME +cyrus-sasl-lib # NOPRIME diff --git a/lib/rpc_backend b/lib/rpc_backend index de82fe115e..14c78fbf7b 100644 --- a/lib/rpc_backend +++ b/lib/rpc_backend @@ -132,39 +132,14 @@ function install_rpc_backend { # Install rabbitmq-server install_package rabbitmq-server elif is_service_enabled qpid; then - local qpid_conf_file=/etc/qpid/qpidd.conf if is_fedora; then install_package qpid-cpp-server - if [[ $DISTRO =~ (rhel6) ]]; then - qpid_conf_file=/etc/qpidd.conf - # RHEL6 leaves "auth=yes" in /etc/qpidd.conf, it needs to - # be no or you get GSS authentication errors as it - # attempts to default to this. - sudo sed -i.bak 's/^auth=yes$/auth=no/' $qpid_conf_file - fi elif is_ubuntu; then install_package qpidd - sudo sed -i '/PLAIN/!s/mech_list: /mech_list: PLAIN /' /etc/sasl2/qpidd.conf - sudo chmod o+r /etc/qpid/qpidd.sasldb else exit_distro_not_supported "qpid installation" fi - # If AMQP 1.0 is specified, ensure that the version of the - # broker can support AMQP 1.0 and configure the queue and - # topic address patterns used by oslo.messaging. - if [ "$RPC_MESSAGING_PROTOCOL" == "AMQP1" ]; then - QPIDD=$(type -p qpidd) - if ! $QPIDD --help | grep -q "queue-patterns"; then - exit_distro_not_supported "qpidd with AMQP 1.0 support" - fi - if ! grep -q "queue-patterns=exclusive" $qpid_conf_file; then - cat < Date: Thu, 12 Jun 2014 18:45:42 -0500 Subject: [PATCH 0004/3333] Add NetApp Cinder backend support Supports both iSCSI and NFS, and now both 7mode and cluster mode Change-Id: If590a7a255268fcce4770c94956607251c36fdf5 --- lib/cinder_backends/netapp_iscsi | 64 +++++++++++++++++++++++++++ lib/cinder_backends/netapp_nfs | 75 ++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 lib/cinder_backends/netapp_iscsi create mode 100644 lib/cinder_backends/netapp_nfs diff --git a/lib/cinder_backends/netapp_iscsi b/lib/cinder_backends/netapp_iscsi new file mode 100644 index 0000000000..7a67da7a26 --- /dev/null +++ b/lib/cinder_backends/netapp_iscsi @@ -0,0 +1,64 @@ +# lib/cinder_backends/netapp_iscsi +# Configure the NetApp iSCSI driver + +# Enable with: +# +# iSCSI: +# CINDER_ENABLED_BACKENDS+=,netapp_iscsi: + +# Dependencies: +# +# - ``functions`` file +# - ``cinder`` configurations + +# ``CINDER_CONF`` +# ``CINDER_CONF_DIR`` +# ``CINDER_ENABLED_BACKENDS`` + +# configure_cinder_backend_netapp_iscsi - configure iSCSI + +# Save trace setting +MY_XTRACE=$(set +o | grep xtrace) +set +o xtrace + + +# Entry Points +# ------------ + +# configure_cinder_backend_netapp_iscsi - Set config files, create data dirs, etc +function configure_cinder_backend_netapp_iscsi { + # To use NetApp, set the following in local.conf: + # CINDER_ENABLED_BACKENDS+=,netapp_iscsi: + # NETAPP_MODE=ontap_7mode|ontap_cluster + # NETAPP_IP= + # NETAPP_LOGIN= + # NETAPP_PASSWORD= + # NETAPP_ISCSI_VOLUME_LIST= + + # In ontap_cluster mode, the following also needs to be defined: + # NETAPP_ISCSI_VSERVER= + + local be_name=$1 + iniset $CINDER_CONF $be_name volume_backend_name $be_name + iniset $CINDER_CONF $be_name volume_driver "cinder.volume.drivers.netapp.common.NetAppDriver" + iniset $CINDER_CONF $be_name netapp_storage_family ${NETAPP_MODE:-ontap_7mode} + iniset $CINDER_CONF $be_name netapp_server_hostname $NETAPP_IP + iniset $CINDER_CONF $be_name netapp_login $NETAPP_LOGIN + iniset $CINDER_CONF $be_name netapp_password $NETAPP_PASSWORD + iniset $CINDER_CONF $be_name netapp_volume_list $NETAPP_ISCSI_VOLUME_LIST + + iniset $CINDER_CONF $be_name netapp_storage_protocol iscsi + iniset $CINDER_CONF $be_name netapp_transport_type https + + if [[ "$NETAPP_MODE" == "ontap_cluster" ]]; then + iniset $CINDER_CONF $be_name netapp_vserver $NETAPP_ISCSI_VSERVER + fi +} + + +# Restore xtrace +$MY_XTRACE + +# Local variables: +# mode: shell-script +# End: diff --git a/lib/cinder_backends/netapp_nfs b/lib/cinder_backends/netapp_nfs new file mode 100644 index 0000000000..d90b7f7d19 --- /dev/null +++ b/lib/cinder_backends/netapp_nfs @@ -0,0 +1,75 @@ +# lib/cinder_backends/netapp_nfs +# Configure the NetApp NFS driver + +# Enable with: +# +# NFS: +# CINDER_ENABLED_BACKENDS+=,netapp_nfs: + +# Dependencies: +# +# - ``functions`` file +# - ``cinder`` configurations + +# ``CINDER_CONF`` +# ``CINDER_CONF_DIR`` +# ``CINDER_ENABLED_BACKENDS`` + +# configure_cinder_backend_netapp_nfs - configure NFS + +# Save trace setting +MY_XTRACE=$(set +o | grep xtrace) +set +o xtrace + + +# Entry Points +# ------------ + +# configure_cinder_backend_netapp_nfs - Set config files, create data dirs, etc +function configure_cinder_backend_netapp_nfs { + # To use NetApp, set the following in local.conf: + # CINDER_ENABLED_BACKENDS+=,netapp_nfs: + # NETAPP_MODE=ontap_7mode|ontap_cluster + # NETAPP_IP= + # NETAPP_LOGIN= + # NETAPP_PASSWORD= + # NETAPP_NFS_VOLUME_LIST= + + # In ontap_cluster mode, the following also needs to be defined: + # NETAPP_NFS_VSERVER= + + local be_name=$1 + iniset $CINDER_CONF $be_name volume_backend_name $be_name + iniset $CINDER_CONF $be_name volume_driver "cinder.volume.drivers.netapp.common.NetAppDriver" + iniset $CINDER_CONF $be_name netapp_storage_family ${NETAPP_MODE:-ontap_7mode} + iniset $CINDER_CONF $be_name netapp_server_hostname $NETAPP_IP + iniset $CINDER_CONF $be_name netapp_login $NETAPP_LOGIN + iniset $CINDER_CONF $be_name netapp_password $NETAPP_PASSWORD + + iniset $CINDER_CONF $be_name netapp_storage_protocol nfs + iniset $CINDER_CONF $be_name netapp_transport_type https + iniset $CINDER_CONF $be_name nfs_shares_config $CINDER_CONF_DIR/netapp_shares.conf + + echo "$NETAPP_NFS_VOLUME_LIST" | tee "$CINDER_CONF_DIR/netapp_shares.conf" + + if [[ "$NETAPP_MODE" == "ontap_cluster" ]]; then + iniset $CINDER_CONF $be_name netapp_vserver $NETAPP_NFS_VSERVER + fi +} + +function cleanup_cinder_backend_netapp_nfs { + # Clean up remaining NFS mounts + # Be blunt and do them all + local m + for m in $CINDER_STATE_PATH/mnt/*; do + sudo umount $m + done +} + + +# Restore xtrace +$MY_XTRACE + +# Local variables: +# mode: shell-script +# End: From 608f884edb2faff59100bb5aa84e8d59e5d3e6d8 Mon Sep 17 00:00:00 2001 From: Kirill Shileev Date: Fri, 3 Oct 2014 22:48:58 +0400 Subject: [PATCH 0005/3333] Use ALT_INSTANCE_USER for image_alt_ssh_user Change-Id: Ib9cfb6e989575d62c493cbe92fdefd8c90256bcd Closes-Bug: 1377914 --- lib/tempest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tempest b/lib/tempest index d677c7e33c..3e55d792ff 100644 --- a/lib/tempest +++ b/lib/tempest @@ -284,7 +284,7 @@ function configure_tempest { iniset $TEMPEST_CONFIG compute image_ref $image_uuid iniset $TEMPEST_CONFIG compute image_ssh_user ${DEFAULT_INSTANCE_USER:-cirros} iniset $TEMPEST_CONFIG compute image_ref_alt $image_uuid_alt - iniset $TEMPEST_CONFIG compute image_alt_ssh_user ${DEFAULT_INSTANCE_USER:-cirros} + iniset $TEMPEST_CONFIG compute image_alt_ssh_user ${ALT_INSTANCE_USER:-cirros} iniset $TEMPEST_CONFIG compute flavor_ref $flavor_ref iniset $TEMPEST_CONFIG compute flavor_ref_alt $flavor_ref_alt iniset $TEMPEST_CONFIG compute ssh_connect_method $ssh_connect_method From d03915f9c08ff91c5d39f8cadb064718079bdb4b Mon Sep 17 00:00:00 2001 From: Daisuke Morita Date: Wed, 8 Oct 2014 06:52:21 +0000 Subject: [PATCH 0006/3333] Enable Swift's newer feature of container-sync Newer version of container-sync feature is introduced in Swift ver. 1.12.0. The spec: http://docs.openstack.org/developer/swift/overview_container_sync.html Before this commit, Devstack does not configure any realm used in container-sync, therefore this feature does not work. To test this feature in CI system, moreover to show the sample configuration of realms, Devstack now edits realms configuration file. Change-Id: I9f1e3224403e08e725a989162729470357fe90b0 Closes-Bug: 1378646 --- lib/swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/swift b/lib/swift index 21ed920149..d8c790a201 100644 --- a/lib/swift +++ b/lib/swift @@ -330,7 +330,12 @@ function configure_swift { SWIFT_CONFIG_PROXY_SERVER=${SWIFT_CONF_DIR}/proxy-server.conf cp ${SWIFT_DIR}/etc/proxy-server.conf-sample ${SWIFT_CONFIG_PROXY_SERVER} - cp ${SWIFT_DIR}/etc/container-sync-realms.conf-sample ${SWIFT_CONF_DIR}/container-sync-realms.conf + # To run container sync feature introduced in Swift ver 1.12.0, + # container sync "realm" is added in container-sync-realms.conf + local csyncfile=${SWIFT_CONF_DIR}/container-sync-realms.conf + cp ${SWIFT_DIR}/etc/container-sync-realms.conf-sample ${csyncfile} + iniset ${csyncfile} realm1 key realm1key + iniset ${csyncfile} realm1 cluster_name1 "$SWIFT_SERVICE_PROTOCOL://$SERVICE_HOST:8080/v1/" iniuncomment ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT user iniset ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT user ${STACK_USER} From bf1b8ed4707e6ee3588c5b5237317325fe2d57c4 Mon Sep 17 00:00:00 2001 From: Steve Martinelli Date: Mon, 6 Oct 2014 03:36:20 -0400 Subject: [PATCH 0007/3333] Move swift CLI commands to OSC commands Only a few instances in exercises/swift.sh Change-Id: I0a39b11f660453a378d44e4f9f28a4a57352f4a8 --- exercises/swift.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exercises/swift.sh b/exercises/swift.sh index 25ea6719c1..afcede81cd 100755 --- a/exercises/swift.sh +++ b/exercises/swift.sh @@ -45,16 +45,16 @@ CONTAINER=ex-swift # ============= # Check if we have to swift via keystone -swift stat || die $LINENO "Failure geting status" +swift stat || die $LINENO "Failure getting status" # We start by creating a test container -swift post $CONTAINER || die $LINENO "Failure creating container $CONTAINER" +openstack container create $CONTAINER || die $LINENO "Failure creating container $CONTAINER" # add some files into it. -swift upload $CONTAINER /etc/issue || die $LINENO "Failure uploading file to container $CONTAINER" +openstack object create $CONTAINER /etc/issue || die $LINENO "Failure uploading file to container $CONTAINER" # list them -swift list $CONTAINER || die $LINENO "Failure listing contents of container $CONTAINER" +openstack object list $CONTAINER || die $LINENO "Failure listing contents of container $CONTAINER" # And we may want to delete them now that we have tested that # everything works. From fa16ae92cd7339a830851dea17ce263205b78865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Han?= Date: Mon, 6 Oct 2014 00:15:33 +0200 Subject: [PATCH 0008/3333] Add the ability to activate Nova ceph without Cinder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prior to this patch, if we wanted to boot a VM in Ceph using libvirt_image_type we must had Cinder enabled. This patch allows you to use libvirt_image_type without having Cinder enabled. Change-Id: Ia61e6effc5a4ccba69f4fa48f6e9984f15bb8979 Signed-off-by: Sébastien Han --- extras.d/60-ceph.sh | 5 +++-- lib/ceph | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/extras.d/60-ceph.sh b/extras.d/60-ceph.sh index 5fb34ea89b..50bdfaee3b 100644 --- a/extras.d/60-ceph.sh +++ b/extras.d/60-ceph.sh @@ -26,8 +26,9 @@ if is_service_enabled ceph; then if is_service_enabled cinder; then echo_summary "Configuring Cinder for Ceph" configure_ceph_cinder - # NOTE (leseb): the part below is a requirement from Cinder in order to attach volumes - # so we should run the following within the if statement. + fi + if is_service_enabled cinder || is_service_enabled nova; then + # NOTE (leseb): the part below is a requirement to attach Ceph block devices echo_summary "Configuring libvirt secret" import_libvirt_secret_ceph fi diff --git a/lib/ceph b/lib/ceph index 30ca903a8d..55e110bead 100644 --- a/lib/ceph +++ b/lib/ceph @@ -221,6 +221,11 @@ function configure_ceph_nova { iniset $NOVA_CONF libvirt images_type rbd iniset $NOVA_CONF libvirt images_rbd_pool ${NOVA_CEPH_POOL} iniset $NOVA_CONF libvirt images_rbd_ceph_conf ${CEPH_CONF_FILE} + + if ! is_service_enabled cinder; then + sudo ceph -c ${CEPH_CONF_FILE} auth get-or-create client.${CINDER_CEPH_USER} mon "allow r" osd "allow class-read object_prefix rbd_children, allow rwx pool=${CINDER_CEPH_POOL}, allow rwx pool=${NOVA_CEPH_POOL},allow rx pool=${GLANCE_CEPH_POOL}" | sudo tee ${CEPH_CONF_DIR}/ceph.client.${CINDER_CEPH_USER}.keyring > /dev/null + sudo chown ${STACK_USER}:$(id -g -n $whoami) ${CEPH_CONF_DIR}/ceph.client.${CINDER_CEPH_USER}.keyring + fi } # configure_ceph_cinder() - Cinder config needs to come after Cinder is set up From efdaafc0f973acdb3fc878434acb3b982e35ccaf Mon Sep 17 00:00:00 2001 From: Chris Dent Date: Tue, 14 Oct 2014 21:08:32 +0100 Subject: [PATCH 0009/3333] Use $() instead of `` There are other instances of this in other files, just tidying ceilometer at the moment. Change-Id: I136a20d7ac50fdf02cbd1102613e324e313b7b0a --- lib/ceilometer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ceilometer b/lib/ceilometer index 9bb31218a0..26c698cf5c 100644 --- a/lib/ceilometer +++ b/lib/ceilometer @@ -178,7 +178,7 @@ function configure_ceilometer { configure_auth_token_middleware $CEILOMETER_CONF ceilometer $CEILOMETER_AUTH_CACHE_DIR if [ "$CEILOMETER_BACKEND" = 'mysql' ] || [ "$CEILOMETER_BACKEND" = 'postgresql' ] ; then - iniset $CEILOMETER_CONF database connection `database_connection_url ceilometer` + iniset $CEILOMETER_CONF database connection $(database_connection_url ceilometer) iniset $CEILOMETER_CONF DEFAULT collector_workers $API_WORKERS else iniset $CEILOMETER_CONF database connection mongodb://localhost:27017/ceilometer From 014564873e98f521338f8bf3ac97e1a7e96ecc9c Mon Sep 17 00:00:00 2001 From: Eric Harney Date: Tue, 14 Oct 2014 18:53:53 -0400 Subject: [PATCH 0010/3333] Set Tempest storage protocol and vendor w/o setting driver Set TEMPEST_STORAGE_PROTOCOL and TEMPEST_VOLUME_VENDOR if they are changed from their defaults, or if TEMPEST_VOLUME_DRIVER is changed. This maintains the current behavior of setting these options if TEMPEST_VOLUME_DRIVER is set to something other than "default". Change-Id: I1fb7f5db0446f97de48b97a6f451882cc51c51a4 --- lib/tempest | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/tempest b/lib/tempest index d677c7e33c..3c37918018 100644 --- a/lib/tempest +++ b/lib/tempest @@ -64,8 +64,10 @@ BOTO_MATERIALS_PATH="$FILES/images/s3-materials/cirros-${CIRROS_VERSION}" # Cinder/Volume variables TEMPEST_VOLUME_DRIVER=${TEMPEST_VOLUME_DRIVER:-default} -TEMPEST_VOLUME_VENDOR=${TEMPEST_VOLUME_VENDOR:-"Open Source"} -TEMPEST_STORAGE_PROTOCOL=${TEMPEST_STORAGE_PROTOCOL:-iSCSI} +TEMPEST_DEFAULT_VOLUME_VENDOR="Open Source" +TEMPEST_VOLUME_VENDOR=${TEMPEST_VOLUME_VENDOR:-$TEMPEST_DEFAULT_VOLUME_VENDOR} +TEMPEST_DEFAULT_STORAGE_PROTOCOL="iSCSI" +TEMPEST_STORAGE_PROTOCOL=${TEMPEST_STORAGE_PROTOCOL:-$TEMPEST_DEFAULT_STORAGE_PROTOCOL} # Neutron/Network variables IPV6_ENABLED=$(trueorfalse True $IPV6_ENABLED) @@ -369,8 +371,12 @@ function configure_tempest { iniset $TEMPEST_CONFIG volume backend2_name "LVM_iSCSI_2" fi - if [ $TEMPEST_VOLUME_DRIVER != "default" ]; then + if [ $TEMPEST_VOLUME_DRIVER != "default" -o \ + $TEMPEST_VOLUME_VENDOR != $TEMPEST_DEFAULT_VOLUME_VENDOR ]; then iniset $TEMPEST_CONFIG volume vendor_name "$TEMPEST_VOLUME_VENDOR" + fi + if [ $TEMPEST_VOLUME_DRIVER != "default" -o \ + $TEMPEST_STORAGE_PROTOCOL != $TEMPEST_DEFAULT_STORAGE_PROTOCOL ]; then iniset $TEMPEST_CONFIG volume storage_protocol $TEMPEST_STORAGE_PROTOCOL fi From 2a324dd2ec51be4485eafe10a31c75bcc238144d Mon Sep 17 00:00:00 2001 From: Mate Lakat Date: Wed, 15 Oct 2014 17:40:41 +0200 Subject: [PATCH 0011/3333] XenAPI: Add exit point after JEOS installation If the user only want to run the installation of Ubuntu - to export the template as an xva, it just needs to specify a non-empty value for: EXIT_AFTER_JEOS_INSTALLATION And the script will exit after the jeos template has been created. Change-Id: I558e2f2b18ee23c15c7e46e2f7e74543cf26b750 --- tools/xen/install_os_domU.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/xen/install_os_domU.sh b/tools/xen/install_os_domU.sh index 75d56a8465..439db68120 100755 --- a/tools/xen/install_os_domU.sh +++ b/tools/xen/install_os_domU.sh @@ -244,6 +244,11 @@ else vm_uuid=$(xe vm-install template="$TNAME" new-name-label="$GUEST_NAME") fi +if [ -n "${EXIT_AFTER_JEOS_INSTALLATION:-}" ]; then + echo "User requested to quit after JEOS instalation" + exit 0 +fi + # # Prepare VM for DevStack # From a1707c7ef0a580bb8f5323ea3d060d0e82d831d7 Mon Sep 17 00:00:00 2001 From: Mate Lakat Date: Wed, 15 Oct 2014 16:56:23 +0200 Subject: [PATCH 0012/3333] XenAPI: Fix vimrc DevStack installs a default minimal .vimrc file for the stack user. Unfortunately the `syntax on` config line is not recognised by the vim installed in DomU. It results in an annoying message being displayed whenever the user is using vi. To avoid this issue, removing the `syntax on` line. Change-Id: I224465cc3cdba3464ea0a9a751f250ecb6ddc9f3 --- tools/xen/prepare_guest.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/xen/prepare_guest.sh b/tools/xen/prepare_guest.sh index cd189db803..7383c91e37 100755 --- a/tools/xen/prepare_guest.sh +++ b/tools/xen/prepare_guest.sh @@ -114,7 +114,6 @@ function setup_vimrc { if [ ! -e $1 ]; then # Simple but usable vimrc cat > $1 < Date: Wed, 15 Oct 2014 16:42:40 +0200 Subject: [PATCH 0013/3333] XenAPI: Always update apt sources If an appliance is used as a base OS, the user might want to use that in a different region. With this change we always update the used mirrors in the template. Change-Id: I7a119664efac1124e54064311c243c63c2a7944b --- tools/xen/prepare_guest_template.sh | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tools/xen/prepare_guest_template.sh b/tools/xen/prepare_guest_template.sh index e6a7e025b0..2d3b89821f 100755 --- a/tools/xen/prepare_guest_template.sh +++ b/tools/xen/prepare_guest_template.sh @@ -93,3 +93,28 @@ EOF # Need to set barrier=0 to avoid a Xen bug # https://bugs.launchpad.net/ubuntu/+source/linux/+bug/824089 sed -i -e 's/errors=/barrier=0,errors=/' $STAGING_DIR/etc/fstab + +# Update ubuntu repositories +cat > $STAGING_DIR/etc/apt/sources.list << EOF +deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} main restricted +deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} main restricted +deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates main restricted +deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates main restricted +deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} universe +deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} universe +deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates universe +deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates universe +deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} multiverse +deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} multiverse +deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates multiverse +deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates multiverse +deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-backports main restricted universe multiverse +deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-backports main restricted universe multiverse + +deb http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security main restricted +deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security main restricted +deb http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security universe +deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security universe +deb http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security multiverse +deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security multiverse +EOF From 751ad1aadf8447c2b6945b6ae4ab73bf71a244ca Mon Sep 17 00:00:00 2001 From: Robert Li Date: Wed, 15 Oct 2014 21:40:53 -0400 Subject: [PATCH 0014/3333] Allow multi-line config items in meta-section of local.conf It would behave such as the contents from each meta-section in local.conf is copied to the destination files. One exception is the multiline options not grouped together. In that case, the contents will be grouped together in its destination config file. Check tests/test_config.sh for examples. This was originally committed in https://review.openstack.org/128805. But the original change used AWK syntax that is not supported in AWK 3.1.8, and caused syntax error on servers with that AWK version. This patch makes the necessary change so that it's compatible with AWK 3.1.8. Change-Id: Id1e1fe01f05bd0f19ea6e89c4f4c0f8be695dfce Partial-Bug: #1374118 --- functions-common | 27 ++++++++++++++++++++ lib/config | 48 +++++++++++++++++++++++++++++++--- tests/test_config.sh | 61 +++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 129 insertions(+), 7 deletions(-) diff --git a/functions-common b/functions-common index 9f4acfec1e..333f31da02 100644 --- a/functions-common +++ b/functions-common @@ -119,6 +119,33 @@ function ini_has_option { [ -n "$line" ] } +# Add another config line for a multi-line option. +# It's normally called after iniset of the same option and assumes +# that the section already exists. +# +# Note that iniset_multiline requires all the 'lines' to be supplied +# in the argument list. Doing that will cause incorrect configuration +# if spaces are used in the config values. +# +# iniadd_literal config-file section option value +function iniadd_literal { + local xtrace=$(set +o | grep xtrace) + set +o xtrace + local file=$1 + local section=$2 + local option=$3 + local value=$4 + + [[ -z $section || -z $option ]] && return + + # Add it + sed -i -e "/^\[$section\]/ a\\ +$option = $value +" "$file" + + $xtrace +} + # Set an option in an INI file # iniset config-file section option value function iniset { diff --git a/lib/config b/lib/config index b44e79aa3d..a4d59a31c9 100644 --- a/lib/config +++ b/lib/config @@ -86,7 +86,11 @@ function merge_config_file { # having to do nasty quoting games get_meta_section $file $matchgroup $configfile | \ $CONFIG_AWK_CMD -v configfile=$configfile ' - BEGIN { section = "" } + BEGIN { + section = "" + last_section = "" + section_count = 0 + } /^\[.+\]/ { gsub("[][]", "", $1); section=$1 @@ -106,10 +110,48 @@ function merge_config_file { # need to strip leading & trailing whitespace from value sub(/^[ \t]*/, "", value) sub(/[ \t]*$/, "", value) - print "iniset " configfile " " section " " attr " \x27" value "\x27" + + # cfg_attr_count: number of config lines per [section, attr] + # cfg_attr: three dimensional array to keep all the config lines per [section, attr] + # cfg_section: keep the section names in the same order as they appear in local.conf + # cfg_sec_attr_name: keep the attr names in the same order as they appear in local.conf + if (! (section, attr) in cfg_attr_count) { + if (section != last_section) { + cfg_section[section_count++] = section + last_section = section + } + attr_count = cfg_sec_attr_count[section_count - 1]++ + cfg_sec_attr_name[section_count - 1, attr_count] = attr + + cfg_attr[section, attr, 0] = value + cfg_attr_count[section, attr] = 1 + } else { + lno = cfg_attr_count[section, attr]++ + cfg_attr[section, attr, lno] = value + } + } + END { + # Process each section in order + for (sno = 0; sno < section_count; sno++) { + section = cfg_section[sno] + # The ini routines simply append a config item immediately + # after the section header. To keep the same order as defined + # in local.conf, invoke the ini routines in the reverse order + for (attr_no = cfg_sec_attr_count[sno] - 1; attr_no >=0; attr_no--) { + attr = cfg_sec_attr_name[sno, attr_no] + if (cfg_attr_count[section, attr] == 1) + print "iniset " configfile " " section " " attr " \x27" cfg_attr[section, attr, 0] "\x27" + else { + # For multiline, invoke the ini routines in the reverse order + count = cfg_attr_count[section, attr] + print "iniset " configfile " " section " " attr " \x27" cfg_attr[section, attr, count - 1] "\x27" + for (l = count -2; l >= 0; l--) + print "iniadd_literal " configfile " " section " " attr " \x27" cfg_attr[section, attr, l] "\x27" + } + } + } } ' | while read a; do eval "$a"; done - } diff --git a/tests/test_config.sh b/tests/test_config.sh index 50e8d7b2e6..cd74cee6f0 100755 --- a/tests/test_config.sh +++ b/tests/test_config.sh @@ -108,6 +108,27 @@ attr = strip_trailing_space [[test7|test-colon.conf]] [DEFAULT] servers=10.11.12.13:80 + +[[test-multi-sections|test-multi-sections.conf]] +[sec-1] +cfg_item1 = abcd +cfg_item2 = efgh + +[sec-2] +cfg_item1 = abcd +cfg_item3 = /1/2/3/4:5 +cfg_item4 = end + +[sec-3] +cfg_item5 = 5555 +cfg_item6 = 6666 +cfg_item5 = 5555another + +[[test-multiline|test-multiline.conf]] +[multi] +cfg_item1 = "ab":"cd", "ef": "gh" +cfg_item1 = abcd +cfg_item2 = efgh EOF echo -n "get_meta_section_files: test0 doesn't exist: " @@ -189,8 +210,39 @@ VAL=$(cat test2a.conf) # iniset adds a blank line if it creates the file... EXPECT_VAL=" [ddd] -additional = true -type = new" +type = new +additional = true" +check_result "$VAL" "$EXPECT_VAL" + +echo -n "merge_config_file test-multi-sections: " +rm -f test-multi-sections.conf +merge_config_file test.conf test-multi-sections test-multi-sections.conf +VAL=$(cat test-multi-sections.conf) +EXPECT_VAL=' +[sec-1] +cfg_item1 = abcd +cfg_item2 = efgh + +[sec-2] +cfg_item1 = abcd +cfg_item3 = /1/2/3/4:5 +cfg_item4 = end + +[sec-3] +cfg_item5 = 5555 +cfg_item5 = 5555another +cfg_item6 = 6666' +check_result "$VAL" "$EXPECT_VAL" + +echo -n "merge_config_file test-multiline: " +rm -f test-multiline.conf +merge_config_file test.conf test-multiline test-multiline.conf +VAL=$(cat test-multiline.conf) +EXPECT_VAL=' +[multi] +cfg_item1 = "ab":"cd", "ef": "gh" +cfg_item1 = abcd +cfg_item2 = efgh' check_result "$VAL" "$EXPECT_VAL" echo -n "merge_config_group test2: " @@ -200,8 +252,8 @@ VAL=$(cat test2a.conf) # iniset adds a blank line if it creates the file... EXPECT_VAL=" [ddd] -additional = true -type = new" +type = new +additional = true" check_result "$VAL" "$EXPECT_VAL" echo -n "merge_config_group test2 no conf file: " @@ -281,4 +333,5 @@ servers = 10.11.12.13:80" check_result "$VAL" "$EXPECT_VAL" rm -f test.conf test1c.conf test2a.conf test-quote.conf test-space.conf test-equals.conf test-strip.conf test-colon.conf +rm -f test-multiline.conf test-multi-sections.conf rm -rf test-etc From 09fb7baff50cfa2d7ca4b5678d3a535842f019c5 Mon Sep 17 00:00:00 2001 From: Swapnil Kulkarni Date: Thu, 16 Oct 2014 06:30:28 +0000 Subject: [PATCH 0015/3333] Update multiple backend configuration in tempest script Currently when we configure the tempest with multiple LVM backends the backend names are created as LVM_iSCSI and LVM_iSCSI_2 which fails since the backends created by cinder are lvmdriver-1 and lvmdriver-2. This patch updates the backend names. Added support for CINDER_ENABLED_BACKENDS and added todo to remove CINDER_MULTI_LVM_BACKEND once its formally removed Closes-Bug:#1369946 Closes-Bug:#1369942 Change-Id: If44f5eb206616afb0fbaf333f3fa6a296d4650cd --- lib/tempest | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/tempest b/lib/tempest index d677c7e33c..40d223bd91 100644 --- a/lib/tempest +++ b/lib/tempest @@ -28,6 +28,7 @@ # - ``DEFAULT_INSTANCE_TYPE`` # - ``DEFAULT_INSTANCE_USER`` # - ``CINDER_MULTI_LVM_BACKEND`` +# - ``CINDER_ENABLED_BACKENDS`` # # ``stack.sh`` calls the entry points in this order: # @@ -362,11 +363,17 @@ function configure_tempest { if ! is_service_enabled c-bak; then iniset $TEMPEST_CONFIG volume-feature-enabled backup False fi - CINDER_MULTI_LVM_BACKEND=$(trueorfalse False $CINDER_MULTI_LVM_BACKEND) - if [ $CINDER_MULTI_LVM_BACKEND == "True" ]; then + + # Using CINDER_ENABLED_BACKENDS + if [[ -n "$CINDER_ENABLED_BACKENDS" ]] && [[ $CINDER_ENABLED_BACKENDS =~ .*,.* ]]; then iniset $TEMPEST_CONFIG volume-feature-enabled multi_backend "True" - iniset $TEMPEST_CONFIG volume backend1_name "LVM_iSCSI" - iniset $TEMPEST_CONFIG volume backend2_name "LVM_iSCSI_2" + local i=1 + local be + for be in ${CINDER_ENABLED_BACKENDS//,/ }; do + local be_name=${be##*:} + iniset $TEMPEST_CONFIG volume "backend${i}_name" "$be_name" + i=$(( i + 1 )) + done fi if [ $TEMPEST_VOLUME_DRIVER != "default" ]; then From 3d6d89935f13635d3fe982ccf870c017155ea903 Mon Sep 17 00:00:00 2001 From: Kyle Mestery Date: Wed, 15 Oct 2014 16:30:15 +0000 Subject: [PATCH 0016/3333] Update the OpenDaylight support to the Helium release The OpenDaylight project recently released their latest release, codenamed Helium. This commit updates the devstack support for OpenDaylight to this new version, which includes changes to configuration files as well as the startup of OpenDaylight itself. Also update my email address in MAINTAINERS.rst. Change-Id: I124b5e7e8ef7feb6c90de907916a9530409c4ad4 --- MAINTAINERS.rst | 2 +- lib/opendaylight | 36 ++++++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/MAINTAINERS.rst b/MAINTAINERS.rst index d754c08e74..d55135de64 100644 --- a/MAINTAINERS.rst +++ b/MAINTAINERS.rst @@ -48,7 +48,7 @@ Neutron OpenDaylight ~~~~~~~~~~~~ -* Kyle Mestery +* Kyle Mestery OpenFlow Agent (ofagent) ~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/lib/opendaylight b/lib/opendaylight index cc29debd05..374de953c6 100644 --- a/lib/opendaylight +++ b/lib/opendaylight @@ -48,10 +48,10 @@ ODL_PASSWORD=${ODL_PASSWORD:-admin} ODL_DIR=$DEST/opendaylight # The OpenDaylight Package, currently using 'Hydrogen' release -ODL_PKG=${ODL_PKG:-distributions-virtualization-0.1.1-osgipackage.zip} +ODL_PKG=${ODL_PKG:-distribution-karaf-0.2.0-Helium.zip} # The OpenDaylight URL -ODL_URL=${ODL_URL:-https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/integration/distributions-virtualization/0.1.1} +ODL_URL=${ODL_URL:-https://nexus.opendaylight.org/content/groups/public/org/opendaylight/integration/distribution-karaf/0.2.0-Helium} # Default arguments for OpenDaylight. This is typically used to set # Java memory options. @@ -59,11 +59,14 @@ ODL_URL=${ODL_URL:-https://nexus.opendaylight.org/content/repositories/opendayli ODL_ARGS=${ODL_ARGS:-"-XX:MaxPermSize=384m"} # How long to pause after ODL starts to let it complete booting -ODL_BOOT_WAIT=${ODL_BOOT_WAIT:-60} +ODL_BOOT_WAIT=${ODL_BOOT_WAIT:-20} # The physical provider network to device mapping ODL_PROVIDER_MAPPINGS=${ODL_PROVIDER_MAPPINGS:-physnet1:eth1} +# Enable OpenDaylight l3 forwarding +ODL_L3=${ODL_L3:-False} + # Entry Points # ------------ @@ -83,11 +86,26 @@ function cleanup_opendaylight { # configure_opendaylight() - Set config files, create data dirs, etc function configure_opendaylight { - # Remove simple forwarder - rm -f $ODL_DIR/opendaylight/plugins/org.opendaylight.controller.samples.simpleforwarding* + # Add odl-ovsdb-openstack if it's not already there + local ODLOVSDB=$(cat $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/org.apache.karaf.features.cfg | grep featuresBoot= | grep odl) + if [ "$ODLOVSDB" == "" ]; then + sed -i '/^featuresBoot=/ s/$/,odl-ovsdb-openstack/' $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/org.apache.karaf.features.cfg + fi - # Configure OpenFlow 1.3 - echo "ovsdb.of.version=1.3" >> $ODL_DIR/opendaylight/configuration/config.ini + # Configure OpenFlow 1.3 if it's not there + local OFLOW13=$(cat $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties | grep ^of.version) + if [ "$OFLOW13" == "" ]; then + echo "ovsdb.of.version=1.3" >> $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties + fi + + # Configure L3 if the user wants it + if [ "${ODL_L3}" == "True" ]; then + # Configure L3 FWD if it's not there + local L3FWD=$(cat $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties | grep ^ovsdb.l3.fwd.enabled) + if [ "$L3FWD" == "" ]; then + echo "ovsdb.l3.fwd.enabled=yes" >> $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties + fi + fi } function configure_ml2_odl { @@ -138,9 +156,7 @@ function start_opendaylight { # -of13: runs ODL using OpenFlow 1.3 protocol support. # -virt ovsdb: Runs ODL in "virtualization" mode with OVSDB support - # NOTE(chdent): Leaving this as screen_it instead of run_process until - # the right thing for this service is determined. - screen_it odl-server "cd $ODL_DIR/opendaylight && JAVA_HOME=$JHOME ./run.sh $ODL_ARGS -of13 -virt ovsdb" + run_process odl-server "cd $ODL_DIR/distribution-karaf-0.2.0-Helium && JAVA_HOME=$JHOME bin/karaf" # Sleep a bit to let OpenDaylight finish starting up sleep $ODL_BOOT_WAIT From 0f18c23de880a38c15aa4bb5d3a8f114f48dfe20 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Fri, 12 Sep 2014 23:44:58 +0900 Subject: [PATCH 0017/3333] ofagent: Support physical_interface_mappings Also, add a knob to create a veth pair instead of a bridge to provide host connectivity for l3-agent. (Q_USE_PUBLIC_VETH) Related: blueprint ofagent-physical-interface-mappings Change-Id: I4c2538f0fd3fb05bfdb69e7e4c3a8462af42ba10 --- lib/neutron | 39 ++++++++++++++++++++++++------- lib/neutron_plugins/ofagent_agent | 4 ++++ lib/neutron_plugins/ovs_base | 19 +++++++++++---- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/lib/neutron b/lib/neutron index 2253eda772..ca9b16cd8c 100644 --- a/lib/neutron +++ b/lib/neutron @@ -148,16 +148,31 @@ PROVIDER_SUBNET_NAME=${PROVIDER_SUBNET_NAME:-"provider_net"} # If Q_USE_PROVIDERNET_FOR_PUBLIC=True, use a flat provider network # for external interface of neutron l3-agent. In that case, # PUBLIC_PHYSICAL_NETWORK specifies provider:physical_network value -# used for the network. In case of openvswitch agent, you should -# add the corresponding entry to your OVS_BRIDGE_MAPPINGS. +# used for the network. In case of ofagent, you should add the +# corresponding entry to your OFAGENT_PHYSICAL_INTERFACE_MAPPINGS. +# For openvswitch agent, you should add the corresponding entry to +# your OVS_BRIDGE_MAPPINGS. # -# eg. +# eg. (ofagent) +# Q_USE_PROVIDERNET_FOR_PUBLIC=True +# Q_USE_PUBLIC_VETH=True +# PUBLIC_PHYSICAL_NETWORK=public +# OFAGENT_PHYSICAL_INTERFACE_MAPPINGS=public:veth-pub-int +# +# eg. (openvswitch agent) # Q_USE_PROVIDERNET_FOR_PUBLIC=True # PUBLIC_PHYSICAL_NETWORK=public # OVS_BRIDGE_MAPPINGS=public:br-ex Q_USE_PROVIDERNET_FOR_PUBLIC=${Q_USE_PROVIDERNET_FOR_PUBLIC:-False} PUBLIC_PHYSICAL_NETWORK=${PUBLIC_PHYSICAL_NETWORK:-public} +# If Q_USE_PUBLIC_VETH=True, create and use a veth pair instead of +# PUBLIC_BRIDGE. This is intended to be used with +# Q_USE_PROVIDERNET_FOR_PUBLIC=True. +Q_USE_PUBLIC_VETH=${Q_USE_PUBLIC_VETH:-False} +Q_PUBLIC_VETH_EX=${Q_PUBLIC_VETH_EX:-veth-pub-ex} +Q_PUBLIC_VETH_INT=${Q_PUBLIC_VETH_INT:-veth-pub-int} + # The next two variables are configured by plugin # e.g. _configure_neutron_l3_agent or lib/neutron_plugins/* # @@ -543,12 +558,20 @@ function create_neutron_initial_network { if is_service_enabled q-l3; then # logic is specific to using the l3-agent for l3 if is_neutron_ovs_base_plugin && [[ "$Q_USE_NAMESPACE" = "True" ]]; then - # Disable in-band as we are going to use local port - # to communicate with VMs - sudo ovs-vsctl set Bridge $PUBLIC_BRIDGE other_config:disable-in-band=true + local ext_gw_interface + + if [[ "$Q_USE_PUBLIC_VETH" = "True" ]]; then + ext_gw_interface=$Q_PUBLIC_VETH_EX + else + # Disable in-band as we are going to use local port + # to communicate with VMs + sudo ovs-vsctl set Bridge $PUBLIC_BRIDGE \ + other_config:disable-in-band=true + ext_gw_interface=$PUBLIC_BRIDGE + fi CIDR_LEN=${FLOATING_RANGE#*/} - sudo ip addr add $EXT_GW_IP/$CIDR_LEN dev $PUBLIC_BRIDGE - sudo ip link set $PUBLIC_BRIDGE up + sudo ip addr add $EXT_GW_IP/$CIDR_LEN dev $ext_gw_interface + sudo ip link set $ext_gw_interface up ROUTER_GW_IP=`neutron port-list -c fixed_ips -c device_owner | grep router_gateway | awk -F '"' '{ print $8; }'` die_if_not_set $LINENO ROUTER_GW_IP "Failure retrieving ROUTER_GW_IP" sudo route add -net $FIXED_RANGE gw $ROUTER_GW_IP diff --git a/lib/neutron_plugins/ofagent_agent b/lib/neutron_plugins/ofagent_agent index a5a58f4c27..1c04f2f64e 100644 --- a/lib/neutron_plugins/ofagent_agent +++ b/lib/neutron_plugins/ofagent_agent @@ -77,6 +77,10 @@ function neutron_plugin_configure_plugin_agent { if [[ "$OVS_BRIDGE_MAPPINGS" != "" ]]; then iniset /$Q_PLUGIN_CONF_FILE ovs bridge_mappings $OVS_BRIDGE_MAPPINGS fi + if [[ "$OFAGENT_PHYSICAL_INTERFACE_MAPPINGS" != "" ]]; then + iniset /$Q_PLUGIN_CONF_FILE agent physical_interface_mappings \ + $OFAGENT_PHYSICAL_INTERFACE_MAPPINGS + fi AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-ofagent-agent" iniset /$Q_PLUGIN_CONF_FILE agent tunnel_types $Q_TUNNEL_TYPES diff --git a/lib/neutron_plugins/ovs_base b/lib/neutron_plugins/ovs_base index d913f7c3cc..f0ef194569 100644 --- a/lib/neutron_plugins/ovs_base +++ b/lib/neutron_plugins/ovs_base @@ -79,11 +79,20 @@ function _neutron_ovs_base_configure_l3_agent { fi neutron-ovs-cleanup - # --no-wait causes a race condition if $PUBLIC_BRIDGE is not up when ip addr flush is called - sudo ovs-vsctl -- --may-exist add-br $PUBLIC_BRIDGE - sudo ovs-vsctl br-set-external-id $PUBLIC_BRIDGE bridge-id $PUBLIC_BRIDGE - # ensure no IP is configured on the public bridge - sudo ip addr flush dev $PUBLIC_BRIDGE + if [[ "$Q_USE_PUBLIC_VETH" = "True" ]]; then + ip link show $Q_PUBLIC_VETH_INT > /dev/null 2>&1 || + sudo ip link add $Q_PUBLIC_VETH_INT type veth \ + peer name $Q_PUBLIC_VETH_EX + sudo ip link set $Q_PUBLIC_VETH_INT up + sudo ip link set $Q_PUBLIC_VETH_EX up + sudo ip addr flush dev $Q_PUBLIC_VETH_EX + else + # --no-wait causes a race condition if $PUBLIC_BRIDGE is not up when ip addr flush is called + sudo ovs-vsctl -- --may-exist add-br $PUBLIC_BRIDGE + sudo ovs-vsctl br-set-external-id $PUBLIC_BRIDGE bridge-id $PUBLIC_BRIDGE + # ensure no IP is configured on the public bridge + sudo ip addr flush dev $PUBLIC_BRIDGE + fi } function _neutron_ovs_base_configure_nova_vif_driver { From e35785d910995c05a3e43af51080c6c6c5631ec7 Mon Sep 17 00:00:00 2001 From: Mate Lakat Date: Thu, 16 Oct 2014 15:40:03 +0200 Subject: [PATCH 0018/3333] XenAPI: Always update proxy settings If a user wants to re-use an xva just with different proxy settings, he can now do it, as this change will always update /etc/apt/apt.conf to reflect the settings in the user's localrc. Change-Id: I8a6e9c88304bc887ea8269d946e89a5ba258b126 --- tools/xen/prepare_guest_template.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/xen/prepare_guest_template.sh b/tools/xen/prepare_guest_template.sh index 2d3b89821f..50f2b6a825 100755 --- a/tools/xen/prepare_guest_template.sh +++ b/tools/xen/prepare_guest_template.sh @@ -118,3 +118,10 @@ deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security univer deb http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security multiverse deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security multiverse EOF + +rm -f $STAGING_DIR/etc/apt/apt.conf +if [ -n "$UBUNTU_INST_HTTP_PROXY" ]; then + cat > $STAGING_DIR/etc/apt/apt.conf << EOF +Acquire::http::Proxy "$UBUNTU_INST_HTTP_PROXY"; +EOF +fi From 6518c0b88ea52e93513fa34dd63eeb4596875212 Mon Sep 17 00:00:00 2001 From: Akihiro Motoki Date: Wed, 15 Oct 2014 17:26:59 +0900 Subject: [PATCH 0019/3333] Compile Horizon message catalogs during stack.sh Recently compiled message catalogs (mo files) were removed in Horizon and django_openstack_auth repositories. We need to compile message catalogs to make translations available for Horizon users. It is useful for developers too. Change-Id: I0831e8308205c116d8e3bb8b43be7f0dd6fa0c0a --- files/apts/general | 1 + files/rpms/general | 1 + lib/horizon | 22 ++++++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/files/apts/general b/files/apts/general index c308c466e3..3fe7863de2 100644 --- a/files/apts/general +++ b/files/apts/general @@ -27,3 +27,4 @@ bc libyaml-dev libffi-dev libssl-dev # for pyOpenSSL +gettext # used for compiling message catalogs diff --git a/files/rpms/general b/files/rpms/general index 7a35961bc2..d4a9fcba55 100644 --- a/files/rpms/general +++ b/files/rpms/general @@ -26,6 +26,7 @@ wget which bc libyaml-devel +gettext # used for compiling message catalogs # [1] : some of installed tools have unversioned dependencies on this, # but others have versioned (<=0.7). So if a later version (0.7.1) diff --git a/lib/horizon b/lib/horizon index 755be18f3c..0213948633 100644 --- a/lib/horizon +++ b/lib/horizon @@ -84,6 +84,14 @@ function cleanup_horizon { # configure_horizon() - Set config files, create data dirs, etc function configure_horizon { setup_develop $HORIZON_DIR + + # Compile message catalogs. + # Horizon is installed as develop mode, so we can compile here. + # Message catalog compilation is handled by Django admin script, + # so compiling them after the installation avoids Django installation twice. + cd $HORIZON_DIR + ./run_tests.sh -N --compilemessages + cd - } # init_horizon() - Initialize databases, etc. @@ -138,6 +146,13 @@ function init_horizon { # install_django_openstack_auth() - Collect source and prepare function install_django_openstack_auth { git_clone $HORIZONAUTH_REPO $HORIZONAUTH_DIR $HORIZONAUTH_BRANCH + + # Compile message catalogs before installation + _prepare_message_catalog_compilation + cd $HORIZONAUTH_DIR + python setup.py compile_catalog + cd - + setup_install $HORIZONAUTH_DIR } @@ -160,6 +175,13 @@ function stop_horizon { stop_apache_server } +# NOTE: It can be moved to common functions, but it is only used by compilation +# of django_openstack_auth catalogs at the moment. +function _prepare_message_catalog_compilation { + local babel_package=$(grep ^Babel $REQUIREMENTS_DIR/global-requirements.txt) + pip_install "$babel_package" +} + # Restore xtrace $XTRACE From 8abd8598b3ba7dce126db7553dfc704e5a343966 Mon Sep 17 00:00:00 2001 From: Chris Dent Date: Wed, 8 Oct 2014 15:24:25 +0100 Subject: [PATCH 0020/3333] Allow use of ceilometer agent coordination Juno brings tooz-based coordination of ceilometer central, compute and alarm agents. If CEILOMETER_COORDINATION_URL is set it will be used as the value for a tooz coordination backend. If memcached is chosen, its package will be installed. Other backends, such as zookeeper can be configured, but installation is left as an exercise for the devstacker. In the default devstack setup having coordination will do little as there are only one of each agent, but this makes it a bit easier for multi-node or multi-agent setups. Change-Id: Ib85ccd435de3bc0ae56b5fe8c2fce6c2af9ff8d0 --- lib/ceilometer | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/ceilometer b/lib/ceilometer index db0c457262..9046b9d3d9 100644 --- a/lib/ceilometer +++ b/lib/ceilometer @@ -155,6 +155,11 @@ function configure_ceilometer { iniset $CEILOMETER_CONF DEFAULT verbose True iniset $CEILOMETER_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL" + if [[ -n "$CEILOMETER_COORDINATION_URL" ]]; then + iniset $CEILOMETER_CONF coordination backend_url $CEILOMETER_COORDINATION_URL + iniset $CEILOMETER_CONF compute workload_partitioning True + fi + # Install the policy file for the API server cp $CEILOMETER_DIR/etc/ceilometer/policy.json $CEILOMETER_CONF_DIR iniset $CEILOMETER_CONF DEFAULT policy_file $CEILOMETER_CONF_DIR/policy.json @@ -242,6 +247,9 @@ function install_ceilometer { git_clone $CEILOMETER_REPO $CEILOMETER_DIR $CEILOMETER_BRANCH setup_develop $CEILOMETER_DIR + if echo $CEILOMETER_COORDINATION_URL | grep -q '^memcached:'; then + install_package memcached + fi } # install_ceilometerclient() - Collect source and prepare From 2a6215dd11400b74b7e5d6db96b44e6a74cfe291 Mon Sep 17 00:00:00 2001 From: Rob Date: Mon, 20 Oct 2014 13:28:47 +0100 Subject: [PATCH 0021/3333] Fix empty functions causing stack failure This patch adds a return value to several empty functions that are causing stack.sh to fail when the Cisco Neutron plugin is enabled. Change-Id: I43987d9cc5edc53de41c27354c3a737643d1cd43 Closes-bug: 1383273 --- lib/neutron_plugins/cisco | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/neutron_plugins/cisco b/lib/neutron_plugins/cisco index 1406e3790c..95e0ab3368 100644 --- a/lib/neutron_plugins/cisco +++ b/lib/neutron_plugins/cisco @@ -82,6 +82,7 @@ function neutron_plugin_configure_common { } function neutron_plugin_configure_debug_command { + : } function neutron_plugin_configure_dhcp_agent { @@ -89,6 +90,7 @@ function neutron_plugin_configure_dhcp_agent { } function neutron_plugin_configure_l3_agent { + : } # Configure n1kv plugin @@ -111,6 +113,7 @@ function _configure_n1kv_subplugin { } function neutron_plugin_configure_plugin_agent { + : } function neutron_plugin_configure_service { From 22ec45e63a45bb38f63ca995446338859dacb207 Mon Sep 17 00:00:00 2001 From: Adam Gandelman Date: Thu, 16 Oct 2014 17:41:22 -0700 Subject: [PATCH 0022/3333] Move generation of baremetal VM names to lib/ironic The create-nodes script currently receives a total # of VMs to create and creates them all, generating their names on the fly. This moves that name generation to lib/ironic and makes the script create only single VMs as directed. This centralizes the naming of things to lib/ironic and will make it easier to reference these things elsewhere. Change-Id: I98e61f7188e027e690303e32aff7cd2347f6d2c2 --- lib/ironic | 27 ++++++-- tools/ironic/scripts/cleanup-node | 25 ++++++++ tools/ironic/scripts/cleanup-nodes | 28 --------- .../scripts/{create-nodes => create-node} | 63 +++++++++---------- 4 files changed, 76 insertions(+), 67 deletions(-) create mode 100755 tools/ironic/scripts/cleanup-node delete mode 100755 tools/ironic/scripts/cleanup-nodes rename tools/ironic/scripts/{create-nodes => create-node} (52%) diff --git a/lib/ironic b/lib/ironic index 5f3ebcd354..1541dcfb33 100644 --- a/lib/ironic +++ b/lib/ironic @@ -354,6 +354,15 @@ function init_ironic { create_ironic_cache_dir } +# _ironic_bm_vm_names() - Generates list of names for baremetal VMs. +function _ironic_bm_vm_names { + local idx + local num_vms=$(($IRONIC_VM_COUNT - 1)) + for idx in $(seq 0 $num_vms); do + echo "baremetal${IRONIC_VM_NETWORK_BRIDGE}_${idx}" + done +} + # start_ironic() - Start running processes, including screen function start_ironic { # Start Ironic API server, if enabled. @@ -449,10 +458,13 @@ function create_bridge_and_vms { else local log_arg="" fi - sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/create-nodes \ - $IRONIC_VM_SPECS_CPU $IRONIC_VM_SPECS_RAM $IRONIC_VM_SPECS_DISK \ - amd64 $IRONIC_VM_COUNT $IRONIC_VM_NETWORK_BRIDGE $IRONIC_VM_EMULATOR \ - $log_arg" >> $IRONIC_VM_MACS_CSV_FILE + local vm_name + for vm_name in $(_ironic_bm_vm_names); do + sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/create-node $vm_name \ + $IRONIC_VM_SPECS_CPU $IRONIC_VM_SPECS_RAM $IRONIC_VM_SPECS_DISK \ + amd64 $IRONIC_VM_NETWORK_BRIDGE $IRONIC_VM_EMULATOR \ + $log_arg" >> $IRONIC_VM_MACS_CSV_FILE + done create_ovs_taps } @@ -655,7 +667,12 @@ function cleanup_baremetal_basic_ops { chmod 0600 $IRONIC_AUTHORIZED_KEYS_FILE fi sudo rm -rf $IRONIC_DATA_DIR $IRONIC_STATE_PATH - sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/cleanup-nodes $IRONIC_VM_COUNT $IRONIC_VM_NETWORK_BRIDGE" + + local vm_name + for vm_name in $(_ironic_bm_vm_names); do + sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/cleanup-node $vm_name $IRONIC_VM_NETWORK_BRIDGE" + done + sudo rm -rf /etc/xinetd.d/tftp /etc/init/tftpd-hpa.override restart_service xinetd sudo iptables -D INPUT -d $HOST_IP -p udp --dport 69 -j ACCEPT || true diff --git a/tools/ironic/scripts/cleanup-node b/tools/ironic/scripts/cleanup-node new file mode 100755 index 0000000000..c4e4e706f4 --- /dev/null +++ b/tools/ironic/scripts/cleanup-node @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# **cleanup-nodes** + +# Cleans up baremetal poseur nodes and volumes created during ironic setup +# Assumes calling user has proper libvirt group membership and access. + +set -exu + +LIBVIRT_STORAGE_POOL=${LIBVIRT_STORAGE_POOL:-"default"} +LIBVIRT_CONNECT_URI=${LIBVIRT_CONNECT_URI:-"qemu:///system"} + +NAME=$1 +NETWORK_BRIDGE=$2 + +export VIRSH_DEFAULT_CONNECT_URI=$LIBVIRT_CONNECT_URI + +VOL_NAME="$NAME.qcow2" +virsh list | grep -q $NAME && virsh destroy $NAME +virsh list --inactive | grep -q $NAME && virsh undefine $NAME + +if virsh pool-list | grep -q $LIBVIRT_STORAGE_POOL ; then + virsh vol-list $LIBVIRT_STORAGE_POOL | grep -q $VOL_NAME && + virsh vol-delete $VOL_NAME --pool $LIBVIRT_STORAGE_POOL +fi diff --git a/tools/ironic/scripts/cleanup-nodes b/tools/ironic/scripts/cleanup-nodes deleted file mode 100755 index adeca5cd9e..0000000000 --- a/tools/ironic/scripts/cleanup-nodes +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash - -# **cleanup-nodes** - -# Cleans up baremetal poseur nodes and volumes created during ironic setup -# Assumes calling user has proper libvirt group membership and access. - -set -exu - -LIBVIRT_STORAGE_POOL=${LIBVIRT_STORAGE_POOL:-"default"} -LIBVIRT_CONNECT_URI=${LIBVIRT_CONNECT_URI:-"qemu:///system"} - -VM_COUNT=$1 -NETWORK_BRIDGE=$2 - -export VIRSH_DEFAULT_CONNECT_URI=$LIBVIRT_CONNECT_URI - -for (( idx=0; idx<$VM_COUNT; idx++ )); do - NAME="baremetal${NETWORK_BRIDGE}_${idx}" - VOL_NAME="baremetal${NETWORK_BRIDGE}-${idx}.qcow2" - virsh list | grep -q $NAME && virsh destroy $NAME - virsh list --inactive | grep -q $NAME && virsh undefine $NAME - - if virsh pool-list | grep -q $LIBVIRT_STORAGE_POOL ; then - virsh vol-list $LIBVIRT_STORAGE_POOL | grep -q $VOL_NAME && - virsh vol-delete $VOL_NAME --pool $LIBVIRT_STORAGE_POOL - fi -done diff --git a/tools/ironic/scripts/create-nodes b/tools/ironic/scripts/create-node similarity index 52% rename from tools/ironic/scripts/create-nodes rename to tools/ironic/scripts/create-node index 140bffe46f..25b53d47f3 100755 --- a/tools/ironic/scripts/create-nodes +++ b/tools/ironic/scripts/create-node @@ -9,19 +9,19 @@ set -ex # Keep track of the devstack directory TOP_DIR=$(cd $(dirname "$0")/.. && pwd) -CPU=$1 -MEM=$(( 1024 * $2 )) +NAME=$1 +CPU=$2 +MEM=$(( 1024 * $3 )) # extra G to allow fuzz for partition table : flavor size and registered size # need to be different to actual size. -DISK=$(( $3 + 1)) +DISK=$(( $4 + 1)) -case $4 in +case $5 in i386) ARCH='i686' ;; amd64) ARCH='x86_64' ;; *) echo "Unsupported arch $4!" ; exit 1 ;; esac -TOTAL=$(($5 - 1)) BRIDGE=$6 EMULATOR=$7 LOGDIR=$8 @@ -53,32 +53,27 @@ if [ -f /etc/debian_version ]; then PREALLOC="--prealloc-metadata" fi -DOMS="" -for idx in $(seq 0 $TOTAL) ; do - NAME="baremetal${BRIDGE}_${idx}" - if [ -n "$LOGDIR" ] ; then - VM_LOGGING="--console-log $LOGDIR/${NAME}_console.log" - else - VM_LOGGING="" - fi - DOMS="$DOMS $NAME" - VOL_NAME="baremetal${BRIDGE}-${idx}.qcow2" - (virsh list --all | grep -q $NAME) && continue - - virsh vol-list --pool $LIBVIRT_STORAGE_POOL | grep -q $VOL_NAME && - virsh vol-delete $VOL_NAME --pool $LIBVIRT_STORAGE_POOL >&2 - virsh vol-create-as $LIBVIRT_STORAGE_POOL ${VOL_NAME} ${DISK}G --format qcow2 $PREALLOC >&2 - volume_path=$(virsh vol-path --pool $LIBVIRT_STORAGE_POOL $VOL_NAME) - # Pre-touch the VM to set +C, as it can only be set on empty files. - sudo touch "$volume_path" - sudo chattr +C "$volume_path" || true - $TOP_DIR/scripts/configure-vm \ - --bootdev network --name $NAME --image "$volume_path" \ - --arch $ARCH --cpus $CPU --memory $MEM --libvirt-nic-driver $LIBVIRT_NIC_DRIVER \ - --emulator $EMULATOR --network $BRIDGE $VM_LOGGING >&2 -done - -for dom in $DOMS ; do - # echo mac - virsh dumpxml $dom | grep "mac address" | head -1 | cut -d\' -f2 -done +if [ -n "$LOGDIR" ] ; then + VM_LOGGING="--console-log $LOGDIR/${NAME}_console.log" +else + VM_LOGGING="" +fi +VOL_NAME="${NAME}.qcow2" + +if ! virsh list --all | grep -q $NAME; then + virsh vol-list --pool $LIBVIRT_STORAGE_POOL | grep -q $VOL_NAME && + virsh vol-delete $VOL_NAME --pool $LIBVIRT_STORAGE_POOL >&2 + virsh vol-create-as $LIBVIRT_STORAGE_POOL ${VOL_NAME} ${DISK}G --format qcow2 $PREALLOC >&2 + volume_path=$(virsh vol-path --pool $LIBVIRT_STORAGE_POOL $VOL_NAME) + # Pre-touch the VM to set +C, as it can only be set on empty files. + sudo touch "$volume_path" + sudo chattr +C "$volume_path" || true + $TOP_DIR/scripts/configure-vm \ + --bootdev network --name $NAME --image "$volume_path" \ + --arch $ARCH --cpus $CPU --memory $MEM --libvirt-nic-driver $LIBVIRT_NIC_DRIVER \ + --emulator $EMULATOR --network $BRIDGE $VM_LOGGING >&2 + +fi + +# echo mac +virsh dumpxml $NAME | grep "mac address" | head -1 | cut -d\' -f2 From 8543a0f763c1f4fcc3ca7e13efece54a0ff7fbb6 Mon Sep 17 00:00:00 2001 From: Adam Gandelman Date: Thu, 16 Oct 2014 17:42:33 -0700 Subject: [PATCH 0023/3333] Make screen_service() useful for more than services screen_service() can currently only be used to launch things that pass the 'is_service_enabled' check, even though its calling functions will have already done this. This removes such check, renames it to screen_process() and updates its usage elsewhere. Change-Id: I480a4560a45b131a95c1b2d2d2379aeba542a9bc --- functions-common | 72 +++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/functions-common b/functions-common index 333f31da02..e6f425f4a1 100644 --- a/functions-common +++ b/functions-common @@ -1251,7 +1251,7 @@ function run_process { if is_service_enabled $service; then if [[ "$USE_SCREEN" = "True" ]]; then - screen_service "$service" "$command" "$group" + screen_process "$service" "$command" "$group" else # Spawn directly without screen _run_process "$service" "$command" "$group" & @@ -1259,14 +1259,14 @@ function run_process { fi } -# Helper to launch a service in a named screen +# Helper to launch a process in a named screen # Uses globals ``CURRENT_LOG_TIME``, ``SCREEN_NAME``, ``SCREEN_LOGDIR``, # ``SERVICE_DIR``, ``USE_SCREEN`` -# screen_service service "command-line" [group] +# screen_process name "command-line" [group] # Run a command in a shell in a screen window, if an optional group # is provided, use sg to set the group of the command. -function screen_service { - local service=$1 +function screen_process { + local name=$1 local command="$2" local group=$3 @@ -1274,38 +1274,36 @@ function screen_service { SERVICE_DIR=${SERVICE_DIR:-${DEST}/status} USE_SCREEN=$(trueorfalse True $USE_SCREEN) - if is_service_enabled $service; then - # Append the service to the screen rc file - screen_rc "$service" "$command" - - screen -S $SCREEN_NAME -X screen -t $service - - if [[ -n ${SCREEN_LOGDIR} ]]; then - screen -S $SCREEN_NAME -p $service -X logfile ${SCREEN_LOGDIR}/screen-${service}.${CURRENT_LOG_TIME}.log - screen -S $SCREEN_NAME -p $service -X log on - ln -sf ${SCREEN_LOGDIR}/screen-${service}.${CURRENT_LOG_TIME}.log ${SCREEN_LOGDIR}/screen-${service}.log - fi + # Append the process to the screen rc file + screen_rc "$name" "$command" - # sleep to allow bash to be ready to be send the command - we are - # creating a new window in screen and then sends characters, so if - # bash isn't running by the time we send the command, nothing happens - sleep 3 + screen -S $SCREEN_NAME -X screen -t $name - NL=`echo -ne '\015'` - # This fun command does the following: - # - the passed server command is backgrounded - # - the pid of the background process is saved in the usual place - # - the server process is brought back to the foreground - # - if the server process exits prematurely the fg command errors - # and a message is written to stdout and the service failure file - # - # The pid saved can be used in stop_process() as a process group - # id to kill off all child processes - if [[ -n "$group" ]]; then - command="sg $group '$command'" - fi - screen -S $SCREEN_NAME -p $service -X stuff "$command & echo \$! >$SERVICE_DIR/$SCREEN_NAME/${service}.pid; fg || echo \"$service failed to start\" | tee \"$SERVICE_DIR/$SCREEN_NAME/${service}.failure\"$NL" + if [[ -n ${SCREEN_LOGDIR} ]]; then + screen -S $SCREEN_NAME -p $name -X logfile ${SCREEN_LOGDIR}/screen-${name}.${CURRENT_LOG_TIME}.log + screen -S $SCREEN_NAME -p $name -X log on + ln -sf ${SCREEN_LOGDIR}/screen-${name}.${CURRENT_LOG_TIME}.log ${SCREEN_LOGDIR}/screen-${name}.log + fi + + # sleep to allow bash to be ready to be send the command - we are + # creating a new window in screen and then sends characters, so if + # bash isn't running by the time we send the command, nothing happens + sleep 3 + + NL=`echo -ne '\015'` + # This fun command does the following: + # - the passed server command is backgrounded + # - the pid of the background process is saved in the usual place + # - the server process is brought back to the foreground + # - if the server process exits prematurely the fg command errors + # and a message is written to stdout and the process failure file + # + # The pid saved can be used in stop_process() as a process group + # id to kill off all child processes + if [[ -n "$group" ]]; then + command="sg $group '$command'" fi + screen -S $SCREEN_NAME -p $name -X stuff "$command & echo \$! >$SERVICE_DIR/$SCREEN_NAME/${name}.pid; fg || echo \"$name failed to start\" | tee \"$SERVICE_DIR/$SCREEN_NAME/${name}.failure\"$NL" } # Screen rc file builder @@ -1412,12 +1410,12 @@ function service_check { # Tail a log file in a screen if USE_SCREEN is true. function tail_log { - local service=$1 + local name=$1 local logfile=$2 USE_SCREEN=$(trueorfalse True $USE_SCREEN) if [[ "$USE_SCREEN" = "True" ]]; then - screen_service "$service" "sudo tail -f $logfile" + screen_process "$name" "sudo tail -f $logfile" fi } @@ -1476,7 +1474,7 @@ function screen_it { screen_rc "$1" "$2" if [[ "$USE_SCREEN" = "True" ]]; then - screen_service "$1" "$2" + screen_process "$1" "$2" else # Spawn directly without screen old_run_process "$1" "$2" >$SERVICE_DIR/$SCREEN_NAME/$1.pid From 761c456a4e89802d2f78a8dbdc5f20d71716f7dd Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Tue, 21 Oct 2014 11:41:37 +1100 Subject: [PATCH 0024/3333] Remove usage of $[ for arithmetic, take 2 I did a similar change in I8ba180be036836f37ebdbb6da36ff0be486c043e but I guess somehow missed these ... maybe I forgot to add them to the change. As described originally, this causes TOT bashate to fail, so fix this up before it gets released. Change-Id: I5580cb46f1c8bd71c631549aab78428d95a6dc51 --- lib/swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/swift b/lib/swift index 15bd2a9471..0b9b89369e 100644 --- a/lib/swift +++ b/lib/swift @@ -196,9 +196,9 @@ function _config_swift_apache_wsgi { # copy apache vhost file and set name and port local node_number for node_number in ${SWIFT_REPLICAS_SEQ}; do - local object_port=$[OBJECT_PORT_BASE + 10 * ($node_number - 1)] - local container_port=$[CONTAINER_PORT_BASE + 10 * ($node_number - 1)] - local account_port=$[ACCOUNT_PORT_BASE + 10 * ($node_number - 1)] + local object_port=$(( OBJECT_PORT_BASE + 10 * (node_number - 1) )) + local container_port=$(( CONTAINER_PORT_BASE + 10 * (node_number - 1) )) + local account_port=$(( ACCOUNT_PORT_BASE + 10 * (node_number - 1) )) sudo cp ${SWIFT_DIR}/examples/apache2/object-server.template $(apache_site_config_for object-server-${node_number}) sudo sed -e " @@ -257,7 +257,7 @@ function generate_swift_config_services { local bind_port=$3 local server_type=$4 - log_facility=$[ node_id - 1 ] + log_facility=$(( node_id - 1 )) local node_path=${SWIFT_DATA_DIR}/${node_number} iniuncomment ${swift_node_config} DEFAULT user From eaff3e1b8c7133e4a5ea8a783e23536871be409a Mon Sep 17 00:00:00 2001 From: Adrien Cunin Date: Tue, 21 Oct 2014 13:46:54 +0200 Subject: [PATCH 0025/3333] Reference git.o.o DevStack repo rather than GitHub In docs, use git.o.o URLs rather than GitHub URLs for the DevStack repo, and don't mention GitHub when git.o.o is more appropriate. Also, replaced GitHub logo with Git logo in quickstart.png. Change-Id: Iab0006144f008963b8cb5be2d10ce0f360c0e6ca --- HACKING.rst | 4 ++-- doc/source/assets/css/local.css | 4 ++-- doc/source/assets/images/quickstart.png | Bin 12375 -> 9491 bytes doc/source/changes.html | 2 +- doc/source/configuration.html | 2 +- doc/source/contributing.html | 4 ++-- doc/source/eucarc.html | 2 +- doc/source/exerciserc.html | 2 +- doc/source/faq.html | 4 ++-- doc/source/guides/multinode-lab.html | 6 +++--- doc/source/guides/pxe-boot.html | 2 +- doc/source/guides/ramdisk.html | 4 ++-- doc/source/guides/single-machine.html | 4 ++-- doc/source/guides/single-vm.html | 4 ++-- doc/source/guides/usb-boot.html | 2 +- doc/source/index.html | 10 +++++----- doc/source/local.conf.html | 2 +- doc/source/localrc.html | 2 +- doc/source/openrc.html | 2 +- doc/source/overview.html | 2 +- doc/source/plugins.html | 2 +- doc/source/stackrc.html | 2 +- 22 files changed, 34 insertions(+), 34 deletions(-) diff --git a/HACKING.rst b/HACKING.rst index d69bb49286..3b86529ec0 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -10,8 +10,8 @@ and so is limited to Bash (version 3 and up) and compatible shells. Shell script was chosen because it best illustrates the steps used to set up and interact with OpenStack components. -DevStack's official repository is located on GitHub at -https://github.com/openstack-dev/devstack.git. Besides the master branch that +DevStack's official repository is located on git.openstack.org at +https://git.openstack.org/openstack-dev/devstack. Besides the master branch that tracks the OpenStack trunk branches a separate branch is maintained for all OpenStack releases starting with Diablo (stable/diablo). diff --git a/doc/source/assets/css/local.css b/doc/source/assets/css/local.css index 5c703af3e4..c8667c45ff 100644 --- a/doc/source/assets/css/local.css +++ b/doc/source/assets/css/local.css @@ -71,7 +71,7 @@ li#ubuntu { margin-bottom: 14px; } -li#github { +li#git { background-position: left -70px !important; height: 61px; padding: ; @@ -119,4 +119,4 @@ footer { .wat { margin-top: 33px; -} \ No newline at end of file +} diff --git a/doc/source/assets/images/quickstart.png b/doc/source/assets/images/quickstart.png index 5400a6f4df111ce1f9bc92bf285cae540840fb9f..735617b8cd4845e1afa9b85524c96d9015fbc410 100644 GIT binary patch literal 9491 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 V6fLn*CGz?bpe(O0S0iH?{y%IZ@nHY} literal 12375 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 Ixbe6D0Bn)wGXMYp diff --git a/doc/source/changes.html b/doc/source/changes.html index 966b0c97b2..028e1cf9e5 100644 --- a/doc/source/changes.html +++ b/doc/source/changes.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • diff --git a/doc/source/configuration.html b/doc/source/configuration.html index 044bafc70d..88d7476bec 100644 --- a/doc/source/configuration.html +++ b/doc/source/configuration.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • diff --git a/doc/source/contributing.html b/doc/source/contributing.html index f3d4b5a4dc..9826fc7f4c 100644 --- a/doc/source/contributing.html +++ b/doc/source/contributing.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • @@ -52,7 +52,7 @@

    Contributing Help us help you

    Things To Know


    Where Things Are -

    The official DevStack repository is located at git://github.com/openstack-dev/devstack.git and git://git.openstack.org/openstack-dev/devstack.git, both mirrors of the official repo maintained by Gerrit.

    +

    The official DevStack repository is located at git://git.openstack.org/openstack-dev/devstack.git, replicated from the repo maintained by Gerrit. GitHub also has a mirror at git://github.com/openstack-dev/devstack.git.

    The blueprint and bug trackers are on Launchpad. It should be noted that DevStack generally does not use these as strongly as other projects, but we're trying to change that.

    The Gerrit review queue is, however, used for all commits except for the text of this website. That should also change in the near future.

    diff --git a/doc/source/eucarc.html b/doc/source/eucarc.html index df5297294a..1dd80968d2 100644 --- a/doc/source/eucarc.html +++ b/doc/source/eucarc.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • diff --git a/doc/source/exerciserc.html b/doc/source/exerciserc.html index 7e4dd54f42..313b0a1daf 100644 --- a/doc/source/exerciserc.html +++ b/doc/source/exerciserc.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • diff --git a/doc/source/faq.html b/doc/source/faq.html index 2c74a66a46..7cbb9d2fc5 100644 --- a/doc/source/faq.html +++ b/doc/source/faq.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • @@ -73,7 +73,7 @@

    General Questions

    A: DevStack is optimized for documentation & developers. As some of us use Crowbar for production deployments, we hope developers documenting how they setup systems for new features supports projects like Crowbar.
    Q: I'd like to help!
    -
    A: That isn't a question, but please do! The source for DevStack is github and bug reports go to LaunchPad. Contributions follow the usual process as described in the OpenStack wiki even though DevStack is not an official OpenStack project. This site is housed in the CloudBuilder's github in the gh-pages branch.
    +
    A: That isn't a question, but please do! The source for DevStack is at git.openstack.org and bug reports go to LaunchPad. Contributions follow the usual process as described in the OpenStack wiki even though DevStack is not an official OpenStack project. This site is housed in the CloudBuilder's github in the gh-pages branch.
    Q: Why not use packages?
    A: Unlike packages, DevStack leaves your cloud ready to develop - checkouts of the code and services running in screen. However, many people are doing the hard work of packaging and recipes for production deployments. We hope this script serves as a way to communicate configuration changes between developers and packagers.
    diff --git a/doc/source/guides/multinode-lab.html b/doc/source/guides/multinode-lab.html index 62232efcd2..6a5f98c11d 100644 --- a/doc/source/guides/multinode-lab.html +++ b/doc/source/guides/multinode-lab.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • @@ -129,8 +129,8 @@

    Set Up Ssh

    echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyYjfgyPazTvGpd8OaAvtU2utL8W6gWC4JdRS1J95GhNNfQd657yO6s1AH5KYQWktcE6FO/xNUC2reEXSGC7ezy+sGO1kj9Limv5vrvNHvF1+wts0Cmyx61D2nQw35/Qz8BvpdJANL7VwP/cFI/p3yhvx2lsnjFE3hN8xRB2LtLUopUSVdBwACOVUmH2G+2BWMJDjVINd2DPqRIA4Zhy09KJ3O1Joabr0XpQL0yt/I9x8BVHdAx6l9U0tMg9dj5+tAjZvMAFfye3PJcYwwsfJoFxC8w/SLtqlFX7Ehw++8RtvomvuipLdmWCy+T9hIkl+gHYE4cS3OIqXH7f49jdJf jesse@spacey.local" > ~/.ssh/authorized_keys

    Download DevStack

    -

    Grab the latest version of DevStack from github:

    -
    git clone https://github.com/openstack-dev/devstack.git
    +        

    Grab the latest version of DevStack:

    +
    git clone https://git.openstack.org/openstack-dev/devstack
     cd devstack

    Up to this point all of the steps apply to each node in the cluster. From here on diff --git a/doc/source/guides/pxe-boot.html b/doc/source/guides/pxe-boot.html index 4dc61a344c..d52b25f276 100644 --- a/doc/source/guides/pxe-boot.html +++ b/doc/source/guides/pxe-boot.html @@ -34,7 +34,7 @@

  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • diff --git a/doc/source/guides/ramdisk.html b/doc/source/guides/ramdisk.html index eaef16edaa..23239e2b60 100644 --- a/doc/source/guides/ramdisk.html +++ b/doc/source/guides/ramdisk.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • @@ -74,7 +74,7 @@

    Installation bit blasting

    Install DevStack

    Grab the latest version of DevStack via https:

    sudo apt-get install git -y
    -git clone https://github.com/openstack-dev/devstack.git
    +git clone https://git.openstack.org/openstack-dev/devstack
     cd devstack

    Prepare the Boot RAMdisk

    diff --git a/doc/source/guides/single-machine.html b/doc/source/guides/single-machine.html index 9471972382..06cc981275 100644 --- a/doc/source/guides/single-machine.html +++ b/doc/source/guides/single-machine.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • @@ -79,7 +79,7 @@

    Add your user

    Download DevStack

    We'll grab the latest version of DevStack via https:

    sudo apt-get install git -y || yum install -y git
    -git clone https://github.com/openstack-dev/devstack.git
    +git clone https://git.openstack.org/openstack-dev/devstack
     cd devstack

    Run DevStack

    diff --git a/doc/source/guides/single-vm.html b/doc/source/guides/single-vm.html index 2f1990a943..d189319623 100644 --- a/doc/source/guides/single-vm.html +++ b/doc/source/guides/single-vm.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • @@ -96,7 +96,7 @@

    Launching With Cloud-Init

    DEBIAN_FRONTEND=noninteractive sudo apt-get install -qqy git || sudo yum install -qy git sudo chown stack:stack /home/stack cd /home/stack - git clone https://github.com/openstack-dev/devstack.git + git clone https://git.openstack.org/openstack-dev/devstack cd devstack echo '[[local|localrc]]' > local.conf echo ADMIN_PASSWORD=password >> local.conf diff --git a/doc/source/guides/usb-boot.html b/doc/source/guides/usb-boot.html index 75adc6f865..2a05f89d89 100644 --- a/doc/source/guides/usb-boot.html +++ b/doc/source/guides/usb-boot.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • diff --git a/doc/source/index.html b/doc/source/index.html index dada57dd53..5f1efd77fb 100644 --- a/doc/source/index.html +++ b/doc/source/index.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • @@ -55,9 +55,9 @@

    DevStack - an OpenStack Community Production

    1. Setup a fresh supported Linux installation.
    2. -
    3. - Clone devstack from devstack. -
      git clone https://github.com/openstack-dev/devstack.git
      +
    4. + Clone devstack from git.openstack.org. +
      git clone https://git.openstack.org/openstack-dev/devstack
    5. Deploy your OpenStack Cloud @@ -84,7 +84,7 @@

      Install Selected OS

    6. Download DevStack

      -
      git clone https://github.com/openstack-dev/devstack.git
      +
      git clone https://git.openstack.org/openstack-dev/devstack

      The devstack repo contains a script that installs OpenStack and templates for configuration files

    7. diff --git a/doc/source/local.conf.html b/doc/source/local.conf.html index ed53adfdb0..2635ac6694 100644 --- a/doc/source/local.conf.html +++ b/doc/source/local.conf.html @@ -34,7 +34,7 @@
    8. Overview
    9. Changes
    10. FAQ
    11. -
    12. GitHub
    13. +
    14. git.openstack.org
    15. Gerrit
    diff --git a/doc/source/localrc.html b/doc/source/localrc.html index 0f669bd679..40a20043a2 100644 --- a/doc/source/localrc.html +++ b/doc/source/localrc.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • diff --git a/doc/source/openrc.html b/doc/source/openrc.html index da6697fb92..94b253dfe1 100644 --- a/doc/source/openrc.html +++ b/doc/source/openrc.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • diff --git a/doc/source/overview.html b/doc/source/overview.html index baee400806..9cee052129 100644 --- a/doc/source/overview.html +++ b/doc/source/overview.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • diff --git a/doc/source/plugins.html b/doc/source/plugins.html index 3327128dff..700a209ac9 100644 --- a/doc/source/plugins.html +++ b/doc/source/plugins.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • diff --git a/doc/source/stackrc.html b/doc/source/stackrc.html index d83fbc164c..2df9d385f7 100644 --- a/doc/source/stackrc.html +++ b/doc/source/stackrc.html @@ -34,7 +34,7 @@
  • Overview
  • Changes
  • FAQ
  • -
  • GitHub
  • +
  • git.openstack.org
  • Gerrit
  • From 50e9b9e25b94b6a088680d93b8873c0368a974b4 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Fri, 17 Oct 2014 11:04:48 -0500 Subject: [PATCH 0026/3333] Remove internal bash8 We use the one installed from pypi in the tox venv, so dump the original. Fix up run_tests.sh. Change-Id: I6b0aa1da9bfa4d742a7210e6ff800d72492a2178 --- run_tests.sh | 2 +- tools/bash8.py | 215 ------------------------------------------------- 2 files changed, 1 insertion(+), 216 deletions(-) delete mode 100755 tools/bash8.py diff --git a/run_tests.sh b/run_tests.sh index b1aef4f81f..bf90332698 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -43,7 +43,7 @@ fi echo "Running bash8..." -./tools/bash8.py -v $FILES +tox -ebashate pass_fail $? 0 bash8 diff --git a/tools/bash8.py b/tools/bash8.py deleted file mode 100755 index 3abf87b484..0000000000 --- a/tools/bash8.py +++ /dev/null @@ -1,215 +0,0 @@ -#!/usr/bin/env python -# -# 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. - -# bash8 - a pep8 equivalent for bash scripts -# -# this program attempts to be an automated style checker for bash scripts -# to fill the same part of code review that pep8 does in most OpenStack -# projects. It starts from humble beginnings, and will evolve over time. -# -# Currently Supported checks -# -# Errors -# Basic white space errors, for consistent indenting -# - E001: check that lines do not end with trailing whitespace -# - E002: ensure that indents are only spaces, and not hard tabs -# - E003: ensure all indents are a multiple of 4 spaces -# - E004: file did not end with a newline -# -# Structure errors -# -# A set of rules that help keep things consistent in control blocks. -# These are ignored on long lines that have a continuation, because -# unrolling that is kind of "interesting" -# -# - E010: *do* not on the same line as *for* -# - E011: *then* not on the same line as *if* -# - E012: heredoc didn't end before EOF - -import argparse -import fileinput -import re -import sys - -ERRORS = 0 -IGNORE = None - - -def register_ignores(ignores): - global IGNORE - if ignores: - IGNORE = '^(' + '|'.join(ignores.split(',')) + ')' - - -def should_ignore(error): - return IGNORE and re.search(IGNORE, error) - - -def print_error(error, line, - filename=None, filelineno=None): - if not filename: - filename = fileinput.filename() - if not filelineno: - filelineno = fileinput.filelineno() - global ERRORS - ERRORS = ERRORS + 1 - print("%s: '%s'" % (error, line.rstrip('\n'))) - print(" - %s: L%s" % (filename, filelineno)) - - -def not_continuation(line): - return not re.search('\\\\$', line) - - -def check_for_do(line): - if not_continuation(line): - match = re.match('^\s*(for|while|until)\s', line) - if match: - operator = match.group(1).strip() - if not re.search(';\s*do(\b|$)', line): - print_error('E010: Do not on same line as %s' % operator, - line) - - -def check_if_then(line): - if not_continuation(line): - if re.search('^\s*if \[', line): - if not re.search(';\s*then(\b|$)', line): - print_error('E011: Then non on same line as if', line) - - -def check_no_trailing_whitespace(line): - if re.search('[ \t]+$', line): - print_error('E001: Trailing Whitespace', line) - - -def check_indents(line): - m = re.search('^(?P[ \t]+)', line) - if m: - if re.search('\t', m.group('indent')): - print_error('E002: Tab indents', line) - if (len(m.group('indent')) % 4) != 0: - print_error('E003: Indent not multiple of 4', line) - -def check_function_decl(line): - failed = False - if line.startswith("function"): - if not re.search('^function [\w-]* \{$', line): - failed = True - else: - # catch the case without "function", e.g. - # things like '^foo() {' - if re.search('^\s*?\(\)\s*?\{', line): - failed = True - - if failed: - print_error('E020: Function declaration not in format ' - ' "^function name {$"', line) - - -def starts_multiline(line): - m = re.search("[^<]<<\s*(?P\w+)", line) - if m: - return m.group('token') - else: - return False - - -def end_of_multiline(line, token): - if token: - return re.search("^%s\s*$" % token, line) is not None - return False - - -def check_files(files, verbose): - in_multiline = False - multiline_start = 0 - multiline_line = "" - logical_line = "" - token = False - prev_file = None - prev_line = "" - prev_lineno = 0 - - for line in fileinput.input(files): - if fileinput.isfirstline(): - # if in_multiline when the new file starts then we didn't - # find the end of a heredoc in the last file. - if in_multiline: - print_error('E012: heredoc did not end before EOF', - multiline_line, - filename=prev_file, filelineno=multiline_start) - in_multiline = False - - # last line of a previous file should always end with a - # newline - if prev_file and not prev_line.endswith('\n'): - print_error('E004: file did not end with a newline', - prev_line, - filename=prev_file, filelineno=prev_lineno) - - prev_file = fileinput.filename() - - if verbose: - print "Running bash8 on %s" % fileinput.filename() - - # NOTE(sdague): multiline processing of heredocs is interesting - if not in_multiline: - logical_line = line - token = starts_multiline(line) - if token: - in_multiline = True - multiline_start = fileinput.filelineno() - multiline_line = line - continue - else: - logical_line = logical_line + line - if not end_of_multiline(line, token): - continue - else: - in_multiline = False - - check_no_trailing_whitespace(logical_line) - check_indents(logical_line) - check_for_do(logical_line) - check_if_then(logical_line) - check_function_decl(logical_line) - - prev_line = logical_line - prev_lineno = fileinput.filelineno() - -def get_options(): - parser = argparse.ArgumentParser( - description='A bash script style checker') - parser.add_argument('files', metavar='file', nargs='+', - help='files to scan for errors') - parser.add_argument('-i', '--ignore', help='Rules to ignore') - parser.add_argument('-v', '--verbose', action='store_true', default=False) - return parser.parse_args() - - -def main(): - opts = get_options() - register_ignores(opts.ignore) - check_files(opts.files, opts.verbose) - - if ERRORS > 0: - print("%d bash8 error(s) found" % ERRORS) - return 1 - else: - return 0 - - -if __name__ == "__main__": - sys.exit(main()) From 24779f65a675f2e78c09b2520ebefcd52b4f0be0 Mon Sep 17 00:00:00 2001 From: Alistair Coles Date: Wed, 15 Oct 2014 18:57:59 +0100 Subject: [PATCH 0027/3333] Add swift user and project in non-default domain Swift has functional tests that check access controls between users and projects in differing domains. Those tests are currently skipped by default since swift tests are configured to use keystone v2 API. In order for those tests to pass when using keystone v3 API, a user and project must be setup in a non-default domain. This patch creates a domain, and a user and project in that domain, in support of swift functional tests moving to using keystone v3 API. Changes: lib/swift - create a new domain, project and user for swift testing - add new project and user credentials to swift test config file - set correct identity service url in swift test config file according to kesytone API version functions-common - add function get_or_create_domain - modify get_or_create_user and get_or_create_project functions to optionally specify a domain Change-Id: I557de01bf196075f2f3adcdf4dd1b43756d8a0ae --- functions-common | 44 ++++++++++++++++++++++++++++++++++++++------ lib/swift | 33 +++++++++++++++++++++++++++------ 2 files changed, 65 insertions(+), 12 deletions(-) diff --git a/functions-common b/functions-common index 333f31da02..4b41bedbbd 100644 --- a/functions-common +++ b/functions-common @@ -790,38 +790,70 @@ function policy_add { mv ${tmpfile} ${policy_file} } +# Gets or creates a domain +# Usage: get_or_create_domain +function get_or_create_domain { + local os_url="$KEYSTONE_SERVICE_URI/v3" + # Gets domain id + local domain_id=$( + # Gets domain id + openstack --os-token=$OS_TOKEN --os-url=$os_url \ + --os-identity-api-version=3 domain show $1 \ + -f value -c id 2>/dev/null || + # Creates new domain + openstack --os-token=$OS_TOKEN --os-url=$os_url \ + --os-identity-api-version=3 domain create $1 \ + --description "$2" \ + -f value -c id + ) + echo $domain_id +} + # Gets or creates user -# Usage: get_or_create_user [] +# Usage: get_or_create_user [ []] function get_or_create_user { if [[ ! -z "$4" ]]; then local email="--email=$4" else local email="" fi + local os_cmd="openstack" + local domain="" + if [[ ! -z "$5" ]]; then + domain="--domain=$5" + os_cmd="$os_cmd --os-url=$KEYSTONE_SERVICE_URI/v3 --os-identity-api-version=3" + fi # Gets user id local user_id=$( # Gets user id - openstack user show $1 -f value -c id 2>/dev/null || + $os_cmd user show $1 $domain -f value -c id 2>/dev/null || # Creates new user - openstack user create \ + $os_cmd user create \ $1 \ --password "$2" \ --project $3 \ $email \ + $domain \ -f value -c id ) echo $user_id } # Gets or creates project -# Usage: get_or_create_project +# Usage: get_or_create_project [] function get_or_create_project { # Gets project id + local os_cmd="openstack" + local domain="" + if [[ ! -z "$2" ]]; then + domain="--domain=$2" + os_cmd="$os_cmd --os-url=$KEYSTONE_SERVICE_URI/v3 --os-identity-api-version=3" + fi local project_id=$( # Gets project id - openstack project show $1 -f value -c id 2>/dev/null || + $os_cmd project show $1 $domain -f value -c id 2>/dev/null || # Creates new project if not exists - openstack project create $1 -f value -c id + $os_cmd project create $1 $domain -f value -c id ) echo $project_id } diff --git a/lib/swift b/lib/swift index 15bd2a9471..c8780ba322 100644 --- a/lib/swift +++ b/lib/swift @@ -468,12 +468,21 @@ EOF iniset ${testfile} func_test username3 swiftusertest3 iniset ${testfile} func_test account2 swifttenanttest2 iniset ${testfile} func_test username2 swiftusertest2 + iniset ${testfile} func_test account4 swifttenanttest4 + iniset ${testfile} func_test username4 swiftusertest4 + iniset ${testfile} func_test password4 testing4 + iniset ${testfile} func_test domain4 swift_test if is_service_enabled key;then iniuncomment ${testfile} func_test auth_version + local auth_vers=$(iniget ${testfile} func_test auth_version) iniset ${testfile} func_test auth_host ${KEYSTONE_SERVICE_HOST} iniset ${testfile} func_test auth_port ${KEYSTONE_AUTH_PORT} - iniset ${testfile} func_test auth_prefix /v2.0/ + if [[ $auth_vers == "3" ]]; then + iniset ${testfile} func_test auth_prefix /v3/ + else + iniset ${testfile} func_test auth_prefix /v2.0/ + fi fi local swift_log_dir=${SWIFT_DATA_DIR}/logs @@ -548,12 +557,13 @@ function create_swift_disk { # since we want to make it compatible with tempauth which use # underscores for separators. -# Tenant User Roles +# Tenant User Roles Domain # ------------------------------------------------------------------ -# service swift service -# swifttenanttest1 swiftusertest1 admin -# swifttenanttest1 swiftusertest3 anotherrole -# swifttenanttest2 swiftusertest2 admin +# service swift service default +# swifttenanttest1 swiftusertest1 admin default +# swifttenanttest1 swiftusertest3 anotherrole default +# swifttenanttest2 swiftusertest2 admin default +# swifttenanttest4 swiftusertest4 admin swift_test function create_swift_accounts { # Defines specific passwords used by tools/create_userrc.sh @@ -562,6 +572,7 @@ function create_swift_accounts { export swiftusertest1_password=testing export swiftusertest2_password=testing2 export swiftusertest3_password=testing3 + export swiftusertest4_password=testing4 KEYSTONE_CATALOG_BACKEND=${KEYSTONE_CATALOG_BACKEND:-sql} @@ -603,6 +614,16 @@ function create_swift_accounts { "$swift_tenant_test2" "test2@example.com") die_if_not_set $LINENO swift_user_test2 "Failure creating swift_user_test2" get_or_add_user_role $admin_role $swift_user_test2 $swift_tenant_test2 + + local swift_domain=$(get_or_create_domain swift_test 'Used for swift functional testing') + die_if_not_set $LINENO swift_domain "Failure creating swift_test domain" + + local swift_tenant_test4=$(get_or_create_project swifttenanttest4 $swift_domain) + die_if_not_set $LINENO swift_tenant_test4 "Failure creating swift_tenant_test4" + local swift_user_test4=$(get_or_create_user swiftusertest4 $swiftusertest4_password \ + $swift_tenant_test4 "test4@example.com" $swift_domain) + die_if_not_set $LINENO swift_user_test4 "Failure creating swift_user_test4" + get_or_add_user_role $admin_role $swift_user_test4 $swift_tenant_test4 } # init_swift() - Initialize rings From 4b109297d5b3dcdcdc2c7e4df1a1571cc674ee9f Mon Sep 17 00:00:00 2001 From: Rob Crittenden Date: Tue, 21 Oct 2014 18:17:48 -0400 Subject: [PATCH 0028/3333] Configure glance CA certificate path in cinder A new configuration option is available in cinder for setting the CA path. Configure this option in devstack when native SSL or TLS proxy is configured. Change-Id: I2cf9a3b8ba8e4896bd98efe0fb6f7d62fb279d90 Closes-Bug: 1384267 --- lib/cinder | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/cinder b/lib/cinder index b30a036d16..29cda42eb2 100644 --- a/lib/cinder +++ b/lib/cinder @@ -306,6 +306,7 @@ function configure_cinder { iniset $CINDER_CONF DEFAULT glance_api_servers "${GLANCE_SERVICE_PROTOCOL}://${GLANCE_HOSTPORT}" if is_ssl_enabled_service glance || is_service_enabled tls-proxy; then iniset $CINDER_CONF DEFAULT glance_protocol https + iniset $CINDER_CONF DEFAULT glance_ca_certificates_file $SSL_BUNDLE_FILE fi # Register SSL certificates if provided From ed077b2846af2b412247208316e6881bed65e6bb Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Wed, 22 Oct 2014 11:35:29 +1100 Subject: [PATCH 0029/3333] Always install latest EPEL Having issues with the centos7 job, that seem to be because they use an old snapshot that hasn't updated to the latest EPEL. Thus we re-install it to ensure we're getting the latest. Change-Id: I7930f3e05ee953dab80b06142c17d6aa70f2c2d1 --- stack.sh | 51 ++++++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/stack.sh b/stack.sh index 3b5fb7459b..ec13338948 100755 --- a/stack.sh +++ b/stack.sh @@ -234,36 +234,41 @@ fi if [[ is_fedora && ( $DISTRO == "rhel6" || $DISTRO == "rhel7" ) ]]; then # RHEL requires EPEL for many Open Stack dependencies - if ! sudo yum repolist enabled epel | grep -q 'epel'; then - echo "EPEL not detected; installing" - # This trick installs the latest epel-release from a bootstrap - # repo, then removes itself (as epel-release installed the - # "real" repo). - # - # you would think that rather than this, you could use - # $releasever directly in .repo file we create below. However - # RHEL gives a $releasever of "6Server" which breaks the path; - # see https://bugzilla.redhat.com/show_bug.cgi?id=1150759 - if [[ $DISTRO == "rhel7" ]]; then - epel_ver="7" - elif [[ $DISTRO == "rhel6" ]]; then - epel_ver="6" - fi - cat < Date: Tue, 21 Oct 2014 11:40:08 -0400 Subject: [PATCH 0030/3333] Convert all HTML doc to RST The motivation for this conversion is to have DevStack's docs be generated using a more familair workflow for OpenStack projects, using Sphinx. Changing from raw HTML to RST will also make it easier to contribute more documentation, as well as making edits less of a hassle. The majority of the work was done by using Pandoc to convert from HTML to RST, with minor edits to the output to remove errors in Sphinx. Change-Id: I9636017965aeade37b950ddf5bdb0c22ab9004bd --- doc/source/changes.html | 70 ---- doc/source/changes.rst | 18 + doc/source/conf.py | 263 ++++++++++++ doc/source/configuration.html | 237 ----------- doc/source/configuration.rst | 360 +++++++++++++++++ doc/source/contributing.html | 88 ---- doc/source/contributing.rst | 105 +++++ doc/source/eucarc.html | 94 ----- doc/source/eucarc.rst | 57 +++ doc/source/exerciserc.html | 88 ---- doc/source/exerciserc.rst | 54 +++ doc/source/faq.html | 169 -------- doc/source/faq.rst | 184 +++++++++ doc/source/guides/multinode-lab.html | 336 --------------- doc/source/guides/multinode-lab.rst | 382 +++++++++++++++++ doc/source/guides/pxe-boot.html | 147 ------- doc/source/guides/pxe-boot.rst | 143 +++++++ doc/source/guides/ramdisk.html | 119 ------ doc/source/guides/ramdisk.rst | 89 ++++ doc/source/guides/single-machine.html | 131 ------ doc/source/guides/single-machine.rst | 145 +++++++ doc/source/guides/single-vm.html | 137 ------- doc/source/guides/single-vm.rst | 110 +++++ doc/source/guides/usb-boot.html | 99 ----- doc/source/guides/usb-boot.rst | 60 +++ doc/source/index.html | 562 -------------------------- doc/source/index.rst | 383 ++++++++++++++++++ doc/source/local.conf.html | 64 --- doc/source/local.conf.rst | 20 + doc/source/localrc.html | 60 --- doc/source/localrc.rst | 20 + doc/source/openrc.html | 115 ------ doc/source/openrc.rst | 88 ++++ doc/source/overview.html | 118 ------ doc/source/overview.rst | 103 +++++ doc/source/plugins.html | 142 ------- doc/source/plugins.rst | 124 ++++++ doc/source/stackrc.html | 101 ----- doc/source/stackrc.rst | 77 ++++ setup.cfg | 23 ++ setup.py | 22 + tox.ini | 7 +- 42 files changed, 2836 insertions(+), 2878 deletions(-) delete mode 100644 doc/source/changes.html create mode 100644 doc/source/changes.rst create mode 100644 doc/source/conf.py delete mode 100644 doc/source/configuration.html create mode 100644 doc/source/configuration.rst delete mode 100644 doc/source/contributing.html create mode 100644 doc/source/contributing.rst delete mode 100644 doc/source/eucarc.html create mode 100644 doc/source/eucarc.rst delete mode 100644 doc/source/exerciserc.html create mode 100644 doc/source/exerciserc.rst delete mode 100644 doc/source/faq.html create mode 100644 doc/source/faq.rst delete mode 100644 doc/source/guides/multinode-lab.html create mode 100644 doc/source/guides/multinode-lab.rst delete mode 100644 doc/source/guides/pxe-boot.html create mode 100644 doc/source/guides/pxe-boot.rst delete mode 100644 doc/source/guides/ramdisk.html create mode 100644 doc/source/guides/ramdisk.rst delete mode 100644 doc/source/guides/single-machine.html create mode 100644 doc/source/guides/single-machine.rst delete mode 100644 doc/source/guides/single-vm.html create mode 100644 doc/source/guides/single-vm.rst delete mode 100644 doc/source/guides/usb-boot.html create mode 100644 doc/source/guides/usb-boot.rst delete mode 100644 doc/source/index.html create mode 100644 doc/source/index.rst delete mode 100644 doc/source/local.conf.html create mode 100644 doc/source/local.conf.rst delete mode 100644 doc/source/localrc.html create mode 100644 doc/source/localrc.rst delete mode 100644 doc/source/openrc.html create mode 100644 doc/source/openrc.rst delete mode 100644 doc/source/overview.html create mode 100644 doc/source/overview.rst delete mode 100644 doc/source/plugins.html create mode 100644 doc/source/plugins.rst delete mode 100644 doc/source/stackrc.html create mode 100644 doc/source/stackrc.rst create mode 100644 setup.cfg create mode 100755 setup.py diff --git a/doc/source/changes.html b/doc/source/changes.html deleted file mode 100644 index 028e1cf9e5..0000000000 --- a/doc/source/changes.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - DevStack - Recent Changes - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -

    Recent Changes What's been happening?

    -

    These are the commits to DevStack for the last six months. For the complete list see the DevStack project in Gerrit.

    - -
      - - - -
    -
    - -
    - - - -
    - - diff --git a/doc/source/changes.rst b/doc/source/changes.rst new file mode 100644 index 0000000000..7ce629faa9 --- /dev/null +++ b/doc/source/changes.rst @@ -0,0 +1,18 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +Recent Changes What's been happening? +------------------------------------- + +These are the commits to DevStack for the last six months. For the +complete list see `the DevStack project in +Gerrit `__. + +© Openstack Foundation 2011-2014 — An +`OpenStack `__ +`program `__ diff --git a/doc/source/conf.py b/doc/source/conf.py new file mode 100644 index 0000000000..3e9aa45911 --- /dev/null +++ b/doc/source/conf.py @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- +# +# Tempest documentation build configuration file, created by +# sphinx-quickstart on Tue May 21 17:43:32 2013. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = [ 'oslosphinx' ] + +todo_include_todos = True + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'DevStack' +copyright = u'2014, OpenStack Foundation' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +add_module_names = False + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +modindex_common_prefix = ['DevStack-doc.'] + +# -- Options for man page output ---------------------------------------------- +man_pages = [] + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'nature' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +git_cmd = "git log --pretty=format:'%ad, commit %h' --date=local -n1" +html_last_updated_fmt = os.popen(git_cmd).read() + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +html_domain_indices = False + +# If false, no index is generated. +html_use_index = False + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'DevStack-doc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'DevStack-doc.tex', u'DevStack Docs', + u'OpenStack DevStack Team', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'DevStack-doc', u'DevStack Docs', + u'OpenStack DevStack Team', 'DevStack-doc', 'DevStack documentation', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + + +# -- Options for Epub output --------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = u'DevStack Documentation' +epub_author = u'OpenStack DevStack Team' +epub_publisher = u'OpenStack DevStack Team' +epub_copyright = u'2014, OpenStack DevStack Team' + +# The language of the text. It defaults to the language option +# or en if the language is not set. +#epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +#epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +#epub_identifier = '' + +# A unique identification for the text. +#epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +#epub_cover = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_pre_files = [] + +# HTML files shat should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_post_files = [] + +# A list of files that should not be packed into the epub file. +#epub_exclude_files = [] + +# The depth of the table of contents in toc.ncx. +#epub_tocdepth = 3 + +# Allow duplicate toc entries. +#epub_tocdup = True diff --git a/doc/source/configuration.html b/doc/source/configuration.html deleted file mode 100644 index 88d7476bec..0000000000 --- a/doc/source/configuration.html +++ /dev/null @@ -1,237 +0,0 @@ - - - - - DevStack - Overview - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -

    Configuration Making it go my way

    -

    DevStack has always tried to be mostly-functional with a minimal amount of configuration. The number of options has ballooned as projects add features, new projects added and more combinations need to be tested. Historically DevStack obtained all local configuration and customizations from a localrc file. The number of configuration variables that are simply passed-through to the individual project configuration files is also increasing. The old mechanism for this (EXTRAS_OPTS and friends) required specific code for each file and did not scale well.

    -

    In Oct 2013 a new configuration method was introduced (in review 46768) to hopefully simplify this process and meet the following goals:

    -
      -
    • contain all non-default local configuration in a single file
    • -
    • be backward-compatible with localrc to smooth the transition process
    • -
    • allow settings in arbitrary configuration files to be changed
    • -
    - -

    local.conf

    -

    The new configuration file is local.conf and resides in the root DevStack directory like the old localrc file. It is a modified INI format file that introduces a meta-section header to carry additional information regarding the configuration files to be changed.

    - -

    The new header is similar to a normal INI section header but with double brackets ([[ ... ]]) and two internal fields separated by a pipe (|):

    -
    [[ <phase> | <config-file-name> ]]
    -
    - -

    where <phase> is one of a set of phase names defined by stack.sh and <config-file-name> is the configuration filename. The filename is eval'ed in the stack.sh context so all environment variables are available and may be used. Using the project config file variables in the header is strongly suggested (see the NOVA_CONF example below). If the path of the config file does not exist it is skipped.

    - -

    The defined phases are:

    -
      -
    • local - extracts localrc from local.conf before stackrc is sourced
    • -
    • pre-install - runs after the system packages are installed but before any of the source repositories are installed
    • -
    • install - runs immediately after the repo installations are complete
    • -
    • post-config - runs after the layer 2 services are configured and before they are started
    • -
    • extra - runs after services are started and before any files in extra.d are executed -
    - -

    The file is processed strictly in sequence; meta-sections may be specified more than once but if any settings are duplicated the last to appear in the file will be used.

    -
    [[post-config|$NOVA_CONF]]
    -[DEFAULT]
    -use_syslog = True
    -
    -[osapi_v3]
    -enabled = False
    -
    - -

    A specific meta-section local|localrc is used to - provide a default localrc file (actually - .localrc.auto). This allows all custom settings - for DevStack to be contained in a single file. If localrc - exists it will be used instead to preserve backward-compatibility. More - details on the contents of localrc are available.

    -
    [[local|localrc]]
    -FIXED_RANGE=10.254.1.0/24
    -ADMIN_PASSWORD=speciale
    -LOGFILE=$DEST/logs/stack.sh.log
    -
    - -

    Note that Q_PLUGIN_CONF_FILE is unique in that it is assumed to NOT start with a / (slash) character. A slash will need to be added:

    -
    [[post-config|/$Q_PLUGIN_CONF_FILE]]
    -
    - -

    Also note that the localrc section is sourced as a shell script fragment amd MUST conform to the shell requirements, specifically no whitespace around = (equals).

    - - -

    Minimal Configuration

    -

    While stack.sh is happy to run without a localrc section in local.conf, devlife is better when there are a few minimal variables set. This is an example of a minimal configuration that touches the values that most often need to be set.

    -
      -
    • no logging
    • -
    • pre-set the passwords to prevent interactive prompts
    • -
    • move network ranges away from the local network (FIXED_RANGE and FLOATING_RANGE, commented out below)
    • -
    • set the host IP if detection is unreliable (HOST_IP, commented out below)
    • -
    -
    [[local|localrc]]
    -ADMIN_PASSWORD=secrete
    -DATABASE_PASSWORD=$ADMIN_PASSWORD
    -RABBIT_PASSWORD=$ADMIN_PASSWORD
    -SERVICE_PASSWORD=$ADMIN_PASSWORD
    -SERVICE_TOKEN=a682f596-76f3-11e3-b3b2-e716f9080d50
    -#FIXED_RANGE=172.31.1.0/24
    -#FLOATING_RANGE=192.168.20.0/25
    -#HOST_IP=10.3.4.5
    -

    If the *_PASSWORD variables are not set here you will be prompted to enter values for them by stack.sh.

    -

    The network ranges must not overlap with any networks in use on the host. Overlap is not uncommon as RFC-1918 'private' ranges are commonly used for both the local networking and Nova's fixed and floating ranges.

    -

    HOST_IP is normally detected on the first run of stack.sh but often is indeterminate on later runs due to the IP being moved from an Ethernet integace to a bridge on the host. Setting it here also makes it available for openrc to set OS_AUTH_URL. HOST_IP is not set by default.

    - -

    Common Configuration Variables

    -
    -
    Set DevStack install directory
    -
    Default: DEST=/opt/stack
    - The DevStack install directory is set by the DEST variable. By setting it early in the localrc section you can reference it in later variables. It can be useful to set it even though it is not changed from the default value. -
    DEST=/opt/stack
    - -
    stack.sh logging
    -
    Defaults: LOGFILE="" LOGDAYS=7 LOG_COLOR=True
    - By default stack.sh output is only written to the console where is runs. It can be sent to a file in addition to the console by setting LOGFILE to the fully-qualified name of the destination log file. A timestamp will be appended to the given filename for each run of stack.sh. -
    LOGFILE=$DEST/logs/stack.sh.log
    - Old log files are cleaned automatically if LOGDAYS is set to the number of days of old log files to keep. -
    LOGDAYS=1
    - The some of the project logs (Nova, Cinder, etc) will be colorized by default (if SYSLOG is not set below); this can be turned off by setting LOG_COLOR False. -
    LOG_COLOR=False
    - -
    Screen logging
    -
    Default: SCREEN_LOGDIR=""
    - By default DevStack runs the OpenStack services using screen which is useful for watching log and debug output. However, in automated testing the interactive screen sessions may not be available after the fact; setting SCREEN_LOGDIR enables logging of the screen sessions in the specified diretory. There will be one file per screen session named for the session name and a timestamp. -
    SCREEN_LOGDIR=$DEST/logs/screen
    - Note the use of DEST to locate the main install directory; this is why we suggest setting it in local.conf.

    - -
    One syslog to bind them all
    -
    Default: SYSLOG=False SYSLOG_HOST=$HOST_IP SYSLOG_PORT=516
    - Logging all services to a single syslog can be convenient. Enable syslogging by setting SYSLOG to True. If the destination log host is not localhost SYSLOG_HOST and SYSLOG_PORT can be used to direct the message stream to the log host. -
    SYSLOG=True
    -SYSLOG_HOST=$HOST_IP
    -SYSLOG_PORT=516
    - -
    A clean install every time
    -
    Default: RECLONE=""
    - By default stack.sh only clones the project repos if they do not exist in $DEST. stack.sh will freshen each repo on each run if RECLONE is set to yes. This avoids having to manually remove repos in order to get the current branch from $GIT_BASE. -
    RECLONE=yes
    - -
    Swift
    -
    Default: SWIFT_HASH="" SWIFT_REPLICAS=1 SWIFT_DATA_DIR=$DEST/data/swift
    - Swift is now used as the back-end for the S3-like object store. When enabled Nova's objectstore (n-obj in ENABLED_SERVICES) is automatically disabled. Enable Swift by adding it services to ENABLED_SERVICES: -
    enable_service s-proxy s-object s-container s-account
    - Setting Swift's hash value is required and you will be prompted for it if Swift is enabled so just set it to something already: -
    SWIFT_HASH=66a3d6b56c1f479c8b4e70ab5c2000f5
    - For development purposes the default number of replicas is set to 1 to reduce the overhead required. To better simulate a production deployment set this to 3 or more. -
    SWIFT_REPLICAS=3
    - The data for Swift is stored in the source tree by default - (in $DEST/swift/data) and can be moved by setting - SWIFT_DATA_DIR. The specified directory will be created if it does not exist. -
    SWIFT_DATA_DIR=$DEST/data/swift
    - Note: Previously just enabling swift was sufficient to start the Swift services. That does not provide proper service granularity, particularly in multi-host configurations, and is considered deprecated. Some service combination tests now check for specific Swift services and the old blanket acceptance will longer work correctly. -
    - -
    Service Catalog Backend
    -
    Default: KEYSTONE_CATALOG_BACKEND=sql
    - DevStack uses Keystone's sql service catalog backend. An alternate template backend is also available. However, it does not support the service-* and endpoint-* commands of the keystone CLI. To - do so requires the sql backend be enabled: -
    KEYSTONE_CATALOG_BACKEND=template
    - DevStack's default configuration in sql mode is set in - files/keystone_data.sh
    - -
    Cinder
    -
    Default: VOLUME_GROUP="stack-volumes" VOLUME_NAME_PREFIX="volume-" VOLUME_BACKING_FILE_SIZE=10250M
    - The logical volume group used to hold the Cinder-managed volumes is set by VOLUME_GROUP, the logical volume name prefix is set with VOLUME_NAME_PREFIX and the size of the volume backing file is set with VOLUME_BACKING_FILE_SIZE. -
    VOLUME_GROUP="stack-volumes"
    -VOLUME_NAME_PREFIX="volume-"
    -VOLUME_BACKING_FILE_SIZE=10250M
    - -
    Multi-host DevStack
    -
    Default: MULTI_HOST=False
    - Running DevStack with multiple hosts requires a custom local.conf section for each host. The master is the same as a single host installation with MULTI_HOST=True. The slaves have fewer services enabled and a couple of host variables pointing to the master. -

    - Master -
    MULTI_HOST=True
    - - Slave -
    MYSQL_HOST=w.x.y.z
    -RABBIT_HOST=w.x.y.z
    -GLANCE_HOSTPORT=w.x.y.z:9292
    -ENABLED_SERVICES=n-vol,n-cpu,n-net,n-api
    - -
    API rate limits
    -
    Default: API_RATE_LIMIT=True
    - Integration tests such as Tempest will likely run afoul of the default rate limits configured for Nova. Turn off rate limiting during testing by setting API_RATE_LIMIT=False. -
    API_RATE_LIMIT=False
    -
    - -

    Examples

    -
      -
    • Eliminate a Cinder pass-through (CINDER_PERIODIC_INTERVAL): -
      [[post-config|$CINDER_CONF]]
      -[DEFAULT]
      -periodic_interval = 60
      -
    • -
    • Sample local.conf with screen logging enabled: -
      [[local|localrc]]
      -FIXED_RANGE=10.254.1.0/24
      -NETWORK_GATEWAY=10.254.1.1
      -LOGDAYS=1
      -LOGFILE=$DEST/logs/stack.sh.log
      -SCREEN_LOGDIR=$DEST/logs/screen
      -ADMIN_PASSWORD=quiet
      -DATABASE_PASSWORD=$ADMIN_PASSWORD
      -RABBIT_PASSWORD=$ADMIN_PASSWORD
      -SERVICE_PASSWORD=$ADMIN_PASSWORD
      -SERVICE_TOKEN=a682f596-76f3-11e3-b3b2-e716f9080d50
    • -
    - -
    - - - -
    - - diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst new file mode 100644 index 0000000000..694ad62844 --- /dev/null +++ b/doc/source/configuration.rst @@ -0,0 +1,360 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +Configuration Making it go my way +--------------------------------- + +DevStack has always tried to be mostly-functional with a minimal amount +of configuration. The number of options has ballooned as projects add +features, new projects added and more combinations need to be tested. +Historically DevStack obtained all local configuration and +customizations from a ``localrc`` file. The number of configuration +variables that are simply passed-through to the individual project +configuration files is also increasing. The old mechanism for this +(``EXTRAS_OPTS`` and friends) required specific code for each file and +did not scale well. + +In Oct 2013 a new configuration method was introduced (in `review +46768 `__) to hopefully +simplify this process and meet the following goals: + +- contain all non-default local configuration in a single file +- be backward-compatible with ``localrc`` to smooth the transition + process +- allow settings in arbitrary configuration files to be changed + +local.conf +~~~~~~~~~~ + +The new configuration file is ``local.conf`` and resides in the root +DevStack directory like the old ``localrc`` file. It is a modified INI +format file that introduces a meta-section header to carry additional +information regarding the configuration files to be changed. + +The new header is similar to a normal INI section header but with double +brackets (``[[ ... ]]``) and two internal fields separated by a pipe +(``|``): + +:: + + [[ | ]] + +where ```` is one of a set of phase names defined by ``stack.sh`` +and ```` is the configuration filename. The filename +is eval'ed in the ``stack.sh`` context so all environment variables are +available and may be used. Using the project config file variables in +the header is strongly suggested (see the ``NOVA_CONF`` example below). +If the path of the config file does not exist it is skipped. + +The defined phases are: + +- **local** - extracts ``localrc`` from ``local.conf`` before + ``stackrc`` is sourced +- **pre-install** - runs after the system packages are installed but + before any of the source repositories are installed +- **install** - runs immediately after the repo installations are + complete +- **post-config** - runs after the layer 2 services are configured and + before they are started +- **extra** - runs after services are started and before any files in + ``extra.d`` are executed + +The file is processed strictly in sequence; meta-sections may be +specified more than once but if any settings are duplicated the last to +appear in the file will be used. + +:: + + [[post-config|$NOVA_CONF]] + [DEFAULT] + use_syslog = True + + [osapi_v3] + enabled = False + +A specific meta-section ``local|localrc`` is used to provide a default +``localrc`` file (actually ``.localrc.auto``). This allows all custom +settings for DevStack to be contained in a single file. If ``localrc`` +exists it will be used instead to preserve backward-compatibility. More +details on the `contents of localrc `__ are available. + +:: + + [[local|localrc]] + FIXED_RANGE=10.254.1.0/24 + ADMIN_PASSWORD=speciale + LOGFILE=$DEST/logs/stack.sh.log + +Note that ``Q_PLUGIN_CONF_FILE`` is unique in that it is assumed to +*NOT* start with a ``/`` (slash) character. A slash will need to be +added: + +:: + + [[post-config|/$Q_PLUGIN_CONF_FILE]] + +Also note that the ``localrc`` section is sourced as a shell script +fragment amd MUST conform to the shell requirements, specifically no +whitespace around ``=`` (equals). + +Minimal Configuration +~~~~~~~~~~~~~~~~~~~~~ + +While ``stack.sh`` is happy to run without a ``localrc`` section in +``local.conf``, devlife is better when there are a few minimal variables +set. This is an example of a minimal configuration that touches the +values that most often need to be set. + +- no logging +- pre-set the passwords to prevent interactive prompts +- move network ranges away from the local network (``FIXED_RANGE`` and + ``FLOATING_RANGE``, commented out below) +- set the host IP if detection is unreliable (``HOST_IP``, commented + out below) + +:: + + [[local|localrc]] + ADMIN_PASSWORD=secrete + DATABASE_PASSWORD=$ADMIN_PASSWORD + RABBIT_PASSWORD=$ADMIN_PASSWORD + SERVICE_PASSWORD=$ADMIN_PASSWORD + SERVICE_TOKEN=a682f596-76f3-11e3-b3b2-e716f9080d50 + #FIXED_RANGE=172.31.1.0/24 + #FLOATING_RANGE=192.168.20.0/25 + #HOST_IP=10.3.4.5 + +If the ``*_PASSWORD`` variables are not set here you will be prompted to +enter values for them by ``stack.sh``. + +The network ranges must not overlap with any networks in use on the +host. Overlap is not uncommon as RFC-1918 'private' ranges are commonly +used for both the local networking and Nova's fixed and floating ranges. + +``HOST_IP`` is normally detected on the first run of ``stack.sh`` but +often is indeterminate on later runs due to the IP being moved from an +Ethernet integace to a bridge on the host. Setting it here also makes it +available for ``openrc`` to set ``OS_AUTH_URL``. ``HOST_IP`` is not set +by default. + +Common Configuration Variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Set DevStack install directory + | *Default: ``DEST=/opt/stack``* + | The DevStack install directory is set by the ``DEST`` variable. + | By setting it early in the ``localrc`` section you can reference it + in later variables. It can be useful to set it even though it is not + changed from the default value. + | + + :: + + DEST=/opt/stack + +stack.sh logging + | *Defaults: ``LOGFILE="" LOGDAYS=7 LOG_COLOR=True``* + | By default ``stack.sh`` output is only written to the console + where is runs. It can be sent to a file in addition to the console + by setting ``LOGFILE`` to the fully-qualified name of the + destination log file. A timestamp will be appended to the given + filename for each run of ``stack.sh``. + | + + :: + + LOGFILE=$DEST/logs/stack.sh.log + + Old log files are cleaned automatically if ``LOGDAYS`` is set to the + number of days of old log files to keep. + + :: + + LOGDAYS=1 + + The some of the project logs (Nova, Cinder, etc) will be colorized + by default (if ``SYSLOG`` is not set below); this can be turned off + by setting ``LOG_COLOR`` False. + + :: + + LOG_COLOR=False + +Screen logging + | *Default: ``SCREEN_LOGDIR=""``* + | By default DevStack runs the OpenStack services using ``screen`` + which is useful for watching log and debug output. However, in + automated testing the interactive ``screen`` sessions may not be + available after the fact; setting ``SCREEN_LOGDIR`` enables logging + of the ``screen`` sessions in the specified diretory. There will be + one file per ``screen`` session named for the session name and a + timestamp. + | + + :: + + SCREEN_LOGDIR=$DEST/logs/screen + + *Note the use of ``DEST`` to locate the main install directory; this + is why we suggest setting it in ``local.conf``.* + +One syslog to bind them all + | *Default: ``SYSLOG=False SYSLOG_HOST=$HOST_IP SYSLOG_PORT=516``* + | Logging all services to a single syslog can be convenient. Enable + syslogging by setting ``SYSLOG`` to ``True``. If the destination log + host is not localhost ``SYSLOG_HOST`` and ``SYSLOG_PORT`` can be + used to direct the message stream to the log host. + | + + :: + + SYSLOG=True + SYSLOG_HOST=$HOST_IP + SYSLOG_PORT=516 + +A clean install every time + | *Default: ``RECLONE=""``* + | By default ``stack.sh`` only clones the project repos if they do + not exist in ``$DEST``. ``stack.sh`` will freshen each repo on each + run if ``RECLONE`` is set to ``yes``. This avoids having to manually + remove repos in order to get the current branch from ``$GIT_BASE``. + | + + :: + + RECLONE=yes + + Swift + Default: SWIFT_HASH="" SWIFT_REPLICAS=1 SWIFT_DATA_DIR=$DEST/data/swift + Swift is now used as the back-end for the S3-like object store. When enabled Nova's objectstore (n-obj in ENABLED_SERVICES) is automatically disabled. Enable Swift by adding it services to ENABLED_SERVICES: + enable_service s-proxy s-object s-container s-account + + Setting Swift's hash value is required and you will be prompted for + it if Swift is enabled so just set it to something already: + + :: + + SWIFT_HASH=66a3d6b56c1f479c8b4e70ab5c2000f5 + + For development purposes the default number of replicas is set to + ``1`` to reduce the overhead required. To better simulate a + production deployment set this to ``3`` or more. + + :: + + SWIFT_REPLICAS=3 + + The data for Swift is stored in the source tree by default (in + ``$DEST/swift/data``) and can be moved by setting + ``SWIFT_DATA_DIR``. The specified directory will be created if it + does not exist. + + :: + + SWIFT_DATA_DIR=$DEST/data/swift + + *Note: Previously just enabling ``swift`` was sufficient to start + the Swift services. That does not provide proper service + granularity, particularly in multi-host configurations, and is + considered deprecated. Some service combination tests now check for + specific Swift services and the old blanket acceptance will longer + work correctly.* + +Service Catalog Backend + | *Default: ``KEYSTONE_CATALOG_BACKEND=sql``* + | DevStack uses Keystone's ``sql`` service catalog backend. An + alternate ``template`` backend is also available. However, it does + not support the ``service-*`` and ``endpoint-*`` commands of the + ``keystone`` CLI. To do so requires the ``sql`` backend be enabled: + | + + :: + + KEYSTONE_CATALOG_BACKEND=template + + DevStack's default configuration in ``sql`` mode is set in + ``files/keystone_data.sh`` + +Cinder + | Default: + | VOLUME_GROUP="stack-volumes" VOLUME_NAME_PREFIX="volume-" VOLUME_BACKING_FILE_SIZE=10250M + | The logical volume group used to hold the Cinder-managed volumes + is set by ``VOLUME_GROUP``, the logical volume name prefix is set + with ``VOLUME_NAME_PREFIX`` and the size of the volume backing file + is set with ``VOLUME_BACKING_FILE_SIZE``. + | + + :: + + VOLUME_GROUP="stack-volumes" + VOLUME_NAME_PREFIX="volume-" + VOLUME_BACKING_FILE_SIZE=10250M + +Multi-host DevStack + | *Default: ``MULTI_HOST=False``* + | Running DevStack with multiple hosts requires a custom + ``local.conf`` section for each host. The master is the same as a + single host installation with ``MULTI_HOST=True``. The slaves have + fewer services enabled and a couple of host variables pointing to + the master. + | **Master** + + :: + + MULTI_HOST=True + + **Slave** + + :: + + MYSQL_HOST=w.x.y.z + RABBIT_HOST=w.x.y.z + GLANCE_HOSTPORT=w.x.y.z:9292 + ENABLED_SERVICES=n-vol,n-cpu,n-net,n-api + +API rate limits + | Default: ``API_RATE_LIMIT=True`` + | Integration tests such as Tempest will likely run afoul of the + default rate limits configured for Nova. Turn off rate limiting + during testing by setting ``API_RATE_LIMIT=False``.* + | + + :: + + API_RATE_LIMIT=False + +Examples +~~~~~~~~ + +- Eliminate a Cinder pass-through (``CINDER_PERIODIC_INTERVAL``): + + :: + + [[post-config|$CINDER_CONF]] + [DEFAULT] + periodic_interval = 60 + +- Sample ``local.conf`` with screen logging enabled: + + :: + + [[local|localrc]] + FIXED_RANGE=10.254.1.0/24 + NETWORK_GATEWAY=10.254.1.1 + LOGDAYS=1 + LOGFILE=$DEST/logs/stack.sh.log + SCREEN_LOGDIR=$DEST/logs/screen + ADMIN_PASSWORD=quiet + DATABASE_PASSWORD=$ADMIN_PASSWORD + RABBIT_PASSWORD=$ADMIN_PASSWORD + SERVICE_PASSWORD=$ADMIN_PASSWORD + SERVICE_TOKEN=a682f596-76f3-11e3-b3b2-e716f9080d50 + +© Openstack Foundation 2011-2014 — An +`OpenStack `__ +`program `__ diff --git a/doc/source/contributing.html b/doc/source/contributing.html deleted file mode 100644 index 9826fc7f4c..0000000000 --- a/doc/source/contributing.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - DevStack - Overview - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -

    Contributing Help us help you

    -

    DevStack uses the standard OpenStack contribution process as outlined in the OpenStack wiki 'How To Contribute'. This means that you will need to meet the requirements of the Contribututors License Agreement (CLA). If you have already done that for another OpenStack project you are good to go.

    - -

    Things To Know

    - -
    Where Things Are -

    The official DevStack repository is located at git://git.openstack.org/openstack-dev/devstack.git, replicated from the repo maintained by Gerrit. GitHub also has a mirror at git://github.com/openstack-dev/devstack.git.

    -

    The blueprint and bug trackers are on Launchpad. It should be noted that DevStack generally does not use these as strongly as other projects, but we're trying to change that.

    -

    The Gerrit review queue is, however, used for all commits except for the text of this website. That should also change in the near future.

    - -
    HACKING.rst -

    Like most OpenStack projects, DevStack includes a HACKING.rst file that describes the layout, style and conventions of the project. Because HACKING.rst is in the main DevStack repo it is considered authoritative. Much of the content on this page is taken from there.

    - -
    bashate Formatting -

    Around the time of the OpenStack Havana release we added a tool to do style checking in DevStack similar to what pep8/flake8 do for Python projects. It is still _very_ simplistic, focusing mostly on stray whitespace to help prevent -1 on reviews that are otherwise acceptable. Oddly enough it is called bashate. It will be expanded to enforce some of the documentation rules in comments that are used in formatting the script pages for devstack.org and possibly even simple code formatting. Run it on the entire project with ./run_tests.sh.

    - -

    Code

    - -
    Repo Layout -

    The DevStack repo generally keeps all of the primary scripts at the root level.

    -

    docs - Contains the source for this website. It is built using tools/build_docs.sh.

    -

    exercises - Contains the test scripts used to validate and demonstrate some OpenStack functions. These scripts know how to exit early or skip services that are not enabled.

    -

    extras.d - Contains the dispatch scripts called by the hooks in stack.sh, unstack.sh and clean.sh. See the plugins docs for more information.

    -

    files - Contains a variety of otherwise lost files used in configuring and operating DevStack. This includes templates for configuration files and the system dependency information. This is also where image files are downloaded and expanded if necessary.

    -

    lib - Contains the sub-scripts specific to each project. This is where the work of managing a project's services is located. Each top-level project (Keystone, Nova, etc) has a file here. Additionally there are some for system services and project plugins.

    -

    samples - Contains a sample of the local files not included in the DevStack repo.

    -

    tests - the DevStack test suite is rather sparse, mostly consisting of test of specific fragile functions in the functions file.

    -

    tools - Contains a collection of stand-alone scripts, some of which have aged a bit (does anyone still do ramdisk installs?). While these may reference the top-level DevStack configuration they can generally be run alone. There are also some sub-directories to support specific environments such as XenServer.

    - - - -
    - - - -
    - - diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst new file mode 100644 index 0000000000..e37c06b6a9 --- /dev/null +++ b/doc/source/contributing.rst @@ -0,0 +1,105 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +Contributing Help us help you +----------------------------- + +DevStack uses the standard OpenStack contribution process as outlined in +`the OpenStack wiki 'How To +Contribute' `__. This +means that you will need to meet the requirements of the Contribututors +License Agreement (CLA). If you have already done that for another +OpenStack project you are good to go. + +Things To Know +~~~~~~~~~~~~~~ + +| +| **Where Things Are** + +The official DevStack repository is located at +``git://git.openstack.org/openstack-dev/devstack.git``, replicated from +the repo maintained by Gerrit. GitHub also has a mirror at +``git://github.com/openstack-dev/devstack.git``. + +The `blueprint `__ and `bug +trackers `__ are on Launchpad. It +should be noted that DevStack generally does not use these as strongly +as other projects, but we're trying to change that. + +The `Gerrit review +queue `__ +is, however, used for all commits except for the text of this website. +That should also change in the near future. + +| +| **HACKING.rst** + +Like most OpenStack projects, DevStack includes a ``HACKING.rst`` file +that describes the layout, style and conventions of the project. Because +``HACKING.rst`` is in the main DevStack repo it is considered +authoritative. Much of the content on this page is taken from there. + +| +| **bashate Formatting** + +Around the time of the OpenStack Havana release we added a tool to do +style checking in DevStack similar to what pep8/flake8 do for Python +projects. It is still \_very\_ simplistic, focusing mostly on stray +whitespace to help prevent -1 on reviews that are otherwise acceptable. +Oddly enough it is called ``bashate``. It will be expanded to enforce +some of the documentation rules in comments that are used in formatting +the script pages for devstack.org and possibly even simple code +formatting. Run it on the entire project with ``./run_tests.sh``. + +Code +~~~~ + +| +| **Repo Layout** + +The DevStack repo generally keeps all of the primary scripts at the root +level. + +``docs`` - Contains the source for this website. It is built using +``tools/build_docs.sh``. + +``exercises`` - Contains the test scripts used to validate and +demonstrate some OpenStack functions. These scripts know how to exit +early or skip services that are not enabled. + +``extras.d`` - Contains the dispatch scripts called by the hooks in +``stack.sh``, ``unstack.sh`` and ``clean.sh``. See `the plugins +docs `__ for more information. + +``files`` - Contains a variety of otherwise lost files used in +configuring and operating DevStack. This includes templates for +configuration files and the system dependency information. This is also +where image files are downloaded and expanded if necessary. + +``lib`` - Contains the sub-scripts specific to each project. This is +where the work of managing a project's services is located. Each +top-level project (Keystone, Nova, etc) has a file here. Additionally +there are some for system services and project plugins. + +``samples`` - Contains a sample of the local files not included in the +DevStack repo. + +``tests`` - the DevStack test suite is rather sparse, mostly consisting +of test of specific fragile functions in the ``functions`` file. + +``tools`` - Contains a collection of stand-alone scripts, some of which +have aged a bit (does anyone still do ramdisk installs?). While these +may reference the top-level DevStack configuration they can generally be +run alone. There are also some sub-directories to support specific +environments such as XenServer. + +© Openstack Foundation 2011-2013 — An `OpenStack +program `__ created by +`Rackspace Cloud +Builders `__ diff --git a/doc/source/eucarc.html b/doc/source/eucarc.html deleted file mode 100644 index 1dd80968d2..0000000000 --- a/doc/source/eucarc.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - DevStack - eucarc - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    EC2_URL
    -
    Set the EC2 url for euca2ools. The endpoint is extracted from the - service catalog for OS_TENANT_NAME:OS_USERNAME. -
    EC2_URL=$(keystone catalog --service ec2 | awk '/ publicURL / { print $4 }')
    - -
    S3_URL
    -
    Set the S3 endpoint for euca2ools. The endpoint is extracted from the - service catalog for OS_TENANT_NAME:OS_USERNAME. -
    export S3_URL=$(keystone catalog --service s3 | awk '/ publicURL / { print $4 }')
    - -
    EC2_ACCESS_KEY, EC2_SECRET_KEY
    -
    Create EC2 credentials for the current tenant:user in Keystone. -
    CREDS=$(keystone ec2-credentials-create)
    -export EC2_ACCESS_KEY=$(echo "$CREDS" | awk '/ access / { print $4 }')
    -export EC2_SECRET_KEY=$(echo "$CREDS" | awk '/ secret / { print $4 }')
    - -
    Certificates for Bundling
    -
    Euca2ools requires certificate files to enable bundle uploading. - The exercise script exercises/bundle.sh demonstrated - retrieving certificates using the Nova CLI. -
    EC2_PRIVATE_KEY=pk.pem
    -EC2_CERT=cert.pem
    -NOVA_CERT=cacert.pem
    -EUCALYPTUS_CERT=${NOVA_CERT}
    - -
    -
    -

    © Openstack Foundation 2011-2013 — An - OpenStack program - created by Rackspace Cloud Builders

    - - -
    - - - diff --git a/doc/source/eucarc.rst b/doc/source/eucarc.rst new file mode 100644 index 0000000000..c1065e6f61 --- /dev/null +++ b/doc/source/eucarc.rst @@ -0,0 +1,57 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +eucarc EC2 settings +------------------- + +``eucarc`` creates EC2 credentials for the current user as defined by +``OS_TENANT_NAME:OS_USERNAME``. ``eucarc`` sources ``openrc`` at the +beginning (which in turn sources ``stackrc`` and ``localrc``) in order +to set credentials to create EC2 credentials in Keystone. + +EC2\_URL + Set the EC2 url for euca2ools. The endpoint is extracted from the + service catalog for ``OS_TENANT_NAME:OS_USERNAME``. + + :: + + EC2_URL=$(keystone catalog --service ec2 | awk '/ publicURL / { print $4 }') + +S3\_URL + Set the S3 endpoint for euca2ools. The endpoint is extracted from + the service catalog for ``OS_TENANT_NAME:OS_USERNAME``. + + :: + + export S3_URL=$(keystone catalog --service s3 | awk '/ publicURL / { print $4 }') + +EC2\_ACCESS\_KEY, EC2\_SECRET\_KEY + Create EC2 credentials for the current tenant:user in Keystone. + + :: + + CREDS=$(keystone ec2-credentials-create) + export EC2_ACCESS_KEY=$(echo "$CREDS" | awk '/ access / { print $4 }') + export EC2_SECRET_KEY=$(echo "$CREDS" | awk '/ secret / { print $4 }') + +Certificates for Bundling + Euca2ools requires certificate files to enable bundle uploading. The + exercise script ``exercises/bundle.sh`` demonstrated retrieving + certificates using the Nova CLI. + + :: + + EC2_PRIVATE_KEY=pk.pem + EC2_CERT=cert.pem + NOVA_CERT=cacert.pem + EUCALYPTUS_CERT=${NOVA_CERT} + +© Openstack Foundation 2011-2013 — An `OpenStack +program `__ created by +`Rackspace Cloud +Builders `__ diff --git a/doc/source/exerciserc.html b/doc/source/exerciserc.html deleted file mode 100644 index 313b0a1daf..0000000000 --- a/doc/source/exerciserc.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - DevStack - exerciserc - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    ACTIVE_TIMEOUT
    -
    Max time to wait while vm goes from build to active state -
    ACTIVE_TIMEOUT==30
    - -
    ASSOCIATE_TIMEOUT
    -
    Max time to wait for proper IP association and dis-association. -
    ASSOCIATE_TIMEOUT=15
    - -
    BOOT_TIMEOUT
    -
    Max time till the vm is bootable -
    BOOT_TIMEOUT=30
    - -
    RUNNING_TIMEOUT
    -
    Max time from run instance command until it is running -
    RUNNING_TIMEOUT=$(($BOOT_TIMEOUT + $ACTIVE_TIMEOUT))
    - -
    TERMINATE_TIMEOUT
    -
    Max time to wait for a vm to terminate -
    TERMINATE_TIMEOUT=30
    - -
    -
    -

    © Openstack Foundation 2011-2013 — An - OpenStack program - created by Rackspace Cloud Builders

    - - -
    - - - diff --git a/doc/source/exerciserc.rst b/doc/source/exerciserc.rst new file mode 100644 index 0000000000..22aff9a9e2 --- /dev/null +++ b/doc/source/exerciserc.rst @@ -0,0 +1,54 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +exerciserc Exercise settings +---------------------------- + +``exerciserc`` is used to configure settings for the exercise scripts. +The values shown below are the default values. Thse can all be +overridden by setting them in the ``localrc`` section. + +ACTIVE\_TIMEOUT + Max time to wait while vm goes from build to active state + + :: + + ACTIVE_TIMEOUT==30 + +ASSOCIATE\_TIMEOUT + Max time to wait for proper IP association and dis-association. + + :: + + ASSOCIATE_TIMEOUT=15 + +BOOT\_TIMEOUT + Max time till the vm is bootable + + :: + + BOOT_TIMEOUT=30 + +RUNNING\_TIMEOUT + Max time from run instance command until it is running + + :: + + RUNNING_TIMEOUT=$(($BOOT_TIMEOUT + $ACTIVE_TIMEOUT)) + +TERMINATE\_TIMEOUT + Max time to wait for a vm to terminate + + :: + + TERMINATE_TIMEOUT=30 + +© Openstack Foundation 2011-2013 — An `OpenStack +program `__ created by +`Rackspace Cloud +Builders `__ diff --git a/doc/source/faq.html b/doc/source/faq.html deleted file mode 100644 index 7cbb9d2fc5..0000000000 --- a/doc/source/faq.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - DevStack - Frequently Asked Questions - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -

    FAQ: Using DevStack Making to behave

    - - - -

    General Questions

    - -
    -
    Q: Can I use DevStack for production?
    -
    A: No. We mean it. Really. DevStack makes some implementation choices that are not appropriate for production deployments. We warned you!
    - -
    Q: Then why selinux in enforcing mode?
    -
    A: That is the default on current Fedora and RHEL releases. DevStack has (rightly so) a bad reputation for its security practices; it has always been meant as a development tool first and system integration later. This is changing as the security issues around OpenStack's use of root (for example) have been tightened and developers need to be better equipped to work in these environments. stack.sh's use of root is primarily to support the activities that would be handled by packaging in "real" deployments. To remove additional protections that will be desired/required in production would be a step backward.
    - -
    Q: But selinux is disabled in RHEL 6!
    -
    A: Today it is, yes. That is a specific exception that certain DevStack contributors fought strongly against. The primary reason it was allowed was to support using RHEL6 as the Python 2.6 test platform and that took priority time-wise. This will not be the case with RHEL 7.
    - -
    Q: Why a shell script, why not chef/puppet/...
    -
    A: The script is meant to be read by humans (as well as ran by computers); it is the primary documentation after all. Using a recipe system requires everyone to agree and understand chef or puppet.
    - -
    Q: Why not use Crowbar?
    -
    A: DevStack is optimized for documentation & developers. As some of us use Crowbar for production deployments, we hope developers documenting how they setup systems for new features supports projects like Crowbar.
    - -
    Q: I'd like to help!
    -
    A: That isn't a question, but please do! The source for DevStack is at git.openstack.org and bug reports go to LaunchPad. Contributions follow the usual process as described in the OpenStack wiki even though DevStack is not an official OpenStack project. This site is housed in the CloudBuilder's github in the gh-pages branch.
    - -
    Q: Why not use packages?
    -
    A: Unlike packages, DevStack leaves your cloud ready to develop - checkouts of the code and services running in screen. However, many people are doing the hard work of packaging and recipes for production deployments. We hope this script serves as a way to communicate configuration changes between developers and packagers.
    - -
    Q: Why isn't $MY_FAVORITE_DISTRO supported?
    -
    A: DevStack is meant for developers and those who want to see how OpenStack really works. DevStack is known to run on the distro/release combinations listed in README.md. DevStack is only supported on releases other than those documented in README.md on a best-effort basis.
    - -
    Q: What about Fedora/RHEL/CentOS?
    -
    A: Fedora and CentOS/RHEL are supported via rpm dependency files and specific checks in stack.sh. Support will follow the pattern set with the Ubuntu testing, i.e. only a single release of the distro will receive regular testing, others will be handled on a best-effort basis.
    - -
    Q: Are there any differences between Ubuntu and Fedora support?
    -
    A: Neutron is not fully supported prior to Fedora 18 due lack of OpenVSwitch packages.
    - -
    Q: How about RHEL 6?
    -
    A: RHEL 6 has Python 2.6 and many old modules packaged and is a challenge to support. There are a number of specific RHEL6 work-arounds in stack.sh to handle this. But the testing on py26 is valuable so we do it...
    -
    - -

    Operation and Configuration

    - -
    -
    Q: Can DevStack handle a multi-node installation?
    -
    A: Indirectly, yes. You run DevStack on each node with the appropriate configuration in local.conf. The primary considerations are turning off the services not required on the secondary nodes, making sure the passwords match and setting the various API URLs to the right place.
    - -
    Q: How can I document the environment that DevStack is using?
    -
    A: DevStack includes a script (tools/info.sh) that gathers the versions of the relevant installed apt packages, pip packages and git repos. This is a good way to verify what Python modules are installed.
    - -
    Q: How do I turn off a service that is enabled by default?
    -
    A: Services can be turned off by adding disable_service xxx to local.conf (using n-vol in this example): -
    disable_service n-vol
    -
    - -
    Q: Is enabling a service that defaults to off done with the reverse of the above?
    -
    A: Of course! -
    enable_service qpid
    -
    - -
    Q: How do I run a specific OpenStack milestone?
    -
    A: OpenStack milestones have tags set in the git repo. Set the appropriate tag in the *_BRANCH variables in local.conf. Swift is on its own release schedule so pick a tag in the Swift repo that is just before the milestone release. For example: -
    [[local|localrc]]
    -GLANCE_BRANCH=stable/grizzly
    -HORIZON_BRANCH=stable/grizzly
    -KEYSTONE_BRANCH=stable/grizzly
    -NOVA_BRANCH=stable/grizzly
    -GLANCE_BRANCH=stable/grizzly
    -NEUTRON_BRANCH=stable/grizzly
    -SWIFT_BRANCH=1.10.0
    -
    - -
    Q: Why not use tools/pip-requiresrequirements.txt to grab project dependencies?
    -
    The majority of deployments will use packages to install OpenStack that will have distro-based packages as dependencies. DevStack installs as many of these Python packages as possible to mimic the expected production environemnt. Certain Linux distributions have a 'lack of workaround' in their Python configurations that installs vendor packaged Python modules and pip-installed modules to the SAME DIRECTORY TREE. This is causing heartache and moving us in the direction of installing more modules from PyPI than vendor packages. However, that is only being done as necessary as the packaging needs to catch up to the development cycle anyway so this is kept to a minimum.
    - -
    Q: What can I do about RabbitMQ not wanting to start on my fresh new VM?
    -
    A: This is often caused by erlang not being happy with the hostname resolving to a reachable IP address. Make sure your hostname resolves to a working IP address; setting it to 127.0.0.1 in /etc/hosts is often good enough for a single-node installation. And in an extreme case, use clean.sh to eradicate it and try again.
    - -
    Q: How can I set up Heat in stand-alone configuration?
    -
    A: Configure local.conf thusly: -
    [[local|localrc]]
    -HEAT_STANDALONE=True
    -ENABLED_SERVICES=rabbit,mysql,heat,h-api,h-api-cfn,h-api-cw,h-eng
    -KEYSTONE_SERVICE_HOST=<keystone-host>
    -KEYSTONE_AUTH_HOST=<keystone-host>
    -
    - -
    Q: Why are my configuration changes ignored?
    -
    A: You may have run into the package prerequisite installation timeout. tools/install_prereqs.sh has a timer that skips the package installation checks if it was run within the last PREREQ_RERUN_HOURS hours (default is 2). To override this, set FORCE_PREREQ=1 and the package checks will never be skipped. -
    -
    - -

    Miscellaneous

    - -
    -
    Q: tools/fixup_stuff.sh is broken and shouldn't 'fix' just one version of packages.
    -
    A: [Another not-a-question] No it isn't. Stuff in there is to correct problems in an environment that need to be fixed elsewhere or may/will be fixed in a future release. In the case of httplib2 and prettytable specific problems with specific versions are being worked around. If later releases have those problems than we'll add them to the script. Knowing about the broken future releases is valuable rather than polling to see if it has been fixed.
    -
    -
    - -
    - - - -
    - - diff --git a/doc/source/faq.rst b/doc/source/faq.rst new file mode 100644 index 0000000000..9adc58ed1c --- /dev/null +++ b/doc/source/faq.rst @@ -0,0 +1,184 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +FAQ: Using DevStack Making to behave +------------------------------------ + +- `General Questions <#general>`__ +- `Operation and Configuration <#ops_conf>`__ +- `Miscellaneous <#misc>`__ + +General Questions +~~~~~~~~~~~~~~~~~ + +Q: Can I use DevStack for production? + A: No. We mean it. Really. DevStack makes some implementation + choices that are not appropriate for production deployments. We + warned you! +Q: Then why selinux in enforcing mode? + A: That is the default on current Fedora and RHEL releases. DevStack + has (rightly so) a bad reputation for its security practices; it has + always been meant as a development tool first and system integration + later. This is changing as the security issues around OpenStack's + use of root (for example) have been tightened and developers need to + be better equipped to work in these environments. ``stack.sh``'s use + of root is primarily to support the activities that would be handled + by packaging in "real" deployments. To remove additional protections + that will be desired/required in production would be a step + backward. +Q: But selinux is disabled in RHEL 6! + A: Today it is, yes. That is a specific exception that certain + DevStack contributors fought strongly against. The primary reason it + was allowed was to support using RHEL6 as the Python 2.6 test + platform and that took priority time-wise. This will not be the case + with RHEL 7. +Q: Why a shell script, why not chef/puppet/... + A: The script is meant to be read by humans (as well as ran by + computers); it is the primary documentation after all. Using a + recipe system requires everyone to agree and understand chef or + puppet. +Q: Why not use Crowbar? + A: DevStack is optimized for documentation & developers. As some of + us use `Crowbar `__ for + production deployments, we hope developers documenting how they + setup systems for new features supports projects like Crowbar. +Q: I'd like to help! + A: That isn't a question, but please do! The source for DevStack is + at + `git.openstack.org `__ + and bug reports go to + `LaunchPad `__. Contributions + follow the usual process as described in the `OpenStack + wiki `__ even though + DevStack is not an official OpenStack project. This site is housed + in the CloudBuilder's + `github `__ in the + gh-pages branch. +Q: Why not use packages? + A: Unlike packages, DevStack leaves your cloud ready to develop - + checkouts of the code and services running in screen. However, many + people are doing the hard work of packaging and recipes for + production deployments. We hope this script serves as a way to + communicate configuration changes between developers and packagers. +Q: Why isn't $MY\_FAVORITE\_DISTRO supported? + A: DevStack is meant for developers and those who want to see how + OpenStack really works. DevStack is known to run on the + distro/release combinations listed in ``README.md``. DevStack is + only supported on releases other than those documented in + ``README.md`` on a best-effort basis. +Q: What about Fedora/RHEL/CentOS? + A: Fedora and CentOS/RHEL are supported via rpm dependency files and + specific checks in ``stack.sh``. Support will follow the pattern set + with the Ubuntu testing, i.e. only a single release of the distro + will receive regular testing, others will be handled on a + best-effort basis. +Q: Are there any differences between Ubuntu and Fedora support? + A: Neutron is not fully supported prior to Fedora 18 due lack of + OpenVSwitch packages. +Q: How about RHEL 6? + A: RHEL 6 has Python 2.6 and many old modules packaged and is a + challenge to support. There are a number of specific RHEL6 + work-arounds in ``stack.sh`` to handle this. But the testing on py26 + is valuable so we do it... + +Operation and Configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Q: Can DevStack handle a multi-node installation? + A: Indirectly, yes. You run DevStack on each node with the + appropriate configuration in ``local.conf``. The primary + considerations are turning off the services not required on the + secondary nodes, making sure the passwords match and setting the + various API URLs to the right place. +Q: How can I document the environment that DevStack is using? + A: DevStack includes a script (``tools/info.sh``) that gathers the + versions of the relevant installed apt packages, pip packages and + git repos. This is a good way to verify what Python modules are + installed. +Q: How do I turn off a service that is enabled by default? + A: Services can be turned off by adding ``disable_service xxx`` to + ``local.conf`` (using ``n-vol`` in this example): + + :: + + disable_service n-vol + +Q: Is enabling a service that defaults to off done with the reverse of the above? + A: Of course! + + :: + + enable_service qpid + +Q: How do I run a specific OpenStack milestone? + A: OpenStack milestones have tags set in the git repo. Set the appropriate tag in the ``*_BRANCH`` variables in ``local.conf``. Swift is on its own release schedule so pick a tag in the Swift repo that is just before the milestone release. For example: + + :: + + [[local|localrc]] + GLANCE_BRANCH=stable/grizzly + HORIZON_BRANCH=stable/grizzly + KEYSTONE_BRANCH=stable/grizzly + NOVA_BRANCH=stable/grizzly + GLANCE_BRANCH=stable/grizzly + NEUTRON_BRANCH=stable/grizzly + SWIFT_BRANCH=1.10.0 + +Q: Why not use [STRIKEOUT:``tools/pip-requires``]\ ``requirements.txt`` to grab project dependencies? + [STRIKEOUT:The majority of deployments will use packages to install + OpenStack that will have distro-based packages as dependencies. + DevStack installs as many of these Python packages as possible to + mimic the expected production environemnt.] Certain Linux + distributions have a 'lack of workaround' in their Python + configurations that installs vendor packaged Python modules and + pip-installed modules to the SAME DIRECTORY TREE. This is causing + heartache and moving us in the direction of installing more modules + from PyPI than vendor packages. However, that is only being done as + necessary as the packaging needs to catch up to the development + cycle anyway so this is kept to a minimum. +Q: What can I do about RabbitMQ not wanting to start on my fresh new VM? + A: This is often caused by ``erlang`` not being happy with the + hostname resolving to a reachable IP address. Make sure your + hostname resolves to a working IP address; setting it to 127.0.0.1 + in ``/etc/hosts`` is often good enough for a single-node + installation. And in an extreme case, use ``clean.sh`` to eradicate + it and try again. +Q: How can I set up Heat in stand-alone configuration? + A: Configure ``local.conf`` thusly: + + :: + + [[local|localrc]] + HEAT_STANDALONE=True + ENABLED_SERVICES=rabbit,mysql,heat,h-api,h-api-cfn,h-api-cw,h-eng + KEYSTONE_SERVICE_HOST= + KEYSTONE_AUTH_HOST= + +Q: Why are my configuration changes ignored? + A: You may have run into the package prerequisite installation + timeout. ``tools/install_prereqs.sh`` has a timer that skips the + package installation checks if it was run within the last + ``PREREQ_RERUN_HOURS`` hours (default is 2). To override this, set + ``FORCE_PREREQ=1`` and the package checks will never be skipped. + +Miscellaneous +~~~~~~~~~~~~~ + +Q: ``tools/fixup_stuff.sh`` is broken and shouldn't 'fix' just one version of packages. + A: [Another not-a-question] No it isn't. Stuff in there is to + correct problems in an environment that need to be fixed elsewhere + or may/will be fixed in a future release. In the case of + ``httplib2`` and ``prettytable`` specific problems with specific + versions are being worked around. If later releases have those + problems than we'll add them to the script. Knowing about the broken + future releases is valuable rather than polling to see if it has + been fixed. + +© Openstack Foundation 2011-2014 — An +`OpenStack `__ +`program `__ diff --git a/doc/source/guides/multinode-lab.html b/doc/source/guides/multinode-lab.html deleted file mode 100644 index 6a5f98c11d..0000000000 --- a/doc/source/guides/multinode-lab.html +++ /dev/null @@ -1,336 +0,0 @@ - - - - - Multi-Node Lab Server Guide - DevStack - - - - - - - - - - - - - - - - - - - - -
    - -
    -

    Multi-Node Lab: Serious Stuff

    -

    Here is OpenStack in a realistic test configuration with multiple physical servers.

    -
    - -
    - - -

    Minimal Install

    -

    You need to have a system with a fresh install of Linux. You can download the Minimal CD for Ubuntu releases since DevStack will download & install all the additional dependencies. The netinstall ISO is available for Fedora and CentOS/RHEL.

    - -

    Install a couple of packages to bootstrap configuration:

    -
    apt-get install -y git sudo || yum install -y git sudo
    - -

    Network Configuration

    -

    The first iteration of the lab uses OpenStack's FlatDHCP network controller so - only a single network will be required. It should be on its own subnet without DHCP; - the host IPs and floating IP pool(s) will come out of this block. This example - uses the following:

    -
      -
    • Gateway: 192.168.42.1
    • -
    • Physical nodes: 192.168.42.11-192.168.42.99
    • -
    • Floating IPs: 192.168.42.128-192.168.42.254
    • -
    -

    Configure each node with a static IP. - For Ubuntu edit /etc/network/interfaces:

    - -
    auto eth0
    -iface eth0 inet static
    -    address 192.168.42.11
    -    netmask 255.255.255.0
    -    gateway 192.168.42.1
    -
    -

    For Fedora and CentOS/RHEL edit - /etc/sysconfig/network-scripts/ifcfg-eth0:

    - -
    BOOTPROTO=static
    -IPADDR=192.168.42.11
    -NETMASK=255.255.255.0
    -GATEWAY=192.168.42.1
    -
    - - - -
    - -
    - - -

    Add the DevStack User

    -

    OpenStack runs as a non-root user that has sudo access to root. There is nothing special - about the name, we'll use stack here. Every node must use the same name and - preferably uid. If you created a user during the OS install you can use it and give it - sudo privileges below. Otherwise create the stack user:

    -
    groupadd stack
    -useradd -g stack -s /bin/bash -d /opt/stack -m stack
    -

    This user will be making many changes to your system during installation and operation - so it needs to have sudo privileges to root without a password:

    -
    echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
    -

    From here on use the stack user. Logout and login as the - stack user.

    - -

    Set Up Ssh

    -

    Set up the stack user on each node with an ssh key for access:

    -
    mkdir ~/.ssh; chmod 700 ~/.ssh
    -echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyYjfgyPazTvGpd8OaAvtU2utL8W6gWC4JdRS1J95GhNNfQd657yO6s1AH5KYQWktcE6FO/xNUC2reEXSGC7ezy+sGO1kj9Limv5vrvNHvF1+wts0Cmyx61D2nQw35/Qz8BvpdJANL7VwP/cFI/p3yhvx2lsnjFE3hN8xRB2LtLUopUSVdBwACOVUmH2G+2BWMJDjVINd2DPqRIA4Zhy09KJ3O1Joabr0XpQL0yt/I9x8BVHdAx6l9U0tMg9dj5+tAjZvMAFfye3PJcYwwsfJoFxC8w/SLtqlFX7Ehw++8RtvomvuipLdmWCy+T9hIkl+gHYE4cS3OIqXH7f49jdJf jesse@spacey.local" > ~/.ssh/authorized_keys
    - -

    Download DevStack

    -

    Grab the latest version of DevStack:

    -
    git clone https://git.openstack.org/openstack-dev/devstack
    -cd devstack
    - -

    Up to this point all of the steps apply to each node in the cluster. From here on - there are some differences between the cluster controller (aka 'head node') and the - compute nodes.

    - -

    Configure Cluster Controller

    -

    The cluster controller runs all OpenStack services. Configure the cluster controller's DevStack in local.conf:

    -
    [[local|localrc]]
    -HOST_IP=192.168.42.11
    -FLAT_INTERFACE=eth0
    -FIXED_RANGE=10.4.128.0/20
    -FIXED_NETWORK_SIZE=4096
    -FLOATING_RANGE=192.168.42.128/25
    -MULTI_HOST=1
    -LOGFILE=/opt/stack/logs/stack.sh.log
    -ADMIN_PASSWORD=labstack
    -MYSQL_PASSWORD=supersecret
    -RABBIT_PASSWORD=supersecrete
    -SERVICE_PASSWORD=supersecrete
    -SERVICE_TOKEN=xyzpdqlazydog
    - - -

    In the multi-node configuration the first 10 or so IPs in the private subnet are usually reserved. Add this to local.sh to have it run after every stack.sh run:

    -
    for i in `seq 2 10`; do /opt/stack/nova/bin/nova-manage fixed reserve 10.4.128.$i; done
    - -

    Fire up OpenStack:

    -
    ./stack.sh
    -

    A stream of activity ensues. When complete you will see a summary of - stack.sh's work, including the relevant URLs, accounts and passwords to poke at your - shiny new OpenStack. The most recent log file is available in stack.sh.log.

    - -

    Configure Compute Nodes

    -

    The compute nodes only run the OpenStack worker services. For additional machines, create a local.conf with:

    -
    HOST_IP=192.168.42.12 # change this per compute node
    -FLAT_INTERFACE=eth0
    -FIXED_RANGE=10.4.128.0/20
    -FIXED_NETWORK_SIZE=4096
    -FLOATING_RANGE=192.168.42.128/25
    -MULTI_HOST=1
    -LOGFILE=/opt/stack/logs/stack.sh.log
    -ADMIN_PASSWORD=labstack
    -MYSQL_PASSWORD=supersecret
    -RABBIT_PASSWORD=supersecrete
    -SERVICE_PASSWORD=supersecrete
    -SERVICE_TOKEN=xyzpdqlazydog
    -DATABASE_TYPE=mysql
    -SERVICE_HOST=192.168.42.11
    -MYSQL_HOST=192.168.42.11
    -RABBIT_HOST=192.168.42.11
    -GLANCE_HOSTPORT=192.168.42.11:9292
    -ENABLED_SERVICES=n-cpu,n-net,n-api,c-sch,c-api,c-vol
    -NOVA_VNC_ENABLED=True
    -NOVNCPROXY_URL="http://192.168.42.11:6080/vnc_auto.html"
    -VNCSERVER_LISTEN=$HOST_IP
    -VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN
    -
    - - - -

    Fire up OpenStack:

    -
    ./stack.sh
    -

    A stream of activity ensues. When complete you will see a summary of - stack.sh's work, including the relevant URLs, accounts and passwords to poke at your - shiny new OpenStack. The most recent log file is available in stack.sh.log.

    - -

    Cleaning Up After DevStack

    -

    Shutting down OpenStack is now as simple as running the included unstack.sh script:

    -
    ./unstack.sh
    - -

    A more aggressive cleanup can be performed using clean.sh. It removes certain troublesome packages and attempts to leave the system in a state where changing the database or queue manager can be reliably performed. -

    ./clean.sh
    - -

    Sometimes running instances are not cleaned up. DevStack attempts to do this when it - runs but there are times it needs to still be done by hand:

    -
    sudo rm -rf /etc/libvirt/qemu/inst*
    -sudo virsh list | grep inst | awk '{print $1}' | xargs -n1 virsh destroy
    - -
    - -
    - - -

    Additional Users

    -

    DevStack creates two OpenStack users (admin and demo) and two tenants (also admin and demo). admin is exactly what it sounds like, a privileged administrative account that is a member of both the admin and demo tenants. demo is a normal user account that is only a member of the demo tenant. Creating additional OpenStack users can be done through the dashboard, sometimes it is easier to do them in bulk from a script, especially since they get blown away every time - stack.sh runs. The following steps are ripe for scripting:

    -
    # Get admin creds
    -. openrc admin admin
    -        
    -# List existing tenants
    -keystone tenant-list
    -
    -# List existing users
    -keystone user-list
    -
    -# Add a user and tenant
    -NAME=bob
    -PASSWORD=BigSecrete
    -TENANT=$NAME
    -keystone tenant-create --name=$NAME
    -keystone user-create --name=$NAME --pass=$PASSWORD
    -keystone user-role-add --user-id=<bob-user-id> --tenant-id=<bob-tenant-id> --role-id=<member-role-id>
    -# member-role-id comes from the existing member role created by stack.sh
    -# keystone role-list
    - -

    Swift

    -

    Swift requires a significant amount of resources and is disabled by default in DevStack. - The support in DevStack is geared toward a minimal installation but can be used for - testing. To implement a true multi-node test of Swift required more than DevStack provides. - Enabling it is as simple as enabling the swift service in local.conf: -

    enable_service s-proxy s-object s-container s-account
    - -

    Swift will put its data files in SWIFT_DATA_DIR (default /opt/stack/data/swift). - The size of the data 'partition' created (really a loop-mounted file) is set by - SWIFT_LOOPBACK_DISK_SIZE. The Swift config files are located in - SWIFT_CONFIG_DIR (default /etc/swift). All of these settings can be overridden in - (wait for it...) local.conf.

    - -

    Volumes

    -

    DevStack will automatically use an existing LVM volume group named stack-volumes - to store cloud-created volumes. If stack-volumes doesn't exist, DevStack - will set up a 5Gb loop-mounted file to contain it. This obviously limits the - number and size of volumes that can be created inside OpenStack. The size can be - overridden by setting VOLUME_BACKING_FILE_SIZE in local.conf.

    - -

    stack-volumes can be pre-created on any physical volume supported by - Linux's LVM. The name of the volume group can be changed by setting VOLUME_GROUP - in localrc. stack.sh deletes - all logical volumes in VOLUME_GROUP that begin with - VOLUME_NAME_PREFIX as part of cleaning up from previous runs. - It is recommended to not use the root volume group as VOLUME_GROUP.

    - -

    The details of creating the volume group depends on the server hardware involved - but looks something like this:

    -
    pvcreate /dev/sdc
    -vgcreate stack-volumes /dev/sdc
    - -

    Syslog

    -

    DevStack is capable of using rsyslog to aggregate logging across the cluster. - It is off by default; to turn it on set SYSLOG=True in local.conf. - SYSLOG_HOST defaults to HOST_IP; on the compute nodes it - must be set to the IP of the cluster controller to send syslog output there. In the example - above, add this to the compute node local.conf:

    -
    SYSLOG_HOST=192.168.42.11
    - -

    Using Alternate Repositories/Branches

    -

    The git repositories for all of the OpenStack services are defined in stackrc. - Since this file is a part of the DevStack package changes to it will probably be overwritten - as updates are applied. Every setting in stackrc can be redefined in - local.conf.

    - -

    To change the repository or branch that a particular OpenStack service is created from, - simply change the value of *_REPO or *_BRANCH corresponding to - that service.

    - -

    After making changes to the repository or branch, if RECLONE is not set - in localrc it may be necessary to remove the corresponding directory from - /opt/stack to force git to re-clone the repository.

    - -

    For example, to pull Nova from a proposed release candidate in the primary Nova - repository:

    -
    NOVA_BRANCH=rc-proposed
    - -

    To pull Glance from an experimental fork:

    -
    GLANCE_BRANCH=try-something-big
    -GLANCE_REPO=https://github.com/mcuser/glance.git
    - -
    - -
    - - -

    Reset the Bridge

    -

    How to reset the bridge configuration:

    -
    sudo brctl delif br100 eth0.926
    -sudo ip link set dev br100 down
    -sudo brctl delbr br100
    - - -

    Set MySQL Password

    -

    If you forgot to set the root password you can do this:

    -
    mysqladmin -u root -pnova password 'supersecret'
    - -
    - - - -
    - - - diff --git a/doc/source/guides/multinode-lab.rst b/doc/source/guides/multinode-lab.rst new file mode 100644 index 0000000000..c7901a21fb --- /dev/null +++ b/doc/source/guides/multinode-lab.rst @@ -0,0 +1,382 @@ +`DevStack `__ + +- `Overview <../overview.html>`__ +- `Changes <../changes.html>`__ +- `FAQ <../faq.html>`__ +- `git.openstack.org `__ +- `Gerrit `__ + +Multi-Node Lab: Serious Stuff +============================= + +Here is OpenStack in a realistic test configuration with multiple +physical servers. + +Prerequisites Linux & Network +----------------------------- + +Minimal Install +~~~~~~~~~~~~~~~ + +You need to have a system with a fresh install of Linux. You can +download the `Minimal +CD `__ for +Ubuntu releases since DevStack will download & install all the +additional dependencies. The netinstall ISO is available for +`Fedora `__ +and +`CentOS/RHEL `__. + +Install a couple of packages to bootstrap configuration: + +:: + + apt-get install -y git sudo || yum install -y git sudo + +Network Configuration +~~~~~~~~~~~~~~~~~~~~~ + +The first iteration of the lab uses OpenStack's FlatDHCP network +controller so only a single network will be required. It should be on +its own subnet without DHCP; the host IPs and floating IP pool(s) will +come out of this block. This example uses the following: + +- Gateway: 192.168.42.1 +- Physical nodes: 192.168.42.11-192.168.42.99 +- Floating IPs: 192.168.42.128-192.168.42.254 + +Configure each node with a static IP. For Ubuntu edit +``/etc/network/interfaces``: + +:: + + auto eth0 + iface eth0 inet static + address 192.168.42.11 + netmask 255.255.255.0 + gateway 192.168.42.1 + +For Fedora and CentOS/RHEL edit +``/etc/sysconfig/network-scripts/ifcfg-eth0``: + +:: + + BOOTPROTO=static + IPADDR=192.168.42.11 + NETMASK=255.255.255.0 + GATEWAY=192.168.42.1 + +Installation shake and bake +--------------------------- + +Add the DevStack User +~~~~~~~~~~~~~~~~~~~~~ + +OpenStack runs as a non-root user that has sudo access to root. There is +nothing special about the name, we'll use ``stack`` here. Every node +must use the same name and preferably uid. If you created a user during +the OS install you can use it and give it sudo privileges below. +Otherwise create the stack user: + +:: + + groupadd stack + useradd -g stack -s /bin/bash -d /opt/stack -m stack + +This user will be making many changes to your system during installation +and operation so it needs to have sudo privileges to root without a +password: + +:: + + echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers + +From here on use the ``stack`` user. **Logout** and **login** as the +``stack`` user. + +Set Up Ssh +~~~~~~~~~~ + +Set up the stack user on each node with an ssh key for access: + +:: + + mkdir ~/.ssh; chmod 700 ~/.ssh + echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyYjfgyPazTvGpd8OaAvtU2utL8W6gWC4JdRS1J95GhNNfQd657yO6s1AH5KYQWktcE6FO/xNUC2reEXSGC7ezy+sGO1kj9Limv5vrvNHvF1+wts0Cmyx61D2nQw35/Qz8BvpdJANL7VwP/cFI/p3yhvx2lsnjFE3hN8xRB2LtLUopUSVdBwACOVUmH2G+2BWMJDjVINd2DPqRIA4Zhy09KJ3O1Joabr0XpQL0yt/I9x8BVHdAx6l9U0tMg9dj5+tAjZvMAFfye3PJcYwwsfJoFxC8w/SLtqlFX7Ehw++8RtvomvuipLdmWCy+T9hIkl+gHYE4cS3OIqXH7f49jdJf jesse@spacey.local" > ~/.ssh/authorized_keys + +Download DevStack +~~~~~~~~~~~~~~~~~ + +Grab the latest version of DevStack: + +:: + + git clone https://git.openstack.org/openstack-dev/devstack + cd devstack + +Up to this point all of the steps apply to each node in the cluster. +From here on there are some differences between the cluster controller +(aka 'head node') and the compute nodes. + +Configure Cluster Controller +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The cluster controller runs all OpenStack services. Configure the +cluster controller's DevStack in ``local.conf``: + +:: + + [[local|localrc]] + HOST_IP=192.168.42.11 + FLAT_INTERFACE=eth0 + FIXED_RANGE=10.4.128.0/20 + FIXED_NETWORK_SIZE=4096 + FLOATING_RANGE=192.168.42.128/25 + MULTI_HOST=1 + LOGFILE=/opt/stack/logs/stack.sh.log + ADMIN_PASSWORD=labstack + MYSQL_PASSWORD=supersecret + RABBIT_PASSWORD=supersecrete + SERVICE_PASSWORD=supersecrete + SERVICE_TOKEN=xyzpdqlazydog + +In the multi-node configuration the first 10 or so IPs in the private +subnet are usually reserved. Add this to ``local.sh`` to have it run +after every ``stack.sh`` run: + +:: + + for i in `seq 2 10`; do /opt/stack/nova/bin/nova-manage fixed reserve 10.4.128.$i; done + +Fire up OpenStack: + +:: + + ./stack.sh + +A stream of activity ensues. When complete you will see a summary of +``stack.sh``'s work, including the relevant URLs, accounts and passwords +to poke at your shiny new OpenStack. The most recent log file is +available in ``stack.sh.log``. + +Configure Compute Nodes +~~~~~~~~~~~~~~~~~~~~~~~ + +The compute nodes only run the OpenStack worker services. For additional +machines, create a ``local.conf`` with: + +:: + + HOST_IP=192.168.42.12 # change this per compute node + FLAT_INTERFACE=eth0 + FIXED_RANGE=10.4.128.0/20 + FIXED_NETWORK_SIZE=4096 + FLOATING_RANGE=192.168.42.128/25 + MULTI_HOST=1 + LOGFILE=/opt/stack/logs/stack.sh.log + ADMIN_PASSWORD=labstack + MYSQL_PASSWORD=supersecret + RABBIT_PASSWORD=supersecrete + SERVICE_PASSWORD=supersecrete + SERVICE_TOKEN=xyzpdqlazydog + DATABASE_TYPE=mysql + SERVICE_HOST=192.168.42.11 + MYSQL_HOST=192.168.42.11 + RABBIT_HOST=192.168.42.11 + GLANCE_HOSTPORT=192.168.42.11:9292 + ENABLED_SERVICES=n-cpu,n-net,n-api,c-sch,c-api,c-vol + NOVA_VNC_ENABLED=True + NOVNCPROXY_URL="http://192.168.42.11:6080/vnc_auto.html" + VNCSERVER_LISTEN=$HOST_IP + VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN + +Fire up OpenStack: + +:: + + ./stack.sh + +A stream of activity ensues. When complete you will see a summary of +``stack.sh``'s work, including the relevant URLs, accounts and passwords +to poke at your shiny new OpenStack. The most recent log file is +available in ``stack.sh.log``. + +Cleaning Up After DevStack +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Shutting down OpenStack is now as simple as running the included +``unstack.sh`` script: + +:: + + ./unstack.sh + +A more aggressive cleanup can be performed using ``clean.sh``. It +removes certain troublesome packages and attempts to leave the system in +a state where changing the database or queue manager can be reliably +performed. + +:: + + ./clean.sh + +Sometimes running instances are not cleaned up. DevStack attempts to do +this when it runs but there are times it needs to still be done by hand: + +:: + + sudo rm -rf /etc/libvirt/qemu/inst* + sudo virsh list | grep inst | awk '{print $1}' | xargs -n1 virsh destroy + +Options pimp your stack +----------------------- + +Additional Users +~~~~~~~~~~~~~~~~ + +DevStack creates two OpenStack users (``admin`` and ``demo``) and two +tenants (also ``admin`` and ``demo``). ``admin`` is exactly what it +sounds like, a privileged administrative account that is a member of +both the ``admin`` and ``demo`` tenants. ``demo`` is a normal user +account that is only a member of the ``demo`` tenant. Creating +additional OpenStack users can be done through the dashboard, sometimes +it is easier to do them in bulk from a script, especially since they get +blown away every time ``stack.sh`` runs. The following steps are ripe +for scripting: + +:: + + # Get admin creds + . openrc admin admin + + # List existing tenants + keystone tenant-list + + # List existing users + keystone user-list + + # Add a user and tenant + NAME=bob + PASSWORD=BigSecrete + TENANT=$NAME + keystone tenant-create --name=$NAME + keystone user-create --name=$NAME --pass=$PASSWORD + keystone user-role-add --user-id= --tenant-id= --role-id= + # member-role-id comes from the existing member role created by stack.sh + # keystone role-list + +Swift +~~~~~ + +Swift requires a significant amount of resources and is disabled by +default in DevStack. The support in DevStack is geared toward a minimal +installation but can be used for testing. To implement a true multi-node +test of Swift required more than DevStack provides. Enabling it is as +simple as enabling the ``swift`` service in ``local.conf``: + +:: + + enable_service s-proxy s-object s-container s-account + +Swift will put its data files in ``SWIFT_DATA_DIR`` (default +``/opt/stack/data/swift``). The size of the data 'partition' created +(really a loop-mounted file) is set by ``SWIFT_LOOPBACK_DISK_SIZE``. The +Swift config files are located in ``SWIFT_CONFIG_DIR`` (default +``/etc/swift``). All of these settings can be overridden in (wait for +it...) ``local.conf``. + +Volumes +~~~~~~~ + +DevStack will automatically use an existing LVM volume group named +``stack-volumes`` to store cloud-created volumes. If ``stack-volumes`` +doesn't exist, DevStack will set up a 5Gb loop-mounted file to contain +it. This obviously limits the number and size of volumes that can be +created inside OpenStack. The size can be overridden by setting +``VOLUME_BACKING_FILE_SIZE`` in ``local.conf``. + +``stack-volumes`` can be pre-created on any physical volume supported by +Linux's LVM. The name of the volume group can be changed by setting +``VOLUME_GROUP`` in ``localrc``. ``stack.sh`` deletes all logical +volumes in ``VOLUME_GROUP`` that begin with ``VOLUME_NAME_PREFIX`` as +part of cleaning up from previous runs. It is recommended to not use the +root volume group as ``VOLUME_GROUP``. + +The details of creating the volume group depends on the server hardware +involved but looks something like this: + +:: + + pvcreate /dev/sdc + vgcreate stack-volumes /dev/sdc + +Syslog +~~~~~~ + +DevStack is capable of using ``rsyslog`` to aggregate logging across the +cluster. It is off by default; to turn it on set ``SYSLOG=True`` in +``local.conf``. ``SYSLOG_HOST`` defaults to ``HOST_IP``; on the compute +nodes it must be set to the IP of the cluster controller to send syslog +output there. In the example above, add this to the compute node +``local.conf``: + +:: + + SYSLOG_HOST=192.168.42.11 + +Using Alternate Repositories/Branches +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The git repositories for all of the OpenStack services are defined in +``stackrc``. Since this file is a part of the DevStack package changes +to it will probably be overwritten as updates are applied. Every setting +in ``stackrc`` can be redefined in ``local.conf``. + +To change the repository or branch that a particular OpenStack service +is created from, simply change the value of ``*_REPO`` or ``*_BRANCH`` +corresponding to that service. + +After making changes to the repository or branch, if ``RECLONE`` is not +set in ``localrc`` it may be necessary to remove the corresponding +directory from ``/opt/stack`` to force git to re-clone the repository. + +For example, to pull Nova from a proposed release candidate in the +primary Nova repository: + +:: + + NOVA_BRANCH=rc-proposed + +To pull Glance from an experimental fork: + +:: + + GLANCE_BRANCH=try-something-big + GLANCE_REPO=https://github.com/mcuser/glance.git + +Notes stuff you might need to know +---------------------------------- + +Reset the Bridge +~~~~~~~~~~~~~~~~ + +How to reset the bridge configuration: + +:: + + sudo brctl delif br100 eth0.926 + sudo ip link set dev br100 down + sudo brctl delbr br100 + +Set MySQL Password +~~~~~~~~~~~~~~~~~~ + +If you forgot to set the root password you can do this: + +:: + + mysqladmin -u root -pnova password 'supersecret' + +© Openstack Foundation 2011-2014 — An +`OpenStack `__ +`program `__ diff --git a/doc/source/guides/pxe-boot.html b/doc/source/guides/pxe-boot.html deleted file mode 100644 index d52b25f276..0000000000 --- a/doc/source/guides/pxe-boot.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - PXE Boot Server Guide - DevStack - - - - - - - - - - - - - - - - - - - - -
    -
    -

    PXE Boot Server Guide: Magic Dust for Network Boot

    -

    Boot DevStack from a PXE server to a RAM disk.

    -
    - -
    - - -

    Hardware

    -

    The whole point of this exercise is to have a highly portable boot server, so using a small router with a USB port is the desired platform. This guide uses a Buffalo WZR-HP-G300NH as an example, but it is easily generalized for other supported platforms. See openwrt.org for more.

    - -

    OpenWRT

    -

    Any recent 'Backfire' build of OpenWRT will work for the boot server project. We build from trunk and have made the images available at http://openwrt.xr7.org/openwrt.

    -
    - -
    - - -

    Install the Image

    -

    This process follows the OpenWRT doc OEM Install to tftp the new image onto the router. You need a computer to set up the router, we assume it is a recent Linux or OS/X installation.

    -
      -
    • Get openwrt-ar71xx-wzr-hp-g300nh-squashfs-tftp.bin -
      wget http://openwrt.xr7.org/openwrt/ar71xx/openwrt-ar71xx-wzr-hp-g300nh-squashfs-tftp.bin
      -
    • -
    • Connect computer to LAN port 4 (closest to WAN port)
    • -
    • Set computer interface to IP address in the 192.168.11.2
    • -
    • Add static arp entry for router -
      arp -s 192.168.11.1 <mac-address>
      -
    • -
    • Start TFTP transfer attempt -
      tftp 192.168.11.1
      -binary
      -rexmt 1
      -timeout 60
      -put openwrt-ar71xx-wzr-hp-g300nh-squashfs-tftp.bin
      -
    • -
    • Power on router. Router will reboot and initialize on 192.168.1.1.
    • -
    • Delete static arp entry for router -
      arp -d 192.168.11.1
      -
    • -
    • Set computer to DHCP, connect and telnet to router and set root password.
    • -
    - -

    Configure the Router

    -
      -
    • Update /etc/opkg.conf to point to our repo: -
      src/gz packages http://192.168.5.13/openwrt/build/ar71xx/packages
      -
    • -
    • Configure anon mounts: -
      uci delete fstab.@mount[0]
      -uci commit fstab
      -/etc/init.d/fstab restart
      -
    • -
    • Reset the DHCP address range. DevStack will claim the upper - /25 of the router's LAN address space for floating IPs so the - default DHCP address range needs to be moved: -
      uci set dhcp.lan.start=65
      -uci set dhcp.lan.limit=60
      -uci commit dhcp
      -
    • -
    • Enable TFTP: -
      uci set dhcp.@dnsmasq[0].enable_tftp=1
      -uci set dhcp.@dnsmasq[0].tftp_root=/mnt/sda1/tftpboot
      -uci set dhcp.@dnsmasq[0].dhcp_boot=pxelinux.0
      -uci commit dhcp
      -/etc/init.d/dnsmasq restart
      -
    • -
    - -

    Set Up tftpboot

    -
      -
    • Create the /tmp/tftpboot structure and populate it: -
      cd ~/devstack
      -tools/build_pxe_boot.sh /tmp
      - This calls tools/build_ramdisk.sh to create a 2GB ramdisk - containing a complete development Oneiric OS plus the - OpenStack code checkouts. -
    • -
    • Copy tftpboot to a USB drive: -
      mount /dev/sdb1 /mnt/tmp
      -rsync -a /tmp/tftpboot/ /mnt/tmp/tftpboot/
      -umount /mnt/tmp
      -
    • -
    • Plug USB drive into router. It will be automounted and is ready to serve content.
    • -
    - -

    Now return to the RAM disk Guide to kick - off your DevStack experience.

    - -
    - -
    -

    © Openstack Foundation 2011-2013 — this is not an official OpenStack project...

    -
    - -
    - - - diff --git a/doc/source/guides/pxe-boot.rst b/doc/source/guides/pxe-boot.rst new file mode 100644 index 0000000000..584e5581fd --- /dev/null +++ b/doc/source/guides/pxe-boot.rst @@ -0,0 +1,143 @@ +`DevStack `__ + +- `Overview <../overview.html>`__ +- `Changes <../changes.html>`__ +- `FAQ <../faq.html>`__ +- `git.openstack.org `__ +- `Gerrit `__ + +PXE Boot Server Guide: Magic Dust for Network Boot +================================================== + +Boot DevStack from a PXE server to a RAM disk. + +Prerequisites Hardware & OpenWRT +-------------------------------- + +Hardware +~~~~~~~~ + +The whole point of this exercise is to have a highly portable boot +server, so using a small router with a USB port is the desired platform. +This guide uses a Buffalo WZR-HP-G300NH as an example, but it is easily +generalized for other supported platforms. See openwrt.org for more. + +OpenWRT +~~~~~~~ + +Any recent 'Backfire' build of OpenWRT will work for the boot server +project. We build from trunk and have made the images available at +`http://openwrt.xr7.org/openwrt `__. + +Installation bit blasting +------------------------- + +Install the Image +~~~~~~~~~~~~~~~~~ + +This process follows `the OpenWRT doc OEM +Install `__ to tftp +the new image onto the router. You need a computer to set up the router, +we assume it is a recent Linux or OS/X installation. + +- Get openwrt-ar71xx-wzr-hp-g300nh-squashfs-tftp.bin + + :: + + wget http://openwrt.xr7.org/openwrt/ar71xx/openwrt-ar71xx-wzr-hp-g300nh-squashfs-tftp.bin + +- Connect computer to LAN port 4 (closest to WAN port) +- Set computer interface to IP address in the 192.168.11.2 +- Add static arp entry for router + + :: + + arp -s 192.168.11.1 + +- Start TFTP transfer attempt + + :: + + tftp 192.168.11.1 + binary + rexmt 1 + timeout 60 + put openwrt-ar71xx-wzr-hp-g300nh-squashfs-tftp.bin + +- Power on router. Router will reboot and initialize on 192.168.1.1. +- Delete static arp entry for router + + :: + + arp -d 192.168.11.1 + +- Set computer to DHCP, connect and telnet to router and set root + password. + +Configure the Router +~~~~~~~~~~~~~~~~~~~~ + +- Update ``/etc/opkg.conf`` to point to our repo: + + :: + + src/gz packages http://192.168.5.13/openwrt/build/ar71xx/packages + +- Configure anon mounts: + + :: + + uci delete fstab.@mount[0] + uci commit fstab + /etc/init.d/fstab restart + +- Reset the DHCP address range. DevStack will claim the upper /25 of + the router's LAN address space for floating IPs so the default DHCP + address range needs to be moved: + + :: + + uci set dhcp.lan.start=65 + uci set dhcp.lan.limit=60 + uci commit dhcp + +- Enable TFTP: + + :: + + uci set dhcp.@dnsmasq[0].enable_tftp=1 + uci set dhcp.@dnsmasq[0].tftp_root=/mnt/sda1/tftpboot + uci set dhcp.@dnsmasq[0].dhcp_boot=pxelinux.0 + uci commit dhcp + /etc/init.d/dnsmasq restart + +Set Up tftpboot +~~~~~~~~~~~~~~~ + +- Create the ``/tmp/tftpboot`` structure and populate it: + + :: + + cd ~/devstack + tools/build_pxe_boot.sh /tmp + + This calls ``tools/build_ramdisk.sh`` to create a 2GB ramdisk + containing a complete development Oneiric OS plus the OpenStack code + checkouts. + +- Copy ``tftpboot`` to a USB drive: + + :: + + mount /dev/sdb1 /mnt/tmp + rsync -a /tmp/tftpboot/ /mnt/tmp/tftpboot/ + umount /mnt/tmp + +- Plug USB drive into router. It will be automounted and is ready to + serve content. + +Now `return `__ to the RAM disk Guide to kick off your +DevStack experience. + +© Openstack Foundation 2011-2013 — this is not an official OpenStack +project... diff --git a/doc/source/guides/ramdisk.html b/doc/source/guides/ramdisk.html deleted file mode 100644 index 23239e2b60..0000000000 --- a/doc/source/guides/ramdisk.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - RAMdisk Boot Guide - DevStack - - - - - - - - - - - - - - - - - - - - -
    -
    -

    Stack-in-a-Box: Try before you mkfs

    -

    Run DevStack from a RAM disk to give it a whirl before making the - commitment to install it. We'll cover booting from a USB drive or - over the network via PXE. We'll even thow in configuring a home - router to handle the PXE boot. You will need a minimum of 3GB - for both of these configurations as the RAM disk itself is 2GB.

    -
    - -
    - - -

    USB Boot

    -

    This guide covers the creation of a bootable USB drive. Your - computer BIOS must support booting from USB.

    - -

    PXE Boot

    -

    This guide covers the installation of OpenWRT on a home router - and configuring it as a PXE server, plus the creation of the - boot images and PXE support files. -

    - -
    - - -

    Install DevStack

    -

    Grab the latest version of DevStack via https:

    -
    sudo apt-get install git -y
    -git clone https://git.openstack.org/openstack-dev/devstack
    -cd devstack
    - -

    Prepare the Boot RAMdisk

    -

    Pick your boot method and follow the guide to prepare to build - the RAM disk and set up the boot process:

    - - -

    Fire It Up

    -
      -
    • Boot the computer into the RAM disk. The details will vary from - machine to machine but most BIOSes have a method to select the - boot device, often by pressing F12 during POST.
    • -
    • Select 'DevStack' from the Boot Menu.
    • -
    • Log in with the 'stack' user and 'pass' password.
    • -
    • Create devstack/localrc if you wish to change any - of the configuration variables. You will probably want to at - least set the admin login password to something memorable rather - than the default 20 random characters: -
      ADMIN_PASSWORD=openstack
      -
    • -
    • Fire up OpenStack! -
      ./run.sh
      -
    • -
    • See the processes running in screen: -
      screen -x
      -
    • -
    • Connect to the dashboard at http://<ip-address>/
    • -
    - -
    - -
    -

    © Openstack Foundation 2011-2013 — this is not an official OpenStack project...

    -
    - -
    - - - diff --git a/doc/source/guides/ramdisk.rst b/doc/source/guides/ramdisk.rst new file mode 100644 index 0000000000..82147a8c1b --- /dev/null +++ b/doc/source/guides/ramdisk.rst @@ -0,0 +1,89 @@ +`DevStack `__ + +- `Overview <../overview.html>`__ +- `Changes <../changes.html>`__ +- `FAQ <../faq.html>`__ +- `git.openstack.org `__ +- `Gerrit `__ + +Stack-in-a-Box: Try before you mkfs +=================================== + +Run DevStack from a RAM disk to give it a whirl before making the +commitment to install it. We'll cover booting from a USB drive or over +the network via PXE. We'll even thow in configuring a home router to +handle the PXE boot. You will need a minimum of 3GB for both of these +configurations as the RAM disk itself is 2GB. + +Prerequisites Hardware +---------------------- + +USB Boot +~~~~~~~~ + +`This guide `__ covers the creation of a bootable USB +drive. Your computer BIOS must support booting from USB. + +PXE Boot +~~~~~~~~ + +`This guide `__ covers the installation of OpenWRT on a +home router and configuring it as a PXE server, plus the creation of the +boot images and PXE support files. + +Installation bit blasting +------------------------- + +Install DevStack +~~~~~~~~~~~~~~~~ + +Grab the latest version of DevStack via https: + +:: + + sudo apt-get install git -y + git clone https://git.openstack.org/openstack-dev/devstack + cd devstack + +Prepare the Boot RAMdisk +~~~~~~~~~~~~~~~~~~~~~~~~ + +Pick your boot method and follow the guide to prepare to build the RAM +disk and set up the boot process: + +- `USB boot `__ +- `PXE boot `__ + +Fire It Up +~~~~~~~~~~ + +- Boot the computer into the RAM disk. The details will vary from + machine to machine but most BIOSes have a method to select the boot + device, often by pressing F12 during POST. +- Select 'DevStack' from the Boot Menu. +- Log in with the 'stack' user and 'pass' password. +- Create ``devstack/localrc`` if you wish to change any of the + configuration variables. You will probably want to at least set the + admin login password to something memorable rather than the default + 20 random characters: + + :: + + ADMIN_PASSWORD=openstack + +- Fire up OpenStack! + + :: + + ./run.sh + +- See the processes running in screen: + + :: + + screen -x + +- Connect to the dashboard at ``http:///`` + +© Openstack Foundation 2011-2013 — this is not an official OpenStack +project... diff --git a/doc/source/guides/single-machine.html b/doc/source/guides/single-machine.html deleted file mode 100644 index 06cc981275..0000000000 --- a/doc/source/guides/single-machine.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - Single Machine Guide - DevStack - - - - - - - - - - - - - - - - - - - - -
    -
    -

    All-In-One: Dedicated Hardware

    -

    Things are about to get real! Using OpenStack in containers or VMs is nice for kicking the tires, but doesn't compare to the feeling you get with hardware.

    -
    - -
    - - -

    Minimal Install

    -

    You need to have a system with a fresh install of Linux. You can download the Minimal CD for Ubuntu releases since DevStack will download & install all the additional dependencies. The netinstall ISO is available for Fedora and CentOS/RHEL. You may be tempted to use a desktop distro on a laptop, it will probably work but you may need to tell Network Manager to keep its fingers off the interface(s) that OpenStack uses for bridging.

    - -

    Network Configuration

    -

    Determine the network configuration on the interface used to integrate your - OpenStack cloud with your existing network. For example, if the IPs given out on your network - by DHCP are 192.168.1.X - where X is between 100 and 200 you will be able to use IPs - 201-254 for floating ips.

    -

    To make things easier later change your host to use a static IP instead of DHCP (i.e. 192.168.1.201).

    -
    - -
    - - -

    Add your user

    -

    We need to add a user to install DevStack. (if you created a user during install you can skip this step and just give the user sudo privileges below)

    -
    adduser stack
    -

    Since this user will be making many changes to your system, it will need to have sudo privileges:

    -
    apt-get install sudo -y || yum install -y sudo
    -echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
    -

    From here on you should use the user you created. Logout and login as that user.

    - -

    Download DevStack

    -

    We'll grab the latest version of DevStack via https:

    -
    sudo apt-get install git -y || yum install -y git
    -git clone https://git.openstack.org/openstack-dev/devstack
    -cd devstack
    - -

    Run DevStack

    -

    Now to configure stack.sh. DevStack includes a sample in devstack/samples/local.conf. Create local.conf as shown below to do the following:

    -
      -
    • Set FLOATING_RANGE to a range not used on the local network, i.e. 192.168.1.224/27. This configures IP addresses ending in 225-254 to be used as floating IPs.
    • -
    • Set FIXED_RANGE and FIXED_NETWORK_SIZE to configure the internal address space used by the instances.
    • -
    • Set FLAT_INTERFACE to the Ethernet interface that connects the host to your local network. This is the interface that should be configured with the static IP address mentioned above.
    • -
    • Set the administrative password. This password is used for the admin and demo accounts set up as OpenStack users.
    • -
    • Set the MySQL administrative password. The default here is a random hex string which is inconvenient if you need to look at the database directly for anything.
    • -
    • Set the RabbitMQ password.
    • -
    • Set the service password. This is used by the OpenStack services (Nova, Glance, etc) to authenticate with Keystone.
    • -
    -

    local.conf should look something like this:

    -
    [[local|localrc]]
    -FLOATING_RANGE=192.168.1.224/27
    -FIXED_RANGE=10.11.12.0/24
    -FIXED_NETWORK_SIZE=256
    -FLAT_INTERFACE=eth0
    -ADMIN_PASSWORD=supersecret
    -MYSQL_PASSWORD=iheartdatabases
    -RABBIT_PASSWORD=flopsymopsy
    -SERVICE_PASSWORD=iheartksl
    - -

    Run DevStack:

    -
    ./stack.sh
    -

    A seemingly endless stream of activity ensues. When complete you will see a summary of - stack.sh's work, including the relevant URLs, accounts and passwords to poke at your - shiny new OpenStack.

    - -

    Using OpenStack

    -

    At this point you should be able to access the dashboard from other computers on the - local network. In this example that would be http://192.168.1.201/ for the dashboard (aka Horizon). - Launch VMs and if you give them floating IPs and security group access those VMs will be accessible from other machines on your network.

    - -

    Some examples of using the OpenStack command-line clients nova and glance - are in the shakedown scripts in devstack/exercises. exercise.sh - will run all of those scripts and report on the results.

    - -
    - - - -
    - - - diff --git a/doc/source/guides/single-machine.rst b/doc/source/guides/single-machine.rst new file mode 100644 index 0000000000..0db0466281 --- /dev/null +++ b/doc/source/guides/single-machine.rst @@ -0,0 +1,145 @@ +`DevStack `__ + +- `Overview <../overview.html>`__ +- `Changes <../changes.html>`__ +- `FAQ <../faq.html>`__ +- `git.openstack.org `__ +- `Gerrit `__ + +All-In-One: Dedicated Hardware +============================== + +Things are about to get real! Using OpenStack in containers or VMs is +nice for kicking the tires, but doesn't compare to the feeling you get +with hardware. + +Prerequisites Linux & Network +----------------------------- + +Minimal Install +~~~~~~~~~~~~~~~ + +You need to have a system with a fresh install of Linux. You can +download the `Minimal +CD `__ for +Ubuntu releases since DevStack will download & install all the +additional dependencies. The netinstall ISO is available for +`Fedora `__ +and +`CentOS/RHEL `__. +You may be tempted to use a desktop distro on a laptop, it will probably +work but you may need to tell Network Manager to keep its fingers off +the interface(s) that OpenStack uses for bridging. + +Network Configuration +~~~~~~~~~~~~~~~~~~~~~ + +Determine the network configuration on the interface used to integrate +your OpenStack cloud with your existing network. For example, if the IPs +given out on your network by DHCP are 192.168.1.X - where X is between +100 and 200 you will be able to use IPs 201-254 for **floating ips**. + +To make things easier later change your host to use a static IP instead +of DHCP (i.e. 192.168.1.201). + +Installation shake and bake +--------------------------- + +Add your user +~~~~~~~~~~~~~ + +We need to add a user to install DevStack. (if you created a user during +install you can skip this step and just give the user sudo privileges +below) + +:: + + adduser stack + +Since this user will be making many changes to your system, it will need +to have sudo privileges: + +:: + + apt-get install sudo -y || yum install -y sudo + echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers + +From here on you should use the user you created. **Logout** and +**login** as that user. + +Download DevStack +~~~~~~~~~~~~~~~~~ + +We'll grab the latest version of DevStack via https: + +:: + + sudo apt-get install git -y || yum install -y git + git clone https://git.openstack.org/openstack-dev/devstack + cd devstack + +Run DevStack +~~~~~~~~~~~~ + +Now to configure ``stack.sh``. DevStack includes a sample in +``devstack/samples/local.conf``. Create ``local.conf`` as shown below to +do the following: + +- Set ``FLOATING_RANGE`` to a range not used on the local network, i.e. + 192.168.1.224/27. This configures IP addresses ending in 225-254 to + be used as floating IPs. +- Set ``FIXED_RANGE`` and ``FIXED_NETWORK_SIZE`` to configure the + internal address space used by the instances. +- Set ``FLAT_INTERFACE`` to the Ethernet interface that connects the + host to your local network. This is the interface that should be + configured with the static IP address mentioned above. +- Set the administrative password. This password is used for the + **admin** and **demo** accounts set up as OpenStack users. +- Set the MySQL administrative password. The default here is a random + hex string which is inconvenient if you need to look at the database + directly for anything. +- Set the RabbitMQ password. +- Set the service password. This is used by the OpenStack services + (Nova, Glance, etc) to authenticate with Keystone. + +``local.conf`` should look something like this: + +:: + + [[local|localrc]] + FLOATING_RANGE=192.168.1.224/27 + FIXED_RANGE=10.11.12.0/24 + FIXED_NETWORK_SIZE=256 + FLAT_INTERFACE=eth0 + ADMIN_PASSWORD=supersecret + MYSQL_PASSWORD=iheartdatabases + RABBIT_PASSWORD=flopsymopsy + SERVICE_PASSWORD=iheartksl + +Run DevStack: + +:: + + ./stack.sh + +A seemingly endless stream of activity ensues. When complete you will +see a summary of ``stack.sh``'s work, including the relevant URLs, +accounts and passwords to poke at your shiny new OpenStack. + +Using OpenStack +~~~~~~~~~~~~~~~ + +At this point you should be able to access the dashboard from other +computers on the local network. In this example that would be +http://192.168.1.201/ for the dashboard (aka Horizon). Launch VMs and if +you give them floating IPs and security group access those VMs will be +accessible from other machines on your network. + +Some examples of using the OpenStack command-line clients ``nova`` and +``glance`` are in the shakedown scripts in ``devstack/exercises``. +``exercise.sh`` will run all of those scripts and report on the results. + +© Openstack Foundation 2011-2013 — An `OpenStack +program `__ created by +`Rackspace Cloud +Builders `__ diff --git a/doc/source/guides/single-vm.html b/doc/source/guides/single-vm.html deleted file mode 100644 index d189319623..0000000000 --- a/doc/source/guides/single-vm.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - Single Machine Guide - DevStack - - - - - - - - - - - - - - - - - - - - -
    -
    -

    Running a Cloud in a VM

    -

    Use the cloud to build the cloud! Use your cloud to launch new versions of OpenStack - in about 5 minutes. When you break it, start over! The VMs launched in the cloud will - be slow as they are running in QEMU (emulation), but their primary use is testing - OpenStack development and operation. Speed not required.

    -
    - -
    - - -

    Virtual Machine

    -

    DevStack should run in any virtual machine running a supported Linux release. It will perform best with 2Gb or more of RAM.

    - -

    OpenStack Deployment & cloud-init

    -

    If the cloud service has an image with cloud-init pre-installed, use it. You can - get one from Ubuntu's Daily Build - site if necessary. This will enable you to launch VMs with userdata that installs - everything at boot time. The userdata script below will install and run - DevStack with a minimal configuration. The use of cloud-init - is outside the scope of this document, refer to the - cloud-init docs for more information.

    - -

    If you are directly using a hypervisor like Xen, kvm or VirtualBox you can manually kick off - the script below as a non-root user in a bare-bones server installation.

    -
    - -
    - - -

    Launching With Cloud-Init

    -

    This cloud config grabs the latest version of DevStack via git, creates a minimal - local.conf file and kicks off stack.sh. It should - be passed as the user-data file when booting the VM.

    -
    #cloud-config
    -
    -users:
    -  - default
    -  - name: stack
    -    lock_passwd: False
    -    sudo: ["ALL=(ALL) NOPASSWD:ALL\nDefaults:stack !requiretty"]
    -    shell: /bin/bash
    -
    -write_files:
    -  - content: |
    -        #!/bin/sh
    -        DEBIAN_FRONTEND=noninteractive sudo apt-get -qqy update || sudo yum update -qy
    -        DEBIAN_FRONTEND=noninteractive sudo apt-get install -qqy git || sudo yum install -qy git
    -        sudo chown stack:stack /home/stack
    -        cd /home/stack
    -        git clone https://git.openstack.org/openstack-dev/devstack
    -        cd devstack
    -        echo '[[local|localrc]]' > local.conf
    -        echo ADMIN_PASSWORD=password >> local.conf
    -        echo MYSQL_PASSWORD=password >> local.conf
    -        echo RABBIT_PASSWORD=password >> local.conf
    -        echo SERVICE_PASSWORD=password >> local.conf
    -        echo SERVICE_TOKEN=tokentoken >> local.conf
    -        ./stack.sh
    -    path: /home/stack/start.sh
    -    permissions: 0755
    -
    -runcmd:
    -  - su -l stack ./start.sh
    -

    As DevStack will refuse to run as root, this configures cloud-init - to create a non-root user and run the start.sh script as that user.

    - -

    Launching By Hand

    -

    Using a hypervisor directly, launch the VM and either manually perform the steps in the - embedded shell script above or copy it into the VM.

    - -

    Using OpenStack

    -

    At this point you should be able to access the dashboard. Launch VMs and if you give them floating IPs access those VMs from other machines on your network.

    - -

    One interesting use case is for developers working on a VM on their laptop. Once - stack.sh has completed once, all of the pre-requisite packages are installed - in the VM and the source trees checked out. Setting OFFLINE=True in - local.conf enables stack.sh to run multiple times without an Internet - connection. DevStack, making hacking at the lake possible since 2012!

    -
    - - - -
    - - - diff --git a/doc/source/guides/single-vm.rst b/doc/source/guides/single-vm.rst new file mode 100644 index 0000000000..0e2d1573aa --- /dev/null +++ b/doc/source/guides/single-vm.rst @@ -0,0 +1,110 @@ +`DevStack `__ + +- `Overview <../overview.html>`__ +- `Changes <../changes.html>`__ +- `FAQ <../faq.html>`__ +- `git.openstack.org `__ +- `Gerrit `__ + +Running a Cloud in a VM +======================= + +Use the cloud to build the cloud! Use your cloud to launch new versions +of OpenStack in about 5 minutes. When you break it, start over! The VMs +launched in the cloud will be slow as they are running in QEMU +(emulation), but their primary use is testing OpenStack development and +operation. Speed not required. + +Prerequisites Cloud & Image +--------------------------- + +Virtual Machine +~~~~~~~~~~~~~~~ + +DevStack should run in any virtual machine running a supported Linux +release. It will perform best with 2Gb or more of RAM. + +OpenStack Deployment & cloud-init +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If the cloud service has an image with ``cloud-init`` pre-installed, use +it. You can get one from `Ubuntu's Daily +Build `__ site if necessary. This will +enable you to launch VMs with userdata that installs everything at boot +time. The userdata script below will install and run DevStack with a +minimal configuration. The use of ``cloud-init`` is outside the scope of +this document, refer to the ``cloud-init`` docs for more information. + +If you are directly using a hypervisor like Xen, kvm or VirtualBox you +can manually kick off the script below as a non-root user in a +bare-bones server installation. + +Installation shake and bake +--------------------------- + +Launching With Cloud-Init +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This cloud config grabs the latest version of DevStack via git, creates +a minimal ``local.conf`` file and kicks off ``stack.sh``. It should be +passed as the user-data file when booting the VM. + +:: + + #cloud-config + + users: + - default + - name: stack + lock_passwd: False + sudo: ["ALL=(ALL) NOPASSWD:ALL\nDefaults:stack !requiretty"] + shell: /bin/bash + + write_files: + - content: | + #!/bin/sh + DEBIAN_FRONTEND=noninteractive sudo apt-get -qqy update || sudo yum update -qy + DEBIAN_FRONTEND=noninteractive sudo apt-get install -qqy git || sudo yum install -qy git + sudo chown stack:stack /home/stack + cd /home/stack + git clone https://git.openstack.org/openstack-dev/devstack + cd devstack + echo '[[local|localrc]]' > local.conf + echo ADMIN_PASSWORD=password >> local.conf + echo MYSQL_PASSWORD=password >> local.conf + echo RABBIT_PASSWORD=password >> local.conf + echo SERVICE_PASSWORD=password >> local.conf + echo SERVICE_TOKEN=tokentoken >> local.conf + ./stack.sh + path: /home/stack/start.sh + permissions: 0755 + + runcmd: + - su -l stack ./start.sh + +As DevStack will refuse to run as root, this configures ``cloud-init`` +to create a non-root user and run the ``start.sh`` script as that user. + +Launching By Hand +~~~~~~~~~~~~~~~~~ + +Using a hypervisor directly, launch the VM and either manually perform +the steps in the embedded shell script above or copy it into the VM. + +Using OpenStack +~~~~~~~~~~~~~~~ + +At this point you should be able to access the dashboard. Launch VMs and +if you give them floating IPs access those VMs from other machines on +your network. + +One interesting use case is for developers working on a VM on their +laptop. Once ``stack.sh`` has completed once, all of the pre-requisite +packages are installed in the VM and the source trees checked out. +Setting ``OFFLINE=True`` in ``local.conf`` enables ``stack.sh`` to run +multiple times without an Internet connection. DevStack, making hacking +at the lake possible since 2012! + +© Openstack Foundation 2011-2014 — An +`OpenStack `__ +`program `__ diff --git a/doc/source/guides/usb-boot.html b/doc/source/guides/usb-boot.html deleted file mode 100644 index 2a05f89d89..0000000000 --- a/doc/source/guides/usb-boot.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - USB Boot Server Guide - DevStack - - - - - - - - - - - - - - - - - - - - -
    -
    -

    USB Boot: Undoable Stack Boot

    -

    Boot DevStack from a USB disk into a RAM disk.

    -
    - -
    - - -

    Hardware

    -

    This guide covers the creation of a bootable USB drive. Your - computer BIOS must support booting from USB and You will want at least 3GB of - RAM. You also will need a USB drive of at least 2GB.

    - -

    Software

    -

    Ubuntu 11.10 (Oneiric Ocelot) is required on host to create images.

    -
    - -
    - - -

    Set Up USB Drive

    -
      -
    • Insert the USB drive into the computer. Make a note of the device name, such as - sdb. Do not mount the device.
    • -
    • Install the boot system: -
      tools/build_usb_boot.sh /dev/sdb1
      -

      This calls tools/build_ramdisk.sh to create a 2GB ramdisk - containing a complete development Oneiric OS plus the - OpenStack code checkouts. It then writes a syslinux boot sector - to the specified device and creates /syslinux.

      -
    • -
    • If desired, you may now mount the device: -
      mount /dev/sdb1 /mnt/tmp
      -# foo
      -umount /mnt/tmp
      -
    • -
    - -

    Now return to the RAM disk Guide to kick - off your DevStack experience.

    - -
    - -
    -

    © Openstack Foundation 2011-2013 — this is not an official OpenStack project...

    -
    - -
    - - - diff --git a/doc/source/guides/usb-boot.rst b/doc/source/guides/usb-boot.rst new file mode 100644 index 0000000000..888e14feb3 --- /dev/null +++ b/doc/source/guides/usb-boot.rst @@ -0,0 +1,60 @@ +`DevStack `__ + +- `Overview <../overview.html>`__ +- `Changes <../changes.html>`__ +- `FAQ <../faq.html>`__ +- `git.openstack.org `__ +- `Gerrit `__ + +USB Boot: Undoable Stack Boot +============================= + +Boot DevStack from a USB disk into a RAM disk. + +Prerequisites +------------- + +Hardware +~~~~~~~~ + +This guide covers the creation of a bootable USB drive. Your computer +BIOS must support booting from USB and You will want at least 3GB of +RAM. You also will need a USB drive of at least 2GB. + +Software +~~~~~~~~ + +Ubuntu 11.10 (Oneiric Ocelot) is required on host to create images. + +Installation bit blasting +------------------------- + +Set Up USB Drive +~~~~~~~~~~~~~~~~ + +- Insert the USB drive into the computer. Make a note of the device + name, such as ``sdb``. Do not mount the device. +- Install the boot system: + + :: + + tools/build_usb_boot.sh /dev/sdb1 + + This calls tools/build\_ramdisk.sh to create a 2GB ramdisk containing + a complete development Oneiric OS plus the OpenStack code checkouts. + It then writes a syslinux boot sector to the specified device and + creates ``/syslinux``. + +- If desired, you may now mount the device: + + :: + + mount /dev/sdb1 /mnt/tmp + # foo + umount /mnt/tmp + +Now `return `__ to the RAM disk Guide to kick off your +DevStack experience. + +© Openstack Foundation 2011-2013 — this is not an official OpenStack +project... diff --git a/doc/source/index.html b/doc/source/index.html deleted file mode 100644 index 5f1efd77fb..0000000000 --- a/doc/source/index.html +++ /dev/null @@ -1,562 +0,0 @@ - - - - - DevStack - Deploying OpenStack for Developers - - - - - - - - - - - - - - - - - - - - -
    - -
    -
    -

    DevStack - an OpenStack Community Production

    -
    -

    -

    A documented shell script to build complete OpenStack development environments.

    - An OpenStack program maintained by the developer community.

    -
    -
    -
    -
      -
    1. Setup a fresh supported Linux installation.
    2. -
    3. - Clone devstack from git.openstack.org. -
      git clone https://git.openstack.org/openstack-dev/devstack
      -
    4. -
    5. - Deploy your OpenStack Cloud -
      cd devstack && ./stack.sh
      -
    6. -
    -
    -
     
    -
    - - -
    - -
      -
    1. -

      Select a Linux Distribution

      -

      Only Ubuntu 14.04 (Trusty), Fedora 20 and CentOS/RHEL 6.5 are documented here. OpenStack also runs and is packaged on other flavors of Linux such as OpenSUSE and Debian.

      -
    2. -
    3. -

      Install Selected OS

      -

      In order to correctly install all the dependencies, we assume a specific minimal version of the supported distributions to make it as easy as possible. We recommend using a minimal install of Ubuntu or Fedora server in a VM if this is your first time.

      -
    4. -
    5. -

      Download DevStack

      -
      git clone https://git.openstack.org/openstack-dev/devstack
      -

      The devstack repo contains a script that installs OpenStack and templates for configuration files

      -
    6. -
    7. -

      Configure

      -

      We recommend at least a minimal configuration be set up.

      -
    8. -
    9. -

      Start the install

      -
      cd devstack; ./stack.sh
      -

      It takes a few minutes, we recommend reading the script while it is building.

      -
    10. -
    -
    - -
    - - -
    -

    OpenStack on VMs

    - - - - - - - - - - - - - - - - - - - - -
    TitleDescriptionLink
    Virtual MachineRun OpenStack in a VM. The VMs launched in your cloud will be slow as they are running in QEMU (emulation), but it is useful if you don't have spare hardware laying around.Read »
    1 Guide
    -
    -
    -

    What is this?

    -

    These guides tell you how to virtualize your OpenStack cloud in virtual machines. This means that you can get started without having to purchase any hardware.

    -
    - -
    -

    OpenStack on Hardware

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TitleDescriptionLink
    All-In-OneRun OpenStack on dedicated hardware to get real performance in your VMs. This can include a server-class machine or a laptop at home.Read »
    Multi-Node + VLANsSetup a multi-node cluster with dedicated VLANs for VMs & Management.Read »
    2 Guides
    -
    -
    -

    What is this?

    -

    These guides tell you how to deploy a development environment on real hardware. Guides range from running OpenStack on a single laptop to running a multi-node deployment on datacenter hardware.

    -
    - -
    - -
    - - - - - - -
    - -
    - - -
    -

    Scripts Generated documentation of DevStack scripts.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FilenameLink
    stack.shRead »
    functionsRead »
    functions-commonRead »
    lib/apacheRead »
    lib/baremetalRead »
    lib/ceilometerRead »
    lib/cinderRead »
    lib/configRead »
    lib/databaseRead »
    lib/glanceRead »
    lib/heatRead »
    lib/horizonRead »
    lib/infraRead »
    lib/ironicRead »
    lib/keystoneRead »
    lib/ldapRead »
    lib/zaqarRead »
    lib/neutronRead »
    lib/novaRead »
    lib/osloRead »
    lib/rpc_backendRead »
    lib/saharaRead »
    lib/savannaRead »
    lib/stackforgeRead »
    lib/swiftRead »
    lib/tempestRead »
    lib/tlsRead »
    lib/troveRead »
    unstack.shRead »
    clean.shRead »
    run_tests.shRead »
    extras.d/50-ironic.shRead »
    extras.d/70-zaqar.shRead »
    extras.d/70-sahara.shRead »
    extras.d/70-savanna.shRead »
    extras.d/70-trove.shRead »
    extras.d/80-opendaylight.shRead »
    extras.d/80-tempest.shRead »
    -
    - -
    -

    Configuration Setting the table

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FilenameLink
    local.confRead »
    stackrcRead »
    openrcRead »
    exercisercRead »
    eucarcRead »
    - -

    Tools Support scripts

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FilenameLink
    tools/info.shRead »
    tools/build_docs.shRead »
    tools/create_userrc.shRead »
    tools/fixup_stuff.shRead »
    tools/install_prereqs.shRead »
    tools/install_pip.shRead »
    tools/upload_image.shRead »
    - -

    Samples Generated documentation of DevStack sample files.

    - - - - - - - - - - - - - - - - - -
    FilenameLink
    local.shRead »
    localrcRead »
    - -
    -

    Exercises Generated documentation of DevStack scripts.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FilenameLink
    exercise.shRead »
    exercises/aggregates.shRead »
    exercises/boot_from_volume.shRead »
    exercises/bundle.shRead »
    exercises/client-args.shRead »
    exercises/client-env.shRead »
    exercises/euca.shRead »
    exercises/floating_ips.shRead »
    exercises/horizon.shRead »
    exercises/neutron-adv-test.shRead »
    exercises/sahara.shRead »
    exercises/savanna.shRead »
    exercises/sec_groups.shRead »
    exercises/swift.shRead »
    exercises/trove.shRead »
    exercises/volumes.shRead »
    exercises/zaqar.shRead »
    - -
    - -
    - - - -
    - - diff --git a/doc/source/index.rst b/doc/source/index.rst new file mode 100644 index 0000000000..6e5105dcff --- /dev/null +++ b/doc/source/index.rst @@ -0,0 +1,383 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +.. toctree:: + :glob: + :maxdepth: 2 + + * + guides/* + + + +DevStack - an OpenStack Community Production +============================================ + +| A documented shell script to build complete OpenStack development environments. +| An OpenStack program maintained by the developer community. + +#. Setup a fresh supported Linux installation. +#. Clone devstack from git.openstack.org. + + :: + + git clone https://git.openstack.org/openstack-dev/devstack + +#. Deploy your OpenStack Cloud + + :: + + cd devstack && ./stack.sh + +  + +Quick Start This ain't your first rodeo +--------------------------------------- + +#. Select a Linux Distribution + + Only Ubuntu 14.04 (Trusty), Fedora 20 and CentOS/RHEL 6.5 are + documented here. OpenStack also runs and is packaged on other flavors + of Linux such as OpenSUSE and Debian. + +#. Install Selected OS + + In order to correctly install all the dependencies, we assume a + specific minimal version of the supported distributions to make it as + easy as possible. We recommend using a minimal install of Ubuntu or + Fedora server in a VM if this is your first time. + +#. Download DevStack + + :: + + git clone https://git.openstack.org/openstack-dev/devstack + + The ``devstack`` repo contains a script that installs OpenStack and + templates for configuration files + +#. Configure + + We recommend at least a `minimal + configuration `__ be set up. + +#. Start the install + + :: + + cd devstack; ./stack.sh + + It takes a few minutes, we recommend `reading the + script `__ while it is building. + +Guides Walk through various setups used by stackers +--------------------------------------------------- + +OpenStack on VMs +---------------- + +Title + +Description + +Link + +Virtual Machine + +Run OpenStack in a VM. The VMs launched in your cloud will be slow as +they are running in QEMU (emulation), but it is useful if you don't have +spare hardware laying around. + +`Read » `__ + +1 Guide + +What is this? +^^^^^^^^^^^^^ + +These guides tell you how to virtualize your OpenStack cloud in virtual +machines. This means that you can get started without having to purchase +any hardware. + +OpenStack on Hardware +--------------------- + +Title + +Description + +Link + +All-In-One + +Run OpenStack on dedicated hardware to get real performance in your VMs. +This can include a server-class machine or a laptop at home. + +`Read » `__ + +Multi-Node + VLANs + +Setup a multi-node cluster with dedicated VLANs for VMs & Management. + +`Read » `__ + +2 Guides + +What is this? +^^^^^^^^^^^^^ + +These guides tell you how to deploy a development environment on real +hardware. Guides range from running OpenStack on a single laptop to +running a multi-node deployment on datacenter hardware. + +Documentation Help yourself to stack +------------------------------------ + +Overview +-------- + +`An overview of DevStack goals and priorities `__ + +Configuration +------------- + +`Configuring and customizing the stack `__ + +Plugins +------- + +`Extending DevStack with new features `__ + +Recent Changes +-------------- + +`An incomplete summary of recent changes `__ + +FAQ +--- + +`The DevStack FAQ `__ + +Contributing +------------ + +`Pitching in to make DevStack a better place `__ + +Code A look at the bits that make it all go +------------------------------------------- + +Scripts Generated documentation of DevStack scripts. +---------------------------------------------------- + ++-------------------------------+----------------------------------------------+ +| Filename | Link | ++===============================+==============================================+ +| stack.sh | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| functions | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| functions-common | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/apache | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/baremetal | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/ceilometer | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/cinder | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/config | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/database | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/glance | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/heat | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/horizon | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/infra | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/ironic | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/keystone | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/ldap | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/zaqar | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/neutron | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/nova | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/oslo | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/rpc\_backend | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/sahara | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/savanna | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/stackforge | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/swift | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/tempest | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/tls | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| lib/trove | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| unstack.sh | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| clean.sh | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| run\_tests.sh | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| extras.d/50-ironic.sh | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| extras.d/70-zaqar.sh | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| extras.d/70-sahara.sh | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| extras.d/70-savanna.sh | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| extras.d/70-trove.sh | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| extras.d/80-opendaylight.sh | `Read » `__ | ++-------------------------------+----------------------------------------------+ +| extras.d/80-tempest.sh | `Read » `__ | ++-------------------------------+----------------------------------------------+ + +Configuration Setting the table +------------------------------- + ++--------------+--------------------------------+ +| Filename | Link | ++==============+================================+ +| local.conf | `Read » `__ | ++--------------+--------------------------------+ +| stackrc | `Read » `__ | ++--------------+--------------------------------+ +| openrc | `Read » `__ | ++--------------+--------------------------------+ +| exerciserc | `Read » `__ | ++--------------+--------------------------------+ +| eucarc | `Read » `__ | ++--------------+--------------------------------+ + +Tools Support scripts +--------------------- + ++-----------------------------+----------------------------------------------+ +| Filename | Link | ++=============================+==============================================+ +| tools/info.sh | `Read » `__ | ++-----------------------------+----------------------------------------------+ +| tools/build\_docs.sh | `Read » `__ | ++-----------------------------+----------------------------------------------+ +| tools/create\_userrc.sh | `Read » `__ | ++-----------------------------+----------------------------------------------+ +| tools/fixup\_stuff.sh | `Read » `__ | ++-----------------------------+----------------------------------------------+ +| tools/install\_prereqs.sh | `Read » `__ | ++-----------------------------+----------------------------------------------+ +| tools/install\_pip.sh | `Read » `__ | ++-----------------------------+----------------------------------------------+ +| tools/upload\_image.sh | `Read » `__ | ++-----------------------------+----------------------------------------------+ + +Samples Generated documentation of DevStack sample files. +--------------------------------------------------------- + ++------------+--------------------------------------+ +| Filename | Link | ++============+======================================+ +| local.sh | `Read » `__ | ++------------+--------------------------------------+ +| localrc | `Read » `__ | ++------------+--------------------------------------+ + +Exercises Generated documentation of DevStack scripts. +------------------------------------------------------ + +Filename + +Link + +exercise.sh + +`Read » `__ + +exercises/aggregates.sh + +`Read » `__ + +exercises/boot\_from\_volume.sh + +`Read » `__ + +exercises/bundle.sh + +`Read » `__ + +exercises/client-args.sh + +`Read » `__ + +exercises/client-env.sh + +`Read » `__ + +exercises/euca.sh + +`Read » `__ + +exercises/floating\_ips.sh + +`Read » `__ + +exercises/horizon.sh + +`Read » `__ + +exercises/neutron-adv-test.sh + +`Read » `__ + +exercises/sahara.sh + +`Read » `__ + +exercises/savanna.sh + +`Read » `__ + +exercises/sec\_groups.sh + +`Read » `__ + +exercises/swift.sh + +`Read » `__ + +exercises/trove.sh + +`Read » `__ + +exercises/volumes.sh + +`Read » `__ + +exercises/zaqar.sh + +`Read » `__ + +© Openstack Foundation 2011-2014 — An +`OpenStack `__ +`program `__ diff --git a/doc/source/local.conf.html b/doc/source/local.conf.html deleted file mode 100644 index 2635ac6694..0000000000 --- a/doc/source/local.conf.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - DevStack - local.conf - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -

    © Openstack Foundation 2011-2014 — An OpenStack program

    - - -
    - - - diff --git a/doc/source/local.conf.rst b/doc/source/local.conf.rst new file mode 100644 index 0000000000..40d0e0f57a --- /dev/null +++ b/doc/source/local.conf.rst @@ -0,0 +1,20 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +local.conf User settings +------------------------ + +``local.conf`` is a user-maintained setings file that is sourced in +``stackrc``. It contains a section that replaces the historical +``localrc`` file. See `the description of +local.conf `__ for more details about the mechanics +of the file. + +© Openstack Foundation 2011-2014 — An +`OpenStack `__ +`program `__ diff --git a/doc/source/localrc.html b/doc/source/localrc.html deleted file mode 100644 index 40a20043a2..0000000000 --- a/doc/source/localrc.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - DevStack - localrc - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -

    © Openstack Foundation 2011-2014 — An OpenStack program

    - - -
    - - - diff --git a/doc/source/localrc.rst b/doc/source/localrc.rst new file mode 100644 index 0000000000..910e274209 --- /dev/null +++ b/doc/source/localrc.rst @@ -0,0 +1,20 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +localrc User settings +--------------------- + +``localrc`` is the old file used to configure DevStack. It is deprecated +and has been replaced by ```local.conf`` `__. DevStack +will continue to use ``localrc`` if it is present and ignore the +``localrc`` section in ``local.conf.``. Remove ``localrc`` to switch to +using the new file. + +© Openstack Foundation 2011-2014 — An +`OpenStack `__ +`program `__ diff --git a/doc/source/openrc.html b/doc/source/openrc.html deleted file mode 100644 index 94b253dfe1..0000000000 --- a/doc/source/openrc.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - DevStack - openrc - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    OS_TENANT_NAME
    -
    The introduction of Keystone to the OpenStack ecosystem has standardized the - term tenant as the entity that owns resources. In some places references - still exist to the original Nova term project for this use. Also, - tenant_name is preferred to tenant_id. -
    OS_TENANT_NAME=demo
    - -
    OS_USERNAME
    -
    In addition to the owning entity (tenant), Nova stores the entity performing - the action as the user. -
    OS_USERNAME=demo
    - -
    OS_PASSWORD
    -
    With Keystone you pass the keystone password instead of an api key. - Recent versions of novaclient use OS_PASSWORD instead of NOVA_API_KEYs - or NOVA_PASSWORD. -
    OS_PASSWORD=secrete
    - -
    HOST_IP, SERVICE_HOST
    -
    Set API endpoint host using HOST_IP. SERVICE_HOST - may also be used to specify the endpoint, which is convenient for - some localrc configurations. Typically, HOST_IP - is set in the localrc section. -
    HOST_IP=127.0.0.1
    -SERVICE_HOST=$HOST_IP
    - -
    OS_AUTH_URL
    -
    Authenticating against an OpenStack cloud using Keystone returns a Token - and Service Catalog. The catalog contains the endpoints for all services - the user/tenant has access to - including Nova, Glance, Keystone and Swift. -
    OS_AUTH_URL=http://$SERVICE_HOST:5000/v2.0
    - -
    GLANCE_HOST
    -
    Some exercises call Glance directly. On a single-node installation, Glance - should be listening on HOST_IP. If its running elsewhere - it can be set here. -
    GLANCE_HOST=$HOST_IP
    - -
    KEYSTONECLIENT_DEBUG, NOVACLIENT_DEBUG
    -
    Set command-line client log level to DEBUG. These are - commented out by default. -
    # export KEYSTONECLIENT_DEBUG=1
    -# export NOVACLIENT_DEBUG=1
    - -
    -
    -

    © Openstack Foundation 2011-2013 — An - OpenStack program - created by Rackspace Cloud Builders

    - - -
    - - - diff --git a/doc/source/openrc.rst b/doc/source/openrc.rst new file mode 100644 index 0000000000..b8759ecb49 --- /dev/null +++ b/doc/source/openrc.rst @@ -0,0 +1,88 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +openrc User authentication settings +----------------------------------- + +``openrc`` configures login credentials suitable for use with the +OpenStack command-line tools. ``openrc`` sources ``stackrc`` at the +beginning (which in turn sources the ``localrc`` setion of +``local.conf``) in order to pick up ``HOST_IP`` and/or ``SERVICE_HOST`` +to use in the endpoints. The values shown below are the default values. + +OS\_TENANT\_NAME + The introduction of Keystone to the OpenStack ecosystem has + standardized the term *tenant* as the entity that owns resources. In + some places references still exist to the original Nova term + *project* for this use. Also, *tenant\_name* is preferred to + *tenant\_id*. + + :: + + OS_TENANT_NAME=demo + +OS\_USERNAME + In addition to the owning entity (tenant), Nova stores the entity + performing the action as the *user*. + + :: + + OS_USERNAME=demo + +OS\_PASSWORD + With Keystone you pass the keystone password instead of an api key. + Recent versions of novaclient use OS\_PASSWORD instead of + NOVA\_API\_KEYs or NOVA\_PASSWORD. + + :: + + OS_PASSWORD=secrete + +HOST\_IP, SERVICE\_HOST + Set API endpoint host using ``HOST_IP``. ``SERVICE_HOST`` may also + be used to specify the endpoint, which is convenient for some + ``localrc`` configurations. Typically, ``HOST_IP`` is set in the + ``localrc`` section. + + :: + + HOST_IP=127.0.0.1 + SERVICE_HOST=$HOST_IP + +OS\_AUTH\_URL + Authenticating against an OpenStack cloud using Keystone returns a + *Token* and *Service Catalog*. The catalog contains the endpoints + for all services the user/tenant has access to - including Nova, + Glance, Keystone and Swift. + + :: + + OS_AUTH_URL=http://$SERVICE_HOST:5000/v2.0 + +GLANCE\_HOST + Some exercises call Glance directly. On a single-node installation, + Glance should be listening on ``HOST_IP``. If its running elsewhere + it can be set here. + + :: + + GLANCE_HOST=$HOST_IP + +KEYSTONECLIENT\_DEBUG, NOVACLIENT\_DEBUG + Set command-line client log level to ``DEBUG``. These are commented + out by default. + + :: + + # export KEYSTONECLIENT_DEBUG=1 + # export NOVACLIENT_DEBUG=1 + +© Openstack Foundation 2011-2013 — An `OpenStack +program `__ created by +`Rackspace Cloud +Builders `__ diff --git a/doc/source/overview.html b/doc/source/overview.html deleted file mode 100644 index 9cee052129..0000000000 --- a/doc/source/overview.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - DevStack - Overview - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -

    Overview DevStack from a cloud-height view

    -

    DevStack has evolved to support a large number of configuration options and alternative platforms and support services. That evolution has grown well beyond what was originally intended and the majority of configuration combinations are rarely, if ever, tested. DevStack is not a general OpenStack installer and was never meant to be everything to everyone..

    -

    Below is a list of what is specifically is supported (read that as "tested") going forward.

    - -

    Supported Components

    - -

    Base OS

    -

    The OpenStack Technical Committee (TC) has defined the current CI strategy to include the latest Ubuntu release and the latest RHEL release (for Python 2.6 testing).

    -
      -
    • Ubuntu: current LTS release plus current development release
    • -
    • Fedora: current release plus previous release
    • -
    • RHEL: current major release
    • -
    • Other OS platforms may continue to be included but the maintenance of those platforms shall not be assumed simply due to their presence. Having a listed point-of-contact for each additional OS will greatly increase its chance of being well-maintained.
    • -
    • Patches for Ubuntu and/or Fedora will not be held up due to side-effects on other OS platforms.
    • -
    - -

    Databases

    -

    As packaged by the host OS

    -
      -
    • MySQL
    • -
    • PostgreSQL
    • -
    - -

    Queues

    -

    As packaged by the host OS

    -
      -
    • Rabbit
    • -
    • Qpid
    • - -
    - -

    Web Server

    -

    As packaged by the host OS

    -
      -
    • Apache
    • -
    - -

    OpenStack Network

    -

    Default to Nova Network, optionally use Neutron

    -
      -
    • Nova Network: FlatDHCP
    • -
    • Neutron: A basic configuration approximating the original FlatDHCP mode using linuxbridge or OpenVSwitch.
    • -
    - -

    Services

    -

    The default services configured by DevStack are Identity (Keystone), Object Storage (Swift), Image Storage (Glance), Block Storage (Cinder), Compute (Nova), Network (Nova), Dashboard (Horizon), Orchestration (Heat)

    -

    Additional services not included directly in DevStack can be tied in to stack.sh using the plugin mechanism to call scripts that perform the configuration and startup of the service.

    - -

    Node Configurations

    -
      -
    • single node
    • -
    • multi-node is not tested regularly by the core team, and even then only minimal configurations are reviewed
    • -
    - -

    Exercises

    -

    The DevStack exercise scripts are no longer used as integration and gate testing as that job has transitioned to Tempest. They are still maintained as a demonstrations of using OpenStack from the command line and for quick operational testing.

    - -
    - -
    - - - -
    - - diff --git a/doc/source/overview.rst b/doc/source/overview.rst new file mode 100644 index 0000000000..953938baaf --- /dev/null +++ b/doc/source/overview.rst @@ -0,0 +1,103 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +Overview DevStack from a cloud-height view +------------------------------------------ + +DevStack has evolved to support a large number of configuration options +and alternative platforms and support services. That evolution has grown +well beyond what was originally intended and the majority of +configuration combinations are rarely, if ever, tested. DevStack is not +a general OpenStack installer and was never meant to be everything to +everyone.. + +Below is a list of what is specifically is supported (read that as +"tested") going forward. + +Supported Components +-------------------- + +Base OS +~~~~~~~ + +*The OpenStack Technical Committee (TC) has defined the current CI +strategy to include the latest Ubuntu release and the latest RHEL +release (for Python 2.6 testing).* + +- Ubuntu: current LTS release plus current development release +- Fedora: current release plus previous release +- RHEL: current major release +- Other OS platforms may continue to be included but the maintenance of + those platforms shall not be assumed simply due to their presence. + Having a listed point-of-contact for each additional OS will greatly + increase its chance of being well-maintained. +- Patches for Ubuntu and/or Fedora will not be held up due to + side-effects on other OS platforms. + +Databases +~~~~~~~~~ + +*As packaged by the host OS* + +- MySQL +- PostgreSQL + +Queues +~~~~~~ + +*As packaged by the host OS* + +- Rabbit +- Qpid + +Web Server +~~~~~~~~~~ + +*As packaged by the host OS* + +- Apache + +OpenStack Network +~~~~~~~~~~~~~~~~~ + +*Default to Nova Network, optionally use Neutron* + +- Nova Network: FlatDHCP +- Neutron: A basic configuration approximating the original FlatDHCP + mode using linuxbridge or OpenVSwitch. + +Services +~~~~~~~~ + +The default services configured by DevStack are Identity (Keystone), +Object Storage (Swift), Image Storage (Glance), Block Storage (Cinder), +Compute (Nova), Network (Nova), Dashboard (Horizon), Orchestration +(Heat) + +Additional services not included directly in DevStack can be tied in to +``stack.sh`` using the `plugin mechanism `__ to call +scripts that perform the configuration and startup of the service. + +Node Configurations +~~~~~~~~~~~~~~~~~~~ + +- single node +- multi-node is not tested regularly by the core team, and even then + only minimal configurations are reviewed + +Exercises +~~~~~~~~~ + +The DevStack exercise scripts are no longer used as integration and gate +testing as that job has transitioned to Tempest. They are still +maintained as a demonstrations of using OpenStack from the command line +and for quick operational testing. + +© Openstack Foundation 2011-2014 — An +`OpenStack `__ +`program `__ diff --git a/doc/source/plugins.html b/doc/source/plugins.html deleted file mode 100644 index 700a209ac9..0000000000 --- a/doc/source/plugins.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - DevStack - Plugins - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -

    Plugins Add stuff

    -

    DevStack has a couple of plugin mechanisms to allow easily adding support for additional projects and features.

    - -

    Extras.d Hooks

    -

    These relatively new hooks are an extension of the existing calls from stack.sh at the end of its run, plus unstack.sh and clean.sh. A number of the higher-layer projects are implemented in DevStack using this mechanism.

    - -

    The script in extras.d is expected to be mostly a dispatcher to functions in a lib/* script. The scripts are named with a zero-padded two digits sequence number prefix to control the order that the scripts are called, and with a suffix of .sh. DevSack reserves for itself the sequence numbers 00 through 09 and 90 through 99.

    - -

    Below is a template that shows handlers for the possible command-line arguments:

    - -
    -# template.sh - DevStack extras.d dispatch script template
    -
    -# check for service enabled
    -if is_service_enabled template; then
    -
    -    if [[ "$1" == "source" ]]; then
    -        # Initial source of lib script
    -        source $TOP_DIR/lib/template
    -    fi
    -
    -    if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then
    -        # Set up system services
    -        echo_summary "Configuring system services Template"
    -        install_package cowsay
    -
    -    elif [[ "$1" == "stack" && "$2" == "install" ]]; then
    -        # Perform installation of service source
    -        echo_summary "Installing Template"
    -        install_template
    -
    -    elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
    -        # Configure after the other layer 1 and 2 services have been configured
    -        echo_summary "Configuring Template"
    -        configure_template
    -
    -    elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
    -        # Initialize and start the template service
    -        echo_summary "Initializing Template"
    -        ##init_template
    -    fi
    -
    -    if [[ "$1" == "unstack" ]]; then
    -        # Shut down template services
    -        # no-op
    -        :
    -    fi
    -
    -    if [[ "$1" == "clean" ]]; then
    -        # Remove state and transient data
    -        # Remember clean.sh first calls unstack.sh
    -        # no-op
    -        :
    -    fi
    -fi
    -
    - -

    The arguments are: -

      -
    • source - Called by each script that utilizes extras.d hooks; this replaces directly sourcing the lib/* script.
    • -
    • stack - Called by stack.sh three times for different phases of its run: -
        -
      • pre-install - Called after system (OS) setup is complete and before project source is installed.
      • -
      • install - Called after the layer 1 and 2 projects source and their dependencies have been installed.
      • -
      • post-config - Called after the layer 1 and 2 services have been configured. All configuration files for enabled services should exist at this point.
      • -
      • extra - Called near the end after layer 1 and 2 services have been started. This is the existing hook and has not otherwise changed.
      • -
    • -
    • unstack - Called by unstack.sh before other services are shut down.
    • -
    • clean - Called by clean.sh before other services are cleaned, but after unstack.sh has been called. -

    - - -

    Hypervisor

    -

    Hypervisor plugins are fairly new and condense most hypervisor configuration into one place.

    - -

    The initial plugin implemented was for Docker support and is a useful template for the required support. Plugins are placed in lib/nova_plugins and named hypervisor-<name> where <name> is the value of VIRT_DRIVER. Plugins must define the following functions:

    -
      -
    • install_nova_hypervisor - install any external requirements
    • -
    • configure_nova_hypervisor - make configuration changes, including those to other services
    • -
    • start_nova_hypervisor - start any external services
    • -
    • stop_nova_hypervisor - stop any external services
    • -
    • cleanup_nova_hypervisor - remove transient data and cache
    • -
    -
    - -
    - - - -
    - - diff --git a/doc/source/plugins.rst b/doc/source/plugins.rst new file mode 100644 index 0000000000..db695d3e84 --- /dev/null +++ b/doc/source/plugins.rst @@ -0,0 +1,124 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +Plugins Add stuff +----------------- + +DevStack has a couple of plugin mechanisms to allow easily adding +support for additional projects and features. + +Extras.d Hooks +~~~~~~~~~~~~~~ + +These relatively new hooks are an extension of the existing calls from +``stack.sh`` at the end of its run, plus ``unstack.sh`` and +``clean.sh``. A number of the higher-layer projects are implemented in +DevStack using this mechanism. + +The script in ``extras.d`` is expected to be mostly a dispatcher to +functions in a ``lib/*`` script. The scripts are named with a +zero-padded two digits sequence number prefix to control the order that +the scripts are called, and with a suffix of ``.sh``. DevSack reserves +for itself the sequence numbers 00 through 09 and 90 through 99. + +Below is a template that shows handlers for the possible command-line +arguments: + +:: + + # template.sh - DevStack extras.d dispatch script template + + # check for service enabled + if is_service_enabled template; then + + if [[ "$1" == "source" ]]; then + # Initial source of lib script + source $TOP_DIR/lib/template + fi + + if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then + # Set up system services + echo_summary "Configuring system services Template" + install_package cowsay + + elif [[ "$1" == "stack" && "$2" == "install" ]]; then + # Perform installation of service source + echo_summary "Installing Template" + install_template + + elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then + # Configure after the other layer 1 and 2 services have been configured + echo_summary "Configuring Template" + configure_template + + elif [[ "$1" == "stack" && "$2" == "extra" ]]; then + # Initialize and start the template service + echo_summary "Initializing Template" + ##init_template + fi + + if [[ "$1" == "unstack" ]]; then + # Shut down template services + # no-op + : + fi + + if [[ "$1" == "clean" ]]; then + # Remove state and transient data + # Remember clean.sh first calls unstack.sh + # no-op + : + fi + fi + +The arguments are: + +- **source** - Called by each script that utilizes ``extras.d`` hooks; + this replaces directly sourcing the ``lib/*`` script. +- **stack** - Called by ``stack.sh`` three times for different phases + of its run: + + - **pre-install** - Called after system (OS) setup is complete and + before project source is installed. + - **install** - Called after the layer 1 and 2 projects source and + their dependencies have been installed. + - **post-config** - Called after the layer 1 and 2 services have + been configured. All configuration files for enabled services + should exist at this point. + - **extra** - Called near the end after layer 1 and 2 services have + been started. This is the existing hook and has not otherwise + changed. + +- **unstack** - Called by ``unstack.sh`` before other services are shut + down. +- **clean** - Called by ``clean.sh`` before other services are cleaned, + but after ``unstack.sh`` has been called. + +Hypervisor +~~~~~~~~~~ + +Hypervisor plugins are fairly new and condense most hypervisor +configuration into one place. + +The initial plugin implemented was for Docker support and is a useful +template for the required support. Plugins are placed in +``lib/nova_plugins`` and named ``hypervisor-`` where ```` is +the value of ``VIRT_DRIVER``. Plugins must define the following +functions: + +- ``install_nova_hypervisor`` - install any external requirements +- ``configure_nova_hypervisor`` - make configuration changes, including + those to other services +- ``start_nova_hypervisor`` - start any external services +- ``stop_nova_hypervisor`` - stop any external services +- ``cleanup_nova_hypervisor`` - remove transient data and cache + +© Openstack Foundation 2011-2013 — An `OpenStack +program `__ created by +`Rackspace Cloud +Builders `__ diff --git a/doc/source/stackrc.html b/doc/source/stackrc.html deleted file mode 100644 index 2df9d385f7..0000000000 --- a/doc/source/stackrc.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - DevStack - stackrc - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    DATABASE_TYPE
    -
    Select the database backend to use. The default is mysql, - postgresql is also available.
    - -
    ENABLED_SERVICES
    -
    Specify which services to launch. These generally correspond to - screen tabs. - The default includes: Glance (API and Registry), Keystone, Nova (API, - Certificate, Object Store, Compute, Network, Scheduler, VNC proxies, - Certificate Authentication), Cinder (Scheduler, API, Volume), Horizon, MySQL, RabbitMQ, Tempest. -
    ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-net,n-cond,cinder,c-sch,c-api,c-vol,n-sch,n-novnc,n-xvnc,n-cauth,horizon,rabbit,tempest,$DATABASE_TYPE
    - Other services that are not enabled by default can be enabled in - localrc. For example, to add Swift, use the following service names: -
    enable_service s-proxy s-object s-container s-account
    - A service can similarly be disabled: -
    disable_service horizon
    - -
    Service Repos
    -
    The Git repositories used to check out the source for each service - are controlled by a pair of variables set for each service. - *_REPO points to the repository and *_BRANCH - selects which branch to check out. These may be overridden in - local.conf to pull source from a different repo for testing, - such as a Gerrit branch proposal. GIT_BASE points to the primary repository server. -
    NOVA_REPO=$GIT_BASE/openstack/nova.git
    -NOVA_BRANCH=master
    - To pull a branch directly from Gerrit, get the repo and branch from the - Gerrit review page: -
    git fetch https://review.openstack.org/p/openstack/nova refs/changes/50/5050/1 && git checkout FETCH_HEAD
    - The repo is the stanza following fetch and the branch - is the stanza following that: -
    NOVA_REPO=https://review.openstack.org/p/openstack/nova
    -NOVA_BRANCH=refs/changes/50/5050/1
    - -
    -
    -

    © Openstack Foundation 2011-2014 — An OpenStack program

    - - -
    - - - diff --git a/doc/source/stackrc.rst b/doc/source/stackrc.rst new file mode 100644 index 0000000000..b2766cb971 --- /dev/null +++ b/doc/source/stackrc.rst @@ -0,0 +1,77 @@ +`DevStack `__ + +- `Overview `__ +- `Changes `__ +- `FAQ `__ +- `git.openstack.org `__ +- `Gerrit `__ + +stackrc DevStack settings +------------------------- + +``stackrc`` is the primary configuration file for DevStack. It contains +all of the settings that control the services started and the +repositories used to download the source for those services. ``stackrc`` +sources the ``localrc`` section of ``local.conf`` to perform the default +overrides. + +DATABASE\_TYPE + Select the database backend to use. The default is ``mysql``, + ``postgresql`` is also available. +ENABLED\_SERVICES + Specify which services to launch. These generally correspond to + screen tabs. The default includes: Glance (API and Registry), + Keystone, Nova (API, Certificate, Object Store, Compute, Network, + Scheduler, VNC proxies, Certificate Authentication), Cinder + (Scheduler, API, Volume), Horizon, MySQL, RabbitMQ, Tempest. + + :: + + ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-net,n-cond,cinder,c-sch,c-api,c-vol,n-sch,n-novnc,n-xvnc,n-cauth,horizon,rabbit,tempest,$DATABASE_TYPE + + Other services that are not enabled by default can be enabled in + ``localrc``. For example, to add Swift, use the following service + names: + + :: + + enable_service s-proxy s-object s-container s-account + + A service can similarly be disabled: + + :: + + disable_service horizon + +Service Repos + The Git repositories used to check out the source for each service + are controlled by a pair of variables set for each service. + ``*_REPO`` points to the repository and ``*_BRANCH`` selects which + branch to check out. These may be overridden in ``local.conf`` to + pull source from a different repo for testing, such as a Gerrit + branch proposal. ``GIT_BASE`` points to the primary repository + server. + + :: + + NOVA_REPO=$GIT_BASE/openstack/nova.git + NOVA_BRANCH=master + + To pull a branch directly from Gerrit, get the repo and branch from + the Gerrit review page: + + :: + + git fetch https://review.openstack.org/p/openstack/nova refs/changes/50/5050/1 && git checkout FETCH_HEAD + + The repo is the stanza following ``fetch`` and the branch is the + stanza following that: + + :: + + NOVA_REPO=https://review.openstack.org/p/openstack/nova + NOVA_BRANCH=refs/changes/50/5050/1 + +© Openstack Foundation 2011-2014 — An +`OpenStack `__ +`program `__ diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000000..58871344aa --- /dev/null +++ b/setup.cfg @@ -0,0 +1,23 @@ +[metadata] +name = DevStack +summary = OpenStack DevStack +description-file = + README.md +author = OpenStack +author-email = openstack-dev@lists.openstack.org +home-page = http://devstack.org +classifier = + Intended Audience :: Developers + License :: OSI Approved :: Apache Software License + Operating System :: POSIX :: Linux + +[build_sphinx] +all_files = 1 +build-dir = doc/build +source-dir = doc/source + +[pbr] +warnerrors = True + +[wheel] +universal = 1 diff --git a/setup.py b/setup.py new file mode 100755 index 0000000000..70c2b3f32b --- /dev/null +++ b/setup.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. +# +# 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. + +# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT +import setuptools + +setuptools.setup( + setup_requires=['pbr'], + pbr=True) diff --git a/tox.ini b/tox.ini index 3677631c5e..b6f2d9655e 100644 --- a/tox.ini +++ b/tox.ini @@ -16,8 +16,13 @@ commands = bash -c "find {toxinidir} -not -wholename \*.tox/\* -and \( -name \*. deps = Pygments docutils + sphinx>=1.1.2,<1.2 + pbr>=0.6,!=0.7,<1.0 + oslosphinx whitelist_externals = bash setenv = TOP_DIR={toxinidir} INSTALL_SHOCCO=true -commands = bash tools/build_docs.sh +commands = + bash tools/build_docs.sh + python setup.py build_sphinx From ab50c702a770fa9d7fd0ff533566fc7a1775dde5 Mon Sep 17 00:00:00 2001 From: Adam Gandelman Date: Wed, 22 Oct 2014 13:21:22 -0700 Subject: [PATCH 0031/3333] Use service tenant id for Ironic agent swift auth Config of ironic conductor currently references a non-existent variable. This corrects it by obtaining and using the correct tenant id. Change-Id: I4340f75b2b22a8fd3fd8dd5cb30d7e91bce4f654 --- lib/ironic | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ironic b/lib/ironic index 1541dcfb33..0a84e47ebc 100644 --- a/lib/ironic +++ b/lib/ironic @@ -281,7 +281,8 @@ function configure_ironic_conductor { fi iniset $IRONIC_CONF_FILE glance swift_endpoint_url http://${HOST_IP}:8080 iniset $IRONIC_CONF_FILE glance swift_api_version v1 - iniset $IRONIC_CONF_FILE glance swift_account AUTH_${SERVICE_TENANT} + local tenant_id=$(get_or_create_project $SERVICE_TENANT_NAME) + iniset $IRONIC_CONF_FILE glance swift_account AUTH_${tenant_id} iniset $IRONIC_CONF_FILE glance swift_container glance iniset $IRONIC_CONF_FILE glance swift_temp_url_duration 3600 iniset $IRONIC_CONF_FILE agent heartbeat_timeout 30 From 1c0628f83ce2dbf27dc0c916a53d915b20233890 Mon Sep 17 00:00:00 2001 From: Patrick East Date: Wed, 22 Oct 2014 16:22:47 -0700 Subject: [PATCH 0032/3333] Fix an issue with setting tempest volume vendor_name with spaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the volume vendor has spaces in it, for example “Open Source”, we need to have quotes around the uses of the variables or the behavior will not be as expected. Change-Id: Ie1e99b6d6de2313e5b5b5a5d3057c136c9b34601 --- lib/tempest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tempest b/lib/tempest index 3c37918018..350d08c331 100644 --- a/lib/tempest +++ b/lib/tempest @@ -372,7 +372,7 @@ function configure_tempest { fi if [ $TEMPEST_VOLUME_DRIVER != "default" -o \ - $TEMPEST_VOLUME_VENDOR != $TEMPEST_DEFAULT_VOLUME_VENDOR ]; then + "$TEMPEST_VOLUME_VENDOR" != "$TEMPEST_DEFAULT_VOLUME_VENDOR" ]; then iniset $TEMPEST_CONFIG volume vendor_name "$TEMPEST_VOLUME_VENDOR" fi if [ $TEMPEST_VOLUME_DRIVER != "default" -o \ From cac1317676dcb0efa489dd667793cf4f6b366170 Mon Sep 17 00:00:00 2001 From: Joe Gordon Date: Thu, 23 Oct 2014 10:52:40 -0700 Subject: [PATCH 0033/3333] Move to download.fedoraproject.org download.fedoraproject.org is the mirror system, while dl.fedoraproject.org is just one system. We have seen performance issues with dl.fedoraproject.org and using download.fedoraproject.org was a recommended as a solution by the folks at #fedora-admin. Local testing on a rackspace server with dl.fedoraproject.org got about 70K/s while download.fedoraproject.org got over 1M/s Move over to https as well. Related-Bug: #1383928 Change-Id: I318d8844cfcfbc42c1e552e443c6b793d20f321f --- stackrc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stackrc b/stackrc index 389952508d..6cec8e85fb 100644 --- a/stackrc +++ b/stackrc @@ -514,7 +514,7 @@ esac if [[ "$ENABLED_SERVICES" =~ 'h-api' ]]; then case "$VIRT_DRIVER" in libvirt|baremetal|ironic) - HEAT_CFN_IMAGE_URL=${HEAT_CFN_IMAGE_URL:-"http://dl.fedoraproject.org/pub/alt/openstack/20/x86_64/Fedora-x86_64-20-20140618-sda.qcow2"} + HEAT_CFN_IMAGE_URL=${HEAT_CFN_IMAGE_URL:-"https://download.fedoraproject.org/pub/alt/openstack/20/x86_64/Fedora-x86_64-20-20140618-sda.qcow2"} IMAGE_URLS+=",$HEAT_CFN_IMAGE_URL" ;; *) @@ -539,7 +539,7 @@ fi PRECACHE_IMAGES=$(trueorfalse False $PRECACHE_IMAGES) if [[ "$PRECACHE_IMAGES" == "True" ]]; then # staging in update for nodepool - IMAGE_URL="http://dl.fedoraproject.org/pub/alt/openstack/20/x86_64/Fedora-x86_64-20-20140618-sda.qcow2" + IMAGE_URL="https://download.fedoraproject.org/pub/alt/openstack/20/x86_64/Fedora-x86_64-20-20140618-sda.qcow2" if ! [[ "$IMAGE_URLS" =~ "$IMAGE_URL" ]]; then IMAGE_URLS+=",$IMAGE_URL" fi From 51f0de5c5d5aa779db0ed647804d7d9488a9122b Mon Sep 17 00:00:00 2001 From: Jamie Lennox Date: Mon, 20 Oct 2014 16:32:34 +0200 Subject: [PATCH 0034/3333] Allow depth limiting git clones Depending on how you are using devstack you probably don't need the entire history of a project so we should allow people to specify a clone depth to speed up the devstack process. Change-Id: I804a5abcc80f6a81e915c0bb4dceae72486441a7 Blueprint: git-depth --- functions-common | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/functions-common b/functions-common index e6f425f4a1..bf25c25052 100644 --- a/functions-common +++ b/functions-common @@ -19,6 +19,7 @@ # # The following variables are assumed to be defined by certain functions: # +# - ``GIT_DEPTH`` # - ``ENABLED_SERVICES`` # - ``ERROR_ON_CLONE`` # - ``FILES`` @@ -562,16 +563,22 @@ function get_release_name_from_branch { # Set global ``RECLONE=yes`` to simulate a clone when dest-dir exists # Set global ``ERROR_ON_CLONE=True`` to abort execution with an error if the git repo # does not exist (default is False, meaning the repo will be cloned). -# Uses globals ``ERROR_ON_CLONE``, ``OFFLINE``, ``RECLONE`` +# Set global ``GIT_DEPTH=`` to limit the history depth of the git clone +# Uses globals ``ERROR_ON_CLONE``, ``OFFLINE``, ``RECLONE``, ``GIT_DEPTH`` # git_clone remote dest-dir branch function git_clone { local git_remote=$1 local git_dest=$2 local git_ref=$3 local orig_dir=$(pwd) + local git_clone_flags="" RECLONE=$(trueorfalse False $RECLONE) + if [[ "$GIT_DEPTH" ]]; then + git_clone_flags="$git_clone_flags --depth $GIT_DEPTH" + fi + if [[ "$OFFLINE" = "True" ]]; then echo "Running in offline mode, clones already exist" # print out the results so we know what change was used in the logs @@ -586,7 +593,7 @@ function git_clone { if [[ ! -d $git_dest ]]; then [[ "$ERROR_ON_CLONE" = "True" ]] && \ die $LINENO "Cloning not allowed in this configuration" - git_timed clone $git_remote $git_dest + git_timed clone $git_clone_flags $git_remote $git_dest fi cd $git_dest git_timed fetch $git_remote $git_ref && git checkout FETCH_HEAD @@ -595,7 +602,7 @@ function git_clone { if [[ ! -d $git_dest ]]; then [[ "$ERROR_ON_CLONE" = "True" ]] && \ die $LINENO "Cloning not allowed in this configuration" - git_timed clone $git_remote $git_dest + git_timed clone $git_clone_flags $git_remote $git_dest cd $git_dest # This checkout syntax works for both branches and tags git checkout $git_ref From 0f3bafc74edce5fbc091b3cacf27f916ebf04fc7 Mon Sep 17 00:00:00 2001 From: "Sean M. Collins" Date: Fri, 24 Oct 2014 10:48:46 -0400 Subject: [PATCH 0035/3333] Remove copyright footer from RST docs Change-Id: I2fe6aac7caec21af26983636d6ec827b3525ee15 --- doc/source/changes.rst | 4 ---- doc/source/configuration.rst | 4 ---- doc/source/contributing.rst | 5 ----- doc/source/eucarc.rst | 5 ----- doc/source/exerciserc.rst | 5 ----- doc/source/faq.rst | 4 ---- doc/source/guides/multinode-lab.rst | 4 ---- doc/source/guides/pxe-boot.rst | 3 --- doc/source/guides/ramdisk.rst | 3 --- doc/source/guides/single-machine.rst | 5 ----- doc/source/guides/single-vm.rst | 4 ---- doc/source/guides/usb-boot.rst | 3 --- doc/source/index.rst | 4 ---- doc/source/local.conf.rst | 4 ---- doc/source/localrc.rst | 4 ---- doc/source/openrc.rst | 5 ----- doc/source/overview.rst | 4 ---- doc/source/plugins.rst | 5 ----- doc/source/stackrc.rst | 4 ---- 19 files changed, 79 deletions(-) diff --git a/doc/source/changes.rst b/doc/source/changes.rst index 7ce629faa9..ccd96e8a7e 100644 --- a/doc/source/changes.rst +++ b/doc/source/changes.rst @@ -12,7 +12,3 @@ Recent Changes What's been happening? These are the commits to DevStack for the last six months. For the complete list see `the DevStack project in Gerrit `__. - -© Openstack Foundation 2011-2014 — An -`OpenStack `__ -`program `__ diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst index 694ad62844..9befc908ea 100644 --- a/doc/source/configuration.rst +++ b/doc/source/configuration.rst @@ -354,7 +354,3 @@ Examples RABBIT_PASSWORD=$ADMIN_PASSWORD SERVICE_PASSWORD=$ADMIN_PASSWORD SERVICE_TOKEN=a682f596-76f3-11e3-b3b2-e716f9080d50 - -© Openstack Foundation 2011-2014 — An -`OpenStack `__ -`program `__ diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst index e37c06b6a9..73069e788b 100644 --- a/doc/source/contributing.rst +++ b/doc/source/contributing.rst @@ -98,8 +98,3 @@ have aged a bit (does anyone still do ramdisk installs?). While these may reference the top-level DevStack configuration they can generally be run alone. There are also some sub-directories to support specific environments such as XenServer. - -© Openstack Foundation 2011-2013 — An `OpenStack -program `__ created by -`Rackspace Cloud -Builders `__ diff --git a/doc/source/eucarc.rst b/doc/source/eucarc.rst index c1065e6f61..c91d3417de 100644 --- a/doc/source/eucarc.rst +++ b/doc/source/eucarc.rst @@ -50,8 +50,3 @@ Certificates for Bundling EC2_CERT=cert.pem NOVA_CERT=cacert.pem EUCALYPTUS_CERT=${NOVA_CERT} - -© Openstack Foundation 2011-2013 — An `OpenStack -program `__ created by -`Rackspace Cloud -Builders `__ diff --git a/doc/source/exerciserc.rst b/doc/source/exerciserc.rst index 22aff9a9e2..ed3f2e87b6 100644 --- a/doc/source/exerciserc.rst +++ b/doc/source/exerciserc.rst @@ -47,8 +47,3 @@ TERMINATE\_TIMEOUT :: TERMINATE_TIMEOUT=30 - -© Openstack Foundation 2011-2013 — An `OpenStack -program `__ created by -`Rackspace Cloud -Builders `__ diff --git a/doc/source/faq.rst b/doc/source/faq.rst index 9adc58ed1c..36b25b3039 100644 --- a/doc/source/faq.rst +++ b/doc/source/faq.rst @@ -178,7 +178,3 @@ Q: ``tools/fixup_stuff.sh`` is broken and shouldn't 'fix' just one version of pa problems than we'll add them to the script. Knowing about the broken future releases is valuable rather than polling to see if it has been fixed. - -© Openstack Foundation 2011-2014 — An -`OpenStack `__ -`program `__ diff --git a/doc/source/guides/multinode-lab.rst b/doc/source/guides/multinode-lab.rst index c7901a21fb..a63260fe6f 100644 --- a/doc/source/guides/multinode-lab.rst +++ b/doc/source/guides/multinode-lab.rst @@ -376,7 +376,3 @@ If you forgot to set the root password you can do this: :: mysqladmin -u root -pnova password 'supersecret' - -© Openstack Foundation 2011-2014 — An -`OpenStack `__ -`program `__ diff --git a/doc/source/guides/pxe-boot.rst b/doc/source/guides/pxe-boot.rst index 584e5581fd..f745abb7e4 100644 --- a/doc/source/guides/pxe-boot.rst +++ b/doc/source/guides/pxe-boot.rst @@ -138,6 +138,3 @@ Set Up tftpboot Now `return `__ to the RAM disk Guide to kick off your DevStack experience. - -© Openstack Foundation 2011-2013 — this is not an official OpenStack -project... diff --git a/doc/source/guides/ramdisk.rst b/doc/source/guides/ramdisk.rst index 82147a8c1b..1ba74f2322 100644 --- a/doc/source/guides/ramdisk.rst +++ b/doc/source/guides/ramdisk.rst @@ -84,6 +84,3 @@ Fire It Up screen -x - Connect to the dashboard at ``http:///`` - -© Openstack Foundation 2011-2013 — this is not an official OpenStack -project... diff --git a/doc/source/guides/single-machine.rst b/doc/source/guides/single-machine.rst index 0db0466281..3e0a39cad5 100644 --- a/doc/source/guides/single-machine.rst +++ b/doc/source/guides/single-machine.rst @@ -138,8 +138,3 @@ accessible from other machines on your network. Some examples of using the OpenStack command-line clients ``nova`` and ``glance`` are in the shakedown scripts in ``devstack/exercises``. ``exercise.sh`` will run all of those scripts and report on the results. - -© Openstack Foundation 2011-2013 — An `OpenStack -program `__ created by -`Rackspace Cloud -Builders `__ diff --git a/doc/source/guides/single-vm.rst b/doc/source/guides/single-vm.rst index 0e2d1573aa..35efb14939 100644 --- a/doc/source/guides/single-vm.rst +++ b/doc/source/guides/single-vm.rst @@ -104,7 +104,3 @@ packages are installed in the VM and the source trees checked out. Setting ``OFFLINE=True`` in ``local.conf`` enables ``stack.sh`` to run multiple times without an Internet connection. DevStack, making hacking at the lake possible since 2012! - -© Openstack Foundation 2011-2014 — An -`OpenStack `__ -`program `__ diff --git a/doc/source/guides/usb-boot.rst b/doc/source/guides/usb-boot.rst index 888e14feb3..4f7a49425b 100644 --- a/doc/source/guides/usb-boot.rst +++ b/doc/source/guides/usb-boot.rst @@ -55,6 +55,3 @@ Set Up USB Drive Now `return `__ to the RAM disk Guide to kick off your DevStack experience. - -© Openstack Foundation 2011-2013 — this is not an official OpenStack -project... diff --git a/doc/source/index.rst b/doc/source/index.rst index 6e5105dcff..6f7cab65a3 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -377,7 +377,3 @@ exercises/volumes.sh exercises/zaqar.sh `Read » `__ - -© Openstack Foundation 2011-2014 — An -`OpenStack `__ -`program `__ diff --git a/doc/source/local.conf.rst b/doc/source/local.conf.rst index 40d0e0f57a..e1de44c2c7 100644 --- a/doc/source/local.conf.rst +++ b/doc/source/local.conf.rst @@ -14,7 +14,3 @@ local.conf User settings ``localrc`` file. See `the description of local.conf `__ for more details about the mechanics of the file. - -© Openstack Foundation 2011-2014 — An -`OpenStack `__ -`program `__ diff --git a/doc/source/localrc.rst b/doc/source/localrc.rst index 910e274209..487280bae5 100644 --- a/doc/source/localrc.rst +++ b/doc/source/localrc.rst @@ -14,7 +14,3 @@ and has been replaced by ```local.conf`` `__. DevStack will continue to use ``localrc`` if it is present and ignore the ``localrc`` section in ``local.conf.``. Remove ``localrc`` to switch to using the new file. - -© Openstack Foundation 2011-2014 — An -`OpenStack `__ -`program `__ diff --git a/doc/source/openrc.rst b/doc/source/openrc.rst index b8759ecb49..ce5765aa60 100644 --- a/doc/source/openrc.rst +++ b/doc/source/openrc.rst @@ -81,8 +81,3 @@ KEYSTONECLIENT\_DEBUG, NOVACLIENT\_DEBUG # export KEYSTONECLIENT_DEBUG=1 # export NOVACLIENT_DEBUG=1 - -© Openstack Foundation 2011-2013 — An `OpenStack -program `__ created by -`Rackspace Cloud -Builders `__ diff --git a/doc/source/overview.rst b/doc/source/overview.rst index 953938baaf..cedf941bcd 100644 --- a/doc/source/overview.rst +++ b/doc/source/overview.rst @@ -97,7 +97,3 @@ The DevStack exercise scripts are no longer used as integration and gate testing as that job has transitioned to Tempest. They are still maintained as a demonstrations of using OpenStack from the command line and for quick operational testing. - -© Openstack Foundation 2011-2014 — An -`OpenStack `__ -`program `__ diff --git a/doc/source/plugins.rst b/doc/source/plugins.rst index db695d3e84..0747b59f3c 100644 --- a/doc/source/plugins.rst +++ b/doc/source/plugins.rst @@ -117,8 +117,3 @@ functions: - ``start_nova_hypervisor`` - start any external services - ``stop_nova_hypervisor`` - stop any external services - ``cleanup_nova_hypervisor`` - remove transient data and cache - -© Openstack Foundation 2011-2013 — An `OpenStack -program `__ created by -`Rackspace Cloud -Builders `__ diff --git a/doc/source/stackrc.rst b/doc/source/stackrc.rst index b2766cb971..5d9d2218c6 100644 --- a/doc/source/stackrc.rst +++ b/doc/source/stackrc.rst @@ -71,7 +71,3 @@ Service Repos NOVA_REPO=https://review.openstack.org/p/openstack/nova NOVA_BRANCH=refs/changes/50/5050/1 - -© Openstack Foundation 2011-2014 — An -`OpenStack `__ -`program `__ From f5cb1ce4c6f1733c3a5276dcf58f99c2984adafb Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Tue, 21 Oct 2014 11:16:58 -0500 Subject: [PATCH 0036/3333] Update docs section for new build The devstack.org build process was recently changed to run as a CI post job, publishing the site after every commit. Change-Id: I05ddb353fae524178a25f28f2437d4fc635167f9 --- HACKING.rst | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/HACKING.rst b/HACKING.rst index d69bb49286..cbba310ee3 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -126,14 +126,9 @@ and can stay in the project file. Documentation ------------- -The official DevStack repo on GitHub does not include a gh-pages branch that -GitHub uses to create static web sites. That branch is maintained in the -`CloudBuilders DevStack repo`__ mirror that supports the -http://devstack.org site. This is the primary DevStack -documentation along with the DevStack scripts themselves. - -__ repo_ -.. _repo: https://github.com/cloudbuilders/devstack +The DevStack repo now contains all of the static pages of devstack.org in +the ``doc/source`` directory. The OpenStack CI system rebuilds the docs after every +commit and updates devstack.org (now a redirect to docs.openstack.org/developer/devstack). All of the scripts are processed with shocco_ to render them with the comments as text describing the script below. For this reason we tend to be a little @@ -144,6 +139,8 @@ uses Markdown headers to divide the script into logical sections. .. _shocco: https://github.com/dtroyer/shocco/tree/rst_support The script used to drive shocco is tools/build_docs.sh. +The complete docs build is also handled with tox -edocs per the +OpenStack project standard. Exercises @@ -235,8 +232,12 @@ DevStack defines a bash set of best practices for maintaining large collections of bash scripts. These should be considered as part of the review process. -We have a preliminary enforcing script for this called bash8 (only a -small number of these rules are enforced). +DevStack uses the bashate_ style checker +to enforce basic guidelines, similar to pep8 and flake8 tools for Python. The +list below is not complete for what bashate checks, nor is it all checked +by bashate. So many lines of code, so little time. + +.. _bashate: https://pypi.python.org/pypi/bashate Whitespace Rules ---------------- From 0d6e992d90b84bcafe16468b0a2aec903e3b7aa0 Mon Sep 17 00:00:00 2001 From: yunhong jiang Date: Fri, 10 Oct 2014 06:12:47 -0700 Subject: [PATCH 0037/3333] Fix a minor comments A minor mismatch in lib/neutron since now unstack.sh invokes three functions and also start_neutron_agents() is called before create_neutron_initial_network(). Change-Id: Ibbe68501cce4c062a9ac610cbc44188dc9bab6c8 --- lib/neutron | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/neutron b/lib/neutron index ca9b16cd8c..d05dcc806f 100644 --- a/lib/neutron +++ b/lib/neutron @@ -20,13 +20,15 @@ # - create_neutron_cache_dir # - create_nova_conf_neutron # - start_neutron_service_and_check +# - start_neutron_agents # - create_neutron_initial_network # - setup_neutron_debug -# - start_neutron_agents # # ``unstack.sh`` calls the entry points in this order: # # - stop_neutron +# - stop_neutron_third_party +# - cleanup_neutron # Functions in lib/neutron are classified into the following categories: # From f76ed01665d8718641a1c5e421571bd165486d24 Mon Sep 17 00:00:00 2001 From: "Sean M. Collins" Date: Mon, 27 Oct 2014 11:36:41 -0400 Subject: [PATCH 0038/3333] Docs: Fix exercise table in index.rst Change-Id: I305414a5a38c6837a765110e726771ba2f94fe45 --- doc/source/index.rst | 108 +++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 71 deletions(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index 6f7cab65a3..37b365d11a 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -306,74 +306,40 @@ Samples Generated documentation of DevStack sample files. Exercises Generated documentation of DevStack scripts. ------------------------------------------------------ -Filename - -Link - -exercise.sh - -`Read » `__ - -exercises/aggregates.sh - -`Read » `__ - -exercises/boot\_from\_volume.sh - -`Read » `__ - -exercises/bundle.sh - -`Read » `__ - -exercises/client-args.sh - -`Read » `__ - -exercises/client-env.sh - -`Read » `__ - -exercises/euca.sh - -`Read » `__ - -exercises/floating\_ips.sh - -`Read » `__ - -exercises/horizon.sh - -`Read » `__ - -exercises/neutron-adv-test.sh - -`Read » `__ - -exercises/sahara.sh - -`Read » `__ - -exercises/savanna.sh - -`Read » `__ - -exercises/sec\_groups.sh - -`Read » `__ - -exercises/swift.sh - -`Read » `__ - -exercises/trove.sh - -`Read » `__ - -exercises/volumes.sh - -`Read » `__ - -exercises/zaqar.sh - -`Read » `__ ++---------------------------------+-------------------------------------------------+ +| Filename | Link | ++=================================+=================================================+ +| exercise.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/aggregates.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/boot\_from\_volume.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/bundle.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/client-args.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/client-env.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/euca.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/floating\_ips.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/horizon.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/neutron-adv-test.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/sahara.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/savanna.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/sec\_groups.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/swift.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/trove.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/volumes.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ +| exercises/zaqar.sh | `Read » `__ | ++---------------------------------+-------------------------------------------------+ From def1534ce06409c4c70d6569ea6314a82897e28b Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Mon, 27 Oct 2014 12:26:04 -0400 Subject: [PATCH 0039/3333] allow for soft updating of global-requirements This creates a devstack REQUIREMENTS_MODE which is how we handle syncing of global requirements. The default is 'strict', which is current behavior. There is a new 'soft' mode which does a --soft-update for projects *not* found in projects.txt, which lets them specify additional requirements. Change-Id: I4aa606514131b5dde67d87f5c8db5a3f3e50fc03 Depends-On: I1f195ef9ff1509659848e14ec9936ff6f66a6496 --- functions-common | 25 +++++++++++++++++++++++-- stackrc | 11 +++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/functions-common b/functions-common index e6f425f4a1..9041439dee 100644 --- a/functions-common +++ b/functions-common @@ -1606,6 +1606,16 @@ function setup_develop { setup_package_with_req_sync $project_dir -e } +# determine if a project as specified by directory is in +# projects.txt. This will not be an exact match because we throw away +# the namespacing when we clone, but it should be good enough in all +# practical ways. +function is_in_projects_txt { + local project_dir=$1 + local project_name=$(basename $project_dir) + return grep "/$project_name\$" $REQUIREMENTS_DIR/projects.txt >/dev/null +} + # ``pip install -e`` the package, which processes the dependencies # using pip before running `setup.py develop` # @@ -1624,8 +1634,19 @@ function setup_package_with_req_sync { local update_requirements=$(cd $project_dir && git diff --exit-code >/dev/null || echo "changed") if [[ $update_requirements != "changed" ]]; then - (cd $REQUIREMENTS_DIR; \ - python update.py $project_dir) + if [[ "$REQUIREMENTS_MODE" == "soft" ]]; then + if is_in_projects_txt $project_dir; then + (cd $REQUIREMENTS_DIR; \ + python update.py $project_dir) + else + # soft update projects not found in requirements project.txt + (cd $REQUIREMENTS_DIR; \ + python update.py -s $project_dir) + fi + else + (cd $REQUIREMENTS_DIR; \ + python update.py $project_dir) + fi fi setup_package $project_dir $flags diff --git a/stackrc b/stackrc index 6cec8e85fb..d97dba826a 100644 --- a/stackrc +++ b/stackrc @@ -116,6 +116,17 @@ DATABASE_QUERY_LOGGING=$(trueorfalse True $DATABASE_QUERY_LOGGING) # Zero disables timeouts GIT_TIMEOUT=${GIT_TIMEOUT:-0} +# Requirements enforcing mode +# +# - strict (default) : ensure all project requirements files match +# what's in global requirements. +# +# - soft : enforce requirements on everything in +# requirements/projects.txt, but do soft updates on all other +# repositories (i.e. sync versions for requirements that are in g-r, +# but pass through any extras) +REQUIREMENTS_MODE=${REQUIREMENTS_MODE:-strict} + # Repositories # ------------ From e7f071b49fa0a4cb695220a2d159214779803cd8 Mon Sep 17 00:00:00 2001 From: taturiello Date: Wed, 15 Oct 2014 05:09:45 -0700 Subject: [PATCH 0040/3333] Remove no_wait ovs flag from vmw_nsx 3rd party lib The no_wait flag can trigger a race conditon with ip addr flush if the public bridge is not yet up. Due to this race condition the local route for the external subnet might not be added. The patch also renames br-ex to $PUBLIC_BRIDGE in some places Change-Id: I11335c99dba580e7ca26b0b15b0df8dead367fdc --- lib/neutron_thirdparty/vmware_nsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/neutron_thirdparty/vmware_nsx b/lib/neutron_thirdparty/vmware_nsx index 7a76570775..7a20c64afb 100644 --- a/lib/neutron_thirdparty/vmware_nsx +++ b/lib/neutron_thirdparty/vmware_nsx @@ -8,7 +8,7 @@ # * enable_service vmware_nsx --> to execute this third-party addition # * PUBLIC_BRIDGE --> bridge used for external connectivity, typically br-ex # * NSX_GATEWAY_NETWORK_INTERFACE --> interface used to communicate with the NSX Gateway -# * NSX_GATEWAY_NETWORK_CIDR --> CIDR to configure br-ex, e.g. 172.24.4.211/24 +# * NSX_GATEWAY_NETWORK_CIDR --> CIDR to configure $PUBLIC_BRIDGE, e.g. 172.24.4.211/24 # Save trace setting NSX3_XTRACE=$(set +o | grep xtrace) @@ -29,7 +29,7 @@ function configure_vmware_nsx { function init_vmware_nsx { if ! is_set NSX_GATEWAY_NETWORK_CIDR; then NSX_GATEWAY_NETWORK_CIDR=$PUBLIC_NETWORK_GATEWAY/${FLOATING_RANGE#*/} - echo "The IP address to set on br-ex was not specified. " + echo "The IP address to set on $PUBLIC_BRIDGE was not specified. " echo "Defaulting to "$NSX_GATEWAY_NETWORK_CIDR fi # Make sure the interface is up, but not configured @@ -42,14 +42,15 @@ function init_vmware_nsx { # only with mac learning enabled, portsecurity and security profiles disabled # The public bridge might not exist for the NSX plugin if Q_USE_DEBUG_COMMAND is off # Try to create it anyway - sudo ovs-vsctl --no-wait -- --may-exist add-br $PUBLIC_BRIDGE - sudo ovs-vsctl -- --may-exist add-port $PUBLIC_BRIDGE $NSX_GATEWAY_NETWORK_INTERFACE + sudo ovs-vsctl --may-exist add-br $PUBLIC_BRIDGE + sudo ovs-vsctl --may-exist add-port $PUBLIC_BRIDGE $NSX_GATEWAY_NETWORK_INTERFACE nsx_gw_net_if_mac=$(ip link show $NSX_GATEWAY_NETWORK_INTERFACE | awk '/ether/ {print $2}') sudo ip link set address $nsx_gw_net_if_mac dev $PUBLIC_BRIDGE for address in $addresses; do sudo ip addr add dev $PUBLIC_BRIDGE $address done sudo ip addr add dev $PUBLIC_BRIDGE $NSX_GATEWAY_NETWORK_CIDR + sudo ip link set $PUBLIC_BRIDGE up } function install_vmware_nsx { @@ -63,7 +64,7 @@ function start_vmware_nsx { function stop_vmware_nsx { if ! is_set NSX_GATEWAY_NETWORK_CIDR; then NSX_GATEWAY_NETWORK_CIDR=$PUBLIC_NETWORK_GATEWAY/${FLOATING_RANGE#*/} - echo "The IP address expected on br-ex was not specified. " + echo "The IP address expected on $PUBLIC_BRIDGE was not specified. " echo "Defaulting to "$NSX_GATEWAY_NETWORK_CIDR fi sudo ip addr del $NSX_GATEWAY_NETWORK_CIDR dev $PUBLIC_BRIDGE From 15130cd5fd1688b8984d78136b97bb8de7c32b64 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Tue, 28 Oct 2014 11:49:58 +0900 Subject: [PATCH 0041/3333] Desupport neutron openvswitch and linuxbridge monolithic plugins These plugins were removed in Juno. Note: this doesn't affect the corresponding ML2 mechanism drivers. Partial-Bug: #1323729 Change-Id: Ia8da1e20a03fef5657ba1584bf83ddd224b5d5f2 --- lib/neutron | 29 ++++------ lib/neutron_plugins/linuxbridge | 55 ------------------- lib/neutron_plugins/linuxbridge_agent | 77 --------------------------- lib/neutron_plugins/openvswitch | 7 ++- 4 files changed, 14 insertions(+), 154 deletions(-) delete mode 100644 lib/neutron_plugins/linuxbridge delete mode 100644 lib/neutron_plugins/linuxbridge_agent diff --git a/lib/neutron b/lib/neutron index ca9b16cd8c..5b3ac9f42e 100644 --- a/lib/neutron +++ b/lib/neutron @@ -43,21 +43,11 @@ # to run Neutron on this host, make sure that q-svc is also in # ``ENABLED_SERVICES``. # -# If you're planning to use the Neutron openvswitch plugin, set -# ``Q_PLUGIN`` to "openvswitch" and make sure the q-agt service is enabled -# in ``ENABLED_SERVICES``. If you're planning to use the Neutron -# linuxbridge plugin, set ``Q_PLUGIN`` to "linuxbridge" and make sure the -# q-agt service is enabled in ``ENABLED_SERVICES``. -# # See "Neutron Network Configuration" below for additional variables # that must be set in localrc for connectivity across hosts with # Neutron. # # With Neutron networking the NETWORK_MANAGER variable is ignored. -# -# To enable specific configuration options for either the Open vSwitch or -# LinuxBridge plugin, please see the top level README file under the -# Neutron section. # Neutron Network Configuration @@ -213,12 +203,11 @@ fi # Provider Network Configurations # -------------------------------- -# The following variables control the Neutron openvswitch and -# linuxbridge plugins' allocation of tenant networks and -# availability of provider networks. If these are not configured -# in ``localrc``, tenant networks will be local to the host (with no -# remote connectivity), and no physical resources will be -# available for the allocation of provider networks. +# The following variables control the Neutron ML2 plugins' allocation +# of tenant networks and availability of provider networks. If these +# are not configured in ``localrc``, tenant networks will be local to +# the host (with no remote connectivity), and no physical resources +# will be available for the allocation of provider networks. # To disable tunnels (GRE or VXLAN) for tenant networks, # set to False in ``local.conf``. @@ -231,8 +220,8 @@ ENABLE_TENANT_TUNNELS=${ENABLE_TENANT_TUNNELS:-True} TENANT_TUNNEL_RANGES=${TENANT_TUNNEL_RANGES:-1:1000} # To use VLANs for tenant networks, set to True in localrc. VLANs -# are supported by the openvswitch and linuxbridge plugins, each -# requiring additional configuration described below. +# are supported by the ML2 plugins, requiring additional configuration +# described below. ENABLE_TENANT_VLANS=${ENABLE_TENANT_VLANS:-False} # If using VLANs for tenant networks, set in ``localrc`` to specify @@ -252,7 +241,7 @@ TENANT_VLAN_RANGE=${TENANT_VLAN_RANGE:-} # Example: ``PHYSICAL_NETWORK=default`` PHYSICAL_NETWORK=${PHYSICAL_NETWORK:-} -# With the openvswitch plugin, if using VLANs for tenant networks, +# With the openvswitch agent, if using VLANs for tenant networks, # or if using flat or VLAN provider networks, set in ``localrc`` to # the name of the OVS bridge to use for the physical network. The # bridge will be created if it does not already exist, but a @@ -262,7 +251,7 @@ PHYSICAL_NETWORK=${PHYSICAL_NETWORK:-} # Example: ``OVS_PHYSICAL_BRIDGE=br-eth1`` OVS_PHYSICAL_BRIDGE=${OVS_PHYSICAL_BRIDGE:-} -# With the linuxbridge plugin, if using VLANs for tenant networks, +# With the linuxbridge agent, if using VLANs for tenant networks, # or if using flat or VLAN provider networks, set in ``localrc`` to # the name of the network interface to use for the physical # network. diff --git a/lib/neutron_plugins/linuxbridge b/lib/neutron_plugins/linuxbridge deleted file mode 100644 index 5f989ae0ad..0000000000 --- a/lib/neutron_plugins/linuxbridge +++ /dev/null @@ -1,55 +0,0 @@ -# Neutron Linux Bridge plugin -# --------------------------- - -# Save trace setting -LBRIDGE_XTRACE=$(set +o | grep xtrace) -set +o xtrace - -source $TOP_DIR/lib/neutron_plugins/linuxbridge_agent - -function neutron_plugin_configure_common { - Q_PLUGIN_CONF_PATH=etc/neutron/plugins/linuxbridge - Q_PLUGIN_CONF_FILENAME=linuxbridge_conf.ini - Q_PLUGIN_CLASS="neutron.plugins.linuxbridge.lb_neutron_plugin.LinuxBridgePluginV2" -} - -function neutron_plugin_configure_service { - if [[ "$ENABLE_TENANT_VLANS" == "True" ]]; then - iniset /$Q_PLUGIN_CONF_FILE vlans tenant_network_type vlan - else - echo "WARNING - The linuxbridge plugin is using local tenant networks, with no connectivity between hosts." - fi - - # Override ``LB_VLAN_RANGES`` and ``LB_INTERFACE_MAPPINGS`` in ``localrc`` - # for more complex physical network configurations. - if [[ "$LB_VLAN_RANGES" == "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]]; then - LB_VLAN_RANGES=$PHYSICAL_NETWORK - if [[ "$TENANT_VLAN_RANGE" != "" ]]; then - LB_VLAN_RANGES=$LB_VLAN_RANGES:$TENANT_VLAN_RANGE - fi - fi - if [[ "$LB_VLAN_RANGES" != "" ]]; then - iniset /$Q_PLUGIN_CONF_FILE vlans network_vlan_ranges $LB_VLAN_RANGES - fi - if [[ "$Q_USE_SECGROUP" == "True" ]]; then - iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.linux.iptables_firewall.IptablesFirewallDriver - else - iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.firewall.NoopFirewallDriver - fi - - # Define extra "LINUX_BRIDGE" configuration options when q-svc is configured by defining - # the array ``Q_SRV_EXTRA_OPTS``. - # For Example: ``Q_SRV_EXTRA_OPTS=(foo=true bar=2)`` - for I in "${Q_SRV_EXTRA_OPTS[@]}"; do - # Replace the first '=' with ' ' for iniset syntax - iniset /$Q_PLUGIN_CONF_FILE linux_bridge ${I/=/ } - done -} - -function has_neutron_plugin_security_group { - # 0 means True here - return 0 -} - -# Restore xtrace -$LBRIDGE_XTRACE diff --git a/lib/neutron_plugins/linuxbridge_agent b/lib/neutron_plugins/linuxbridge_agent deleted file mode 100644 index 2638dd3725..0000000000 --- a/lib/neutron_plugins/linuxbridge_agent +++ /dev/null @@ -1,77 +0,0 @@ -# Neutron Linux Bridge L2 agent -# ----------------------------- - -# Save trace setting -PLUGIN_XTRACE=$(set +o | grep xtrace) -set +o xtrace - -function is_neutron_ovs_base_plugin { - # linuxbridge doesn't use OVS - return 1 -} - -function neutron_plugin_create_nova_conf { - : -} - -function neutron_plugin_install_agent_packages { - install_package bridge-utils -} - -function neutron_plugin_configure_debug_command { - iniset $NEUTRON_TEST_CONFIG_FILE DEFAULT external_network_bridge -} - -function neutron_plugin_configure_dhcp_agent { - iniset $Q_DHCP_CONF_FILE DEFAULT dhcp_agent_manager neutron.agent.dhcp_agent.DhcpAgentWithStateReport -} - -function neutron_plugin_configure_l3_agent { - iniset $Q_L3_CONF_FILE DEFAULT external_network_bridge - iniset $Q_L3_CONF_FILE DEFAULT l3_agent_manager neutron.agent.l3_agent.L3NATAgentWithStateReport -} - -function neutron_plugin_configure_plugin_agent { - # Setup physical network interface mappings. Override - # ``LB_VLAN_RANGES`` and ``LB_INTERFACE_MAPPINGS`` in ``localrc`` for more - # complex physical network configurations. - if [[ "$LB_INTERFACE_MAPPINGS" == "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]] && [[ "$LB_PHYSICAL_INTERFACE" != "" ]]; then - LB_INTERFACE_MAPPINGS=$PHYSICAL_NETWORK:$LB_PHYSICAL_INTERFACE - fi - if [[ "$LB_INTERFACE_MAPPINGS" != "" ]]; then - iniset /$Q_PLUGIN_CONF_FILE linux_bridge physical_interface_mappings $LB_INTERFACE_MAPPINGS - fi - if [[ "$Q_USE_SECGROUP" == "True" ]]; then - iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.linux.iptables_firewall.IptablesFirewallDriver - else - iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.firewall.NoopFirewallDriver - fi - AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-linuxbridge-agent" - iniset /$Q_PLUGIN_CONF_FILE agent tunnel_types $Q_TUNNEL_TYPES - # Define extra "AGENT" configuration options when q-agt is configured by defining - # the array ``Q_AGENT_EXTRA_AGENT_OPTS``. - # For Example: ``Q_AGENT_EXTRA_AGENT_OPTS=(foo=true bar=2)`` - for I in "${Q_AGENT_EXTRA_AGENT_OPTS[@]}"; do - # Replace the first '=' with ' ' for iniset syntax - iniset /$Q_PLUGIN_CONF_FILE agent ${I/=/ } - done - # Define extra "LINUX_BRIDGE" configuration options when q-agt is configured by defining - # the array ``Q_AGENT_EXTRA_SRV_OPTS``. - # For Example: ``Q_AGENT_EXTRA_SRV_OPTS=(foo=true bar=2)`` - for I in "${Q_AGENT_EXTRA_SRV_OPTS[@]}"; do - # Replace the first '=' with ' ' for iniset syntax - iniset /$Q_PLUGIN_CONF_FILE linux_bridge ${I/=/ } - done -} - -function neutron_plugin_setup_interface_driver { - local conf_file=$1 - iniset $conf_file DEFAULT interface_driver neutron.agent.linux.interface.BridgeInterfaceDriver -} - -function neutron_plugin_check_adv_test_requirements { - is_service_enabled q-agt && is_service_enabled q-dhcp && return 0 -} - -# Restore xtrace -$PLUGIN_XTRACE diff --git a/lib/neutron_plugins/openvswitch b/lib/neutron_plugins/openvswitch index c468132bbb..e9bc5f9a78 100644 --- a/lib/neutron_plugins/openvswitch +++ b/lib/neutron_plugins/openvswitch @@ -1,5 +1,8 @@ -# Neutron Open vSwitch plugin -# --------------------------- +# Common code used by cisco and embrane plugins +# --------------------------------------------- + +# This module used to be for Open vSwitch monolithic plugin, +# which has been removed in Juno. # Save trace setting OVS_XTRACE=$(set +o | grep xtrace) From 3ec8a9032724a5ad86d80b3ac3ef7143c6c68890 Mon Sep 17 00:00:00 2001 From: Nikhil Manchanda Date: Sun, 26 Oct 2014 15:41:15 -0700 Subject: [PATCH 0042/3333] Use updated trove mysql image location Use the updated trove mysql image at: tarballs.openstack.org/trove/images/ubuntu/mysql.qcow2 instead of the older deprecated image at: tarballs.openstack.org/trove/images/ubuntu_mysql.qcow2/ubuntu_mysql.qcow2 Change-Id: If76f25dfe0f975faf1883f0a6d993c21b26e1b29 --- stackrc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stackrc b/stackrc index 6cec8e85fb..fd84598c5f 100644 --- a/stackrc +++ b/stackrc @@ -522,11 +522,11 @@ if [[ "$ENABLED_SERVICES" =~ 'h-api' ]]; then esac fi -# Trove needs a custom image for it's work +# Trove needs a custom image for its work if [[ "$ENABLED_SERVICES" =~ 'tr-api' ]]; then case "$VIRT_DRIVER" in libvirt|baremetal|ironic|xenapi) - TROVE_GUEST_IMAGE_URL=${TROVE_GUEST_IMAGE_URL:-"http://tarballs.openstack.org/trove/images/ubuntu_mysql.qcow2/ubuntu_mysql.qcow2"} + TROVE_GUEST_IMAGE_URL=${TROVE_GUEST_IMAGE_URL:-"http://tarballs.openstack.org/trove/images/ubuntu/mysql.qcow2"} IMAGE_URLS+=",${TROVE_GUEST_IMAGE_URL}" ;; *) From 7fb5082c5c7abff95eb46dd9a92c5fd8fc63ddd2 Mon Sep 17 00:00:00 2001 From: wanghong Date: Tue, 28 Oct 2014 19:09:04 +0800 Subject: [PATCH 0043/3333] correct templated catalog driver class Now the templated catalog driver class "TemplatedCatalog" is removed in this patch https://review.openstack.org/#/c/125708/2 use "keystone.catalog.backends.templated.Catalog" instead. Change-Id: Ib9c8ea557e7171ff0c78a1e10d752ed564aff9e7 Closes-Bug: #1386562 --- lib/keystone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/keystone b/lib/keystone index 1c67835a12..276e9718a6 100644 --- a/lib/keystone +++ b/lib/keystone @@ -287,7 +287,7 @@ function configure_keystone { " -i $KEYSTONE_CATALOG # Configure ``keystone.conf`` to use templates - iniset $KEYSTONE_CONF catalog driver "keystone.catalog.backends.templated.TemplatedCatalog" + iniset $KEYSTONE_CONF catalog driver "keystone.catalog.backends.templated.Catalog" iniset $KEYSTONE_CONF catalog template_file "$KEYSTONE_CATALOG" fi From 2112743b10fb522e86380fad5bf5a9e72b73721f Mon Sep 17 00:00:00 2001 From: Chris Dent Date: Tue, 21 Oct 2014 20:19:23 +0100 Subject: [PATCH 0044/3333] Allow ceilometer to use redis for coordination If redis is desired by local.conf via CEILOMETER_COORDINATION_URL then make sure redis is installed and restarted. Change-Id: Idfb7b902478049fbc240bf416db6c7d6acd67a51 --- lib/ceilometer | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/ceilometer b/lib/ceilometer index 9046b9d3d9..483cd277c8 100644 --- a/lib/ceilometer +++ b/lib/ceilometer @@ -242,6 +242,18 @@ function init_ceilometer { fi } +# install_redis() - Install the redis server. +function install_redis { + if is_ubuntu; then + install_package redis-server + else + # This will fail (correctly) where a redis package is unavailable + install_package redis + fi + + restart_service redis +} + # install_ceilometer() - Collect source and prepare function install_ceilometer { git_clone $CEILOMETER_REPO $CEILOMETER_DIR $CEILOMETER_BRANCH @@ -249,6 +261,8 @@ function install_ceilometer { if echo $CEILOMETER_COORDINATION_URL | grep -q '^memcached:'; then install_package memcached + elif echo $CEILOMETER_COORDINATION_URL | grep -q '^redis:'; then + install_redis fi } From d16197b689e9087d6c22e0488c0aa671578a927d Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Tue, 28 Oct 2014 12:21:38 +0900 Subject: [PATCH 0045/3333] Stop setting deprecated OVS.enable_tunneling option The option has been deprecated in IceHouse and now being removed. Related-Bug: #1195374 Change-Id: I38d962551173892144c369df71e0524b43e1fc89 --- lib/neutron_plugins/ofagent_agent | 1 - lib/neutron_plugins/openvswitch | 5 ----- lib/neutron_plugins/openvswitch_agent | 1 - 3 files changed, 7 deletions(-) diff --git a/lib/neutron_plugins/ofagent_agent b/lib/neutron_plugins/ofagent_agent index 1c04f2f64e..55f3f72056 100644 --- a/lib/neutron_plugins/ofagent_agent +++ b/lib/neutron_plugins/ofagent_agent @@ -61,7 +61,6 @@ function neutron_plugin_configure_plugin_agent { if [ `vercmp_numbers "$OVS_VERSION" "1.4"` -lt "0" ]; then die $LINENO "You are running OVS version $OVS_VERSION. OVS 1.4+ is required for tunneling between multiple hosts." fi - iniset /$Q_PLUGIN_CONF_FILE ovs enable_tunneling True iniset /$Q_PLUGIN_CONF_FILE ovs local_ip $TUNNEL_ENDPOINT_IP fi diff --git a/lib/neutron_plugins/openvswitch b/lib/neutron_plugins/openvswitch index e9bc5f9a78..3b6567cd0a 100644 --- a/lib/neutron_plugins/openvswitch +++ b/lib/neutron_plugins/openvswitch @@ -38,11 +38,6 @@ function neutron_plugin_configure_service { iniset /$Q_PLUGIN_CONF_FILE ovs network_vlan_ranges $OVS_VLAN_RANGES fi - # Enable tunnel networks if selected - if [[ $OVS_ENABLE_TUNNELING == "True" ]]; then - iniset /$Q_PLUGIN_CONF_FILE ovs enable_tunneling True - fi - _neutron_ovs_base_configure_firewall_driver # Define extra "OVS" configuration options when q-svc is configured by defining diff --git a/lib/neutron_plugins/openvswitch_agent b/lib/neutron_plugins/openvswitch_agent index 835f645b8c..e1a6f4a47f 100644 --- a/lib/neutron_plugins/openvswitch_agent +++ b/lib/neutron_plugins/openvswitch_agent @@ -47,7 +47,6 @@ function neutron_plugin_configure_plugin_agent { if [ `vercmp_numbers "$OVS_VERSION" "1.4"` -lt "0" ] && ! is_service_enabled q-svc ; then die $LINENO "You are running OVS version $OVS_VERSION. OVS 1.4+ is required for tunneling between multiple hosts." fi - iniset /$Q_PLUGIN_CONF_FILE ovs enable_tunneling True iniset /$Q_PLUGIN_CONF_FILE ovs local_ip $TUNNEL_ENDPOINT_IP fi From f3bf8b6cc0dc94684a3bbecc4cc1e2169506f804 Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Wed, 29 Oct 2014 21:53:56 +1100 Subject: [PATCH 0046/3333] Revert "Single quote iniset argument in merge_config_file" This reverts commit e2c9fee8ed846aba124a2fc1bba245790ed7ba90. We have decided that we don't want to support the json-style argument as described by bug#1374118 (see thread at [1]). This restores the old behavior of sending the argument in double-quotes so environment variables get expanded. As a bonus, tests for this are added. [1] http://lists.openstack.org/pipermail/openstack-dev/2014-October/049341.html Change-Id: I9fc99f3716cc53366907878adb00ae6cf3898f14 Closes-Bug:#1386413 --- lib/config | 8 +++----- tests/test_config.sh | 33 +++++++++++++++++++++------------ 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/lib/config b/lib/config index a4d59a31c9..a4d032864b 100644 --- a/lib/config +++ b/lib/config @@ -82,8 +82,6 @@ function merge_config_file { local matchgroup=$2 local configfile=$3 - # note in the awk below, \x27 is ascii for ' -- this avoids - # having to do nasty quoting games get_meta_section $file $matchgroup $configfile | \ $CONFIG_AWK_CMD -v configfile=$configfile ' BEGIN { @@ -140,13 +138,13 @@ function merge_config_file { for (attr_no = cfg_sec_attr_count[sno] - 1; attr_no >=0; attr_no--) { attr = cfg_sec_attr_name[sno, attr_no] if (cfg_attr_count[section, attr] == 1) - print "iniset " configfile " " section " " attr " \x27" cfg_attr[section, attr, 0] "\x27" + print "iniset " configfile " " section " " attr " \"" cfg_attr[section, attr, 0] "\"" else { # For multiline, invoke the ini routines in the reverse order count = cfg_attr_count[section, attr] - print "iniset " configfile " " section " " attr " \x27" cfg_attr[section, attr, count - 1] "\x27" + print "iniset " configfile " " section " " attr " \"" cfg_attr[section, attr, count - 1] "\"" for (l = count -2; l >= 0; l--) - print "iniadd_literal " configfile " " section " " attr " \x27" cfg_attr[section, attr, l] "\x27" + print "iniadd_literal " configfile " " section " " attr " \"" cfg_attr[section, attr, l] "\"" } } } diff --git a/tests/test_config.sh b/tests/test_config.sh index cd74cee6f0..3252104bf1 100755 --- a/tests/test_config.sh +++ b/tests/test_config.sh @@ -92,9 +92,9 @@ attribute=value [fff] type=new -[[test-quote|test-quote.conf]] +[[test-env|test-env.conf]] [foo] -foo="foo bar" "baz" +foo=\${FOO_BAR_BAZ} [[test5|test-equals.conf]] [DEFAULT] @@ -126,9 +126,11 @@ cfg_item5 = 5555another [[test-multiline|test-multiline.conf]] [multi] -cfg_item1 = "ab":"cd", "ef": "gh" +cfg_item1 = ab:cd:ef:gh cfg_item1 = abcd cfg_item2 = efgh +cfg_item2 = \${FOO_BAR_BAZ} + EOF echo -n "get_meta_section_files: test0 doesn't exist: " @@ -236,14 +238,17 @@ check_result "$VAL" "$EXPECT_VAL" echo -n "merge_config_file test-multiline: " rm -f test-multiline.conf +FOO_BAR_BAZ="foo bar baz" merge_config_file test.conf test-multiline test-multiline.conf VAL=$(cat test-multiline.conf) EXPECT_VAL=' [multi] -cfg_item1 = "ab":"cd", "ef": "gh" +cfg_item1 = ab:cd:ef:gh cfg_item1 = abcd -cfg_item2 = efgh' +cfg_item2 = efgh +cfg_item2 = foo bar baz' check_result "$VAL" "$EXPECT_VAL" +unset FOO_BAR_BAZ echo -n "merge_config_group test2: " rm test2a.conf @@ -275,14 +280,16 @@ EXPECT_VAL=" attribute = value" check_result "$VAL" "$EXPECT_VAL" -echo -n "merge_config_file test-quote: " -rm -f test-quote.conf -merge_config_file test.conf test-quote test-quote.conf -VAL=$(cat test-quote.conf) +echo -n "merge_config_file test-env: " +rm -f test-env.conf +FOO_BAR_BAZ="foo bar baz" +merge_config_file test.conf test-env test-env.conf +VAL=$(cat test-env.conf) EXPECT_VAL=' [foo] -foo = "foo bar" "baz"' +foo = foo bar baz' check_result "$VAL" "$EXPECT_VAL" +unset FOO_BAR_BAZ echo -n "merge_config_group test4 variable filename: " setup_test4 @@ -332,6 +339,8 @@ EXPECT_VAL=" servers = 10.11.12.13:80" check_result "$VAL" "$EXPECT_VAL" -rm -f test.conf test1c.conf test2a.conf test-quote.conf test-space.conf test-equals.conf test-strip.conf test-colon.conf -rm -f test-multiline.conf test-multi-sections.conf +rm -f test.conf test1c.conf test2a.conf \ + test-space.conf test-equals.conf test-strip.conf \ + test-colon.conf test-env.conf test-multiline.conf \ + test-multi-sections.conf rm -rf test-etc From 46b0be31372e2f1aa9c2e55f3112b65a76167f8e Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Thu, 16 Oct 2014 13:15:51 +1100 Subject: [PATCH 0047/3333] Fix up file-matching in bashate tox test The current test does not match file files in /lib/* because the -wholename command is missing the preceeding \*. The whole command is a little difficult to understand. This re-lays the find command, using -prune to skip dot directories and keeping a hopefully clearer flow of what is being matched. Change-Id: Idd856e897ff97095fb116294a9187ff4b198fa26 --- tox.ini | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index b6f2d9655e..c8d3909805 100644 --- a/tox.ini +++ b/tox.ini @@ -10,7 +10,19 @@ install_command = pip install {opts} {packages} [testenv:bashate] deps = bashate whitelist_externals = bash -commands = bash -c "find {toxinidir} -not -wholename \*.tox/\* -and \( -name \*.sh -or -name \*rc -or -name functions\* -or \( -wholename lib/\* -and -not -name \*.md \) \) -print0 | xargs -0 bashate -v" +commands = bash -c "find {toxinidir} \ + -not \( -type d -name .?\* -prune \) \ # prune all 'dot' dirs + -not \( -type d -name doc -prune \) \ # skip documentation + -type f \ # only files + -not -name \*~ \ # skip editors, readme, etc + -not -name \*.md \ + \( \ + -name \*.sh -or \ + -name \*rc -or \ + -name functions\* -or \ + -wholename \*/lib/\* \ # /lib files are shell, but + \) \ # have no extension + -print0 | xargs -0 bashate -v" [testenv:docs] deps = From 6df648920c0d15c1b79f8592bb99b98282005794 Mon Sep 17 00:00:00 2001 From: Mate Lakat Date: Fri, 17 Oct 2014 13:09:49 +0200 Subject: [PATCH 0048/3333] XenAPI: move Neutron plugin install to domU Use the same mechanism as used for nova plugin installation, thus avoiding the need for variables in dom0. This change will also help to move XenServer CI to neutron in the future, as the dom0 part of the script is not executed there. With this change, the neutron related network will always be created and attached even if the user wants to use nova-network. Change-Id: I8669c94e9f0aacce2990469dbabde1ff702a2769 --- lib/neutron | 18 ++++++++++++++++++ tools/xen/install_os_domU.sh | 26 ++++++-------------------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/lib/neutron b/lib/neutron index ca9b16cd8c..43167d8206 100644 --- a/lib/neutron +++ b/lib/neutron @@ -595,6 +595,24 @@ function init_neutron { function install_neutron { git_clone $NEUTRON_REPO $NEUTRON_DIR $NEUTRON_BRANCH setup_develop $NEUTRON_DIR + + if [ "$VIRT_DRIVER" == 'xenserver' ]; then + local dom0_ip + dom0_ip=$(echo "$XENAPI_CONNECTION_URL" | cut -d "/" -f 3-) + + local ssh_dom0 + ssh_dom0="sudo -u $DOMZERO_USER ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@$dom0_ip" + + # Find where the plugins should go in dom0 + local xen_functions + xen_functions=$(cat $TOP_DIR/tools/xen/functions) + local plugin_dir + plugin_dir=$($ssh_dom0 "$xen_functions; set -eux; xapi_plugin_location") + + # install neutron plugins to dom0 + tar -czf - -C $NEUTRON_DIR/neutron/plugins/openvswitch/agent/xenapi/etc/xapi.d/plugins/ ./ | + $ssh_dom0 "tar -xzf - -C $plugin_dir && chmod a+x $plugin_dir/*" + fi } # install_neutronclient() - Collect source and prepare diff --git a/tools/xen/install_os_domU.sh b/tools/xen/install_os_domU.sh index 439db68120..ff7e6fbc88 100755 --- a/tools/xen/install_os_domU.sh +++ b/tools/xen/install_os_domU.sh @@ -65,16 +65,6 @@ EOF exit 1 fi -# Install plugins - -## Install the netwrap xapi plugin to support agent control of dom0 networking -if [[ "$ENABLED_SERVICES" =~ "q-agt" && "$Q_PLUGIN" = "openvswitch" ]]; then - NEUTRON_ZIPBALL_URL=${NEUTRON_ZIPBALL_URL:-$(zip_snapshot_location $NEUTRON_REPO $NEUTRON_BRANCH)} - EXTRACTED_NEUTRON=$(extract_remote_zipball "$NEUTRON_ZIPBALL_URL") - install_xapi_plugins_from "$EXTRACTED_NEUTRON" - rm -rf "$EXTRACTED_NEUTRON" -fi - # # Configure Networking # @@ -88,9 +78,7 @@ setup_network "$PUB_BRIDGE_OR_NET_NAME" # With neutron, one more network is required, which is internal to the # hypervisor, and used by the VMs -if is_service_enabled neutron; then - setup_network "$XEN_INT_BRIDGE_OR_NET_NAME" -fi +setup_network "$XEN_INT_BRIDGE_OR_NET_NAME" if parameter_is_specified "FLAT_NETWORK_BRIDGE"; then if [ "$(bridge_for "$VM_BRIDGE_OR_NET_NAME")" != "$(bridge_for "$FLAT_NETWORK_BRIDGE")" ]; then @@ -292,14 +280,12 @@ $THIS_DIR/build_xva.sh "$GUEST_NAME" # Attach a network interface for the integration network (so that the bridge # is created by XenServer). This is required for Neutron. Also pass that as a # kernel parameter for DomU -if is_service_enabled neutron; then - attach_network "$XEN_INT_BRIDGE_OR_NET_NAME" +attach_network "$XEN_INT_BRIDGE_OR_NET_NAME" - XEN_INTEGRATION_BRIDGE=$(bridge_for "$XEN_INT_BRIDGE_OR_NET_NAME") - append_kernel_cmdline \ - "$GUEST_NAME" \ - "xen_integration_bridge=${XEN_INTEGRATION_BRIDGE}" -fi +XEN_INTEGRATION_BRIDGE=$(bridge_for "$XEN_INT_BRIDGE_OR_NET_NAME") +append_kernel_cmdline \ + "$GUEST_NAME" \ + "xen_integration_bridge=${XEN_INTEGRATION_BRIDGE}" FLAT_NETWORK_BRIDGE="${FLAT_NETWORK_BRIDGE:-$(bridge_for "$VM_BRIDGE_OR_NET_NAME")}" append_kernel_cmdline "$GUEST_NAME" "flat_network_bridge=${FLAT_NETWORK_BRIDGE}" From dec5ca0f201eaaa996b929aa36f2db5d9fb91aac Mon Sep 17 00:00:00 2001 From: Mate Lakat Date: Fri, 17 Oct 2014 13:13:35 +0200 Subject: [PATCH 0049/3333] XenAPI: Remove non-used functions Remove the no-longer used functions that were used to download plugins to dom0. Change-Id: I8dfd476781b683a8378efdae45d3cb1b46e7063c --- tools/xen/functions | 40 ---------------------------------- tools/xen/test_functions.sh | 43 ------------------------------------- 2 files changed, 83 deletions(-) diff --git a/tools/xen/functions b/tools/xen/functions index 4317796e39..c8efd57d88 100644 --- a/tools/xen/functions +++ b/tools/xen/functions @@ -19,10 +19,6 @@ function xapi_plugin_location { return 1 } -function zip_snapshot_location { - echo $1 | sed "s,^git://,http://,g;s:\.git$::;s:$:/zipball/$2:g" -} - function create_directory_for_kernels { if [ -d "/boot/guest" ]; then echo "INFO: /boot/guest directory already exists, using that" >&2 @@ -43,42 +39,6 @@ function create_directory_for_images { fi } -function extract_remote_zipball { - local ZIPBALL_URL=$1 - - local LOCAL_ZIPBALL=$(mktemp) - local EXTRACTED_FILES=$(mktemp -d) - - { - if ! wget -nv $ZIPBALL_URL -O $LOCAL_ZIPBALL --no-check-certificate; then - die_with_error "Failed to download [$ZIPBALL_URL]" - fi - unzip -q -o $LOCAL_ZIPBALL -d $EXTRACTED_FILES - rm -f $LOCAL_ZIPBALL - } >&2 - - echo "$EXTRACTED_FILES" -} - -function find_xapi_plugins_dir { - find $1 -path '*/xapi.d/plugins' -type d -print -} - -function install_xapi_plugins_from { - local XAPI_PLUGIN_DIR - local EXTRACTED_FILES - local EXTRACTED_PLUGINS_DIR - - EXTRACTED_FILES="$1" - - XAPI_PLUGIN_DIR=$(xapi_plugin_location) - - EXTRACTED_PLUGINS_DIR=$(find_xapi_plugins_dir $EXTRACTED_FILES) - - cp -pr $EXTRACTED_PLUGINS_DIR/* $XAPI_PLUGIN_DIR - chmod a+x ${XAPI_PLUGIN_DIR}* -} - function get_local_sr { xe pool-list params=default-SR minimal=true } diff --git a/tools/xen/test_functions.sh b/tools/xen/test_functions.sh index 838f86a525..924e773c00 100755 --- a/tools/xen/test_functions.sh +++ b/tools/xen/test_functions.sh @@ -116,18 +116,6 @@ function test_no_plugin_directory_found { grep "[ -d /usr/lib/xcp/plugins/ ]" $LIST_OF_ACTIONS } -function test_zip_snapshot_location_http { - diff \ - <(zip_snapshot_location "http://github.com/openstack/nova.git" "master") \ - <(echo "http://github.com/openstack/nova/zipball/master") -} - -function test_zip_snapsot_location_git { - diff \ - <(zip_snapshot_location "git://github.com/openstack/nova.git" "master") \ - <(echo "http://github.com/openstack/nova/zipball/master") -} - function test_create_directory_for_kernels { ( . mocks @@ -174,37 +162,6 @@ function test_create_directory_for_images_existing_dir { EOF } -function test_extract_remote_zipball { - local RESULT=$(. mocks && extract_remote_zipball "someurl") - - diff <(cat $LIST_OF_ACTIONS) - << EOF -wget -nv someurl -O tempfile --no-check-certificate -unzip -q -o tempfile -d tempdir -rm -f tempfile -EOF - - [ "$RESULT" = "tempdir" ] -} - -function test_extract_remote_zipball_wget_fail { - set +e - - local IGNORE - IGNORE=$(. mocks && extract_remote_zipball "failurl") - - assert_died_with "Failed to download [failurl]" -} - -function test_find_nova_plugins { - local tmpdir=$(mktemp -d) - - mkdir -p "$tmpdir/blah/blah/u/xapi.d/plugins" - - [ "$tmpdir/blah/blah/u/xapi.d/plugins" = $(find_xapi_plugins_dir $tmpdir) ] - - rm -rf $tmpdir -} - function test_get_local_sr { setup_xe_response "uuid123" From 518fb760d3cfa47c94400ef664f0daa14b99c003 Mon Sep 17 00:00:00 2001 From: Mate Lakat Date: Fri, 17 Oct 2014 13:14:49 +0200 Subject: [PATCH 0050/3333] XenAPI: workaround for unsupp. associative arrays Dom0's bash does not support associative arrays, however we source `functions` and therefore our scripts fail. This change breaks the dependency of dom0 tools on domU functions. Fixes bug: 1379804 Change-Id: I229e2d5f07070a9236ec612d4032c94c4361a9f6 --- tools/xen/build_xva.sh | 7 ------- tools/xen/install_os_domU.sh | 7 ------- tools/xen/prepare_guest_template.sh | 7 ------- tools/xen/scripts/install_ubuntu_template.sh | 3 --- tools/xen/xenrc | 21 ++++++++++++++++++-- 5 files changed, 19 insertions(+), 26 deletions(-) diff --git a/tools/xen/build_xva.sh b/tools/xen/build_xva.sh index cc3cbe18d1..7c8e620f44 100755 --- a/tools/xen/build_xva.sh +++ b/tools/xen/build_xva.sh @@ -21,19 +21,12 @@ set -o xtrace # This directory TOP_DIR=$(cd $(dirname "$0") && pwd) -# Source lower level functions -. $TOP_DIR/../../functions - # Include onexit commands . $TOP_DIR/scripts/on_exit.sh # xapi functions . $TOP_DIR/functions -# Determine what system we are running on. -# Might not be XenServer if we're using xenserver-core -GetDistro - # Source params - override xenrc params in your localrc to suite your taste source xenrc diff --git a/tools/xen/install_os_domU.sh b/tools/xen/install_os_domU.sh index ff7e6fbc88..3a63473d40 100755 --- a/tools/xen/install_os_domU.sh +++ b/tools/xen/install_os_domU.sh @@ -22,19 +22,12 @@ fi # This directory THIS_DIR=$(cd $(dirname "$0") && pwd) -# Source lower level functions -. $THIS_DIR/../../functions - # Include onexit commands . $THIS_DIR/scripts/on_exit.sh # xapi functions . $THIS_DIR/functions -# Determine what system we are running on. -# Might not be XenServer if we're using xenserver-core -GetDistro - # # Get Settings # diff --git a/tools/xen/prepare_guest_template.sh b/tools/xen/prepare_guest_template.sh index 2d3b89821f..a7a60ca5e6 100755 --- a/tools/xen/prepare_guest_template.sh +++ b/tools/xen/prepare_guest_template.sh @@ -22,19 +22,12 @@ set -o xtrace # This directory TOP_DIR=$(cd $(dirname "$0") && pwd) -# Source lower level functions -. $TOP_DIR/../../functions - # Include onexit commands . $TOP_DIR/scripts/on_exit.sh # xapi functions . $TOP_DIR/functions -# Determine what system we are running on. -# Might not be XenServer if we're using xenserver-core -GetDistro - # Source params - override xenrc params in your localrc to suite your taste source xenrc diff --git a/tools/xen/scripts/install_ubuntu_template.sh b/tools/xen/scripts/install_ubuntu_template.sh index d4d6567a40..d80ed095e8 100755 --- a/tools/xen/scripts/install_ubuntu_template.sh +++ b/tools/xen/scripts/install_ubuntu_template.sh @@ -14,9 +14,6 @@ set -o xtrace # This directory BASE_DIR=$(cd $(dirname "$0") && pwd) -# Source the top level functions -source $BASE_DIR/../../../functions - # For default setings see xenrc source $BASE_DIR/../xenrc diff --git a/tools/xen/xenrc b/tools/xen/xenrc index 510c5f9c46..0cbf86118d 100644 --- a/tools/xen/xenrc +++ b/tools/xen/xenrc @@ -91,7 +91,24 @@ UBUNTU_INST_GATEWAY="" # Set the size to 0 to avoid creation of additional disk. XEN_XVDB_SIZE_GB=0 -restore_nounset=`set +o | grep nounset` +STACK_USER=stack +DOMZERO_USER=domzero + +RC_DIR="../.." + +restore_nounset=$(set +o | grep nounset) set +u -source ../../stackrc + +## Note that the lines below are coming from stackrc to support +## new-style config files + +# allow local overrides of env variables, including repo config +if [[ -f $RC_DIR/localrc ]]; then + # Old-style user-supplied config + source $RC_DIR/localrc +elif [[ -f $RC_DIR/.localrc.auto ]]; then + # New-style user-supplied config extracted from local.conf + source $RC_DIR/.localrc.auto +fi + $restore_nounset From 20522e3b0e69c1f37ebeb7b4a66d9ced9e2a4236 Mon Sep 17 00:00:00 2001 From: Akihiro Motoki Date: Wed, 15 Oct 2014 19:53:11 +0900 Subject: [PATCH 0051/3333] Add pcre devel package for Horizon pyScss python module uses pcre if available for performance and it is better to be installed. This commit adds it for files/{apts,rpms}/horizon. Change-Id: If711fa222d3f395efd670334c8a84f35d195dc25 --- files/apts/horizon | 1 + files/rpms/horizon | 1 + 2 files changed, 2 insertions(+) diff --git a/files/apts/horizon b/files/apts/horizon index 03df3cba97..5d06928c7b 100644 --- a/files/apts/horizon +++ b/files/apts/horizon @@ -17,3 +17,4 @@ python-mox python-coverage python-cherrypy3 # why? python-migrate +libpcre3-dev # pyScss diff --git a/files/rpms/horizon b/files/rpms/horizon index fe3a2f40c0..7add23a549 100644 --- a/files/rpms/horizon +++ b/files/rpms/horizon @@ -19,3 +19,4 @@ python-sphinx python-sqlalchemy python-webob pyxattr +pcre-devel # pyScss From 18d6298ea1eb0ff9697258dc323f1aba2b9b3d46 Mon Sep 17 00:00:00 2001 From: Joe Gordon Date: Tue, 28 Oct 2014 13:37:15 -0700 Subject: [PATCH 0052/3333] Make allow_{resize|migrate}_to_same_host configurable In preparation for supporting 2 node devstack jobs, where the first node is an all in one and the second is a compute node. Make nova config options allow_resize_to_same_host and allow_migrate_to_same_host configurable so we can turn them off when we have two compute nodes. Change-Id: If6989200b56c4597d6e8506d0dda2cc75d0881f1 --- lib/nova | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/nova b/lib/nova index f47dc9798c..0f838072c1 100644 --- a/lib/nova +++ b/lib/nova @@ -137,6 +137,10 @@ FLAT_INTERFACE=${FLAT_INTERFACE:-$GUEST_INTERFACE_DEFAULT} # running the VM - removing a SPOF and bandwidth bottleneck. MULTI_HOST=`trueorfalse False $MULTI_HOST` +# ``NOVA_ALLOW_MOVE_TO_SAME_HOST` can be set to False in multi node devstack, +# where there are at least two nova-computes. +NOVA_ALLOW_MOVE_TO_SAME_HOST=`trueorfalse True $NOVA_ALLOW_MOVE_TO_SAME_HOST` + # Test floating pool and range are used for testing. They are defined # here until the admin APIs can replace nova-manage TEST_FLOATING_POOL=${TEST_FLOATING_POOL:-test} @@ -411,8 +415,10 @@ function create_nova_conf { rm -f $NOVA_CONF iniset $NOVA_CONF DEFAULT verbose "True" iniset $NOVA_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL" - iniset $NOVA_CONF DEFAULT allow_resize_to_same_host "True" - iniset $NOVA_CONF DEFAULT allow_migrate_to_same_host "True" + if [ "$NOVA_ALLOW_MOVE_TO_SAME_HOST" == "True" ]; then + iniset $NOVA_CONF DEFAULT allow_resize_to_same_host "True" + iniset $NOVA_CONF DEFAULT allow_migrate_to_same_host "True" + fi iniset $NOVA_CONF DEFAULT api_paste_config "$NOVA_API_PASTE_INI" iniset $NOVA_CONF DEFAULT rootwrap_config "$NOVA_CONF_DIR/rootwrap.conf" iniset $NOVA_CONF DEFAULT scheduler_driver "$SCHEDULER" From 627ca74b51d68651a6cd042d83a0386713f15b39 Mon Sep 17 00:00:00 2001 From: Andrew Lazarev Date: Wed, 29 Oct 2014 17:01:15 -0700 Subject: [PATCH 0053/3333] [Sahara] Copy policy.json if it exists To enable policy check in Sahara we need gate tests passed. Tests will not pass until Sahara has default policy.json ( e.g. http://logs.openstack.org/09/131609/1/check/check-tempest-dsvm-full/536d5e7/console.html). New code will copy of policy.json if it exists. So, for now this code will do nothing. Once policy.json appears in etc/sahara, the code will start coping it to sahara conf dir. This will allow to merge auth support with gate tests passed. Related blueprint: auth-policy Change-Id: I98e108ff02aacb91570f97e457d67dd02779ae3d --- lib/sahara | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/sahara b/lib/sahara index 5c7c2534e2..7f59cc1f2e 100644 --- a/lib/sahara +++ b/lib/sahara @@ -98,6 +98,10 @@ function configure_sahara { fi sudo chown $STACK_USER $SAHARA_CONF_DIR + if [[ -f $SAHARA_DIR/etc/sahara/policy.json ]]; then + cp -p $SAHARA_DIR/etc/sahara/policy.json $SAHARA_CONF_DIR + fi + # Copy over sahara configuration file and configure common parameters. cp $SAHARA_DIR/etc/sahara/sahara.conf.sample $SAHARA_CONF_FILE From 17314d242e1fea5a5ebc602c2a72fc28fb5473b4 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Wed, 29 Oct 2014 22:11:05 -0500 Subject: [PATCH 0054/3333] Remove old guides Change-Id: I2f8cd36aef1e0018ed4d5619c934dc9772823656 --- doc/source/guides/pxe-boot.rst | 140 --------------------------------- doc/source/guides/ramdisk.rst | 86 -------------------- doc/source/guides/usb-boot.rst | 57 -------------- 3 files changed, 283 deletions(-) delete mode 100644 doc/source/guides/pxe-boot.rst delete mode 100644 doc/source/guides/ramdisk.rst delete mode 100644 doc/source/guides/usb-boot.rst diff --git a/doc/source/guides/pxe-boot.rst b/doc/source/guides/pxe-boot.rst deleted file mode 100644 index f745abb7e4..0000000000 --- a/doc/source/guides/pxe-boot.rst +++ /dev/null @@ -1,140 +0,0 @@ -`DevStack `__ - -- `Overview <../overview.html>`__ -- `Changes <../changes.html>`__ -- `FAQ <../faq.html>`__ -- `git.openstack.org `__ -- `Gerrit `__ - -PXE Boot Server Guide: Magic Dust for Network Boot -================================================== - -Boot DevStack from a PXE server to a RAM disk. - -Prerequisites Hardware & OpenWRT --------------------------------- - -Hardware -~~~~~~~~ - -The whole point of this exercise is to have a highly portable boot -server, so using a small router with a USB port is the desired platform. -This guide uses a Buffalo WZR-HP-G300NH as an example, but it is easily -generalized for other supported platforms. See openwrt.org for more. - -OpenWRT -~~~~~~~ - -Any recent 'Backfire' build of OpenWRT will work for the boot server -project. We build from trunk and have made the images available at -`http://openwrt.xr7.org/openwrt `__. - -Installation bit blasting -------------------------- - -Install the Image -~~~~~~~~~~~~~~~~~ - -This process follows `the OpenWRT doc OEM -Install `__ to tftp -the new image onto the router. You need a computer to set up the router, -we assume it is a recent Linux or OS/X installation. - -- Get openwrt-ar71xx-wzr-hp-g300nh-squashfs-tftp.bin - - :: - - wget http://openwrt.xr7.org/openwrt/ar71xx/openwrt-ar71xx-wzr-hp-g300nh-squashfs-tftp.bin - -- Connect computer to LAN port 4 (closest to WAN port) -- Set computer interface to IP address in the 192.168.11.2 -- Add static arp entry for router - - :: - - arp -s 192.168.11.1 - -- Start TFTP transfer attempt - - :: - - tftp 192.168.11.1 - binary - rexmt 1 - timeout 60 - put openwrt-ar71xx-wzr-hp-g300nh-squashfs-tftp.bin - -- Power on router. Router will reboot and initialize on 192.168.1.1. -- Delete static arp entry for router - - :: - - arp -d 192.168.11.1 - -- Set computer to DHCP, connect and telnet to router and set root - password. - -Configure the Router -~~~~~~~~~~~~~~~~~~~~ - -- Update ``/etc/opkg.conf`` to point to our repo: - - :: - - src/gz packages http://192.168.5.13/openwrt/build/ar71xx/packages - -- Configure anon mounts: - - :: - - uci delete fstab.@mount[0] - uci commit fstab - /etc/init.d/fstab restart - -- Reset the DHCP address range. DevStack will claim the upper /25 of - the router's LAN address space for floating IPs so the default DHCP - address range needs to be moved: - - :: - - uci set dhcp.lan.start=65 - uci set dhcp.lan.limit=60 - uci commit dhcp - -- Enable TFTP: - - :: - - uci set dhcp.@dnsmasq[0].enable_tftp=1 - uci set dhcp.@dnsmasq[0].tftp_root=/mnt/sda1/tftpboot - uci set dhcp.@dnsmasq[0].dhcp_boot=pxelinux.0 - uci commit dhcp - /etc/init.d/dnsmasq restart - -Set Up tftpboot -~~~~~~~~~~~~~~~ - -- Create the ``/tmp/tftpboot`` structure and populate it: - - :: - - cd ~/devstack - tools/build_pxe_boot.sh /tmp - - This calls ``tools/build_ramdisk.sh`` to create a 2GB ramdisk - containing a complete development Oneiric OS plus the OpenStack code - checkouts. - -- Copy ``tftpboot`` to a USB drive: - - :: - - mount /dev/sdb1 /mnt/tmp - rsync -a /tmp/tftpboot/ /mnt/tmp/tftpboot/ - umount /mnt/tmp - -- Plug USB drive into router. It will be automounted and is ready to - serve content. - -Now `return `__ to the RAM disk Guide to kick off your -DevStack experience. diff --git a/doc/source/guides/ramdisk.rst b/doc/source/guides/ramdisk.rst deleted file mode 100644 index 1ba74f2322..0000000000 --- a/doc/source/guides/ramdisk.rst +++ /dev/null @@ -1,86 +0,0 @@ -`DevStack `__ - -- `Overview <../overview.html>`__ -- `Changes <../changes.html>`__ -- `FAQ <../faq.html>`__ -- `git.openstack.org `__ -- `Gerrit `__ - -Stack-in-a-Box: Try before you mkfs -=================================== - -Run DevStack from a RAM disk to give it a whirl before making the -commitment to install it. We'll cover booting from a USB drive or over -the network via PXE. We'll even thow in configuring a home router to -handle the PXE boot. You will need a minimum of 3GB for both of these -configurations as the RAM disk itself is 2GB. - -Prerequisites Hardware ----------------------- - -USB Boot -~~~~~~~~ - -`This guide `__ covers the creation of a bootable USB -drive. Your computer BIOS must support booting from USB. - -PXE Boot -~~~~~~~~ - -`This guide `__ covers the installation of OpenWRT on a -home router and configuring it as a PXE server, plus the creation of the -boot images and PXE support files. - -Installation bit blasting -------------------------- - -Install DevStack -~~~~~~~~~~~~~~~~ - -Grab the latest version of DevStack via https: - -:: - - sudo apt-get install git -y - git clone https://git.openstack.org/openstack-dev/devstack - cd devstack - -Prepare the Boot RAMdisk -~~~~~~~~~~~~~~~~~~~~~~~~ - -Pick your boot method and follow the guide to prepare to build the RAM -disk and set up the boot process: - -- `USB boot `__ -- `PXE boot `__ - -Fire It Up -~~~~~~~~~~ - -- Boot the computer into the RAM disk. The details will vary from - machine to machine but most BIOSes have a method to select the boot - device, often by pressing F12 during POST. -- Select 'DevStack' from the Boot Menu. -- Log in with the 'stack' user and 'pass' password. -- Create ``devstack/localrc`` if you wish to change any of the - configuration variables. You will probably want to at least set the - admin login password to something memorable rather than the default - 20 random characters: - - :: - - ADMIN_PASSWORD=openstack - -- Fire up OpenStack! - - :: - - ./run.sh - -- See the processes running in screen: - - :: - - screen -x - -- Connect to the dashboard at ``http:///`` diff --git a/doc/source/guides/usb-boot.rst b/doc/source/guides/usb-boot.rst deleted file mode 100644 index 4f7a49425b..0000000000 --- a/doc/source/guides/usb-boot.rst +++ /dev/null @@ -1,57 +0,0 @@ -`DevStack `__ - -- `Overview <../overview.html>`__ -- `Changes <../changes.html>`__ -- `FAQ <../faq.html>`__ -- `git.openstack.org `__ -- `Gerrit `__ - -USB Boot: Undoable Stack Boot -============================= - -Boot DevStack from a USB disk into a RAM disk. - -Prerequisites -------------- - -Hardware -~~~~~~~~ - -This guide covers the creation of a bootable USB drive. Your computer -BIOS must support booting from USB and You will want at least 3GB of -RAM. You also will need a USB drive of at least 2GB. - -Software -~~~~~~~~ - -Ubuntu 11.10 (Oneiric Ocelot) is required on host to create images. - -Installation bit blasting -------------------------- - -Set Up USB Drive -~~~~~~~~~~~~~~~~ - -- Insert the USB drive into the computer. Make a note of the device - name, such as ``sdb``. Do not mount the device. -- Install the boot system: - - :: - - tools/build_usb_boot.sh /dev/sdb1 - - This calls tools/build\_ramdisk.sh to create a 2GB ramdisk containing - a complete development Oneiric OS plus the OpenStack code checkouts. - It then writes a syslinux boot sector to the specified device and - creates ``/syslinux``. - -- If desired, you may now mount the device: - - :: - - mount /dev/sdb1 /mnt/tmp - # foo - umount /mnt/tmp - -Now `return `__ to the RAM disk Guide to kick off your -DevStack experience. From 28d4392d56c6a493dd71c4a5a5f64f6dee36dd01 Mon Sep 17 00:00:00 2001 From: Andrew Lazarev Date: Wed, 29 Oct 2014 17:25:12 -0700 Subject: [PATCH 0055/3333] Set permissions on sahara cache Signing certificate directory should have 700 mode. Before the change it was created with 755. As a visual impact this CR removes warning from keystonemiddleware. Change-Id: I8483e73447348b9a9e33dfd382543978a70a9d43 Closes-Bug: #1387416 --- lib/sahara | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/sahara b/lib/sahara index 5c7c2534e2..42e8e016d8 100644 --- a/lib/sahara +++ b/lib/sahara @@ -104,6 +104,7 @@ function configure_sahara { # Create auth cache dir sudo mkdir -p $SAHARA_AUTH_CACHE_DIR sudo chown $STACK_USER $SAHARA_AUTH_CACHE_DIR + sudo chmod 700 $SAHARA_AUTH_CACHE_DIR rm -rf $SAHARA_AUTH_CACHE_DIR/* configure_auth_token_middleware $SAHARA_CONF_FILE sahara $SAHARA_AUTH_CACHE_DIR From 74b28bc43b9570496f2b67688e0c4c04aa273733 Mon Sep 17 00:00:00 2001 From: Jim Rollenhagen Date: Wed, 29 Oct 2014 14:15:22 -0700 Subject: [PATCH 0056/3333] Add iptables rule for Ironic VMs -> Swift The agent ramdisk gets instance images from swift, set firewall rules to allow this. Also configure Ironic API port using the correct variable, and use SWIFT_DEFAULT_BIND_PORT for Swift ports everywhere. Change-Id: Ieec8cc64e504b04a21daa49e90e2d4925f4838ee --- lib/ironic | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/ironic b/lib/ironic index 0a84e47ebc..cf005a74d6 100644 --- a/lib/ironic +++ b/lib/ironic @@ -279,7 +279,7 @@ function configure_ironic_conductor { else die $LINENO "SWIFT_ENABLE_TEMPURLS must be True to use agent_ssh driver in Ironic." fi - iniset $IRONIC_CONF_FILE glance swift_endpoint_url http://${HOST_IP}:8080 + iniset $IRONIC_CONF_FILE glance swift_endpoint_url http://${HOST_IP}:${SWIFT_DEFAULT_BIND_PORT:-8080} iniset $IRONIC_CONF_FILE glance swift_api_version v1 local tenant_id=$(get_or_create_project $SERVICE_TENANT_NAME) iniset $IRONIC_CONF_FILE glance swift_account AUTH_${tenant_id} @@ -523,7 +523,11 @@ function configure_iptables { sudo modprobe nf_nat_tftp # nodes boot from TFTP and callback to the API server listening on $HOST_IP sudo iptables -I INPUT -d $HOST_IP -p udp --dport 69 -j ACCEPT || true - sudo iptables -I INPUT -d $HOST_IP -p tcp --dport 6385 -j ACCEPT || true + sudo iptables -I INPUT -d $HOST_IP -p tcp --dport $IRONIC_HOSTPORT -j ACCEPT || true + if [ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]; then + # agent ramdisk gets instance image from swift + sudo iptables -I INPUT -d $HOST_IP -p tcp --dport ${SWIFT_DEFAULT_BIND_PORT:-8080} -j ACCEPT || true + fi } function configure_tftpd { @@ -678,6 +682,10 @@ function cleanup_baremetal_basic_ops { restart_service xinetd sudo iptables -D INPUT -d $HOST_IP -p udp --dport 69 -j ACCEPT || true sudo iptables -D INPUT -d $HOST_IP -p tcp --dport 6385 -j ACCEPT || true + if [ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]; then + # agent ramdisk gets instance image from swift + sudo iptables -D INPUT -d $HOST_IP -p tcp --dport ${SWIFT_DEFAULT_BIND_PORT:-8080} -j ACCEPT || true + fi sudo rmmod nf_conntrack_tftp || true sudo rmmod nf_nat_tftp || true } From 292b2a7ee61f9b034230e8c99d2e5c7154dcf79b Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Fri, 31 Oct 2014 13:48:58 +0900 Subject: [PATCH 0057/3333] Workaround openrc failure on zsh The recent GIT_DEPTH change introduced a [[ ]] construct which doesn't work for zsh 5.0.2. Workaround it by tweaking the test. The following is a demonstration to show how zsh behaves: % if [[ "" ]];then echo hoge;fi zsh: parse error near `]]' % if [[ "x" ]];then echo hoge;fi zsh: parse error near `]]' % if [[ -n "" ]];then echo hoge;fi % if [[ -n "x" ]];then echo hoge;fi hoge % Closes-Bug: #1387943 Change-Id: Ia88de876dacb3664a7c3d8f5a035e8e50fddb678 --- functions-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions-common b/functions-common index 48edba8da6..818e165df7 100644 --- a/functions-common +++ b/functions-common @@ -575,7 +575,7 @@ function git_clone { RECLONE=$(trueorfalse False $RECLONE) - if [[ "$GIT_DEPTH" ]]; then + if [[ -n "${GIT_DEPTH}" ]]; then git_clone_flags="$git_clone_flags --depth $GIT_DEPTH" fi From cd1c3c7adb45e6fda75df48d0313aad8836a7453 Mon Sep 17 00:00:00 2001 From: Kashyap Kopparam Date: Fri, 31 Oct 2014 17:32:57 +0530 Subject: [PATCH 0058/3333] added the localrc section to the local.conf Change-Id: Iffcc61ca886df96e1dc7c0df3c02125cb2b4a7dc --- doc/source/guides/multinode-lab.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/guides/multinode-lab.rst b/doc/source/guides/multinode-lab.rst index a63260fe6f..0b1ebb931b 100644 --- a/doc/source/guides/multinode-lab.rst +++ b/doc/source/guides/multinode-lab.rst @@ -167,6 +167,7 @@ machines, create a ``local.conf`` with: :: + [[local|localrc]] HOST_IP=192.168.42.12 # change this per compute node FLAT_INTERFACE=eth0 FIXED_RANGE=10.4.128.0/20 From 8fceb49820cb299ad2957b280724e10bb8f1196d Mon Sep 17 00:00:00 2001 From: Chmouel Boudjnah Date: Thu, 2 Oct 2014 20:58:20 +0200 Subject: [PATCH 0059/3333] Only sysctl reserverd ports when available. Only set the keystone reserved ports when available, on some system (like when running under containers) where this sysfs interface is not exposed we are almost pretty sure these ports would be exclusive for our devstack. Change-Id: I06d7d227ae94d564c91c16119e4bbbcc6564a280 --- tools/fixup_stuff.sh | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/tools/fixup_stuff.sh b/tools/fixup_stuff.sh index 1732eccdbe..b8beb01583 100755 --- a/tools/fixup_stuff.sh +++ b/tools/fixup_stuff.sh @@ -50,17 +50,24 @@ fi # exception into the Kernel for the Keystone AUTH ports. keystone_ports=${KEYSTONE_AUTH_PORT:-35357},${KEYSTONE_AUTH_PORT_INT:-35358} -# Get any currently reserved ports, strip off leading whitespace -reserved_ports=$(sysctl net.ipv4.ip_local_reserved_ports | awk -F'=' '{print $2;}' | sed 's/^ //') - -if [[ -z "${reserved_ports}" ]]; then - # If there are no currently reserved ports, reserve the keystone ports - sudo sysctl -w net.ipv4.ip_local_reserved_ports=${keystone_ports} +# only do the reserved ports when available, on some system (like containers) +# where it's not exposed we are almost pretty sure these ports would be +# exclusive for our devstack. +if sysctl net.ipv4.ip_local_reserved_ports >/dev/null 2>&1; then + # Get any currently reserved ports, strip off leading whitespace + reserved_ports=$(sysctl net.ipv4.ip_local_reserved_ports | awk -F'=' '{print $2;}' | sed 's/^ //') + + if [[ -z "${reserved_ports}" ]]; then + # If there are no currently reserved ports, reserve the keystone ports + sudo sysctl -w net.ipv4.ip_local_reserved_ports=${keystone_ports} + else + # If there are currently reserved ports, keep those and also reserve the + # keystone specific ports. Duplicate reservations are merged into a single + # reservation (or range) automatically by the kernel. + sudo sysctl -w net.ipv4.ip_local_reserved_ports=${keystone_ports},${reserved_ports} + fi else - # If there are currently reserved ports, keep those and also reserve the - # keystone specific ports. Duplicate reservations are merged into a single - # reservation (or range) automatically by the kernel. - sudo sysctl -w net.ipv4.ip_local_reserved_ports=${keystone_ports},${reserved_ports} + echo_summary "WARNING: unable to reserve keystone ports" fi From 5a91c3548370d3de856e5522f2d11775278115cf Mon Sep 17 00:00:00 2001 From: Flavio Percoco Date: Fri, 31 Oct 2014 18:48:00 +0100 Subject: [PATCH 0060/3333] USe `trueorfalse` for INSTALL_TESTONLY_PACKAGES INSTALL_TESTONLY_PACKAGES is assumed to be set to `True` or `False`. However, in devstack-gate this variable is set to 0 or 1. The patch uses the already existing `trueorfalse` function to evaluate INSTALL_TESTONLY_PACKAGES and normalize its value. Change-Id: I0e4a31e422bad2a31d919d9f871e24833a0faa99 --- functions-common | 3 +++ 1 file changed, 3 insertions(+) diff --git a/functions-common b/functions-common index 48edba8da6..b9eaae5db3 100644 --- a/functions-common +++ b/functions-common @@ -993,6 +993,8 @@ function get_packages { local file_to_parse local service + INSTALL_TESTONLY_PACKAGES=$(trueorfalse False $INSTALL_TESTONLY_PACKAGES) + if [[ -z "$package_dir" ]]; then echo "No package directory supplied" return 1 @@ -1599,6 +1601,7 @@ function pip_install { $cmd_pip install \ $pip_mirror_opt $@ + INSTALL_TESTONLY_PACKAGES=$(trueorfalse False $INSTALL_TESTONLY_PACKAGES) if [[ "$INSTALL_TESTONLY_PACKAGES" == "True" ]]; then local test_req="$@/test-requirements.txt" if [[ -e "$test_req" ]]; then From 213f13a28399657955be263c936db0a87310b5b1 Mon Sep 17 00:00:00 2001 From: Rob Crittenden Date: Thu, 30 Oct 2014 19:49:20 -0400 Subject: [PATCH 0061/3333] Don't hardcode glance protocol when finding trove guest image This allows configuration of trove when devstack is configured for SSL or tls-proxy. Change-Id: I680effda94926951f9068e2df1e354c708aa4495 --- lib/trove | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/trove b/lib/trove index 1d1b5f406b..4ac7293fbd 100644 --- a/lib/trove +++ b/lib/trove @@ -207,7 +207,7 @@ function init_trove { # The image is uploaded by stack.sh -- see $IMAGE_URLS handling GUEST_IMAGE_NAME=$(basename "$TROVE_GUEST_IMAGE_URL") GUEST_IMAGE_NAME=${GUEST_IMAGE_NAME%.*} - TROVE_GUEST_IMAGE_ID=$(openstack --os-token $TOKEN --os-url http://$GLANCE_HOSTPORT image list | grep "${GUEST_IMAGE_NAME}" | get_field 1) + TROVE_GUEST_IMAGE_ID=$(openstack --os-token $TOKEN --os-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT image list | grep "${GUEST_IMAGE_NAME}" | get_field 1) if [ -z "$TROVE_GUEST_IMAGE_ID" ]; then # If no glance id is found, skip remaining setup echo "Datastore ${TROVE_DATASTORE_TYPE} will not be created: guest image ${GUEST_IMAGE_NAME} not found." From 27a196e26064aba615b0177435071d569b82389b Mon Sep 17 00:00:00 2001 From: Tan Lin Date: Fri, 31 Oct 2014 15:44:34 +0800 Subject: [PATCH 0062/3333] Add options to enable using DHCP agent Metadata-proxy Add options to support DHCP agent providing metadata-proxy. In some cases, users have to disable L3 Agent. But people still need metadata services. Change-Id: I4664fc3a4937c3b7b5c27e74f509b683ffbedd09 --- lib/neutron | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/neutron b/lib/neutron index 98636b4b41..573fd6fbb0 100644 --- a/lib/neutron +++ b/lib/neutron @@ -229,6 +229,14 @@ TUNNEL_ENDPOINT_IP=${TUNNEL_ENDPOINT_IP:-$HOST_IP} # Example: ``OVS_ENABLE_TUNNELING=True`` OVS_ENABLE_TUNNELING=${OVS_ENABLE_TUNNELING:-$ENABLE_TENANT_TUNNELS} +# Use DHCP agent for providing metadata service in the case of +# without L3 agent (No Route Agent), set to True in localrc. +ENABLE_ISOLATED_METADATA=${ENABLE_ISOLATED_METADATA:-False} + +# Add a static route as dhcp option, so the request to 169.254.169.254 +# will be able to reach through a route(DHCP agent) +# This option require ENABLE_ISOLATED_METADATA = True +ENABLE_METADATA_NETWORK=${ENABLE_METADATA_NETWORK:-False} # Neutron plugin specific functions # --------------------------------- @@ -687,6 +695,17 @@ function _configure_neutron_dhcp_agent { iniset $Q_DHCP_CONF_FILE DEFAULT use_namespaces $Q_USE_NAMESPACE iniset $Q_DHCP_CONF_FILE DEFAULT root_helper "$Q_RR_COMMAND" + if ! is_service_enabled q-l3; then + if [[ "$ENABLE_ISOLATED_METADATA" = "True" ]]; then + iniset $Q_DHCP_CONF_FILE DEFAULT enable_isolated_metadata $ENABLE_ISOLATED_METADATA + iniset $Q_DHCP_CONF_FILE DEFAULT enable_metadata_network $ENABLE_METADATA_NETWORK + else + if [[ "$ENABLE_METADATA_NETWORK" = "True" ]]; then + die "$LINENO" "Enable isolated metadata is a must for metadata network" + fi + fi + fi + _neutron_setup_interface_driver $Q_DHCP_CONF_FILE neutron_plugin_configure_dhcp_agent From 5cb190697c1bce5dcd2ad843922813b0cc74bd24 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Sat, 1 Nov 2014 01:37:45 +0100 Subject: [PATCH 0063/3333] support installing clients at released versions expand the devstack support for libraries from released versions to support python-* clients and tempest_lib. Depends-On: I81b0d228e7769758c61e5b0323ecfce8c8886d39 Change-Id: I26fac0ccf8fd4818e24618d56bf04b32306f88f6 --- extras.d/70-trove.sh | 1 - functions-common | 1 + lib/ceilometer | 11 ++++++---- lib/cinder | 11 ++++++---- lib/glance | 9 ++++++--- lib/heat | 11 ++++++---- lib/ironic | 14 +++++++++---- lib/keystone | 11 ++++++---- lib/neutron | 12 +++++++---- lib/nova | 12 +++++++---- lib/swift | 10 ++++++--- lib/tempest | 9 ++++++--- lib/trove | 12 +++++------ stack.sh | 12 ++++++++--- stackrc | 48 ++++++++++++++++++++++---------------------- 15 files changed, 113 insertions(+), 71 deletions(-) diff --git a/extras.d/70-trove.sh b/extras.d/70-trove.sh index a4dc7fbc5b..f284354e1f 100644 --- a/extras.d/70-trove.sh +++ b/extras.d/70-trove.sh @@ -11,7 +11,6 @@ if is_service_enabled trove; then cleanup_trove elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then echo_summary "Configuring Trove" - configure_troveclient configure_trove if is_service_enabled key; then diff --git a/functions-common b/functions-common index 48edba8da6..4e6ad14437 100644 --- a/functions-common +++ b/functions-common @@ -1621,6 +1621,7 @@ function use_library_from_git { return $enabled } + # setup a library by name. If we are trying to use the library from # git, we'll do a git based install, otherwise we'll punt and the # library should be installed by a requirements pull from another diff --git a/lib/ceilometer b/lib/ceilometer index 9046b9d3d9..b1ff8b4157 100644 --- a/lib/ceilometer +++ b/lib/ceilometer @@ -35,8 +35,9 @@ set +o xtrace # -------- # Set up default directories +GITDIR["ceilometerclient"]=$DEST/python-ceilometerclient + CEILOMETER_DIR=$DEST/ceilometer -CEILOMETERCLIENT_DIR=$DEST/python-ceilometerclient CEILOMETER_CONF_DIR=/etc/ceilometer CEILOMETER_CONF=$CEILOMETER_CONF_DIR/ceilometer.conf CEILOMETER_API_LOG_DIR=/var/log/ceilometer-api @@ -254,9 +255,11 @@ function install_ceilometer { # install_ceilometerclient() - Collect source and prepare function install_ceilometerclient { - git_clone $CEILOMETERCLIENT_REPO $CEILOMETERCLIENT_DIR $CEILOMETERCLIENT_BRANCH - setup_develop $CEILOMETERCLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$CEILOMETERCLIENT_DIR/tools/,/etc/bash_completion.d/}ceilometer.bash_completion + if use_library_from_git "ceilometerclient"; then + git_clone_by_name "ceilometerclient" + setup_develop "ceilometerclient" + sudo install -D -m 0644 -o $STACK_USER {$CEILOMETERCLIENT_DIR/tools/,/etc/bash_completion.d/}ceilometer.bash_completion + fi } # start_ceilometer() - Start running processes, including screen diff --git a/lib/cinder b/lib/cinder index 29cda42eb2..56878642e3 100644 --- a/lib/cinder +++ b/lib/cinder @@ -36,8 +36,9 @@ if [[ -r $CINDER_PLUGINS/$CINDER_DRIVER ]]; then fi # set up default directories +GITDIR["cinderclient"]=$DEST/python-cinderclient + CINDER_DIR=$DEST/cinder -CINDERCLIENT_DIR=$DEST/python-cinderclient CINDER_STATE_PATH=${CINDER_STATE_PATH:=$DATA_DIR/cinder} CINDER_AUTH_CACHE_DIR=${CINDER_AUTH_CACHE_DIR:-/var/cache/cinder} @@ -402,9 +403,11 @@ function install_cinder { # install_cinderclient() - Collect source and prepare function install_cinderclient { - git_clone $CINDERCLIENT_REPO $CINDERCLIENT_DIR $CINDERCLIENT_BRANCH - setup_develop $CINDERCLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,/etc/bash_completion.d/}cinder.bash_completion + if use_library_from_git "cinderclient"; then + git_clone_by_name "cinderclient" + setup_develop "cinderclient" + sudo install -D -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,/etc/bash_completion.d/}cinder.bash_completion + fi } # apply config.d approach for cinder volumes directory diff --git a/lib/glance b/lib/glance index 4194842407..8cd48b13f9 100644 --- a/lib/glance +++ b/lib/glance @@ -27,9 +27,10 @@ set +o xtrace # -------- # Set up default directories +GITDIR["glanceclient"]=$DEST/python-glanceclient + GLANCE_DIR=$DEST/glance GLANCE_STORE_DIR=$DEST/glance_store -GLANCECLIENT_DIR=$DEST/python-glanceclient GLANCE_CACHE_DIR=${GLANCE_CACHE_DIR:=$DATA_DIR/glance/cache} GLANCE_IMAGE_DIR=${GLANCE_IMAGE_DIR:=$DATA_DIR/glance/images} GLANCE_AUTH_CACHE_DIR=${GLANCE_AUTH_CACHE_DIR:-/var/cache/glance} @@ -286,8 +287,10 @@ function init_glance { # install_glanceclient() - Collect source and prepare function install_glanceclient { - git_clone $GLANCECLIENT_REPO $GLANCECLIENT_DIR $GLANCECLIENT_BRANCH - setup_develop $GLANCECLIENT_DIR + if use_library_from_git "glanceclient"; then + git_clone_by_name "glanceclient" + setup_develop "glanceclient" + fi } # install_glance() - Collect source and prepare diff --git a/lib/heat b/lib/heat index 53eca25450..ed5181b2b8 100644 --- a/lib/heat +++ b/lib/heat @@ -29,8 +29,9 @@ set +o xtrace # -------- # set up default directories +GITDIR["heatclient"]=$DEST/python-heatclient + HEAT_DIR=$DEST/heat -HEATCLIENT_DIR=$DEST/python-heatclient HEAT_CFNTOOLS_DIR=$DEST/heat-cfntools HEAT_TEMPLATES_REPO_DIR=$DEST/heat-templates HEAT_AUTH_CACHE_DIR=${HEAT_AUTH_CACHE_DIR:-/var/cache/heat} @@ -183,9 +184,11 @@ function create_heat_cache_dir { # install_heatclient() - Collect source and prepare function install_heatclient { - git_clone $HEATCLIENT_REPO $HEATCLIENT_DIR $HEATCLIENT_BRANCH - setup_develop $HEATCLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$HEATCLIENT_DIR/tools/,/etc/bash_completion.d/}heat.bash_completion + if use_library_from_git "heatclient"; then + git_clone_by_name "heatclient" + setup_develop "heatclient" + sudo install -D -m 0644 -o $STACK_USER {$HEATCLIENT_DIR/tools/,/etc/bash_completion.d/}heat.bash_completion + fi } # install_heat() - Collect source and prepare diff --git a/lib/ironic b/lib/ironic index 0a84e47ebc..0fadb8d0a1 100644 --- a/lib/ironic +++ b/lib/ironic @@ -28,11 +28,12 @@ set +o pipefail # -------- # Set up default directories +GITDIR["ironicclient"]=$DEST/python-ironicclient + IRONIC_DIR=$DEST/ironic IRONIC_PYTHON_AGENT_DIR=$DEST/ironic-python-agent IRONIC_DATA_DIR=$DATA_DIR/ironic IRONIC_STATE_PATH=/var/lib/ironic -IRONICCLIENT_DIR=$DEST/python-ironicclient IRONIC_AUTH_CACHE_DIR=${IRONIC_AUTH_CACHE_DIR:-/var/cache/ironic} IRONIC_CONF_DIR=${IRONIC_CONF_DIR:-/etc/ironic} IRONIC_CONF_FILE=$IRONIC_CONF_DIR/ironic.conf @@ -150,9 +151,14 @@ function install_ironic { # install_ironicclient() - Collect sources and prepare function install_ironicclient { - git_clone $IRONICCLIENT_REPO $IRONICCLIENT_DIR $IRONICCLIENT_BRANCH - setup_develop $IRONICCLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$IRONICCLIENT_DIR/tools/,/etc/bash_completion.d/}ironic.bash_completion + if use_library_from_git "ironicclient"; then + git_clone_by_name "ironicclient" + setup_develop "ironicclient" + sudo install -D -m 0644 -o $STACK_USER {$IRONICCLIENT_DIR/tools/,/etc/bash_completion.d/}ironic.bash_completion + else + # nothing actually "requires" ironicclient, so force instally from pypi + pip_install python-ironicclient + fi } # _cleanup_ironic_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file diff --git a/lib/keystone b/lib/keystone index 276e9718a6..6341ce2eea 100644 --- a/lib/keystone +++ b/lib/keystone @@ -33,6 +33,8 @@ set +o xtrace # -------- # Set up default directories +GITDIR["keystoneclient"]=$DEST/python-keystoneclient + KEYSTONE_DIR=$DEST/keystone KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-/etc/keystone} KEYSTONE_CONF=$KEYSTONE_CONF_DIR/keystone.conf @@ -45,7 +47,6 @@ else fi KEYSTONEMIDDLEWARE_DIR=$DEST/keystonemiddleware -KEYSTONECLIENT_DIR=$DEST/python-keystoneclient # Set up additional extensions, such as oauth1, federation # Example of KEYSTONE_EXTENSIONS=oauth1,federation @@ -479,9 +480,11 @@ function init_keystone { # install_keystoneclient() - Collect source and prepare function install_keystoneclient { - git_clone $KEYSTONECLIENT_REPO $KEYSTONECLIENT_DIR $KEYSTONECLIENT_BRANCH - setup_develop $KEYSTONECLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,/etc/bash_completion.d/}keystone.bash_completion + if use_library_from_git "keystoneclient"; then + git_clone_by_name "keystoneclient" + setup_develop "keystoneclient" + sudo install -D -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,/etc/bash_completion.d/}keystone.bash_completion + fi } # install_keystonemiddleware() - Collect source and prepare diff --git a/lib/neutron b/lib/neutron index d05dcc806f..faca3e0da2 100644 --- a/lib/neutron +++ b/lib/neutron @@ -77,8 +77,10 @@ fi # Set up default directories +GITDIR["neutronclient"]=$DEST/python-neutronclient + + NEUTRON_DIR=$DEST/neutron -NEUTRONCLIENT_DIR=$DEST/python-neutronclient NEUTRON_AUTH_CACHE_DIR=${NEUTRON_AUTH_CACHE_DIR:-/var/cache/neutron} # Support entry points installation of console scripts @@ -601,9 +603,11 @@ function install_neutron { # install_neutronclient() - Collect source and prepare function install_neutronclient { - git_clone $NEUTRONCLIENT_REPO $NEUTRONCLIENT_DIR $NEUTRONCLIENT_BRANCH - setup_develop $NEUTRONCLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,/etc/bash_completion.d/}neutron.bash_completion + if use_library_from_git "neutronclient"; then + git_clone_by_name "neutronclient" + setup_develop "neutronclient" + sudo install -D -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,/etc/bash_completion.d/}neutron.bash_completion + fi } # install_neutron_agent_packages() - Collect source and prepare diff --git a/lib/nova b/lib/nova index 0f838072c1..d5f11928e5 100644 --- a/lib/nova +++ b/lib/nova @@ -29,8 +29,10 @@ set +o xtrace # -------- # Set up default directories +GITDIR["novaclient"]=$DEST/python-novaclient + + NOVA_DIR=$DEST/nova -NOVACLIENT_DIR=$DEST/python-novaclient NOVA_STATE_PATH=${NOVA_STATE_PATH:=$DATA_DIR/nova} # INSTANCES_PATH is the previous name for this NOVA_INSTANCES_PATH=${NOVA_INSTANCES_PATH:=${INSTANCES_PATH:=$NOVA_STATE_PATH/instances}} @@ -637,9 +639,11 @@ function init_nova { # install_novaclient() - Collect source and prepare function install_novaclient { - git_clone $NOVACLIENT_REPO $NOVACLIENT_DIR $NOVACLIENT_BRANCH - setup_develop $NOVACLIENT_DIR - sudo install -D -m 0644 -o $STACK_USER {$NOVACLIENT_DIR/tools/,/etc/bash_completion.d/}nova.bash_completion + if use_library_from_git "novaclient"; then + git_clone_by_name "novaclient" + setup_develop "novaclient" + sudo install -D -m 0644 -o $STACK_USER {$NOVACLIENT_DIR/tools/,/etc/bash_completion.d/}nova.bash_completion + fi } # install_nova() - Collect source and prepare diff --git a/lib/swift b/lib/swift index 7ef44969b6..801628241a 100644 --- a/lib/swift +++ b/lib/swift @@ -34,8 +34,10 @@ if is_ssl_enabled_service "s-proxy" || is_service_enabled tls-proxy; then fi # Set up default directories +GITDIR["swiftclient"]=$DEST/python-swiftclient + + SWIFT_DIR=$DEST/swift -SWIFTCLIENT_DIR=$DEST/python-swiftclient SWIFT_AUTH_CACHE_DIR=${SWIFT_AUTH_CACHE_DIR:-/var/cache/swift} SWIFT_APACHE_WSGI_DIR=${SWIFT_APACHE_WSGI_DIR:-/var/www/swift} SWIFT3_DIR=$DEST/swift3 @@ -675,8 +677,10 @@ function install_swift { } function install_swiftclient { - git_clone $SWIFTCLIENT_REPO $SWIFTCLIENT_DIR $SWIFTCLIENT_BRANCH - setup_develop $SWIFTCLIENT_DIR + if use_library_from_git "swiftclient"; then + git_clone_by_name "swiftclient" + setup_develop "swiftclient" + fi } # start_swift() - Start running processes, including screen diff --git a/lib/tempest b/lib/tempest index 66f1a788f1..25dc171fe2 100644 --- a/lib/tempest +++ b/lib/tempest @@ -45,11 +45,12 @@ set +o xtrace # -------- # Set up default directories +GITDIR["tempest_lib"]=$DEST/tempest-lib + TEMPEST_DIR=$DEST/tempest TEMPEST_CONFIG_DIR=${TEMPEST_CONFIG_DIR:-$TEMPEST_DIR/etc} TEMPEST_CONFIG=$TEMPEST_CONFIG_DIR/tempest.conf TEMPEST_STATE_PATH=${TEMPEST_STATE_PATH:=$DATA_DIR/tempest} -TEMPEST_LIB_DIR=$DEST/tempest-lib NOVA_SOURCE_DIR=$DEST/nova @@ -441,8 +442,10 @@ function create_tempest_accounts { # install_tempest_lib() - Collect source, prepare, and install tempest-lib function install_tempest_lib { - git_clone $TEMPEST_LIB_REPO $TEMPEST_LIB_DIR $TEMPEST_LIB_BRANCH - setup_develop $TEMPEST_LIB_DIR + if use_library_from_git "tempest_lib"; then + git_clone_by_name "tempest_lib" + setup_develop "tempest_lib" + fi } # install_tempest() - Collect source and prepare diff --git a/lib/trove b/lib/trove index 1d1b5f406b..2f8b696924 100644 --- a/lib/trove +++ b/lib/trove @@ -28,8 +28,9 @@ else fi # Set up default configuration +GITDIR["troveclient"]=$DEST/python-troveclient + TROVE_DIR=$DEST/trove -TROVECLIENT_DIR=$DEST/python-troveclient TROVE_CONF_DIR=/etc/trove TROVE_LOCAL_CONF_DIR=$TROVE_DIR/etc/trove TROVE_AUTH_CACHE_DIR=${TROVE_AUTH_CACHE_DIR:-/var/cache/trove} @@ -109,10 +110,6 @@ function cleanup_trove { rm -fr $TROVE_CONF_DIR/* } -# configure_troveclient() - Set config files, create data dirs, etc -function configure_troveclient { - setup_develop $TROVECLIENT_DIR -} # configure_trove() - Set config files, create data dirs, etc function configure_trove { @@ -184,7 +181,10 @@ function configure_trove { # install_troveclient() - Collect source and prepare function install_troveclient { - git_clone $TROVECLIENT_REPO $TROVECLIENT_DIR $TROVECLIENT_BRANCH + if use_library_from_git "troveclient"; then + git_clone_by_name "troveclient" + setup_develop "troveclient" + fi } # install_trove() - Collect source and prepare diff --git a/stack.sh b/stack.sh index ec13338948..5f87a904c3 100755 --- a/stack.sh +++ b/stack.sh @@ -585,7 +585,7 @@ if [[ -d $TOP_DIR/extras.d ]]; then fi # Set the destination directories for other OpenStack projects -OPENSTACKCLIENT_DIR=$DEST/python-openstackclient +GITDIR["openstackclient"]=$DEST/python-openstackclient # Interactive Configuration # ------------------------- @@ -788,8 +788,14 @@ fi # Install middleware install_keystonemiddleware -git_clone $OPENSTACKCLIENT_REPO $OPENSTACKCLIENT_DIR $OPENSTACKCLIENT_BRANCH -setup_develop $OPENSTACKCLIENT_DIR +# install the OpenStack client, needed for most setup commands +if use_library_from_git "openstackclient"; then + git_clone_by_name "openstackclient" + setup_develop "openstackclient" +else + pip_install python-openstackclient +fi + if is_service_enabled key; then if [ "$KEYSTONE_AUTH_HOST" == "$SERVICE_HOST" ]; then diff --git a/stackrc b/stackrc index 15b0951a1a..2f08c730be 100644 --- a/stackrc +++ b/stackrc @@ -199,8 +199,8 @@ TEMPEST_REPO=${TEMPEST_REPO:-${GIT_BASE}/openstack/tempest.git} TEMPEST_BRANCH=${TEMPEST_BRANCH:-master} # TODO(sdague): this should end up as a library component like below -TEMPEST_LIB_REPO=${TEMPEST_LIB_REPO:-${GIT_BASE}/openstack/tempest-lib.git} -TEMPEST_LIB_BRANCH=${TEMPEST_LIB_BRANCH:-master} +GITREPO["tempest_lib"]=${TEMPEST_LIB_REPO:-${GIT_BASE}/openstack/tempest-lib.git} +GITBRANCH["tempest_lib"]=${TEMPEST_LIB_BRANCH:-master} ############## @@ -210,48 +210,48 @@ TEMPEST_LIB_BRANCH=${TEMPEST_LIB_BRANCH:-master} ############## # ceilometer client library -CEILOMETERCLIENT_REPO=${CEILOMETERCLIENT_REPO:-${GIT_BASE}/openstack/python-ceilometerclient.git} -CEILOMETERCLIENT_BRANCH=${CEILOMETERCLIENT_BRANCH:-master} +GITREPO["ceilometerclient"]=${CEILOMETERCLIENT_REPO:-${GIT_BASE}/openstack/python-ceilometerclient.git} +GITBRANCH["ceilometerclient"]=${CEILOMETERCLIENT_BRANCH:-master} # volume client -CINDERCLIENT_REPO=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git} -CINDERCLIENT_BRANCH=${CINDERCLIENT_BRANCH:-master} +GITREPO["cinderclient"]=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git} +GITBRACH["cinderclient"]=${CINDERCLIENT_BRANCH:-master} # python glance client library -GLANCECLIENT_REPO=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git} -GLANCECLIENT_BRANCH=${GLANCECLIENT_BRANCH:-master} +GITREPO["glanceclient"]=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git} +GITBRANCH["glanceclient"]=${GLANCECLIENT_BRANCH:-master} # python heat client library -HEATCLIENT_REPO=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git} -HEATCLIENT_BRANCH=${HEATCLIENT_BRANCH:-master} +GITREPO["heatclient"]=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git} +GITBRANCH["heatclient"]=${HEATCLIENT_BRANCH:-master} # ironic client -IRONICCLIENT_REPO=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git} -IRONICCLIENT_BRANCH=${IRONICCLIENT_BRANCH:-master} +GITREPO["ironicclient"]=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git} +GITBRANCH["ironicclient"]=${IRONICCLIENT_BRANCH:-master} # python keystone client library to nova that horizon uses -KEYSTONECLIENT_REPO=${KEYSTONECLIENT_REPO:-${GIT_BASE}/openstack/python-keystoneclient.git} -KEYSTONECLIENT_BRANCH=${KEYSTONECLIENT_BRANCH:-master} +GITREPO["keystoneclient"]=${KEYSTONECLIENT_REPO:-${GIT_BASE}/openstack/python-keystoneclient.git} +GITBRANCH["keystoneclient"]=${KEYSTONECLIENT_BRANCH:-master} # neutron client -NEUTRONCLIENT_REPO=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git} -NEUTRONCLIENT_BRANCH=${NEUTRONCLIENT_BRANCH:-master} +GITREPO["neutronclient"]=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git} +GITBRANCH["neutronclient"]=${NEUTRONCLIENT_BRANCH:-master} # python client library to nova that horizon (and others) use -NOVACLIENT_REPO=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git} -NOVACLIENT_BRANCH=${NOVACLIENT_BRANCH:-master} +GITREPO["novaclient"]=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git} +GITBRANCH["novaclient"]=${NOVACLIENT_BRANCH:-master} # python swift client library -SWIFTCLIENT_REPO=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git} -SWIFTCLIENT_BRANCH=${SWIFTCLIENT_BRANCH:-master} +GITREPO["swiftclient"]=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git} +GITBRANCH["swiftclient"]=${SWIFTCLIENT_BRANCH:-master} # trove client library test -TROVECLIENT_REPO=${TROVECLIENT_REPO:-${GIT_BASE}/openstack/python-troveclient.git} -TROVECLIENT_BRANCH=${TROVECLIENT_BRANCH:-master} +GITREPO["troveclient"]=${TROVECLIENT_REPO:-${GIT_BASE}/openstack/python-troveclient.git} +GITBRANCH["troveclient"]=${TROVECLIENT_BRANCH:-master} # consolidated openstack python client -OPENSTACKCLIENT_REPO=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git} -OPENSTACKCLIENT_BRANCH=${OPENSTACKCLIENT_BRANCH:-master} +GITREPO["openstackclient"]=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git} +GITBRANCH["openstackclient"]=${OPENSTACKCLIENT_BRANCH:-master} ################### # From c973e6c96ce0d37bc22877f3af65135989c469e4 Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Wed, 5 Nov 2014 09:52:27 +1100 Subject: [PATCH 0064/3333] Move platform check after localrc This got moved around with some of the recent cleanups I think. My CI was putting FORCE=yes into localrc which used to work. Noticed doing some bring-up on F21 Change-Id: I7c0ea6b67b42b768278de0fd41d0c0bfbb572387 --- stack.sh | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/stack.sh b/stack.sh index ec13338948..38ecceb717 100755 --- a/stack.sh +++ b/stack.sh @@ -90,16 +90,6 @@ source $TOP_DIR/lib/config # and ``DISTRO`` GetDistro -# Warn users who aren't on an explicitly supported distro, but allow them to -# override check and attempt installation with ``FORCE=yes ./stack`` -if [[ ! ${DISTRO} =~ (precise|trusty|7.0|wheezy|sid|testing|jessie|f19|f20|rhel6|rhel7) ]]; then - echo "WARNING: this script has not been tested on $DISTRO" - if [[ "$FORCE" != "yes" ]]; then - die $LINENO "If you wish to run this script anyway run with FORCE=yes" - fi -fi - - # Global Settings # --------------- @@ -151,6 +141,15 @@ if [[ ! -r $TOP_DIR/stackrc ]]; then fi source $TOP_DIR/stackrc +# Warn users who aren't on an explicitly supported distro, but allow them to +# override check and attempt installation with ``FORCE=yes ./stack`` +if [[ ! ${DISTRO} =~ (precise|trusty|7.0|wheezy|sid|testing|jessie|f19|f20|rhel6|rhel7) ]]; then + echo "WARNING: this script has not been tested on $DISTRO" + if [[ "$FORCE" != "yes" ]]; then + die $LINENO "If you wish to run this script anyway run with FORCE=yes" + fi +fi + # Check to see if we are already running DevStack # Note that this may fail if USE_SCREEN=False if type -p screen > /dev/null && screen -ls | egrep -q "[0-9]\.$SCREEN_NAME"; then From 73d32161df5bc0255d32b1ce1eefb4068d09596b Mon Sep 17 00:00:00 2001 From: yunhong jiang Date: Mon, 6 Oct 2014 09:34:35 -0700 Subject: [PATCH 0065/3333] Passing config for flat type network Add support to passing the flat_network configuration. User can either passing the physical network name, or use the physical network definition Change-Id: Ie42679f207eb14620883778314f74abf378b5cbc --- lib/neutron_plugins/ml2 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/neutron_plugins/ml2 b/lib/neutron_plugins/ml2 index 44b947f380..f9a9774e98 100644 --- a/lib/neutron_plugins/ml2 +++ b/lib/neutron_plugins/ml2 @@ -84,6 +84,11 @@ function neutron_plugin_configure_service { fi fi + + # Allow for setup the flat type network + if [[ -z "$Q_ML2_PLUGIN_FLAT_TYPE_OPTIONS" && -n "$PHYSICAL_NETWORK" ]]; then + Q_ML2_PLUGIN_FLAT_TYPE_OPTIONS="flat_networks=$Q_ML2_FLAT_PHYSNET_OPTIONS" + fi # REVISIT(rkukura): Setting firewall_driver here for # neutron.agent.securitygroups_rpc.is_firewall_enabled() which is # used in the server, in case no L2 agent is configured on the @@ -110,6 +115,8 @@ function neutron_plugin_configure_service { populate_ml2_config /$Q_PLUGIN_CONF_FILE ml2_type_vxlan $Q_ML2_PLUGIN_VXLAN_TYPE_OPTIONS + populate_ml2_config /$Q_PLUGIN_CONF_FILE ml2_type_flat $Q_ML2_PLUGIN_FLAT_TYPE_OPTIONS + populate_ml2_config /$Q_PLUGIN_CONF_FILE ml2_type_vlan $Q_ML2_PLUGIN_VLAN_TYPE_OPTIONS if [[ "$Q_DVR_MODE" != "legacy" ]]; then From 7bce8fa3171801db9bf2261b65b1f5b8978bb46e Mon Sep 17 00:00:00 2001 From: Edgar Magana Date: Tue, 4 Nov 2014 17:32:54 +0100 Subject: [PATCH 0066/3333] Includes a validation to disable creating initial networks for Neutron Neutron external and internal networks are created by default This commit let developers by configuration to decide if those networks needs to be created. This is needed to test Neutron DVR in a distributed Multi-node environment Change-Id: I17d891d072f189925676b4557094cde1c7a71579 Closes-Bug: 1389288 --- lib/neutron | 2 ++ stack.sh | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/neutron b/lib/neutron index eb07f402d0..a3f9192869 100644 --- a/lib/neutron +++ b/lib/neutron @@ -131,6 +131,8 @@ Q_NOTIFY_NOVA_PORT_STATUS_CHANGES=${Q_NOTIFY_NOVA_PORT_STATUS_CHANGES:-True} Q_NOTIFY_NOVA_PORT_DATA_CHANGES=${Q_NOTIFY_NOVA_PORT_DATA_CHANGES:-True} VIF_PLUGGING_IS_FATAL=${VIF_PLUGGING_IS_FATAL:-True} VIF_PLUGGING_TIMEOUT=${VIF_PLUGGING_TIMEOUT:-300} +# Specify if the initial private and external networks should be created +NEUTRON_CREATE_INITIAL_NETWORKS=${NEUTRON_CREATE_INITIAL_NETWORKS:-True} ## Provider Network Information PROVIDER_SUBNET_NAME=${PROVIDER_SUBNET_NAME:-"provider_net"} diff --git a/stack.sh b/stack.sh index ec13338948..ed6a4e3936 100755 --- a/stack.sh +++ b/stack.sh @@ -1275,7 +1275,7 @@ if is_service_enabled neutron; then start_neutron_agents fi # Once neutron agents are started setup initial network elements -if is_service_enabled q-svc; then +if is_service_enabled q-svc && [[ "$NEUTRON_CREATE_INITIAL_NETWORKS" == "True" ]]; then echo_summary "Creating initial neutron network elements" create_neutron_initial_network setup_neutron_debug From 63baba2711552e0f818ad2482281d93dc11e7212 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Wed, 29 Oct 2014 21:57:31 -0500 Subject: [PATCH 0067/3333] Clean up index page There were a lot of artifacts left from the HTML translation. The toctree at the end is to suppress the errors until the remaining docs are cleaned up. Change-Id: I4a8f29f0be524d0a15c7c6f590ffc3ceed6ff811 --- doc/source/index.rst | 140 +++++++++++++++++-------------------------- 1 file changed, 54 insertions(+), 86 deletions(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index 37b365d11a..6c38216d26 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -1,40 +1,19 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -.. toctree:: - :glob: - :maxdepth: 2 - - * - guides/* - - - DevStack - an OpenStack Community Production ============================================ -| A documented shell script to build complete OpenStack development environments. -| An OpenStack program maintained by the developer community. - -#. Setup a fresh supported Linux installation. -#. Clone devstack from git.openstack.org. - - :: - - git clone https://git.openstack.org/openstack-dev/devstack - -#. Deploy your OpenStack Cloud +.. toctree:: + :glob: + :maxdepth: 1 - :: + overview + configuration + plugins + faq + changes + contributing - cd devstack && ./stack.sh + guides/* -  Quick Start This ain't your first rodeo --------------------------------------- @@ -75,68 +54,45 @@ Quick Start This ain't your first rodeo It takes a few minutes, we recommend `reading the script `__ while it is building. -Guides Walk through various setups used by stackers ---------------------------------------------------- +Guides +====== + +Walk through various setups used by stackers OpenStack on VMs ---------------- -Title - -Description - -Link +These guides tell you how to virtualize your OpenStack cloud in virtual +machines. This means that you can get started without having to purchase +any hardware. Virtual Machine +~~~~~~~~~~~~~~~ -Run OpenStack in a VM. The VMs launched in your cloud will be slow as +`Run OpenStack in a VM `__. The VMs launched in your cloud will be slow as they are running in QEMU (emulation), but it is useful if you don't have -spare hardware laying around. - -`Read » `__ - -1 Guide - -What is this? -^^^^^^^^^^^^^ - -These guides tell you how to virtualize your OpenStack cloud in virtual -machines. This means that you can get started without having to purchase -any hardware. +spare hardware laying around. `[Read] `__ OpenStack on Hardware --------------------- -Title - -Description - -Link +These guides tell you how to deploy a development environment on real +hardware. Guides range from running OpenStack on a single laptop to +running a multi-node deployment on datacenter hardware. All-In-One +~~~~~~~~~~ -Run OpenStack on dedicated hardware to get real performance in your VMs. -This can include a server-class machine or a laptop at home. - -`Read » `__ +`Run OpenStack on dedicated hardware `__ to get real performance in your VMs. +This can include a server-class machine or a laptop at home. `[Read] `__ Multi-Node + VLANs +~~~~~~~~~~~~~~~~~~ -Setup a multi-node cluster with dedicated VLANs for VMs & Management. - -`Read » `__ - -2 Guides - -What is this? -^^^^^^^^^^^^^ +`Setup a multi-node cluster `__ with dedicated VLANs for VMs & Management. `[Read] `__ -These guides tell you how to deploy a development environment on real -hardware. Guides range from running OpenStack on a single laptop to -running a multi-node deployment on datacenter hardware. - -Documentation Help yourself to stack ------------------------------------- +Documentation +============= Overview -------- @@ -168,11 +124,15 @@ Contributing `Pitching in to make DevStack a better place `__ -Code A look at the bits that make it all go -------------------------------------------- +Code +==== + +A look at the bits that make it all go + +Scripts +------- -Scripts Generated documentation of DevStack scripts. ----------------------------------------------------- +Generated documentation of DevStack scripts. +-------------------------------+----------------------------------------------+ | Filename | Link | @@ -254,8 +214,8 @@ Scripts Generated documentation of DevStack scripts. | extras.d/80-tempest.sh | `Read » `__ | +-------------------------------+----------------------------------------------+ -Configuration Setting the table -------------------------------- +Configuration +------------- +--------------+--------------------------------+ | Filename | Link | @@ -271,8 +231,8 @@ Configuration Setting the table | eucarc | `Read » `__ | +--------------+--------------------------------+ -Tools Support scripts ---------------------- +Tools +----- +-----------------------------+----------------------------------------------+ | Filename | Link | @@ -292,8 +252,10 @@ Tools Support scripts | tools/upload\_image.sh | `Read » `__ | +-----------------------------+----------------------------------------------+ -Samples Generated documentation of DevStack sample files. ---------------------------------------------------------- +Samples +------- + +Generated documentation of DevStack sample files. +------------+--------------------------------------+ | Filename | Link | @@ -303,8 +265,8 @@ Samples Generated documentation of DevStack sample files. | localrc | `Read » `__ | +------------+--------------------------------------+ -Exercises Generated documentation of DevStack scripts. ------------------------------------------------------- +Exercises +--------- +---------------------------------+-------------------------------------------------+ | Filename | Link | @@ -343,3 +305,9 @@ Exercises Generated documentation of DevStack scripts. +---------------------------------+-------------------------------------------------+ | exercises/zaqar.sh | `Read » `__ | +---------------------------------+-------------------------------------------------+ + +.. toctree:: + :glob: + :maxdepth: 1 + + * From 0986a7b760e34741d4df6f97851f6d98fec4f99c Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Wed, 29 Oct 2014 22:08:13 -0500 Subject: [PATCH 0068/3333] Remove old HTML headers Change-Id: I39107df88aeb89d3364ad479d8c313b7a79b9440 --- doc/source/changes.rst | 10 +++------- doc/source/configuration.rst | 13 +++---------- doc/source/contributing.rst | 13 +++---------- doc/source/eucarc.rst | 13 +++---------- doc/source/exerciserc.rst | 13 +++---------- doc/source/faq.rst | 13 +++---------- doc/source/guides/multinode-lab.rst | 13 +++---------- doc/source/guides/single-machine.rst | 13 +++---------- doc/source/guides/single-vm.rst | 13 +++---------- doc/source/local.conf.rst | 13 +++---------- doc/source/localrc.rst | 13 +++---------- doc/source/openrc.rst | 13 +++---------- doc/source/overview.rst | 13 +++---------- doc/source/plugins.rst | 13 +++---------- doc/source/stackrc.rst | 13 +++---------- 15 files changed, 45 insertions(+), 147 deletions(-) diff --git a/doc/source/changes.rst b/doc/source/changes.rst index ccd96e8a7e..f4a326d60e 100644 --- a/doc/source/changes.rst +++ b/doc/source/changes.rst @@ -1,10 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ +======= +Changes +======= Recent Changes What's been happening? ------------------------------------- diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst index 9befc908ea..eba295622b 100644 --- a/doc/source/configuration.rst +++ b/doc/source/configuration.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -Configuration Making it go my way ---------------------------------- +============= +Configuration +============= DevStack has always tried to be mostly-functional with a minimal amount of configuration. The number of options has ballooned as projects add diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst index 73069e788b..b4f9f37902 100644 --- a/doc/source/contributing.rst +++ b/doc/source/contributing.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -Contributing Help us help you ------------------------------ +============ +Contributing +============ DevStack uses the standard OpenStack contribution process as outlined in `the OpenStack wiki 'How To diff --git a/doc/source/eucarc.rst b/doc/source/eucarc.rst index c91d3417de..1284b8883b 100644 --- a/doc/source/eucarc.rst +++ b/doc/source/eucarc.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -eucarc EC2 settings -------------------- +===================== +eucarc - EC2 Settings +===================== ``eucarc`` creates EC2 credentials for the current user as defined by ``OS_TENANT_NAME:OS_USERNAME``. ``eucarc`` sources ``openrc`` at the diff --git a/doc/source/exerciserc.rst b/doc/source/exerciserc.rst index ed3f2e87b6..f3780c34c5 100644 --- a/doc/source/exerciserc.rst +++ b/doc/source/exerciserc.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -exerciserc Exercise settings ----------------------------- +============================== +exerciserc - Exercise Settings +============================== ``exerciserc`` is used to configure settings for the exercise scripts. The values shown below are the default values. Thse can all be diff --git a/doc/source/faq.rst b/doc/source/faq.rst index 36b25b3039..7b33b41741 100644 --- a/doc/source/faq.rst +++ b/doc/source/faq.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -FAQ: Using DevStack Making to behave ------------------------------------- +=== +FAQ +=== - `General Questions <#general>`__ - `Operation and Configuration <#ops_conf>`__ diff --git a/doc/source/guides/multinode-lab.rst b/doc/source/guides/multinode-lab.rst index 0b1ebb931b..1c53227835 100644 --- a/doc/source/guides/multinode-lab.rst +++ b/doc/source/guides/multinode-lab.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview <../overview.html>`__ -- `Changes <../changes.html>`__ -- `FAQ <../faq.html>`__ -- `git.openstack.org `__ -- `Gerrit `__ - -Multi-Node Lab: Serious Stuff -============================= +============== +Multi-Node Lab +============== Here is OpenStack in a realistic test configuration with multiple physical servers. diff --git a/doc/source/guides/single-machine.rst b/doc/source/guides/single-machine.rst index 3e0a39cad5..60595118ee 100644 --- a/doc/source/guides/single-machine.rst +++ b/doc/source/guides/single-machine.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview <../overview.html>`__ -- `Changes <../changes.html>`__ -- `FAQ <../faq.html>`__ -- `git.openstack.org `__ -- `Gerrit `__ - -All-In-One: Dedicated Hardware -============================== +========== +All-In-One +========== Things are about to get real! Using OpenStack in containers or VMs is nice for kicking the tires, but doesn't compare to the feeling you get diff --git a/doc/source/guides/single-vm.rst b/doc/source/guides/single-vm.rst index 35efb14939..d296db6298 100644 --- a/doc/source/guides/single-vm.rst +++ b/doc/source/guides/single-vm.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview <../overview.html>`__ -- `Changes <../changes.html>`__ -- `FAQ <../faq.html>`__ -- `git.openstack.org `__ -- `Gerrit `__ - -Running a Cloud in a VM -======================= +============= +Cloud in a VM +============= Use the cloud to build the cloud! Use your cloud to launch new versions of OpenStack in about 5 minutes. When you break it, start over! The VMs diff --git a/doc/source/local.conf.rst b/doc/source/local.conf.rst index e1de44c2c7..a9dfcb0ac7 100644 --- a/doc/source/local.conf.rst +++ b/doc/source/local.conf.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -local.conf User settings ------------------------- +========================== +local.conf - User Settings +========================== ``local.conf`` is a user-maintained setings file that is sourced in ``stackrc``. It contains a section that replaces the historical diff --git a/doc/source/localrc.rst b/doc/source/localrc.rst index 487280bae5..98f308302f 100644 --- a/doc/source/localrc.rst +++ b/doc/source/localrc.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -localrc User settings ---------------------- +===================== +localrc - The Old Way +===================== ``localrc`` is the old file used to configure DevStack. It is deprecated and has been replaced by ```local.conf`` `__. DevStack diff --git a/doc/source/openrc.rst b/doc/source/openrc.rst index ce5765aa60..dc12f76b84 100644 --- a/doc/source/openrc.rst +++ b/doc/source/openrc.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -openrc User authentication settings ------------------------------------ +===================================== +openrc - User Authentication Settings +===================================== ``openrc`` configures login credentials suitable for use with the OpenStack command-line tools. ``openrc`` sources ``stackrc`` at the diff --git a/doc/source/overview.rst b/doc/source/overview.rst index cedf941bcd..e3cf75dd29 100644 --- a/doc/source/overview.rst +++ b/doc/source/overview.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -Overview DevStack from a cloud-height view ------------------------------------------- +======== +Overview +======== DevStack has evolved to support a large number of configuration options and alternative platforms and support services. That evolution has grown diff --git a/doc/source/plugins.rst b/doc/source/plugins.rst index 0747b59f3c..282c1a4a3b 100644 --- a/doc/source/plugins.rst +++ b/doc/source/plugins.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -Plugins Add stuff ------------------ +======= +Plugins +======= DevStack has a couple of plugin mechanisms to allow easily adding support for additional projects and features. diff --git a/doc/source/stackrc.rst b/doc/source/stackrc.rst index 5d9d2218c6..0faab45c2f 100644 --- a/doc/source/stackrc.rst +++ b/doc/source/stackrc.rst @@ -1,13 +1,6 @@ -`DevStack `__ - -- `Overview `__ -- `Changes `__ -- `FAQ `__ -- `git.openstack.org `__ -- `Gerrit `__ - -stackrc DevStack settings -------------------------- +=========================== +stackrc - DevStack Settings +=========================== ``stackrc`` is the primary configuration file for DevStack. It contains all of the settings that control the services started and the From 6a709ab25a294d03009936322d753ce13ead1204 Mon Sep 17 00:00:00 2001 From: Kyle Mestery Date: Thu, 6 Nov 2014 08:36:09 +0000 Subject: [PATCH 0069/3333] Add ODL_NAME variable for OpenDaylight configuration This makes the name of the unzipped package configurable so you can run with releases other than the default specified in lib/opendaylight. Change-Id: Iad879c558d742da03375cb61b0c2ef141573ffec --- lib/opendaylight | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/opendaylight b/lib/opendaylight index 374de953c6..bdebe5846d 100644 --- a/lib/opendaylight +++ b/lib/opendaylight @@ -44,6 +44,9 @@ ODL_USERNAME=${ODL_USERNAME:-admin} # The ODL password ODL_PASSWORD=${ODL_PASSWORD:-admin} +# Short name of ODL package +ODL_NAME=${ODL_NAME:-distribution-karaf-0.2.0-Helium} + # ODL_DIR=$DEST/opendaylight @@ -87,23 +90,23 @@ function cleanup_opendaylight { # configure_opendaylight() - Set config files, create data dirs, etc function configure_opendaylight { # Add odl-ovsdb-openstack if it's not already there - local ODLOVSDB=$(cat $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/org.apache.karaf.features.cfg | grep featuresBoot= | grep odl) + local ODLOVSDB=$(cat $ODL_DIR/$ODL_NAME/etc/org.apache.karaf.features.cfg | grep featuresBoot= | grep odl) if [ "$ODLOVSDB" == "" ]; then - sed -i '/^featuresBoot=/ s/$/,odl-ovsdb-openstack/' $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/org.apache.karaf.features.cfg + sed -i '/^featuresBoot=/ s/$/,odl-ovsdb-openstack/' $ODL_DIR/$ODL_NAME/etc/org.apache.karaf.features.cfg fi # Configure OpenFlow 1.3 if it's not there - local OFLOW13=$(cat $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties | grep ^of.version) + local OFLOW13=$(cat $ODL_DIR/$ODL_NAME/etc/custom.properties | grep ^of.version) if [ "$OFLOW13" == "" ]; then - echo "ovsdb.of.version=1.3" >> $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties + echo "ovsdb.of.version=1.3" >> $ODL_DIR/$ODL_NAME/etc/custom.properties fi # Configure L3 if the user wants it if [ "${ODL_L3}" == "True" ]; then # Configure L3 FWD if it's not there - local L3FWD=$(cat $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties | grep ^ovsdb.l3.fwd.enabled) + local L3FWD=$(cat $ODL_DIR/$ODL_NAME/etc/custom.properties | grep ^ovsdb.l3.fwd.enabled) if [ "$L3FWD" == "" ]; then - echo "ovsdb.l3.fwd.enabled=yes" >> $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties + echo "ovsdb.l3.fwd.enabled=yes" >> $ODL_DIR/$ODL_NAME/etc/custom.properties fi fi } @@ -156,7 +159,7 @@ function start_opendaylight { # -of13: runs ODL using OpenFlow 1.3 protocol support. # -virt ovsdb: Runs ODL in "virtualization" mode with OVSDB support - run_process odl-server "cd $ODL_DIR/distribution-karaf-0.2.0-Helium && JAVA_HOME=$JHOME bin/karaf" + run_process odl-server "cd $ODL_DIR/$ODL_NAME && JAVA_HOME=$JHOME bin/karaf" # Sleep a bit to let OpenDaylight finish starting up sleep $ODL_BOOT_WAIT From d224ae1086c7641726a961208cab8af350a81b51 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Thu, 6 Nov 2014 09:33:02 -0600 Subject: [PATCH 0070/3333] Update index page doc links This updates the form of the links to other documents in the tree; the generated HTML links must remain in the original form. Change-Id: I6c2179e3b7cb5b8e2589ede84ab7d02340812e80 --- doc/source/index.rst | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index 6c38216d26..2128620ffd 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -42,8 +42,8 @@ Quick Start This ain't your first rodeo #. Configure - We recommend at least a `minimal - configuration `__ be set up. + We recommend at least a :doc:`minimal + configuration ` be set up. #. Start the install @@ -69,9 +69,9 @@ any hardware. Virtual Machine ~~~~~~~~~~~~~~~ -`Run OpenStack in a VM `__. The VMs launched in your cloud will be slow as +:doc:`Run OpenStack in a VM `. The VMs launched in your cloud will be slow as they are running in QEMU (emulation), but it is useful if you don't have -spare hardware laying around. `[Read] `__ +spare hardware laying around. :doc:`[Read] ` OpenStack on Hardware --------------------- @@ -83,13 +83,13 @@ running a multi-node deployment on datacenter hardware. All-In-One ~~~~~~~~~~ -`Run OpenStack on dedicated hardware `__ to get real performance in your VMs. -This can include a server-class machine or a laptop at home. `[Read] `__ +:doc:`Run OpenStack on dedicated hardware ` to get real performance in your VMs. +This can include a server-class machine or a laptop at home. :doc:`[Read] ` Multi-Node + VLANs ~~~~~~~~~~~~~~~~~~ -`Setup a multi-node cluster `__ with dedicated VLANs for VMs & Management. `[Read] `__ +:doc:`Setup a multi-node cluster ` with dedicated VLANs for VMs & Management. :doc:`[Read] ` Documentation ============= @@ -97,32 +97,32 @@ Documentation Overview -------- -`An overview of DevStack goals and priorities `__ +:doc:`An overview of DevStack goals and priorities ` Configuration ------------- -`Configuring and customizing the stack `__ +:doc:`Configuring and customizing the stack ` Plugins ------- -`Extending DevStack with new features `__ +:doc:`Extending DevStack with new features ` Recent Changes -------------- -`An incomplete summary of recent changes `__ +:doc:`An incomplete summary of recent changes ` FAQ --- -`The DevStack FAQ `__ +:doc:`The DevStack FAQ ` Contributing ------------ -`Pitching in to make DevStack a better place `__ +:doc:`Pitching in to make DevStack a better place ` Code ==== From a12dee433c12c336d804ebe36a6a36f7d3c85f65 Mon Sep 17 00:00:00 2001 From: sailajay Date: Thu, 6 Nov 2014 16:14:32 -0800 Subject: [PATCH 0071/3333] Devstack Nuage Plugin correct the ovs_bridge parameter This commit fixes the name of ovs_bridge parameter and the section it is set in nova.conf by the nuage plugin Closes-Bug: 1390256 Change-Id: I63c929e827db10d0cf5450907a273d880fc757f6 --- lib/neutron_plugins/nuage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/neutron_plugins/nuage b/lib/neutron_plugins/nuage index 52d85a26cc..70de8fad01 100644 --- a/lib/neutron_plugins/nuage +++ b/lib/neutron_plugins/nuage @@ -7,7 +7,7 @@ set +o xtrace function neutron_plugin_create_nova_conf { NOVA_OVS_BRIDGE=${NOVA_OVS_BRIDGE:-"br-int"} - iniset $NOVA_CONF DEFAULT neutron_ovs_bridge $NOVA_OVS_BRIDGE + iniset $NOVA_CONF neutron ovs_bridge $NOVA_OVS_BRIDGE NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtGenericVIFDriver"} LIBVIRT_FIREWALL_DRIVER=nova.virt.firewall.NoopFirewallDriver iniset $NOVA_CONF DEFAULT firewall_driver $LIBVIRT_FIREWALL_DRIVER From 26dd21be8cbf789a8774c9a1941b364a497c4643 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Thu, 6 Nov 2014 09:33:02 -0600 Subject: [PATCH 0072/3333] One last format and content cleanup for the index page Update the form of the links to other documents in the tree; the generated HTML links must remain in the original form. The layout is changed from the previous tables to a more Sphinx-y TOC-like list. Also editorial changes to the index page and guide titles Change-Id: I52df0cc542754c386fb3c99d9efdf2524c11bf48 --- doc/source/guides/single-machine.rst | 6 +- doc/source/guides/single-vm.rst | 6 +- doc/source/index.rst | 294 +++++++++------------------ doc/source/localrc.rst | 9 - 4 files changed, 107 insertions(+), 208 deletions(-) delete mode 100644 doc/source/localrc.rst diff --git a/doc/source/guides/single-machine.rst b/doc/source/guides/single-machine.rst index 60595118ee..9eaa38a49a 100644 --- a/doc/source/guides/single-machine.rst +++ b/doc/source/guides/single-machine.rst @@ -1,6 +1,6 @@ -========== -All-In-One -========== +========================= +All-In-One Single Machine +========================= Things are about to get real! Using OpenStack in containers or VMs is nice for kicking the tires, but doesn't compare to the feeling you get diff --git a/doc/source/guides/single-vm.rst b/doc/source/guides/single-vm.rst index d296db6298..ef59953eb6 100644 --- a/doc/source/guides/single-vm.rst +++ b/doc/source/guides/single-vm.rst @@ -1,6 +1,6 @@ -============= -Cloud in a VM -============= +==================== +All-In-One Single VM +==================== Use the cloud to build the cloud! Use your cloud to launch new versions of OpenStack in about 5 minutes. When you break it, start over! The VMs diff --git a/doc/source/index.rst b/doc/source/index.rst index 2128620ffd..dbefdec144 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -12,11 +12,8 @@ DevStack - an OpenStack Community Production changes contributing - guides/* - - -Quick Start This ain't your first rodeo ---------------------------------------- +Quick Start +----------- #. Select a Linux Distribution @@ -59,40 +56,36 @@ Guides Walk through various setups used by stackers -OpenStack on VMs ----------------- +.. toctree:: + :glob: + :maxdepth: 1 -These guides tell you how to virtualize your OpenStack cloud in virtual -machines. This means that you can get started without having to purchase -any hardware. + guides/single-vm + guides/single-machine + guides/multinode-lab -Virtual Machine -~~~~~~~~~~~~~~~ +All-In-One Single VM +-------------------- -:doc:`Run OpenStack in a VM `. The VMs launched in your cloud will be slow as +Run :doc:`OpenStack in a VM `. The VMs launched in your cloud will be slow as they are running in QEMU (emulation), but it is useful if you don't have spare hardware laying around. :doc:`[Read] ` -OpenStack on Hardware ---------------------- +All-In-One Single Machine +------------------------- -These guides tell you how to deploy a development environment on real -hardware. Guides range from running OpenStack on a single laptop to -running a multi-node deployment on datacenter hardware. +Run :doc:`OpenStack on dedicated hardware ` This can include a +server-class machine or a laptop at home. +:doc:`[Read] ` -All-In-One -~~~~~~~~~~ - -:doc:`Run OpenStack on dedicated hardware ` to get real performance in your VMs. -This can include a server-class machine or a laptop at home. :doc:`[Read] ` - -Multi-Node + VLANs -~~~~~~~~~~~~~~~~~~ +Multi-Node Lab +-------------- -:doc:`Setup a multi-node cluster ` with dedicated VLANs for VMs & Management. :doc:`[Read] ` +Setup a :doc:`multi-node cluster ` with dedicated VLANs for VMs & Management. +:doc:`[Read] ` -Documentation -============= +DevStack Documentation +====================== Overview -------- @@ -127,187 +120,102 @@ Contributing Code ==== -A look at the bits that make it all go +*A look at the bits that make it all go* Scripts ------- -Generated documentation of DevStack scripts. - -+-------------------------------+----------------------------------------------+ -| Filename | Link | -+===============================+==============================================+ -| stack.sh | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| functions | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| functions-common | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/apache | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/baremetal | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/ceilometer | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/cinder | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/config | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/database | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/glance | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/heat | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/horizon | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/infra | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/ironic | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/keystone | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/ldap | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/zaqar | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/neutron | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/nova | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/oslo | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/rpc\_backend | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/sahara | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/savanna | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/stackforge | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/swift | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/tempest | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/tls | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| lib/trove | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| unstack.sh | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| clean.sh | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| run\_tests.sh | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| extras.d/50-ironic.sh | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| extras.d/70-zaqar.sh | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| extras.d/70-sahara.sh | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| extras.d/70-savanna.sh | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| extras.d/70-trove.sh | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| extras.d/80-opendaylight.sh | `Read » `__ | -+-------------------------------+----------------------------------------------+ -| extras.d/80-tempest.sh | `Read » `__ | -+-------------------------------+----------------------------------------------+ +* `stack.sh `__ - The main script +* `functions `__ - DevStack-specific functions +* `functions-common `__ - Functions shared with other projects +* `lib/apache `__ +* `lib/baremetal `__ +* `lib/ceilometer `__ +* `lib/ceph `__ +* `lib/cinder `__ +* `lib/config `__ +* `lib/database `__ +* `lib/dib `__ +* `lib/dstat `__ +* `lib/glance `__ +* `lib/heat `__ +* `lib/horizon `__ +* `lib/infra `__ +* `lib/ironic `__ +* `lib/keystone `__ +* `lib/ldap `__ +* `lib/neutron `__ +* `lib/nova `__ +* `lib/opendaylight `__ +* `lib/oslo `__ +* `lib/rpc\_backend `__ +* `lib/sahara `__ +* `lib/stackforge `__ +* `lib/swift `__ +* `lib/tempest `__ +* `lib/tls `__ +* `lib/trove `__ +* `lib/zaqar `__ +* `unstack.sh `__ +* `clean.sh `__ +* `run\_tests.sh `__ + +* `extras.d/40-dib.sh `__ +* `extras.d/50-ironic.sh `__ +* `extras.d/60-ceph.sh `__ +* `extras.d/70-sahara.sh `__ +* `extras.d/70-trove.sh `__ +* `extras.d/70-zaqar.sh `__ +* `extras.d/80-opendaylight.sh `__ +* `extras.d/80-tempest.sh `__ Configuration ------------- -+--------------+--------------------------------+ -| Filename | Link | -+==============+================================+ -| local.conf | `Read » `__ | -+--------------+--------------------------------+ -| stackrc | `Read » `__ | -+--------------+--------------------------------+ -| openrc | `Read » `__ | -+--------------+--------------------------------+ -| exerciserc | `Read » `__ | -+--------------+--------------------------------+ -| eucarc | `Read » `__ | -+--------------+--------------------------------+ +.. toctree:: + :glob: + :maxdepth: 1 + + local.conf + stackrc + openrc + exerciserc + eucarc Tools ----- -+-----------------------------+----------------------------------------------+ -| Filename | Link | -+=============================+==============================================+ -| tools/info.sh | `Read » `__ | -+-----------------------------+----------------------------------------------+ -| tools/build\_docs.sh | `Read » `__ | -+-----------------------------+----------------------------------------------+ -| tools/create\_userrc.sh | `Read » `__ | -+-----------------------------+----------------------------------------------+ -| tools/fixup\_stuff.sh | `Read » `__ | -+-----------------------------+----------------------------------------------+ -| tools/install\_prereqs.sh | `Read » `__ | -+-----------------------------+----------------------------------------------+ -| tools/install\_pip.sh | `Read » `__ | -+-----------------------------+----------------------------------------------+ -| tools/upload\_image.sh | `Read » `__ | -+-----------------------------+----------------------------------------------+ +* `tools/build\_docs.sh `__ +* `tools/create-stack-user.sh `__ +* `tools/create\_userrc.sh `__ +* `tools/fixup\_stuff.sh `__ +* `tools/info.sh `__ +* `tools/install\_pip.sh `__ +* `tools/install\_prereqs.sh `__ +* `tools/make\_cert.sh `__ +* `tools/upload\_image.sh `__ Samples ------- -Generated documentation of DevStack sample files. - -+------------+--------------------------------------+ -| Filename | Link | -+============+======================================+ -| local.sh | `Read » `__ | -+------------+--------------------------------------+ -| localrc | `Read » `__ | -+------------+--------------------------------------+ +* `local.sh `__ Exercises --------- -+---------------------------------+-------------------------------------------------+ -| Filename | Link | -+=================================+=================================================+ -| exercise.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/aggregates.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/boot\_from\_volume.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/bundle.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/client-args.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/client-env.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/euca.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/floating\_ips.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/horizon.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/neutron-adv-test.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/sahara.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/savanna.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/sec\_groups.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/swift.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/trove.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/volumes.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ -| exercises/zaqar.sh | `Read » `__ | -+---------------------------------+-------------------------------------------------+ - -.. toctree:: - :glob: - :maxdepth: 1 - - * +* `exercise.sh `__ +* `exercises/aggregates.sh `__ +* `exercises/boot\_from\_volume.sh `__ +* `exercises/bundle.sh `__ +* `exercises/client-args.sh `__ +* `exercises/client-env.sh `__ +* `exercises/euca.sh `__ +* `exercises/floating\_ips.sh `__ +* `exercises/horizon.sh `__ +* `exercises/neutron-adv-test.sh `__ +* `exercises/sahara.sh `__ +* `exercises/sec\_groups.sh `__ +* `exercises/swift.sh `__ +* `exercises/trove.sh `__ +* `exercises/volumes.sh `__ +* `exercises/zaqar.sh `__ diff --git a/doc/source/localrc.rst b/doc/source/localrc.rst deleted file mode 100644 index 98f308302f..0000000000 --- a/doc/source/localrc.rst +++ /dev/null @@ -1,9 +0,0 @@ -===================== -localrc - The Old Way -===================== - -``localrc`` is the old file used to configure DevStack. It is deprecated -and has been replaced by ```local.conf`` `__. DevStack -will continue to use ``localrc`` if it is present and ignore the -``localrc`` section in ``local.conf.``. Remove ``localrc`` to switch to -using the new file. From ea3cdfad1fe6f63c8a6acdd4df4b5c4db85fabb5 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Sat, 8 Nov 2014 08:29:16 -0600 Subject: [PATCH 0073/3333] Pass through the rest of the docs Do the link cleanups and update a handful of things that were out of date. Change-Id: I758027bf3577c66cfb13df963516823a5c247080 --- doc/source/configuration.rst | 2 +- doc/source/contributing.rst | 17 ++++++------- doc/source/faq.rst | 7 ++---- doc/source/guides/multinode-lab.rst | 6 ++--- doc/source/guides/single-machine.rst | 4 ++-- doc/source/local.conf.rst | 4 ++-- doc/source/openrc.rst | 36 +++++++++++----------------- doc/source/overview.rst | 2 +- doc/source/plugins.rst | 4 ++-- doc/source/stackrc.rst | 4 ++-- 10 files changed, 38 insertions(+), 48 deletions(-) diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst index eba295622b..a4d940d762 100644 --- a/doc/source/configuration.rst +++ b/doc/source/configuration.rst @@ -74,7 +74,7 @@ A specific meta-section ``local|localrc`` is used to provide a default ``localrc`` file (actually ``.localrc.auto``). This allows all custom settings for DevStack to be contained in a single file. If ``localrc`` exists it will be used instead to preserve backward-compatibility. More -details on the `contents of localrc `__ are available. +details on the :doc:`contents of local.conf ` are available. :: diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst index b4f9f37902..7ca3d64afd 100644 --- a/doc/source/contributing.rst +++ b/doc/source/contributing.rst @@ -59,16 +59,17 @@ Code The DevStack repo generally keeps all of the primary scripts at the root level. -``docs`` - Contains the source for this website. It is built using -``tools/build_docs.sh``. +``doc`` - Contains the Sphinx source for the documentation. +``tools/build_docs.sh`` is used to generate the HTML versions of the +DevStack scripts. A complete doc build can be run with ``tox -edocs``. -``exercises`` - Contains the test scripts used to validate and +``exercises`` - Contains the test scripts used to sanity-check and demonstrate some OpenStack functions. These scripts know how to exit early or skip services that are not enabled. ``extras.d`` - Contains the dispatch scripts called by the hooks in -``stack.sh``, ``unstack.sh`` and ``clean.sh``. See `the plugins -docs `__ for more information. +``stack.sh``, ``unstack.sh`` and ``clean.sh``. See :doc:`the plugins +docs ` for more information. ``files`` - Contains a variety of otherwise lost files used in configuring and operating DevStack. This includes templates for @@ -84,10 +85,10 @@ there are some for system services and project plugins. DevStack repo. ``tests`` - the DevStack test suite is rather sparse, mostly consisting -of test of specific fragile functions in the ``functions`` file. +of test of specific fragile functions in the ``functions`` and +``functions-common`` files. -``tools`` - Contains a collection of stand-alone scripts, some of which -have aged a bit (does anyone still do ramdisk installs?). While these +``tools`` - Contains a collection of stand-alone scripts. While these may reference the top-level DevStack configuration they can generally be run alone. There are also some sub-directories to support specific environments such as XenServer. diff --git a/doc/source/faq.rst b/doc/source/faq.rst index 7b33b41741..b7943ba130 100644 --- a/doc/source/faq.rst +++ b/doc/source/faq.rst @@ -47,11 +47,8 @@ Q: I'd like to help! and bug reports go to `LaunchPad `__. Contributions follow the usual process as described in the `OpenStack - wiki `__ even though - DevStack is not an official OpenStack project. This site is housed - in the CloudBuilder's - `github `__ in the - gh-pages branch. + wiki `__. This Sphinx + documentation is housed in the doc directory. Q: Why not use packages? A: Unlike packages, DevStack leaves your cloud ready to develop - checkouts of the code and services running in screen. However, many diff --git a/doc/source/guides/multinode-lab.rst b/doc/source/guides/multinode-lab.rst index 1c53227835..4c60b6a745 100644 --- a/doc/source/guides/multinode-lab.rst +++ b/doc/source/guides/multinode-lab.rst @@ -16,9 +16,9 @@ download the `Minimal CD `__ for Ubuntu releases since DevStack will download & install all the additional dependencies. The netinstall ISO is available for -`Fedora `__ +`Fedora `__ and -`CentOS/RHEL `__. +`CentOS/RHEL `__. Install a couple of packages to bootstrap configuration: @@ -284,7 +284,7 @@ Volumes DevStack will automatically use an existing LVM volume group named ``stack-volumes`` to store cloud-created volumes. If ``stack-volumes`` -doesn't exist, DevStack will set up a 5Gb loop-mounted file to contain +doesn't exist, DevStack will set up a 10Gb loop-mounted file to contain it. This obviously limits the number and size of volumes that can be created inside OpenStack. The size can be overridden by setting ``VOLUME_BACKING_FILE_SIZE`` in ``local.conf``. diff --git a/doc/source/guides/single-machine.rst b/doc/source/guides/single-machine.rst index 9eaa38a49a..a7a1099bc7 100644 --- a/doc/source/guides/single-machine.rst +++ b/doc/source/guides/single-machine.rst @@ -17,9 +17,9 @@ download the `Minimal CD `__ for Ubuntu releases since DevStack will download & install all the additional dependencies. The netinstall ISO is available for -`Fedora `__ +`Fedora `__ and -`CentOS/RHEL `__. +`CentOS/RHEL `__. You may be tempted to use a desktop distro on a laptop, it will probably work but you may need to tell Network Manager to keep its fingers off the interface(s) that OpenStack uses for bridging. diff --git a/doc/source/local.conf.rst b/doc/source/local.conf.rst index a9dfcb0ac7..b2f7557e6d 100644 --- a/doc/source/local.conf.rst +++ b/doc/source/local.conf.rst @@ -4,6 +4,6 @@ local.conf - User Settings ``local.conf`` is a user-maintained setings file that is sourced in ``stackrc``. It contains a section that replaces the historical -``localrc`` file. See `the description of -local.conf `__ for more details about the mechanics +``localrc`` file. See the description of +:doc:`local.conf ` for more details about the mechanics of the file. diff --git a/doc/source/openrc.rst b/doc/source/openrc.rst index dc12f76b84..56ff5c2edb 100644 --- a/doc/source/openrc.rst +++ b/doc/source/openrc.rst @@ -8,29 +8,30 @@ beginning (which in turn sources the ``localrc`` setion of ``local.conf``) in order to pick up ``HOST_IP`` and/or ``SERVICE_HOST`` to use in the endpoints. The values shown below are the default values. -OS\_TENANT\_NAME - The introduction of Keystone to the OpenStack ecosystem has - standardized the term *tenant* as the entity that owns resources. In - some places references still exist to the original Nova term - *project* for this use. Also, *tenant\_name* is preferred to - *tenant\_id*. +OS\_PROJECT\_NAME (OS\_TENANT\_NAME) + Keystone has + standardized the term *project* as the entity that owns resources. In + some places references still exist to the previous term + *tenant* for this use. Also, *project\_name* is preferred to + *project\_id*. OS\_TENANT\_NAME remains supported for compatibility + with older tools. :: - OS_TENANT_NAME=demo + OS_PROJECT_NAME=demo OS\_USERNAME - In addition to the owning entity (tenant), Nova stores the entity - performing the action as the *user*. + In addition to the owning entity (project), OpenStack calls the entity + performing the action *user*. :: OS_USERNAME=demo OS\_PASSWORD - With Keystone you pass the keystone password instead of an api key. - Recent versions of novaclient use OS\_PASSWORD instead of - NOVA\_API\_KEYs or NOVA\_PASSWORD. + Keystone's default authentication requires a password be provided. + The usual cautions about putting passwords in environment variables + apply, for most DevStack uses this may be an acceptable tradeoff. :: @@ -39,7 +40,7 @@ OS\_PASSWORD HOST\_IP, SERVICE\_HOST Set API endpoint host using ``HOST_IP``. ``SERVICE_HOST`` may also be used to specify the endpoint, which is convenient for some - ``localrc`` configurations. Typically, ``HOST_IP`` is set in the + ``local.conf`` configurations. Typically, ``HOST_IP`` is set in the ``localrc`` section. :: @@ -57,15 +58,6 @@ OS\_AUTH\_URL OS_AUTH_URL=http://$SERVICE_HOST:5000/v2.0 -GLANCE\_HOST - Some exercises call Glance directly. On a single-node installation, - Glance should be listening on ``HOST_IP``. If its running elsewhere - it can be set here. - - :: - - GLANCE_HOST=$HOST_IP - KEYSTONECLIENT\_DEBUG, NOVACLIENT\_DEBUG Set command-line client log level to ``DEBUG``. These are commented out by default. diff --git a/doc/source/overview.rst b/doc/source/overview.rst index e3cf75dd29..40782403fa 100644 --- a/doc/source/overview.rst +++ b/doc/source/overview.rst @@ -73,7 +73,7 @@ Compute (Nova), Network (Nova), Dashboard (Horizon), Orchestration (Heat) Additional services not included directly in DevStack can be tied in to -``stack.sh`` using the `plugin mechanism `__ to call +``stack.sh`` using the :doc:`plugin mechanism ` to call scripts that perform the configuration and startup of the service. Node Configurations diff --git a/doc/source/plugins.rst b/doc/source/plugins.rst index 282c1a4a3b..b4136c4653 100644 --- a/doc/source/plugins.rst +++ b/doc/source/plugins.rst @@ -8,8 +8,8 @@ support for additional projects and features. Extras.d Hooks ~~~~~~~~~~~~~~ -These relatively new hooks are an extension of the existing calls from -``stack.sh`` at the end of its run, plus ``unstack.sh`` and +These hooks are an extension of the service calls in +``stack.sh`` at specific points in its run, plus ``unstack.sh`` and ``clean.sh``. A number of the higher-layer projects are implemented in DevStack using this mechanism. diff --git a/doc/source/stackrc.rst b/doc/source/stackrc.rst index 0faab45c2f..b21f74f761 100644 --- a/doc/source/stackrc.rst +++ b/doc/source/stackrc.rst @@ -15,12 +15,12 @@ ENABLED\_SERVICES Specify which services to launch. These generally correspond to screen tabs. The default includes: Glance (API and Registry), Keystone, Nova (API, Certificate, Object Store, Compute, Network, - Scheduler, VNC proxies, Certificate Authentication), Cinder + Scheduler, Certificate Authentication), Cinder (Scheduler, API, Volume), Horizon, MySQL, RabbitMQ, Tempest. :: - ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-net,n-cond,cinder,c-sch,c-api,c-vol,n-sch,n-novnc,n-xvnc,n-cauth,horizon,rabbit,tempest,$DATABASE_TYPE + ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-net,n-cond,c-sch,c-api,c-vol,n-sch,n-cauth,horizon,rabbit,tempest,$DATABASE_TYPE Other services that are not enabled by default can be enabled in ``localrc``. For example, to add Swift, use the following service From 90f77fb01579b1859199b451d090170d4752a3e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Han?= Date: Fri, 31 Oct 2014 12:05:20 +0100 Subject: [PATCH 0074/3333] Fix DevStack Ceph on the Giant release MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As of the Ceph Giant release, pools 'data' and 'metadata' (used for CephFS) were removed. Thus applying the pool change command fails on Giant since those pools don't exist anymore. Now we are checking for every release prior to Giant and apply proper commands accordingly. Change-Id: Ia12042899c0e6809f5b98c2e0de177bb61c8a790 Signed-off-by: Sébastien Han --- lib/ceph | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/ceph b/lib/ceph index e55738c0d2..2ddf5dbb6a 100644 --- a/lib/ceph +++ b/lib/ceph @@ -71,6 +71,11 @@ CEPH_REPLICAS_SEQ=$(seq ${CEPH_REPLICAS}) # Functions # ------------ +function get_ceph_version { + local ceph_version_str=$(sudo ceph daemon mon.$(hostname) version | cut -d '"' -f 4) + echo $ceph_version_str +} + # import_libvirt_secret_ceph() - Imports Cinder user key into libvirt # so it can connect to the Ceph cluster while attaching a Cinder block device function import_libvirt_secret_ceph { @@ -154,10 +159,16 @@ EOF sleep 5 done + # pools data and metadata were removed in the Giant release so depending on the version we apply different commands + local ceph_version=$(get_ceph_version) # change pool replica size according to the CEPH_REPLICAS set by the user - sudo ceph -c ${CEPH_CONF_FILE} osd pool set data size ${CEPH_REPLICAS} - sudo ceph -c ${CEPH_CONF_FILE} osd pool set rbd size ${CEPH_REPLICAS} - sudo ceph -c ${CEPH_CONF_FILE} osd pool set metadata size ${CEPH_REPLICAS} + if [[ ${ceph_version%.*} -eq 0 ]] && [[ ${ceph_version##*.} -lt 87 ]]; then + sudo ceph -c ${CEPH_CONF_FILE} osd pool set rbd size ${CEPH_REPLICAS} + sudo ceph -c ${CEPH_CONF_FILE} osd pool set data size ${CEPH_REPLICAS} + sudo ceph -c ${CEPH_CONF_FILE} osd pool set metadata size ${CEPH_REPLICAS} + else + sudo ceph -c ${CEPH_CONF_FILE} osd pool set rbd size ${CEPH_REPLICAS} + fi # create a simple rule to take OSDs instead of host with CRUSH # then apply this rules to the default pool From af81d672937fb4cefb7d723769af232cac714c22 Mon Sep 17 00:00:00 2001 From: Attila Fazekas Date: Mon, 10 Nov 2014 09:04:54 +0100 Subject: [PATCH 0075/3333] Drop PIP_USE_MIRRORS environment variable The PIP_USE_MIRRORS does not do anything else than adding the --use-mirrors option to the pip command line. The --use-mirrors is deprecated since pip-1.5, and does not do anything else than printing a warning message. For using alternate pypi index url this option is not required and not sufficient. The current way for using alternate mirrors is to defining them in the .pip/pip.conf either manually (before devstack), or by using the PYPI_ALTERNATIVE_URL and PYPI_OVERRIDE environment variables. Change-Id: Ia33e783360e5661c2ef03b77e9f7af32b2633f2f --- functions-common | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/functions-common b/functions-common index 9f8476e841..b9d9114512 100644 --- a/functions-common +++ b/functions-common @@ -25,7 +25,6 @@ # - ``FILES`` # - ``OFFLINE`` # - ``PIP_DOWNLOAD_CACHE`` -# - ``PIP_USE_MIRRORS`` # - ``RECLONE`` # - ``REQUIREMENTS_DIR`` # - ``STACK_USER`` @@ -1559,7 +1558,7 @@ function get_python_exec_prefix { } # Wrapper for ``pip install`` to set cache and proxy environment variables -# Uses globals ``OFFLINE``, ``PIP_DOWNLOAD_CACHE``, ``PIP_USE_MIRRORS``, +# Uses globals ``OFFLINE``, ``PIP_DOWNLOAD_CACHE``, # ``TRACK_DEPENDS``, ``*_proxy`` # pip_install package [package ...] function pip_install { @@ -1585,21 +1584,13 @@ function pip_install { local sudo_pip="sudo" fi - # Mirror option not needed anymore because pypi has CDN available, - # but it's useful in certain circumstances - PIP_USE_MIRRORS=${PIP_USE_MIRRORS:-False} - local pip_mirror_opt="" - if [[ "$PIP_USE_MIRRORS" != "False" ]]; then - pip_mirror_opt="--use-mirrors" - fi - $xtrace $sudo_pip PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE:-/var/cache/pip} \ http_proxy=$http_proxy \ https_proxy=$https_proxy \ no_proxy=$no_proxy \ $cmd_pip install \ - $pip_mirror_opt $@ + $@ INSTALL_TESTONLY_PACKAGES=$(trueorfalse False $INSTALL_TESTONLY_PACKAGES) if [[ "$INSTALL_TESTONLY_PACKAGES" == "True" ]]; then @@ -1610,7 +1601,7 @@ function pip_install { https_proxy=$https_proxy \ no_proxy=$no_proxy \ $cmd_pip install \ - $pip_mirror_opt -r $test_req + -r $test_req fi fi } From c411fcfc9224894db55d82b8ce4fa4a2b68de89d Mon Sep 17 00:00:00 2001 From: Attila Fazekas Date: Tue, 19 Aug 2014 16:48:14 +0200 Subject: [PATCH 0076/3333] Allow installing tempest only with keystone Modify the lib/tempest to not fail if no nova or glance available. * This allows performance test of keystone and neutron with tempest (or tempest stress runner) without having system noise from another components. * Depending on not required components for tempest is bad practice, tempest service decorators expected to allow tempest, to run in more minimal system out-of-the-box. Change-Id: Ifc40b1eb5c4b79d96a5fae919b88afecca642ca0 --- lib/tempest | 196 +++++++++++++++++++++++++++------------------------- 1 file changed, 101 insertions(+), 95 deletions(-) diff --git a/lib/tempest b/lib/tempest index 66f1a788f1..3996cd1a62 100644 --- a/lib/tempest +++ b/lib/tempest @@ -110,34 +110,36 @@ function configure_tempest { # ... Also ensure we only take active images, so we don't get snapshots in process declare -a images - while read -r IMAGE_NAME IMAGE_UUID; do - if [ "$IMAGE_NAME" = "$DEFAULT_IMAGE_NAME" ]; then - image_uuid="$IMAGE_UUID" - image_uuid_alt="$IMAGE_UUID" - fi - images+=($IMAGE_UUID) - # TODO(stevemar): update this command to use openstackclient's `openstack image list` - # when it supports listing by status. - done < <(glance image-list --status=active | awk -F'|' '!/^(+--)|ID|aki|ari/ { print $3,$2 }') - - case "${#images[*]}" in - 0) - echo "Found no valid images to use!" - exit 1 - ;; - 1) - if [ -z "$image_uuid" ]; then - image_uuid=${images[0]} - image_uuid_alt=${images[0]} - fi - ;; - *) - if [ -z "$image_uuid" ]; then - image_uuid=${images[0]} - image_uuid_alt=${images[1]} + if is_service_enabled glance; then + while read -r IMAGE_NAME IMAGE_UUID; do + if [ "$IMAGE_NAME" = "$DEFAULT_IMAGE_NAME" ]; then + image_uuid="$IMAGE_UUID" + image_uuid_alt="$IMAGE_UUID" fi - ;; - esac + images+=($IMAGE_UUID) + # TODO(stevemar): update this command to use openstackclient's `openstack image list` + # when it supports listing by status. + done < <(glance image-list --status=active | awk -F'|' '!/^(+--)|ID|aki|ari/ { print $3,$2 }') + + case "${#images[*]}" in + 0) + echo "Found no valid images to use!" + exit 1 + ;; + 1) + if [ -z "$image_uuid" ]; then + image_uuid=${images[0]} + image_uuid_alt=${images[0]} + fi + ;; + *) + if [ -z "$image_uuid" ]; then + image_uuid=${images[0]} + image_uuid_alt=${images[1]} + fi + ;; + esac + fi # Create tempest.conf from tempest.conf.sample # copy every time, because the image UUIDS are going to change @@ -161,63 +163,65 @@ function configure_tempest { ALT_TENANT_NAME=${ALT_TENANT_NAME:-alt_demo} ADMIN_TENANT_ID=$(openstack project list | awk "/ admin / { print \$2 }") - # If the ``DEFAULT_INSTANCE_TYPE`` not declared, use the new behavior - # Tempest creates instane types for himself - if [[ -z "$DEFAULT_INSTANCE_TYPE" ]]; then - available_flavors=$(nova flavor-list) - if [[ ! ( $available_flavors =~ 'm1.nano' ) ]]; then - if is_arch "ppc64"; then - # qemu needs at least 128MB of memory to boot on ppc64 - nova flavor-create m1.nano 42 128 0 1 - else - nova flavor-create m1.nano 42 64 0 1 + if is_service_enabled nova; then + # If the ``DEFAULT_INSTANCE_TYPE`` not declared, use the new behavior + # Tempest creates instane types for himself + if [[ -z "$DEFAULT_INSTANCE_TYPE" ]]; then + available_flavors=$(nova flavor-list) + if [[ ! ( $available_flavors =~ 'm1.nano' ) ]]; then + if is_arch "ppc64"; then + # qemu needs at least 128MB of memory to boot on ppc64 + nova flavor-create m1.nano 42 128 0 1 + else + nova flavor-create m1.nano 42 64 0 1 + fi fi - fi - flavor_ref=42 - boto_instance_type=m1.nano - if [[ ! ( $available_flavors =~ 'm1.micro' ) ]]; then - if is_arch "ppc64"; then - nova flavor-create m1.micro 84 256 0 1 - else - nova flavor-create m1.micro 84 128 0 1 + flavor_ref=42 + boto_instance_type=m1.nano + if [[ ! ( $available_flavors =~ 'm1.micro' ) ]]; then + if is_arch "ppc64"; then + nova flavor-create m1.micro 84 256 0 1 + else + nova flavor-create m1.micro 84 128 0 1 + fi fi - fi - flavor_ref_alt=84 - else - # Check Nova for existing flavors and, if set, look for the - # ``DEFAULT_INSTANCE_TYPE`` and use that. - boto_instance_type=$DEFAULT_INSTANCE_TYPE - flavor_lines=`nova flavor-list` - IFS=$'\r\n' - flavors="" - for line in $flavor_lines; do - f=$(echo $line | awk "/ $DEFAULT_INSTANCE_TYPE / { print \$2 }") - flavors="$flavors $f" - done - - for line in $flavor_lines; do - flavors="$flavors `echo $line | grep -v "^\(|\s*ID\|+--\)" | cut -d' ' -f2`" - done - - IFS=" " - flavors=($flavors) - num_flavors=${#flavors[*]} - echo "Found $num_flavors flavors" - if [[ $num_flavors -eq 0 ]]; then - echo "Found no valid flavors to use!" - exit 1 - fi - flavor_ref=${flavors[0]} - flavor_ref_alt=$flavor_ref - - # ensure flavor_ref and flavor_ref_alt have different values - # some resize instance in tempest tests depends on this. - for f in ${flavors[@]:1}; do - if [[ $f -ne $flavor_ref ]]; then - flavor_ref_alt=$f - break + flavor_ref_alt=84 + else + # Check Nova for existing flavors and, if set, look for the + # ``DEFAULT_INSTANCE_TYPE`` and use that. + boto_instance_type=$DEFAULT_INSTANCE_TYPE + flavor_lines=`nova flavor-list` + IFS=$'\r\n' + flavors="" + for line in $flavor_lines; do + f=$(echo $line | awk "/ $DEFAULT_INSTANCE_TYPE / { print \$2 }") + flavors="$flavors $f" + done + + for line in $flavor_lines; do + flavors="$flavors `echo $line | grep -v "^\(|\s*ID\|+--\)" | cut -d' ' -f2`" + done + + IFS=" " + flavors=($flavors) + num_flavors=${#flavors[*]} + echo "Found $num_flavors flavors" + if [[ $num_flavors -eq 0 ]]; then + echo "Found no valid flavors to use!" + exit 1 fi - done + flavor_ref=${flavors[0]} + flavor_ref_alt=$flavor_ref + + # ensure flavor_ref and flavor_ref_alt have different values + # some resize instance in tempest tests depends on this. + for f in ${flavors[@]:1}; do + if [[ $f -ne $flavor_ref ]]; then + flavor_ref_alt=$f + break + fi + done + fi fi if [ "$Q_USE_NAMESPACE" != "False" ]; then @@ -460,20 +464,22 @@ function init_tempest { local kernel="$image_dir/${base_image_name}-vmlinuz" local ramdisk="$image_dir/${base_image_name}-initrd" local disk_image="$image_dir/${base_image_name}-blank.img" - # if the cirros uec downloaded and the system is uec capable - if [ -f "$kernel" -a -f "$ramdisk" -a -f "$disk_image" -a "$VIRT_DRIVER" != "openvz" \ - -a \( "$LIBVIRT_TYPE" != "lxc" -o "$VIRT_DRIVER" != "libvirt" \) ]; then - echo "Prepare aki/ari/ami Images" - mkdir -p $BOTO_MATERIALS_PATH - ( #new namespace - # tenant:demo ; user: demo - source $TOP_DIR/accrc/demo/demo - euca-bundle-image -r ${CIRROS_ARCH} -i "$kernel" --kernel true -d "$BOTO_MATERIALS_PATH" - euca-bundle-image -r ${CIRROS_ARCH} -i "$ramdisk" --ramdisk true -d "$BOTO_MATERIALS_PATH" - euca-bundle-image -r ${CIRROS_ARCH} -i "$disk_image" -d "$BOTO_MATERIALS_PATH" - ) 2>&1 &1 Date: Tue, 11 Nov 2014 11:11:00 +0900 Subject: [PATCH 0077/3333] Remove neutron ryu-plugin support Ryu plugin was marked deprecated in Juno and will be removed for Kilo. We (Ryu team) recommend users to migrate to ofagent, on which we aim to concentrate our development resources by this deprecation. Partial-Bug: #1391714 Change-Id: I1ef28818e9400664ae3d83758dc2dcf71c02f185 --- MAINTAINERS.rst | 6 --- lib/neutron_plugins/ofagent_agent | 1 - lib/neutron_plugins/ryu | 79 ------------------------------- lib/neutron_thirdparty/ryu | 63 ++---------------------- 4 files changed, 5 insertions(+), 144 deletions(-) delete mode 100644 lib/neutron_plugins/ryu diff --git a/MAINTAINERS.rst b/MAINTAINERS.rst index d55135de64..a376eb0428 100644 --- a/MAINTAINERS.rst +++ b/MAINTAINERS.rst @@ -56,12 +56,6 @@ OpenFlow Agent (ofagent) * YAMAMOTO Takashi * Fumihiko Kakuma -Ryu -~~~ - -* YAMAMOTO Takashi -* Fumihiko Kakuma - Sahara ~~~~~~ diff --git a/lib/neutron_plugins/ofagent_agent b/lib/neutron_plugins/ofagent_agent index 55f3f72056..90b37f1be9 100644 --- a/lib/neutron_plugins/ofagent_agent +++ b/lib/neutron_plugins/ofagent_agent @@ -18,7 +18,6 @@ function neutron_plugin_install_agent_packages { # This agent uses ryu to talk with switches install_package $(get_packages "ryu") install_ryu - configure_ryu } function neutron_plugin_configure_debug_command { diff --git a/lib/neutron_plugins/ryu b/lib/neutron_plugins/ryu deleted file mode 100644 index f45a7972e8..0000000000 --- a/lib/neutron_plugins/ryu +++ /dev/null @@ -1,79 +0,0 @@ -# Neutron Ryu plugin -# ------------------ - -# Save trace setting -RYU_XTRACE=$(set +o | grep xtrace) -set +o xtrace - -source $TOP_DIR/lib/neutron_plugins/ovs_base -source $TOP_DIR/lib/neutron_thirdparty/ryu # for configuration value - -function neutron_plugin_create_nova_conf { - _neutron_ovs_base_configure_nova_vif_driver - iniset $NOVA_CONF DEFAULT libvirt_ovs_integration_bridge "$OVS_BRIDGE" -} - -function neutron_plugin_install_agent_packages { - _neutron_ovs_base_install_agent_packages - - # neutron_ryu_agent requires ryu module - install_package $(get_packages "ryu") - install_ryu - configure_ryu -} - -function neutron_plugin_configure_common { - Q_PLUGIN_CONF_PATH=etc/neutron/plugins/ryu - Q_PLUGIN_CONF_FILENAME=ryu.ini - Q_PLUGIN_CLASS="neutron.plugins.ryu.ryu_neutron_plugin.RyuNeutronPluginV2" -} - -function neutron_plugin_configure_debug_command { - _neutron_ovs_base_configure_debug_command - iniset $NEUTRON_TEST_CONFIG_FILE DEFAULT ryu_api_host $RYU_API_HOST:$RYU_API_PORT -} - -function neutron_plugin_configure_dhcp_agent { - iniset $Q_DHCP_CONF_FILE DEFAULT ryu_api_host $RYU_API_HOST:$RYU_API_PORT -} - -function neutron_plugin_configure_l3_agent { - iniset $Q_L3_CONF_FILE DEFAULT ryu_api_host $RYU_API_HOST:$RYU_API_PORT - _neutron_ovs_base_configure_l3_agent -} - -function neutron_plugin_configure_plugin_agent { - # Set up integration bridge - _neutron_ovs_base_setup_bridge $OVS_BRIDGE - if [ -n "$RYU_INTERNAL_INTERFACE" ]; then - sudo ovs-vsctl --no-wait -- --may-exist add-port $OVS_BRIDGE $RYU_INTERNAL_INTERFACE - fi - iniset /$Q_PLUGIN_CONF_FILE ovs integration_bridge $OVS_BRIDGE - AGENT_BINARY="$NEUTRON_DIR/neutron/plugins/ryu/agent/ryu_neutron_agent.py" - - _neutron_ovs_base_configure_firewall_driver -} - -function neutron_plugin_configure_service { - iniset /$Q_PLUGIN_CONF_FILE ovs openflow_rest_api $RYU_API_HOST:$RYU_API_PORT - - _neutron_ovs_base_configure_firewall_driver -} - -function neutron_plugin_setup_interface_driver { - local conf_file=$1 - iniset $conf_file DEFAULT interface_driver neutron.agent.linux.interface.OVSInterfaceDriver - iniset $conf_file DEFAULT ovs_use_veth True -} - -function has_neutron_plugin_security_group { - # 0 means True here - return 0 -} - -function neutron_plugin_check_adv_test_requirements { - is_service_enabled q-agt && is_service_enabled q-dhcp && return 0 -} - -# Restore xtrace -$RYU_XTRACE diff --git a/lib/neutron_thirdparty/ryu b/lib/neutron_thirdparty/ryu index 233f3aacdf..eaf088b797 100644 --- a/lib/neutron_thirdparty/ryu +++ b/lib/neutron_thirdparty/ryu @@ -1,56 +1,15 @@ -# Ryu OpenFlow Controller -# ----------------------- +# Ryu SDN Framework +# ----------------- + +# Used by ofagent. +# TODO(yamamoto): Switch to pip_install once the development was settled # Save trace setting RYU3_XTRACE=$(set +o | grep xtrace) set +o xtrace - RYU_DIR=$DEST/ryu -# Ryu API Host -RYU_API_HOST=${RYU_API_HOST:-127.0.0.1} -# Ryu API Port -RYU_API_PORT=${RYU_API_PORT:-8080} -# Ryu OFP Host -RYU_OFP_HOST=${RYU_OFP_HOST:-127.0.0.1} -# Ryu OFP Port -RYU_OFP_PORT=${RYU_OFP_PORT:-6633} -# Ryu Applications -RYU_APPS=${RYU_APPS:-ryu.app.simple_isolation,ryu.app.rest} - -function configure_ryu { - : -} - -function init_ryu { - RYU_CONF_DIR=/etc/ryu - if [[ ! -d $RYU_CONF_DIR ]]; then - sudo mkdir -p $RYU_CONF_DIR - fi - sudo chown $STACK_USER $RYU_CONF_DIR - RYU_CONF=$RYU_CONF_DIR/ryu.conf - sudo rm -rf $RYU_CONF - - # Ryu configuration - RYU_CONF_CONTENTS=${RYU_CONF_CONTENTS:-"[DEFAULT] -app_lists=$RYU_APPS -wsapi_host=$RYU_API_HOST -wsapi_port=$RYU_API_PORT -ofp_listen_host=$RYU_OFP_HOST -ofp_tcp_listen_port=$RYU_OFP_PORT -neutron_url=http://$Q_HOST:$Q_PORT -neutron_admin_username=$Q_ADMIN_USERNAME -neutron_admin_password=$SERVICE_PASSWORD -neutron_admin_tenant_name=$SERVICE_TENANT_NAME -neutron_admin_auth_url=$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_AUTH_PORT/v2.0 -neutron_auth_strategy=$Q_AUTH_STRATEGY -neutron_controller_addr=tcp:$RYU_OFP_HOST:$RYU_OFP_PORT -"} - echo "${RYU_CONF_CONTENTS}" > $RYU_CONF -} -# install_ryu can be called multiple times as neutron_pluing/ryu may call -# this function for neutron-ryu-agent # Make this function idempotent and avoid cloning same repo many times # with RECLONE=yes _RYU_INSTALLED=${_RYU_INSTALLED:-False} @@ -63,17 +22,5 @@ function install_ryu { fi } -function start_ryu { - run_process ryu "$RYU_DIR/bin/ryu-manager --config-file $RYU_CONF" -} - -function stop_ryu { - : -} - -function check_ryu { - : -} - # Restore xtrace $RYU3_XTRACE From 52f13a4087ef8b49640053bebd6a5046d55c63fe Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Wed, 12 Nov 2014 06:33:36 -0500 Subject: [PATCH 0078/3333] remove the trove exercise The trove cli has been changed in an incompatible way. Exercises are the requirements of projects to keep functioning, if they aren't we should fast delete them. Related-Bug: #1391840 Change-Id: I3b61194ff220525aed202c7f7851faa0be446646 --- exercises/trove.sh | 49 ---------------------------------------------- 1 file changed, 49 deletions(-) delete mode 100755 exercises/trove.sh diff --git a/exercises/trove.sh b/exercises/trove.sh deleted file mode 100755 index 053f872361..0000000000 --- a/exercises/trove.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash - -# **trove.sh** - -# Sanity check that trove started if enabled - -echo "*********************************************************************" -echo "Begin DevStack Exercise: $0" -echo "*********************************************************************" - -# This script exits on an error so that errors don't compound and you see -# only the first error that occurred. -set -o errexit - -# Print the commands being run so that we can see the command that triggers -# an error. It is also useful for following allowing as the install occurs. -set -o xtrace - - -# Settings -# ======== - -# Keep track of the current directory -EXERCISE_DIR=$(cd $(dirname "$0") && pwd) -TOP_DIR=$(cd $EXERCISE_DIR/..; pwd) - -# Import common functions -source $TOP_DIR/functions - -# Import configuration -source $TOP_DIR/openrc - -# Import exercise configuration -source $TOP_DIR/exerciserc - -is_service_enabled trove || exit 55 - -# can try to get datastore id -DSTORE_ID=$(trove datastore-list | tail -n +4 |head -3 | get_field 1) -die_if_not_set $LINENO DSTORE_ID "Trove API not functioning!" - -DV_ID=$(trove datastore-version-list $DSTORE_ID | tail -n +4 | get_field 1) -die_if_not_set $LINENO DV_ID "Trove API not functioning!" - -set +o xtrace -echo "*********************************************************************" -echo "SUCCESS: End DevStack Exercise: $0" -echo "*********************************************************************" - From 6d20f09045dba237caf50d8d55dcc90a9f105ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Sedl=C3=A1k?= Date: Wed, 22 Oct 2014 15:34:46 +0200 Subject: [PATCH 0079/3333] Initial support for Fedora 21 Initial support for Fedora 21. Add f21 to the distribution lists for rpms, ensure "mariadb" is used over "mysqld" and enable it in the distro check, as we have several reports of it working. Tested with [1] [1] http://download.fedoraproject.org/pub/fedora/linux/releases/test/21-Beta/Cloud/Images/x86_64/Fedora-Cloud-Base-20141029-21_Beta.x86_64.qcow2 Change-Id: I97cbede806e5c00363c7174fa1e9f286de96aab6 --- files/rpms/cinder | 2 +- files/rpms/glance | 6 +++--- files/rpms/horizon | 4 ++-- files/rpms/keystone | 10 +++++----- files/rpms/neutron | 4 ++-- files/rpms/nova | 6 +++--- files/rpms/swift | 2 +- lib/databases/mysql | 18 +++++++++--------- stack.sh | 2 +- 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/files/rpms/cinder b/files/rpms/cinder index ce6181eedf..eedff184dd 100644 --- a/files/rpms/cinder +++ b/files/rpms/cinder @@ -3,4 +3,4 @@ scsi-target-utils qemu-img postgresql-devel iscsi-initiator-utils -python-lxml #dist:f19,f20,rhel7 +python-lxml #dist:f19,f20,f21,rhel7 diff --git a/files/rpms/glance b/files/rpms/glance index 5a7f073f35..d2792cf987 100644 --- a/files/rpms/glance +++ b/files/rpms/glance @@ -6,10 +6,10 @@ postgresql-devel # testonly python-argparse python-eventlet python-greenlet -python-lxml #dist:f19,f20,rhel7 -python-paste-deploy #dist:f19,f20,rhel7 +python-lxml #dist:f19,f20,f21,rhel7 +python-paste-deploy #dist:f19,f20,f21,rhel7 python-routes python-sqlalchemy -python-wsgiref #dist:f18,f19,f20 +python-wsgiref #dist:f18,f19,f20,f21 pyxattr zlib-devel # testonly diff --git a/files/rpms/horizon b/files/rpms/horizon index 7add23a549..1d06ac278b 100644 --- a/files/rpms/horizon +++ b/files/rpms/horizon @@ -12,8 +12,8 @@ python-httplib2 python-migrate python-mox python-nose -python-paste #dist:f19,f20 -python-paste-deploy #dist:f19,f20 +python-paste #dist:f19,f20,f21 +python-paste-deploy #dist:f19,f20,f21 python-routes python-sphinx python-sqlalchemy diff --git a/files/rpms/keystone b/files/rpms/keystone index ce41ee598b..8b0953dd69 100644 --- a/files/rpms/keystone +++ b/files/rpms/keystone @@ -1,10 +1,10 @@ MySQL-python python-greenlet -libxslt-devel # dist:f20 -python-lxml #dist:f19,f20 -python-paste #dist:f19,f20 -python-paste-deploy #dist:f19,f20 -python-paste-script #dist:f19,f20 +libxslt-devel # dist:f20,f21 +python-lxml #dist:f19,f20,f21 +python-paste #dist:f19,f20,f21 +python-paste-deploy #dist:f19,f20,f21 +python-paste-script #dist:f19,f20,f21 python-routes python-sqlalchemy python-webob diff --git a/files/rpms/neutron b/files/rpms/neutron index 2c9dd3d5e8..f2473fb20d 100644 --- a/files/rpms/neutron +++ b/files/rpms/neutron @@ -12,8 +12,8 @@ python-eventlet python-greenlet python-iso8601 #rhel6 gets via pip -python-paste # dist:f19,f20,rhel7 -python-paste-deploy # dist:f19,f20,rhel7 +python-paste # dist:f19,f20,f21,rhel7 +python-paste-deploy # dist:f19,f20,f21,rhel7 python-qpid # NOPRIME python-routes python-sqlalchemy diff --git a/files/rpms/nova b/files/rpms/nova index f3261c6ae0..07f13c7071 100644 --- a/files/rpms/nova +++ b/files/rpms/nova @@ -29,11 +29,11 @@ python-iso8601 python-lockfile python-migrate python-mox -python-paramiko # dist:f19,f20,rhel7 +python-paramiko # dist:f19,f20,f21,rhel7 # ^ on RHEL6, brings in python-crypto which conflicts with version from # pip we need -python-paste # dist:f19,f20,rhel7 -python-paste-deploy # dist:f19,f20,rhel7 +python-paste # dist:f19,f20,f21,rhel7 +python-paste-deploy # dist:f19,f20,f21,rhel7 python-qpid # NOPRIME python-routes python-sqlalchemy diff --git a/files/rpms/swift b/files/rpms/swift index 9ec4aab8ce..ccda22bcc8 100644 --- a/files/rpms/swift +++ b/files/rpms/swift @@ -6,7 +6,7 @@ python-eventlet python-greenlet python-netifaces python-nose -python-paste-deploy # dist:f19,f20,rhel7 +python-paste-deploy # dist:f19,f20,f21,rhel7 python-simplejson python-webob pyxattr diff --git a/lib/databases/mysql b/lib/databases/mysql index 67bf85ac97..7a444a3140 100644 --- a/lib/databases/mysql +++ b/lib/databases/mysql @@ -26,10 +26,10 @@ function cleanup_database_mysql { sudo rm -rf /etc/mysql return elif is_fedora; then - if [[ $DISTRO =~ (rhel7) ]]; then - MYSQL=mariadb - else + if [[ $DISTRO =~ (rhel6) ]]; then MYSQL=mysqld + else + MYSQL=mariadb fi elif is_suse; then MYSQL=mysql @@ -54,10 +54,10 @@ function configure_database_mysql { my_conf=/etc/mysql/my.cnf mysql=mysql elif is_fedora; then - if [[ $DISTRO =~ (rhel7) ]]; then - mysql=mariadb - else + if [[ $DISTRO =~ (rhel6) ]]; then mysql=mysqld + else + mysql=mariadb fi my_conf=/etc/my.cnf elif is_suse; then @@ -142,10 +142,10 @@ EOF fi # Install mysql-server if is_ubuntu || is_fedora; then - if [[ $DISTRO =~ (rhel7) ]]; then - install_package mariadb-server - else + if [[ $DISTRO =~ (rhel6) ]]; then install_package mysql-server + else + install_package mariadb-server fi elif is_suse; then if ! is_package_installed mariadb; then diff --git a/stack.sh b/stack.sh index 38ecceb717..8e05ae6322 100755 --- a/stack.sh +++ b/stack.sh @@ -143,7 +143,7 @@ source $TOP_DIR/stackrc # Warn users who aren't on an explicitly supported distro, but allow them to # override check and attempt installation with ``FORCE=yes ./stack`` -if [[ ! ${DISTRO} =~ (precise|trusty|7.0|wheezy|sid|testing|jessie|f19|f20|rhel6|rhel7) ]]; then +if [[ ! ${DISTRO} =~ (precise|trusty|7.0|wheezy|sid|testing|jessie|f19|f20|f21|rhel6|rhel7) ]]; then echo "WARNING: this script has not been tested on $DISTRO" if [[ "$FORCE" != "yes" ]]; then die $LINENO "If you wish to run this script anyway run with FORCE=yes" From 91e4018afd98e454a0d56a69271e089ac97aab5c Mon Sep 17 00:00:00 2001 From: Kashyap Chamarthy Date: Thu, 13 Nov 2014 12:18:33 +0100 Subject: [PATCH 0080/3333] Add 'net-tools' package dependency Noticed this on a freshly installed, minimal Fedora-21 (from development repos): $ ./stack.sh [. . .] 2014-11-13 10:56:22.442 | + local exitcode=0 2014-11-13 10:56:22.453 | + sudo route add -net 10.1.0.0/24 gw 172.24.4.2 2014-11-13 10:56:22.479 | sudo: route: command not found 2014-11-13 10:56:22.488 | + exit_trap [. . .] Also added it to files/rpms-suse/general, just in case. Change-Id: I77954d97e654e8f384a2016631df14e73be927fe --- files/rpms-suse/general | 1 + files/rpms/general | 1 + 2 files changed, 2 insertions(+) diff --git a/files/rpms-suse/general b/files/rpms-suse/general index 0a4746f185..f1f7e8f173 100644 --- a/files/rpms-suse/general +++ b/files/rpms-suse/general @@ -22,3 +22,4 @@ tar tcpdump unzip wget +net-tools diff --git a/files/rpms/general b/files/rpms/general index d4a9fcba55..d7ace9b990 100644 --- a/files/rpms/general +++ b/files/rpms/general @@ -27,6 +27,7 @@ which bc libyaml-devel gettext # used for compiling message catalogs +net-tools # [1] : some of installed tools have unversioned dependencies on this, # but others have versioned (<=0.7). So if a later version (0.7.1) From e08ab104e62da041fcc6b2aafba4349326f4a969 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Thu, 13 Nov 2014 17:09:28 -0500 Subject: [PATCH 0081/3333] fix python-* lib from git installation We're using all the magic variables based on python-fooclient, however all the inline code was using fooclient for variables. So we had a mismatch, which was kindly pointed out by some of the 3rd party ci testers. Change-Id: I27a56222c7e8e610fba8bf97672d2a42f5cf14ca --- functions-common | 12 +++++++++++- lib/ceilometer | 10 +++++----- lib/cinder | 10 +++++----- lib/glance | 8 ++++---- lib/heat | 10 +++++----- lib/ironic | 10 +++++----- lib/keystone | 10 +++++----- lib/neutron | 10 +++++----- lib/nova | 10 +++++----- lib/swift | 8 ++++---- lib/trove | 8 ++++---- stack.sh | 8 ++++---- stackrc | 44 ++++++++++++++++++++++---------------------- 13 files changed, 84 insertions(+), 74 deletions(-) diff --git a/functions-common b/functions-common index 996d79ba6f..e890b75d13 100644 --- a/functions-common +++ b/functions-common @@ -1615,7 +1615,6 @@ function use_library_from_git { return $enabled } - # setup a library by name. If we are trying to use the library from # git, we'll do a git based install, otherwise we'll punt and the # library should be installed by a requirements pull from another @@ -1626,6 +1625,17 @@ function setup_lib { setup_install $dir } +# setup a library by name in editiable mode. If we are trying to use +# the library from git, we'll do a git based install, otherwise we'll +# punt and the library should be installed by a requirements pull from +# another project. +# +# use this for non namespaced libraries +function setup_dev_lib { + local name=$1 + local dir=${GITDIR[$name]} + setup_develop $dir +} # this should be used if you want to install globally, all libraries should # use this, especially *oslo* ones diff --git a/lib/ceilometer b/lib/ceilometer index eee3e8f35d..c4377e04c0 100644 --- a/lib/ceilometer +++ b/lib/ceilometer @@ -35,7 +35,7 @@ set +o xtrace # -------- # Set up default directories -GITDIR["ceilometerclient"]=$DEST/python-ceilometerclient +GITDIR["python-ceilometerclient"]=$DEST/python-ceilometerclient CEILOMETER_DIR=$DEST/ceilometer CEILOMETER_CONF_DIR=/etc/ceilometer @@ -269,10 +269,10 @@ function install_ceilometer { # install_ceilometerclient() - Collect source and prepare function install_ceilometerclient { - if use_library_from_git "ceilometerclient"; then - git_clone_by_name "ceilometerclient" - setup_develop "ceilometerclient" - sudo install -D -m 0644 -o $STACK_USER {$CEILOMETERCLIENT_DIR/tools/,/etc/bash_completion.d/}ceilometer.bash_completion + if use_library_from_git "python-ceilometerclient"; then + git_clone_by_name "python-ceilometerclient" + setup_dev_lib "python-ceilometerclient" + sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-ceilometerclient"]}/tools/,/etc/bash_completion.d/}ceilometer.bash_completion fi } diff --git a/lib/cinder b/lib/cinder index 56878642e3..eb3cbe86cf 100644 --- a/lib/cinder +++ b/lib/cinder @@ -36,7 +36,7 @@ if [[ -r $CINDER_PLUGINS/$CINDER_DRIVER ]]; then fi # set up default directories -GITDIR["cinderclient"]=$DEST/python-cinderclient +GITDIR["python-cinderclient"]=$DEST/python-cinderclient CINDER_DIR=$DEST/cinder CINDER_STATE_PATH=${CINDER_STATE_PATH:=$DATA_DIR/cinder} @@ -403,10 +403,10 @@ function install_cinder { # install_cinderclient() - Collect source and prepare function install_cinderclient { - if use_library_from_git "cinderclient"; then - git_clone_by_name "cinderclient" - setup_develop "cinderclient" - sudo install -D -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,/etc/bash_completion.d/}cinder.bash_completion + if use_library_from_git "python-cinderclient"; then + git_clone_by_name "python-cinderclient" + setup_dev_lib "python-cinderclient" + sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-cinderclient"]}/tools/,/etc/bash_completion.d/}cinder.bash_completion fi } diff --git a/lib/glance b/lib/glance index 8cd48b13f9..3a4ccd8132 100644 --- a/lib/glance +++ b/lib/glance @@ -27,7 +27,7 @@ set +o xtrace # -------- # Set up default directories -GITDIR["glanceclient"]=$DEST/python-glanceclient +GITDIR["python-glanceclient"]=$DEST/python-glanceclient GLANCE_DIR=$DEST/glance GLANCE_STORE_DIR=$DEST/glance_store @@ -287,9 +287,9 @@ function init_glance { # install_glanceclient() - Collect source and prepare function install_glanceclient { - if use_library_from_git "glanceclient"; then - git_clone_by_name "glanceclient" - setup_develop "glanceclient" + if use_library_from_git "python-glanceclient"; then + git_clone_by_name "python-glanceclient" + setup_dev_lib "python-glanceclient" fi } diff --git a/lib/heat b/lib/heat index ed5181b2b8..2b55cf0f6a 100644 --- a/lib/heat +++ b/lib/heat @@ -29,7 +29,7 @@ set +o xtrace # -------- # set up default directories -GITDIR["heatclient"]=$DEST/python-heatclient +GITDIR["python-heatclient"]=$DEST/python-heatclient HEAT_DIR=$DEST/heat HEAT_CFNTOOLS_DIR=$DEST/heat-cfntools @@ -184,10 +184,10 @@ function create_heat_cache_dir { # install_heatclient() - Collect source and prepare function install_heatclient { - if use_library_from_git "heatclient"; then - git_clone_by_name "heatclient" - setup_develop "heatclient" - sudo install -D -m 0644 -o $STACK_USER {$HEATCLIENT_DIR/tools/,/etc/bash_completion.d/}heat.bash_completion + if use_library_from_git "python-heatclient"; then + git_clone_by_name "python-heatclient" + setup_dev_lib "python-heatclient" + sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-heatclient"]}/tools/,/etc/bash_completion.d/}heat.bash_completion fi } diff --git a/lib/ironic b/lib/ironic index c90482a00b..afe69f2df8 100644 --- a/lib/ironic +++ b/lib/ironic @@ -28,7 +28,7 @@ set +o pipefail # -------- # Set up default directories -GITDIR["ironicclient"]=$DEST/python-ironicclient +GITDIR["python-ironicclient"]=$DEST/python-ironicclient IRONIC_DIR=$DEST/ironic IRONIC_PYTHON_AGENT_DIR=$DEST/ironic-python-agent @@ -151,10 +151,10 @@ function install_ironic { # install_ironicclient() - Collect sources and prepare function install_ironicclient { - if use_library_from_git "ironicclient"; then - git_clone_by_name "ironicclient" - setup_develop "ironicclient" - sudo install -D -m 0644 -o $STACK_USER {$IRONICCLIENT_DIR/tools/,/etc/bash_completion.d/}ironic.bash_completion + if use_library_from_git "python-ironicclient"; then + git_clone_by_name "python-ironicclient" + setup_dev_lib "python-ironicclient" + sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-ironicclient"]}/tools/,/etc/bash_completion.d/}ironic.bash_completion else # nothing actually "requires" ironicclient, so force instally from pypi pip_install python-ironicclient diff --git a/lib/keystone b/lib/keystone index 6341ce2eea..e2c823a89e 100644 --- a/lib/keystone +++ b/lib/keystone @@ -33,7 +33,7 @@ set +o xtrace # -------- # Set up default directories -GITDIR["keystoneclient"]=$DEST/python-keystoneclient +GITDIR["python-keystoneclient"]=$DEST/python-keystoneclient KEYSTONE_DIR=$DEST/keystone KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-/etc/keystone} @@ -480,10 +480,10 @@ function init_keystone { # install_keystoneclient() - Collect source and prepare function install_keystoneclient { - if use_library_from_git "keystoneclient"; then - git_clone_by_name "keystoneclient" - setup_develop "keystoneclient" - sudo install -D -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,/etc/bash_completion.d/}keystone.bash_completion + if use_library_from_git "python-keystoneclient"; then + git_clone_by_name "python-keystoneclient" + setup_dev_lib "python-keystoneclient" + sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-keystoneclient"]}/tools/,/etc/bash_completion.d/}keystone.bash_completion fi } diff --git a/lib/neutron b/lib/neutron index 8f1bbf2b93..8295a738b7 100644 --- a/lib/neutron +++ b/lib/neutron @@ -67,7 +67,7 @@ fi # Set up default directories -GITDIR["neutronclient"]=$DEST/python-neutronclient +GITDIR["python-neutronclient"]=$DEST/python-neutronclient NEUTRON_DIR=$DEST/neutron @@ -620,10 +620,10 @@ function install_neutron { # install_neutronclient() - Collect source and prepare function install_neutronclient { - if use_library_from_git "neutronclient"; then - git_clone_by_name "neutronclient" - setup_develop "neutronclient" - sudo install -D -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,/etc/bash_completion.d/}neutron.bash_completion + if use_library_from_git "python-neutronclient"; then + git_clone_by_name "python-neutronclient" + setup_dev_lib "python-neutronclient" + sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-neutronclient"]}/tools/,/etc/bash_completion.d/}neutron.bash_completion fi } diff --git a/lib/nova b/lib/nova index d5f11928e5..78906f7210 100644 --- a/lib/nova +++ b/lib/nova @@ -29,7 +29,7 @@ set +o xtrace # -------- # Set up default directories -GITDIR["novaclient"]=$DEST/python-novaclient +GITDIR["python-novaclient"]=$DEST/python-novaclient NOVA_DIR=$DEST/nova @@ -639,10 +639,10 @@ function init_nova { # install_novaclient() - Collect source and prepare function install_novaclient { - if use_library_from_git "novaclient"; then - git_clone_by_name "novaclient" - setup_develop "novaclient" - sudo install -D -m 0644 -o $STACK_USER {$NOVACLIENT_DIR/tools/,/etc/bash_completion.d/}nova.bash_completion + if use_library_from_git "python-novaclient"; then + git_clone_by_name "python-novaclient" + setup_dev_lib "python-novaclient" + sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-novaclient"]}/tools/,/etc/bash_completion.d/}nova.bash_completion fi } diff --git a/lib/swift b/lib/swift index 801628241a..ae0874ebdf 100644 --- a/lib/swift +++ b/lib/swift @@ -34,7 +34,7 @@ if is_ssl_enabled_service "s-proxy" || is_service_enabled tls-proxy; then fi # Set up default directories -GITDIR["swiftclient"]=$DEST/python-swiftclient +GITDIR["python-swiftclient"]=$DEST/python-swiftclient SWIFT_DIR=$DEST/swift @@ -677,9 +677,9 @@ function install_swift { } function install_swiftclient { - if use_library_from_git "swiftclient"; then - git_clone_by_name "swiftclient" - setup_develop "swiftclient" + if use_library_from_git "python-swiftclient"; then + git_clone_by_name "python-swiftclient" + setup_dev_lib "python-swiftclient" fi } diff --git a/lib/trove b/lib/trove index 50bd684745..60b2bdba22 100644 --- a/lib/trove +++ b/lib/trove @@ -28,7 +28,7 @@ else fi # Set up default configuration -GITDIR["troveclient"]=$DEST/python-troveclient +GITDIR["python-troveclient"]=$DEST/python-troveclient TROVE_DIR=$DEST/trove TROVE_CONF_DIR=/etc/trove @@ -181,9 +181,9 @@ function configure_trove { # install_troveclient() - Collect source and prepare function install_troveclient { - if use_library_from_git "troveclient"; then - git_clone_by_name "troveclient" - setup_develop "troveclient" + if use_library_from_git "python-troveclient"; then + git_clone_by_name "python-troveclient" + setup_dev_lib "python-troveclient" fi } diff --git a/stack.sh b/stack.sh index 2f045119bc..54444ad80c 100755 --- a/stack.sh +++ b/stack.sh @@ -584,7 +584,7 @@ if [[ -d $TOP_DIR/extras.d ]]; then fi # Set the destination directories for other OpenStack projects -GITDIR["openstackclient"]=$DEST/python-openstackclient +GITDIR["python-openstackclient"]=$DEST/python-openstackclient # Interactive Configuration # ------------------------- @@ -788,9 +788,9 @@ fi install_keystonemiddleware # install the OpenStack client, needed for most setup commands -if use_library_from_git "openstackclient"; then - git_clone_by_name "openstackclient" - setup_develop "openstackclient" +if use_library_from_git "python-openstackclient"; then + git_clone_by_name "python-openstackclient" + setup_dev_lib "python-openstackclient" else pip_install python-openstackclient fi diff --git a/stackrc b/stackrc index 2f08c730be..c7bad78c0e 100644 --- a/stackrc +++ b/stackrc @@ -210,48 +210,48 @@ GITBRANCH["tempest_lib"]=${TEMPEST_LIB_BRANCH:-master} ############## # ceilometer client library -GITREPO["ceilometerclient"]=${CEILOMETERCLIENT_REPO:-${GIT_BASE}/openstack/python-ceilometerclient.git} -GITBRANCH["ceilometerclient"]=${CEILOMETERCLIENT_BRANCH:-master} +GITREPO["python-ceilometerclient"]=${CEILOMETERCLIENT_REPO:-${GIT_BASE}/openstack/python-ceilometerclient.git} +GITBRANCH["python-ceilometerclient"]=${CEILOMETERCLIENT_BRANCH:-master} # volume client -GITREPO["cinderclient"]=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git} -GITBRACH["cinderclient"]=${CINDERCLIENT_BRANCH:-master} +GITREPO["python-cinderclient"]=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git} +GITBRACH["python-cinderclient"]=${CINDERCLIENT_BRANCH:-master} # python glance client library -GITREPO["glanceclient"]=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git} -GITBRANCH["glanceclient"]=${GLANCECLIENT_BRANCH:-master} +GITREPO["python-glanceclient"]=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git} +GITBRANCH["python-glanceclient"]=${GLANCECLIENT_BRANCH:-master} # python heat client library -GITREPO["heatclient"]=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git} -GITBRANCH["heatclient"]=${HEATCLIENT_BRANCH:-master} +GITREPO["python-heatclient"]=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git} +GITBRANCH["python-heatclient"]=${HEATCLIENT_BRANCH:-master} # ironic client -GITREPO["ironicclient"]=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git} -GITBRANCH["ironicclient"]=${IRONICCLIENT_BRANCH:-master} +GITREPO["python-ironicclient"]=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git} +GITBRANCH["python-ironicclient"]=${IRONICCLIENT_BRANCH:-master} # python keystone client library to nova that horizon uses -GITREPO["keystoneclient"]=${KEYSTONECLIENT_REPO:-${GIT_BASE}/openstack/python-keystoneclient.git} -GITBRANCH["keystoneclient"]=${KEYSTONECLIENT_BRANCH:-master} +GITREPO["python-keystoneclient"]=${KEYSTONECLIENT_REPO:-${GIT_BASE}/openstack/python-keystoneclient.git} +GITBRANCH["python-keystoneclient"]=${KEYSTONECLIENT_BRANCH:-master} # neutron client -GITREPO["neutronclient"]=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git} -GITBRANCH["neutronclient"]=${NEUTRONCLIENT_BRANCH:-master} +GITREPO["python-neutronclient"]=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git} +GITBRANCH["python-neutronclient"]=${NEUTRONCLIENT_BRANCH:-master} # python client library to nova that horizon (and others) use -GITREPO["novaclient"]=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git} -GITBRANCH["novaclient"]=${NOVACLIENT_BRANCH:-master} +GITREPO["python-novaclient"]=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git} +GITBRANCH["python-novaclient"]=${NOVACLIENT_BRANCH:-master} # python swift client library -GITREPO["swiftclient"]=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git} -GITBRANCH["swiftclient"]=${SWIFTCLIENT_BRANCH:-master} +GITREPO["python-swiftclient"]=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git} +GITBRANCH["python-swiftclient"]=${SWIFTCLIENT_BRANCH:-master} # trove client library test -GITREPO["troveclient"]=${TROVECLIENT_REPO:-${GIT_BASE}/openstack/python-troveclient.git} -GITBRANCH["troveclient"]=${TROVECLIENT_BRANCH:-master} +GITREPO["python-troveclient"]=${TROVECLIENT_REPO:-${GIT_BASE}/openstack/python-troveclient.git} +GITBRANCH["python-troveclient"]=${TROVECLIENT_BRANCH:-master} # consolidated openstack python client -GITREPO["openstackclient"]=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git} -GITBRANCH["openstackclient"]=${OPENSTACKCLIENT_BRANCH:-master} +GITREPO["python-openstackclient"]=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git} +GITBRANCH["python-openstackclient"]=${OPENSTACKCLIENT_BRANCH:-master} ################### # From ee5ae7b92369484007d8deb249f6c941d422123c Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Thu, 13 Nov 2014 13:23:27 -0500 Subject: [PATCH 0082/3333] further pypi libs conversions glance_store and saharaclient were missed in the last round, make them install from released clients in this patch. Change-Id: I2e0ed2b7fb5994ae6abd92612a67ce5fd82b3f7e --- lib/glance | 8 +++++--- lib/sahara | 13 +++++-------- stackrc | 16 ++++++++++++---- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lib/glance b/lib/glance index 3a4ccd8132..04c088aa6d 100644 --- a/lib/glance +++ b/lib/glance @@ -28,9 +28,9 @@ set +o xtrace # Set up default directories GITDIR["python-glanceclient"]=$DEST/python-glanceclient +GIRDIR["glance_store"]=$DEST/glance_store GLANCE_DIR=$DEST/glance -GLANCE_STORE_DIR=$DEST/glance_store GLANCE_CACHE_DIR=${GLANCE_CACHE_DIR:=$DATA_DIR/glance/cache} GLANCE_IMAGE_DIR=${GLANCE_IMAGE_DIR:=$DATA_DIR/glance/images} GLANCE_AUTH_CACHE_DIR=${GLANCE_AUTH_CACHE_DIR:-/var/cache/glance} @@ -297,8 +297,10 @@ function install_glanceclient { function install_glance { # Install glance_store from git so we make sure we're testing # the latest code. - git_clone $GLANCE_STORE_REPO $GLANCE_STORE_DIR $GLANCE_STORE_BRANCH - setup_develop $GLANCE_STORE_DIR + if use_library_from_git "glance_store"; then + git_clone_by_name "glance_store" + setup_dev_lib "glance_store" + fi git_clone $GLANCE_REPO $GLANCE_DIR $GLANCE_BRANCH setup_develop $GLANCE_DIR diff --git a/lib/sahara b/lib/sahara index 6d1bef571a..4f1ba22c67 100644 --- a/lib/sahara +++ b/lib/sahara @@ -22,15 +22,10 @@ set +o xtrace # -------- # Set up default repos -SAHARA_REPO=${SAHARA_REPO:-${GIT_BASE}/openstack/sahara.git} -SAHARA_BRANCH=${SAHARA_BRANCH:-master} - -SAHARA_PYTHONCLIENT_REPO=${SAHARA_PYTHONCLIENT_REPO:-${GIT_BASE}/openstack/python-saharaclient.git} -SAHARA_PYTHONCLIENT_BRANCH=${SAHARA_PYTHONCLIENT_BRANCH:-master} # Set up default directories +GITDIR["python-saharaclient"]=$DEST/python-saharaclient SAHARA_DIR=$DEST/sahara -SAHARA_PYTHONCLIENT_DIR=$DEST/python-saharaclient SAHARA_CONF_DIR=${SAHARA_CONF_DIR:-/etc/sahara} SAHARA_CONF_FILE=${SAHARA_CONF_DIR}/sahara.conf @@ -158,8 +153,10 @@ function install_sahara { # install_python_saharaclient() - Collect source and prepare function install_python_saharaclient { - git_clone $SAHARA_PYTHONCLIENT_REPO $SAHARA_PYTHONCLIENT_DIR $SAHARA_PYTHONCLIENT_BRANCH - setup_develop $SAHARA_PYTHONCLIENT_DIR + if use_library_from_git "python-saharaclient"; then + git_clone_by_name "python-saharaclient" + setup_dev_lib "python-saharaclient" + fi } # start_sahara() - Start running processes, including screen diff --git a/stackrc b/stackrc index c7bad78c0e..75f606f382 100644 --- a/stackrc +++ b/stackrc @@ -144,7 +144,7 @@ GIT_BASE=${GIT_BASE:-git://git.openstack.org} CEILOMETER_REPO=${CEILOMETER_REPO:-${GIT_BASE}/openstack/ceilometer.git} CEILOMETER_BRANCH=${CEILOMETER_BRANCH:-master} -# volume service +# block storage service CINDER_REPO=${CINDER_REPO:-${GIT_BASE}/openstack/cinder.git} CINDER_BRANCH=${CINDER_BRANCH:-master} @@ -176,7 +176,11 @@ NEUTRON_BRANCH=${NEUTRON_BRANCH:-master} NOVA_REPO=${NOVA_REPO:-${GIT_BASE}/openstack/nova.git} NOVA_BRANCH=${NOVA_BRANCH:-master} -# storage service +# data processing service +SAHARA_REPO=${SAHARA_REPO:-${GIT_BASE}/openstack/sahara.git} +SAHARA_BRANCH=${SAHARA_BRANCH:-master} + +# object storage service SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git} SWIFT_BRANCH=${SWIFT_BRANCH:-master} @@ -241,6 +245,10 @@ GITBRANCH["python-neutronclient"]=${NEUTRONCLIENT_BRANCH:-master} GITREPO["python-novaclient"]=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git} GITBRANCH["python-novaclient"]=${NOVACLIENT_BRANCH:-master} +# python saharaclient +GITREPO["python-saharaclient"]=${SAHARACLIENT_REPO:-${GIT_BASE}/openstack/python-saharaclient.git} +GITBRANCH["python-saharaclient"]=${SAHARACLIENT_BRANCH:-master} + # python swift client library GITREPO["python-swiftclient"]=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git} GITBRANCH["python-swiftclient"]=${SWIFTCLIENT_BRANCH:-master} @@ -330,8 +338,8 @@ GITBRANCH["pbr"]=${PBR_BRANCH:-master} ################## # glance store library -GLANCE_STORE_REPO=${GLANCE_STORE_REPO:-${GIT_BASE}/openstack/glance_store.git} -GLANCE_STORE_BRANCH=${GLANCE_STORE_BRANCH:-master} +GITREPO["glance_store"]=${GLANCE_STORE_REPO:-${GIT_BASE}/openstack/glance_store.git} +GITBRANCH["glance_store"]=${GLANCE_STORE_BRANCH:-master} # heat-cfntools server agent HEAT_CFNTOOLS_REPO=${HEAT_CFNTOOLS_REPO:-${GIT_BASE}/openstack/heat-cfntools.git} From ae9ee6bf97c721e43f468b70eb6fb5c234e3eeba Mon Sep 17 00:00:00 2001 From: yunhong jiang Date: Wed, 8 Oct 2014 07:01:02 -0700 Subject: [PATCH 0083/3333] Add Ironic hardware deployment support Currently devstack create VMs and then deploy Ironic on these VMs. Sometimes developer may want to deploy on real platform. A separated file is required to provide the baremetal compute node information, which includes four fields for each hardware platform, the ipmi address, the mac address, the ipmi user name and the password. Change-Id: I422b43eae6edc95f15b8c40383d0ba7fbcd9b1ff --- lib/ironic | 89 ++++++++++++++++++++++++++++++++++++++++++----------- lib/neutron | 17 +++++++++- 2 files changed, 87 insertions(+), 19 deletions(-) diff --git a/lib/ironic b/lib/ironic index afe69f2df8..a0a93d5deb 100644 --- a/lib/ironic +++ b/lib/ironic @@ -40,6 +40,18 @@ IRONIC_CONF_FILE=$IRONIC_CONF_DIR/ironic.conf IRONIC_ROOTWRAP_CONF=$IRONIC_CONF_DIR/rootwrap.conf IRONIC_POLICY_JSON=$IRONIC_CONF_DIR/policy.json +# Deploy to hardware platform +IRONIC_HW_NODE_CPU=${IRONIC_HW_NODE_CPU:-1} +IRONIC_HW_NODE_RAM=${IRONIC_HW_NODE_RAM:-512} +IRONIC_HW_NODE_DISK=${IRONIC_HW_NODE_DISK:-10} +IRONIC_HW_EPHEMERAL_DISK=${IRONIC_HW_EPHEMERAL_DISK:-0} +# The file is composed of multiple lines, each line includes four field +# separated by white space: IPMI address, MAC address, IPMI username +# and IPMI password. +# An example: +# 192.168.110.107 00:1e:67:57:50:4c root otc123 +IRONIC_IPMIINFO_FILE=${IRONIC_IPMIINFO_FILE:-$IRONIC_DATA_DIR/hardware_info} + # Set up defaults for functional / integration testing IRONIC_SCRIPTS_DIR=${IRONIC_SCRIPTS_DIR:-$TOP_DIR/tools/ironic/scripts} IRONIC_TEMPLATES_DIR=${IRONIC_TEMPLATES_DIR:-$TOP_DIR/tools/ironic/templates} @@ -51,6 +63,7 @@ IRONIC_SSH_KEY_FILENAME=${IRONIC_SSH_KEY_FILENAME:-ironic_key} IRONIC_KEY_FILE=$IRONIC_SSH_KEY_DIR/$IRONIC_SSH_KEY_FILENAME IRONIC_SSH_VIRT_TYPE=${IRONIC_SSH_VIRT_TYPE:-virsh} IRONIC_TFTPBOOT_DIR=${IRONIC_TFTPBOOT_DIR:-$IRONIC_DATA_DIR/tftpboot} +IRONIC_TFTPSERVER_IP=${IRONIC_TFTPSERVER_IP:-$HOST_IP} IRONIC_VM_SSH_PORT=${IRONIC_VM_SSH_PORT:-22} IRONIC_VM_SSH_ADDRESS=${IRONIC_VM_SSH_ADDRESS:-$HOST_IP} IRONIC_VM_COUNT=${IRONIC_VM_COUNT:-1} @@ -80,7 +93,7 @@ IRONIC_AGENT_KERNEL_URL=${IRONIC_AGENT_KERNEL_URL:-http://tarballs.openstack.org IRONIC_AGENT_RAMDISK_URL=${IRONIC_AGENT_RAMDISK_URL:-http://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe_image-oem.cpio.gz} # Which deploy driver to use - valid choices right now -# are 'pxe_ssh' and 'agent_ssh'. +# are 'pxe_ssh', 'pxe_ipmitool' and 'agent_ssh'. IRONIC_DEPLOY_DRIVER=${IRONIC_DEPLOY_DRIVER:-pxe_ssh} #TODO(agordeev): replace 'ubuntu' with host distro name getting @@ -133,6 +146,11 @@ function is_ironic_enabled { return 1 } +function is_ironic_hardware { + is_ironic_enabled && [[ -n "${IRONIC_DEPLOY_DRIVER##*_ssh}" ]] && return 0 + return 1 +} + # install_ironic() - Collect source and prepare function install_ironic { # make sure all needed service were enabled @@ -273,7 +291,7 @@ function configure_ironic_conductor { iniset $IRONIC_CONF_FILE DEFAULT rootwrap_config $IRONIC_ROOTWRAP_CONF iniset $IRONIC_CONF_FILE DEFAULT enabled_drivers $IRONIC_ENABLED_DRIVERS iniset $IRONIC_CONF_FILE conductor api_url http://$HOST_IP:6385 - iniset $IRONIC_CONF_FILE pxe tftp_server $HOST_IP + iniset $IRONIC_CONF_FILE pxe tftp_server $IRONIC_TFTPSERVER_IP iniset $IRONIC_CONF_FILE pxe tftp_root $IRONIC_TFTPBOOT_DIR iniset $IRONIC_CONF_FILE pxe tftp_master_path $IRONIC_TFTPBOOT_DIR/master_images if [[ "$IRONIC_VM_LOG_CONSOLE" == "True" ]] ; then @@ -475,7 +493,7 @@ function create_bridge_and_vms { create_ovs_taps } -function enroll_vms { +function enroll_nodes { local chassis_id=$(ironic chassis-create -d "ironic test chassis" | grep " uuid " | get_field 2) local idx=0 @@ -487,34 +505,65 @@ function enroll_vms { local _IRONIC_DEPLOY_RAMDISK_KEY=deploy_ramdisk fi - while read MAC; do - - local node_id=$(ironic node-create --chassis_uuid $chassis_id \ - --driver $IRONIC_DEPLOY_DRIVER \ + if ! is_ironic_hardware; then + local ironic_node_cpu=$IRONIC_VM_SPECS_CPU + local ironic_node_ram=$IRONIC_VM_SPECS_RAM + local ironic_node_disk=$IRONIC_VM_SPECS_DISK + local ironic_ephemeral_disk=$IRONIC_VM_EPHEMERAL_DISK + local ironic_hwinfo_file=$IRONIC_VM_MACS_CSV_FILE + local node_options="\ -i $_IRONIC_DEPLOY_KERNEL_KEY=$IRONIC_DEPLOY_KERNEL_ID \ -i $_IRONIC_DEPLOY_RAMDISK_KEY=$IRONIC_DEPLOY_RAMDISK_ID \ -i ssh_virt_type=$IRONIC_SSH_VIRT_TYPE \ -i ssh_address=$IRONIC_VM_SSH_ADDRESS \ -i ssh_port=$IRONIC_VM_SSH_PORT \ -i ssh_username=$IRONIC_SSH_USERNAME \ - -i ssh_key_filename=$IRONIC_SSH_KEY_DIR/$IRONIC_SSH_KEY_FILENAME \ - -p cpus=$IRONIC_VM_SPECS_CPU \ - -p memory_mb=$IRONIC_VM_SPECS_RAM \ - -p local_gb=$IRONIC_VM_SPECS_DISK \ + -i ssh_key_filename=$IRONIC_SSH_KEY_DIR/$IRONIC_SSH_KEY_FILENAME" + else + local ironic_node_cpu=$IRONIC_HW_NODE_CPU + local ironic_node_ram=$IRONIC_HW_NODE_RAM + local ironic_node_disk=$IRONIC_HW_NODE_DISK + local ironic_ephemeral_disk=$IRONIC_HW_EPHEMERAL_DISK + if [[ -z "${IRONIC_DEPLOY_DRIVER##*_ipmitool}" ]]; then + local ironic_hwinfo_file=$IRONIC_IPMIINFO_FILE + fi + fi + + while read hardware_info; do + if ! is_ironic_hardware; then + local mac_address=$hardware_info + elif [[ -z "${IRONIC_DEPLOY_DRIVER##*_ipmitool}" ]]; then + local ipmi_address=$(echo $hardware_info |awk '{print $1}') + local mac_address=$(echo $hardware_info |awk '{print $2}') + local ironic_ipmi_username=$(echo $hardware_info |awk '{print $3}') + local ironic_ipmi_passwd=$(echo $hardware_info |awk '{print $4}') + # Currently we require all hardware platform have same CPU/RAM/DISK info + # in future, this can be enhanced to support different type, and then + # we create the bare metal flavor with minimum value + local node_options="-i ipmi_address=$ipmi_address -i ipmi_password=$ironic_ipmi_passwd\ + -i ipmi_username=$ironic_ipmi_username" + fi + + local node_id=$(ironic node-create --chassis_uuid $chassis_id \ + --driver $IRONIC_DEPLOY_DRIVER \ + -p cpus=$ironic_node_cpu\ + -p memory_mb=$ironic_node_ram\ + -p local_gb=$ironic_node_disk\ -p cpu_arch=x86_64 \ + $node_options \ | grep " uuid " | get_field 2) - ironic port-create --address $MAC --node_uuid $node_id + ironic port-create --address $mac_address --node_uuid $node_id idx=$((idx+1)) - done < $IRONIC_VM_MACS_CSV_FILE + done < $ironic_hwinfo_file # create the nova flavor # NOTE(adam_g): Attempting to use an autogenerated UUID for flavor id here uncovered # bug (LP: #1333852) in Trove. This can be changed to use an auto flavor id when the # bug is fixed in Juno. - local adjusted_disk=$(($IRONIC_VM_SPECS_DISK - $IRONIC_VM_EPHEMERAL_DISK)) - nova flavor-create --ephemeral $IRONIC_VM_EPHEMERAL_DISK baremetal 551 $IRONIC_VM_SPECS_RAM $adjusted_disk $IRONIC_VM_SPECS_CPU + local adjusted_disk=$(($ironic_node_disk - $ironic_ephemeral_disk)) + nova flavor-create --ephemeral $ironic_ephemeral_disk baremetal 551 $ironic_node_ram $adjusted_disk $ironic_node_cpu # TODO(lucasagomes): Remove the 'baremetal:deploy_kernel_id' # and 'baremetal:deploy_ramdisk_id' parameters @@ -662,11 +711,15 @@ function upload_baremetal_ironic_deploy { function prepare_baremetal_basic_ops { upload_baremetal_ironic_deploy - create_bridge_and_vms - enroll_vms + if ! is_ironic_hardware; then + create_bridge_and_vms + fi + enroll_nodes configure_tftpd configure_iptables - configure_ironic_auxiliary + if ! is_ironic_hardware; then + configure_ironic_auxiliary + fi } function cleanup_baremetal_basic_ops { diff --git a/lib/neutron b/lib/neutron index 8295a738b7..db6bd47ced 100644 --- a/lib/neutron +++ b/lib/neutron @@ -523,7 +523,7 @@ function create_neutron_initial_network { die_if_not_set $LINENO PHYSICAL_NETWORK "You must specify the PHYSICAL_NETWORK" die_if_not_set $LINENO PROVIDER_NETWORK_TYPE "You must specifiy the PROVIDER_NETWORK_TYPE" NET_ID=$(neutron net-create $PHYSICAL_NETWORK --tenant_id $TENANT_ID --provider:network_type $PROVIDER_NETWORK_TYPE --provider:physical_network "$PHYSICAL_NETWORK" ${SEGMENTATION_ID:+--provider:segmentation_id $SEGMENTATION_ID} --shared | grep ' id ' | get_field 2) - SUBNET_ID=$(neutron subnet-create --tenant_id $TENANT_ID --ip_version 4 ${ALLOCATION_POOL:+--allocation-pool $ALLOCATION_POOL} --name $PROVIDER_SUBNET_NAME $NET_ID $FIXED_RANGE | grep ' id ' | get_field 2) + SUBNET_ID=$(neutron subnet-create --tenant_id $TENANT_ID --ip_version 4 ${ALLOCATION_POOL:+--allocation-pool $ALLOCATION_POOL} --name $PROVIDER_SUBNET_NAME --gateway $NETWORK_GATEWAY $NET_ID $FIXED_RANGE | grep ' id ' | get_field 2) SUBNET_V6_ID=$(neutron subnet-create --tenant_id $TENANT_ID --ip_version 6 --ipv6-address-mode slaac --gateway $V6_NETWORK_GATEWAY --name $PROVIDER_SUBNET_NAME_V6 $NET_ID $FIXED_RANGE_V6 | grep 'id' | get_field 2) sudo ip link set $OVS_PHYSICAL_BRIDGE up sudo ip link set br-int up @@ -678,6 +678,13 @@ function start_neutron_agents { sudo ip link set $OVS_PHYSICAL_BRIDGE up sudo ip link set br-int up sudo ip link set $PUBLIC_INTERFACE up + if is_ironic_hardware; then + for IP in $(ip addr show dev $PUBLIC_INTERFACE | grep ' inet ' | awk '{print $2}'); do + sudo ip addr del $IP dev $PUBLIC_INTERFACE + sudo ip addr add $IP dev $OVS_PHYSICAL_BRIDGE + done + sudo route add -net $FIXED_RANGE gw $NETWORK_GATEWAY dev $OVS_PHYSICAL_BRIDGE + fi fi if is_service_enabled q-vpn; then @@ -729,6 +736,14 @@ function stop_neutron { # cleanup_neutron() - Remove residual data files, anything left over from previous # runs that a clean run would need to clean up function cleanup_neutron { + if [[ is_provider_network && is_ironic_hardware ]]; then + for IP in $(ip addr show dev $OVS_PHYSICAL_BRIDGE | grep ' inet ' | awk '{print $2}'); do + sudo ip addr del $IP dev $OVS_PHYSICAL_BRIDGE + sudo ip addr add $IP dev $PUBLIC_INTERFACE + done + sudo route del -net $FIXED_RANGE gw $NETWORK_GATEWAY dev $OVS_PHYSICAL_BRIDGE + fi + if is_neutron_ovs_base_plugin; then neutron_ovs_base_cleanup fi From 425e8447f1db92af03c02c1bf42456773206c8a9 Mon Sep 17 00:00:00 2001 From: Chris Dent Date: Fri, 14 Nov 2014 11:09:16 +0000 Subject: [PATCH 0084/3333] Fix a typo of python-cinderclient GITBRANCH A left out N. Causes various failures in shell evaluation. Change-Id: Icc09998c645ef2b975cb24b56d0f71c60289c188 --- stackrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stackrc b/stackrc index c7bad78c0e..d59166ebae 100644 --- a/stackrc +++ b/stackrc @@ -215,7 +215,7 @@ GITBRANCH["python-ceilometerclient"]=${CEILOMETERCLIENT_BRANCH:-master} # volume client GITREPO["python-cinderclient"]=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git} -GITBRACH["python-cinderclient"]=${CINDERCLIENT_BRANCH:-master} +GITBRANCH["python-cinderclient"]=${CINDERCLIENT_BRANCH:-master} # python glance client library GITREPO["python-glanceclient"]=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git} From 3c8973a90abc7601e46e2fcaf3d50343338e24d8 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Fri, 14 Nov 2014 09:31:02 -0500 Subject: [PATCH 0085/3333] support installing django_openstack_auth from pypi Part of the libs from pypi conversion, convert django_openstack_auth to this format. Change-Id: I97c8ea19d8aed1e0bdd62c06cfadd1d616573d76 --- lib/horizon | 26 +++++++++++++------------- stackrc | 4 ++-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/horizon b/lib/horizon index 0213948633..1b53831135 100644 --- a/lib/horizon +++ b/lib/horizon @@ -25,8 +25,9 @@ set +o xtrace # -------- # Set up default directories +GITDIR["django_openstack_auth"]=$DEST/django_openstack_auth + HORIZON_DIR=$DEST/horizon -HORIZONAUTH_DIR=$DEST/django_openstack_auth # local_settings.py is used to customize Dashboard settings. # The example file in Horizon repo is used by default. @@ -89,9 +90,7 @@ function configure_horizon { # Horizon is installed as develop mode, so we can compile here. # Message catalog compilation is handled by Django admin script, # so compiling them after the installation avoids Django installation twice. - cd $HORIZON_DIR - ./run_tests.sh -N --compilemessages - cd - + (cd $HORIZON_DIR; ./run_tests.sh -N --compilemessages) } # init_horizon() - Initialize databases, etc. @@ -145,15 +144,16 @@ function init_horizon { # install_django_openstack_auth() - Collect source and prepare function install_django_openstack_auth { - git_clone $HORIZONAUTH_REPO $HORIZONAUTH_DIR $HORIZONAUTH_BRANCH - - # Compile message catalogs before installation - _prepare_message_catalog_compilation - cd $HORIZONAUTH_DIR - python setup.py compile_catalog - cd - - - setup_install $HORIZONAUTH_DIR + if use_library_from_git "django_openstack_auth"; then + local dir=${GITDIR["django_openstack_auth"]} + git_clone_by_name "django_openstack_auth" + # Compile message catalogs before installation + _prepare_message_catalog_compilation + (cd $dir; python setup.py compile_catalog) + setup_dev_lib "django_openstack_auth" + fi + # if we aren't using this library from git, then we just let it + # get dragged in by the horizon setup. } # install_horizon() - Collect source and prepare diff --git a/stackrc b/stackrc index 75f606f382..a404ad88f4 100644 --- a/stackrc +++ b/stackrc @@ -350,8 +350,8 @@ HEAT_TEMPLATES_REPO=${HEAT_TEMPLATES_REPO:-${GIT_BASE}/openstack/heat-templates. HEAT_TEMPLATES_BRANCH=${HEAT_TEMPLATES_BRANCH:-master} # django openstack_auth library -HORIZONAUTH_REPO=${HORIZONAUTH_REPO:-${GIT_BASE}/openstack/django_openstack_auth.git} -HORIZONAUTH_BRANCH=${HORIZONAUTH_BRANCH:-master} +GITREPO["django_openstack_auth"]=${HORIZONAUTH_REPO:-${GIT_BASE}/openstack/django_openstack_auth.git} +GITBRANCH["django_openstack_auth"]=${HORIZONAUTH_BRANCH:-master} # keystone middleware KEYSTONEMIDDLEWARE_REPO=${KEYSTONEMIDDLEWARE_REPO:-${GIT_BASE}/openstack/keystonemiddleware.git} From 658312ca2f54aaabd43f91d2fca73cbee0319735 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Fri, 14 Nov 2014 11:35:56 -0500 Subject: [PATCH 0086/3333] move keystonemiddleware to pypi libs Make keystonemiddleware install from pypi releases by default Change-Id: I3dc4b096b4184f4cf00fb0df66b76fcc8f19785b --- lib/keystone | 9 +++++---- stackrc | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/keystone b/lib/keystone index e2c823a89e..72a79be44d 100644 --- a/lib/keystone +++ b/lib/keystone @@ -34,6 +34,7 @@ set +o xtrace # Set up default directories GITDIR["python-keystoneclient"]=$DEST/python-keystoneclient +GITDIR["keystonemiddleware"]=$DEST/keystonemiddleware KEYSTONE_DIR=$DEST/keystone KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-/etc/keystone} @@ -46,8 +47,6 @@ else KEYSTONE_WSGI_DIR=${KEYSTONE_WSGI_DIR:-/var/www/keystone} fi -KEYSTONEMIDDLEWARE_DIR=$DEST/keystonemiddleware - # Set up additional extensions, such as oauth1, federation # Example of KEYSTONE_EXTENSIONS=oauth1,federation KEYSTONE_EXTENSIONS=${KEYSTONE_EXTENSIONS:-} @@ -489,8 +488,10 @@ function install_keystoneclient { # install_keystonemiddleware() - Collect source and prepare function install_keystonemiddleware { - git_clone $KEYSTONEMIDDLEWARE_REPO $KEYSTONEMIDDLEWARE_DIR $KEYSTONEMIDDLEWARE_BRANCH - setup_install $KEYSTONEMIDDLEWARE_DIR + if use_library_from_git "keystonemiddleware"; then + git_clone_by_name "keystonemiddleware" + setup_dev_lib "keystonemiddleware" + fi } # install_keystone() - Collect source and prepare diff --git a/stackrc b/stackrc index a404ad88f4..d54a497bb0 100644 --- a/stackrc +++ b/stackrc @@ -354,8 +354,8 @@ GITREPO["django_openstack_auth"]=${HORIZONAUTH_REPO:-${GIT_BASE}/openstack/djang GITBRANCH["django_openstack_auth"]=${HORIZONAUTH_BRANCH:-master} # keystone middleware -KEYSTONEMIDDLEWARE_REPO=${KEYSTONEMIDDLEWARE_REPO:-${GIT_BASE}/openstack/keystonemiddleware.git} -KEYSTONEMIDDLEWARE_BRANCH=${KEYSTONEMIDDLEWARE_BRANCH:-master} +GITREPO["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_REPO:-${GIT_BASE}/openstack/keystonemiddleware.git} +GITBRANCH["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_BRANCH:-master} # s3 support for swift SWIFT3_REPO=${SWIFT3_REPO:-${GIT_BASE}/stackforge/swift3.git} From 6a41ba20e7978c5f62a125412a9489d59e520a43 Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Mon, 17 Nov 2014 10:46:56 +1100 Subject: [PATCH 0087/3333] Remove rackspace/centos7 work-around The current centos 7 images from rackspace do not have cloud-init installed via pip, so this is no longer needed. This work around is actually a little wrong too, see the bug. Change-Id: I6642593ca2248d9e01f653cc8e70c70ba8372e50 Partial-bug: #1393073 --- stack.sh | 8 -------- 1 file changed, 8 deletions(-) diff --git a/stack.sh b/stack.sh index 7635f32298..ef4591e232 100755 --- a/stack.sh +++ b/stack.sh @@ -209,14 +209,6 @@ if is_ubuntu; then echo 'APT::Acquire::Retries "20";' | sudo tee /etc/apt/apt.conf.d/80retry >/dev/null fi -# upstream Rackspace centos7 images have an issue where cloud-init is -# installed via pip because there were not official packages when the -# image was created (fix in the works). Remove all pip packages -# before we do anything else -if [[ $DISTRO = "rhel7" && is_rackspace ]]; then - (sudo pip freeze | xargs sudo pip uninstall -y) || true -fi - # Some distros need to add repos beyond the defaults provided by the vendor # to pick up required packages. From 0eed532ce392f7db7cc004ca4b28c22407499d1d Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Sat, 15 Nov 2014 17:15:49 -0300 Subject: [PATCH 0088/3333] Remove nose things We don't use nose anywhere in anything related to devstack. The only legitimate OpenStack things that are still nose are horizon and swift unittests, and it turns out we don't really run those in devstack. Change-Id: I215e0f3664f269e0e1b8f5d5f9c70553dededddd --- tools/fixup_stuff.sh | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tools/fixup_stuff.sh b/tools/fixup_stuff.sh index b8beb01583..ca465339b7 100755 --- a/tools/fixup_stuff.sh +++ b/tools/fixup_stuff.sh @@ -18,7 +18,6 @@ # - (re)start messagebus daemon # - remove distro packages python-crypto and python-lxml # - pre-install hgtools to work around a bug in RHEL6 distribute -# - install nose 1.1 from EPEL # If TOP_DIR is set we're being sourced rather than running stand-alone # or in a sub-shell @@ -179,14 +178,6 @@ if [[ $DISTRO =~ (rhel6) ]]; then # Note we do this before the track-depends in ``stack.sh``. pip_install hgtools - - # RHEL6's version of ``python-nose`` is incompatible with Tempest. - # Install nose 1.1 (Tempest-compatible) from EPEL - install_package python-nose1.1 - # Add a symlink for the new nosetests to allow tox for Tempest to - # work unmolested. - sudo ln -sf /usr/bin/nosetests1.1 /usr/local/bin/nosetests - # workaround for https://code.google.com/p/unittest-ext/issues/detail?id=79 install_package python-unittest2 patch pip_install discover From dc73d39a3006f92b2902a08279377634efb03094 Mon Sep 17 00:00:00 2001 From: Ken'ichi Ohmichi Date: Mon, 17 Nov 2014 03:54:58 +0000 Subject: [PATCH 0089/3333] Add TEMPEST_ENABLE_NOVA_XML_API option XML support of Nova API has been deprecated with the following message: XML support has been deprecated and may be removed as early as the Juno release. Now Kilo development cycle started, so we should disable Nova API XML tests on Tempest. This patch adds TEMPEST_ENABLE_NOVA_XML_API option for setting Tempest test by devstack-gate. The default value is True because of keeping the test coverage. After merging a devstack-gate patch which specifes True for stable/icehouse and stable/juno, we will set False for the master blanch. I4acc15ce5f487738bb34a95c2261a5d05d827d8d is a Nova patch which removes XML API support. Change-Id: I2ab8f5c3d15b496e0b639c99bb8592533a69a265 --- lib/tempest | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/tempest b/lib/tempest index 9e025a1096..7ef8a308e3 100644 --- a/lib/tempest +++ b/lib/tempest @@ -303,6 +303,7 @@ function configure_tempest { iniset $TEMPEST_CONFIG compute-feature-enabled change_password False iniset $TEMPEST_CONFIG compute-feature-enabled block_migration_for_live_migration ${USE_BLOCK_MIGRATION_FOR_LIVE_MIGRATION:-False} iniset $TEMPEST_CONFIG compute-feature-enabled api_extensions ${COMPUTE_API_EXTENSIONS:-"all"} + iniset $TEMPEST_CONFIG compute-feature-enabled xml_api_v2 ${TEMPEST_ENABLE_NOVA_XML_API:-True} iniset $TEMPEST_CONFIG compute-feature-disabled api_extensions ${DISABLE_COMPUTE_API_EXTENSIONS} # Compute admin From 7d0a0f7d48222369f36a1a5a27a39c45430c9615 Mon Sep 17 00:00:00 2001 From: Rob Crittenden Date: Mon, 17 Nov 2014 00:03:47 -0500 Subject: [PATCH 0090/3333] Remove hardcoded protocol from backup_swift_url Use SWIFT_SERVICE_PROTOCOL when configuring backup_swift_url for cinder configuration. Change-Id: I09de62e8deca86b473cee969ba2c5919d4f9892d Closes-Bug: #1393554 --- lib/cinder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cinder b/lib/cinder index eb3cbe86cf..611e1ca5d9 100644 --- a/lib/cinder +++ b/lib/cinder @@ -258,7 +258,7 @@ function configure_cinder { fi if is_service_enabled swift; then - iniset $CINDER_CONF DEFAULT backup_swift_url "http://$SERVICE_HOST:8080/v1/AUTH_" + iniset $CINDER_CONF DEFAULT backup_swift_url "$SWIFT_SERVICE_PROTOCOL://$SERVICE_HOST:8080/v1/AUTH_" fi if is_service_enabled ceilometer; then From 21529a50e3b49ce378da88ce10ce903933fa3a02 Mon Sep 17 00:00:00 2001 From: John Davidge Date: Mon, 30 Jun 2014 09:55:11 -0400 Subject: [PATCH 0091/3333] Add IPv6 support for tenant data network Define IP_VERSION with one of the three values 4, 6, or 4+6 in your localrc to indicate if you intend to run your tenant data network as either IPv4, IPv6, or dual stack respectively. Default value is 4. If your IP_VERSION is set to 6 or 4+6, then the following variables should be defined in your localrc: - FIXED_RANGE_V6: The IPv6 prefix for your tenant network - IPV6_PRIVATE_NETWORK_GATEWAY: The gateway IP with the same prefix - IPV6_RA_MODE (with default as slaac) - IPV6_ADDRESS_MODE (with default as slaac) If you're going to use IPV6_RA_MODE/IPV6_ADDRESS_MODE settings other than the defaults then you should make sure your VM image has dhcpv6 client enabled at bootup, otherwise you'll need to run it manually after the VM is booted. It's recommended to run the latest version of dnsmasq 2.68. If you intend to enable internet access in your VM, make sure your network node has IPv6 internet access, and the IPv6 prefix for your tenant network is a GUA and routable. Implements: blueprint ipv6-support Change-Id: I848abf18e00e2a869697c5ef6366bc567dde448a Co-Authored-By: John Davidge --- doc/source/configuration.rst | 29 +++++ lib/neutron | 244 ++++++++++++++++++++++++++++++----- 2 files changed, 242 insertions(+), 31 deletions(-) diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst index a4d940d762..ba36ebd1b8 100644 --- a/doc/source/configuration.rst +++ b/doc/source/configuration.rst @@ -321,6 +321,35 @@ API rate limits API_RATE_LIMIT=False +IP Version + | Default: ``IP_VERSION=4`` + | This setting can be used to configure DevStack to create either an IPv4, + IPv6, or dual stack tenant data network by setting ``IP_VERSION`` to + either ``IP_VERSION=4``, ``IP_VERSION=6``, or ``IP_VERSION=4+6`` + respectively. This functionality requires that the Neutron networking + service is enabled by setting the following options: + | + + :: + + disable_service n-net + enable_service q-svc q-agt q-dhcp q-l3 + + | The following optional variables can be used to alter the default IPv6 + behavior: + | + + :: + + IPV6_RA_MODE=slaac + IPV6_ADDRESS_MODE=slaac + FIXED_RANGE_V6=fd$IPV6_GLOBAL_ID::/64 + IPV6_PRIVATE_NETWORK_GATEWAY=fd$IPV6_GLOBAL_ID::1 + + | *Note: ``FIXED_RANGE_V6`` and ``IPV6_PRIVATE_NETWORK_GATEWAY`` + can be configured with any valid IPv6 prefix. The default values make + use of an auto-generated ``IPV6_GLOBAL_ID`` to comply with RFC 4193.* + Examples ~~~~~~~~ diff --git a/lib/neutron b/lib/neutron index 8295a738b7..8bf4310a27 100644 --- a/lib/neutron +++ b/lib/neutron @@ -51,10 +51,22 @@ # # With Neutron networking the NETWORK_MANAGER variable is ignored. +# Settings +# -------- + +# Timeout value in seconds to wait for IPv6 gateway configuration +GATEWAY_TIMEOUT=30 + # Neutron Network Configuration # ----------------------------- +# Subnet IP version +IP_VERSION=${IP_VERSION:-4} +# Validate IP_VERSION +if [[ $IP_VERSION != "4" ]] && [[ $IP_VERSION != "6" ]] && [[ $IP_VERSION != "4+6" ]]; then + die $LINENO "IP_VERSION must be either 4, 6, or 4+6" +fi # Gateway and subnet defaults, in case they are not customized in localrc NETWORK_GATEWAY=${NETWORK_GATEWAY:-10.0.0.1} PUBLIC_NETWORK_GATEWAY=${PUBLIC_NETWORK_GATEWAY:-172.24.4.1} @@ -65,6 +77,22 @@ if is_ssl_enabled_service "neutron" || is_service_enabled tls-proxy; then Q_PROTOCOL="https" fi +# Generate 40-bit IPv6 Global ID to comply with RFC 4193 +IPV6_GLOBAL_ID=`uuidgen | sed s/-//g | cut -c 23- | sed -e "s/\(..\)\(....\)\(....\)/\1:\2:\3/"` + +# IPv6 gateway and subnet defaults, in case they are not customized in localrc +IPV6_RA_MODE=${IPV6_RA_MODE:-slaac} +IPV6_ADDRESS_MODE=${IPV6_ADDRESS_MODE:-slaac} +IPV6_PUBLIC_SUBNET_NAME=${IPV6_PUBLIC_SUBNET_NAME:-ipv6-public-subnet} +IPV6_PRIVATE_SUBNET_NAME=${IPV6_PRIVATE_SUBNET_NAME:-ipv6-private-subnet} +FIXED_RANGE_V6=${FIXED_RANGE_V6:-fd$IPV6_GLOBAL_ID::/64} +IPV6_PRIVATE_NETWORK_GATEWAY=${IPV6_PRIVATE_NETWORK_GATEWAY:-fd$IPV6_GLOBAL_ID::1} +IPV6_PUBLIC_RANGE=${IPV6_PUBLIC_RANGE:-fe80:cafe:cafe::/64} +IPV6_PUBLIC_NETWORK_GATEWAY=${IPV6_PUBLIC_NETWORK_GATEWAY:-fe80:cafe:cafe::2} +# IPV6_ROUTER_GW_IP must be defined when IP_VERSION=4+6 as it cannot be +# obtained conventionally until the l3-agent has support for dual-stack +# TODO (john-davidge) Remove once l3-agent supports dual-stack +IPV6_ROUTER_GW_IP=${IPV6_ROUTER_GW_IP:-fe80:cafe:cafe::1} # Set up default directories GITDIR["python-neutronclient"]=$DEST/python-neutronclient @@ -531,8 +559,16 @@ function create_neutron_initial_network { else NET_ID=$(neutron net-create --tenant-id $TENANT_ID "$PRIVATE_NETWORK_NAME" | grep ' id ' | get_field 2) die_if_not_set $LINENO NET_ID "Failure creating NET_ID for $PHYSICAL_NETWORK $TENANT_ID" - SUBNET_ID=$(neutron subnet-create --tenant-id $TENANT_ID --ip_version 4 --gateway $NETWORK_GATEWAY --name $PRIVATE_SUBNET_NAME $NET_ID $FIXED_RANGE | grep ' id ' | get_field 2) - die_if_not_set $LINENO SUBNET_ID "Failure creating SUBNET_ID for $TENANT_ID" + + if [[ "$IP_VERSION" =~ 4.* ]]; then + # Create IPv4 private subnet + SUBNET_ID=$(_neutron_create_private_subnet_v4) + fi + + if [[ "$IP_VERSION" =~ .*6 ]]; then + # Create IPv6 private subnet + IPV6_SUBNET_ID=$(_neutron_create_private_subnet_v6) + fi fi if [[ "$Q_L3_ENABLED" == "True" ]]; then @@ -546,7 +582,7 @@ function create_neutron_initial_network { ROUTER_ID=$(neutron router-create $Q_ROUTER_NAME | grep ' id ' | get_field 2) die_if_not_set $LINENO ROUTER_ID "Failure creating ROUTER_ID for $Q_ROUTER_NAME" fi - neutron router-interface-add $ROUTER_ID $SUBNET_ID + # Create an external network, and a subnet. Configure the external network as router gw if [ "$Q_USE_PROVIDERNET_FOR_PUBLIC" = "True" ]; then EXT_NET_ID=$(neutron net-create "$PUBLIC_NETWORK_NAME" -- --router:external=True --provider:network_type=flat --provider:physical_network=${PUBLIC_PHYSICAL_NETWORK} | grep ' id ' | get_field 2) @@ -554,35 +590,15 @@ function create_neutron_initial_network { EXT_NET_ID=$(neutron net-create "$PUBLIC_NETWORK_NAME" -- --router:external=True | grep ' id ' | get_field 2) fi die_if_not_set $LINENO EXT_NET_ID "Failure creating EXT_NET_ID for $PUBLIC_NETWORK_NAME" - EXT_GW_IP=$(neutron subnet-create --ip_version 4 ${Q_FLOATING_ALLOCATION_POOL:+--allocation-pool $Q_FLOATING_ALLOCATION_POOL} --gateway $PUBLIC_NETWORK_GATEWAY --name $PUBLIC_SUBNET_NAME $EXT_NET_ID $FLOATING_RANGE -- --enable_dhcp=False | grep 'gateway_ip' | get_field 2) - die_if_not_set $LINENO EXT_GW_IP "Failure creating EXT_GW_IP" - neutron router-gateway-set $ROUTER_ID $EXT_NET_ID - if is_service_enabled q-l3; then - # logic is specific to using the l3-agent for l3 - if is_neutron_ovs_base_plugin && [[ "$Q_USE_NAMESPACE" = "True" ]]; then - local ext_gw_interface - - if [[ "$Q_USE_PUBLIC_VETH" = "True" ]]; then - ext_gw_interface=$Q_PUBLIC_VETH_EX - else - # Disable in-band as we are going to use local port - # to communicate with VMs - sudo ovs-vsctl set Bridge $PUBLIC_BRIDGE \ - other_config:disable-in-band=true - ext_gw_interface=$PUBLIC_BRIDGE - fi - CIDR_LEN=${FLOATING_RANGE#*/} - sudo ip addr add $EXT_GW_IP/$CIDR_LEN dev $ext_gw_interface - sudo ip link set $ext_gw_interface up - ROUTER_GW_IP=`neutron port-list -c fixed_ips -c device_owner | grep router_gateway | awk -F '"' '{ print $8; }'` - die_if_not_set $LINENO ROUTER_GW_IP "Failure retrieving ROUTER_GW_IP" - sudo route add -net $FIXED_RANGE gw $ROUTER_GW_IP - fi - if [[ "$Q_USE_NAMESPACE" == "False" ]]; then - # Explicitly set router id in l3 agent configuration - iniset $Q_L3_CONF_FILE DEFAULT router_id $ROUTER_ID - fi + if [[ "$IP_VERSION" =~ 4.* ]]; then + # Configure router for IPv4 public access + _neutron_configure_router_v4 + fi + + if [[ "$IP_VERSION" =~ .*6 ]]; then + # Configure router for IPv6 public access + _neutron_configure_router_v6 fi fi } @@ -1050,6 +1066,172 @@ function _neutron_setup_interface_driver { neutron_plugin_setup_interface_driver $1 } +# Create private IPv4 subnet +function _neutron_create_private_subnet_v4 { + local subnet_params="--tenant-id $TENANT_ID " + subnet_params+="--ip_version 4 " + subnet_params+="--gateway $NETWORK_GATEWAY " + subnet_params+="--name $PRIVATE_SUBNET_NAME " + subnet_params+="$NET_ID $FIXED_RANGE" + local subnet_id=$(neutron subnet-create $subnet_params | grep ' id ' | get_field 2) + die_if_not_set $LINENO subnet_id "Failure creating private IPv4 subnet for $TENANT_ID" + echo $subnet_id +} + +# Create private IPv6 subnet +function _neutron_create_private_subnet_v6 { + die_if_not_set $LINENO IPV6_RA_MODE "IPV6 RA Mode not set" + die_if_not_set $LINENO IPV6_ADDRESS_MODE "IPV6 Address Mode not set" + local ipv6_modes="--ipv6-ra-mode $IPV6_RA_MODE --ipv6-address-mode $IPV6_ADDRESS_MODE" + local subnet_params="--tenant-id $TENANT_ID " + subnet_params+="--ip_version 6 " + subnet_params+="--gateway $IPV6_PRIVATE_NETWORK_GATEWAY " + subnet_params+="--name $IPV6_PRIVATE_SUBNET_NAME " + subnet_params+="$NET_ID $FIXED_RANGE_V6 $ipv6_modes" + local ipv6_subnet_id=$(neutron subnet-create $subnet_params | grep ' id ' | get_field 2) + die_if_not_set $LINENO ipv6_subnet_id "Failure creating private IPv6 subnet for $TENANT_ID" + echo $ipv6_subnet_id +} + +# Create public IPv4 subnet +function _neutron_create_public_subnet_v4 { + local subnet_params+="--ip_version 4 " + subnet_params+="${Q_FLOATING_ALLOCATION_POOL:+--allocation-pool $Q_FLOATING_ALLOCATION_POOL} " + subnet_params+="--gateway $PUBLIC_NETWORK_GATEWAY " + subnet_params+="--name $PUBLIC_SUBNET_NAME " + subnet_params+="$EXT_NET_ID $FLOATING_RANGE " + subnet_params+="-- --enable_dhcp=False" + local id_and_ext_gw_ip=$(neutron subnet-create $subnet_params | grep -e 'gateway_ip' -e ' id ') + die_if_not_set $LINENO id_and_ext_gw_ip "Failure creating public IPv4 subnet" + echo $id_and_ext_gw_ip +} + +# Create public IPv6 subnet +function _neutron_create_public_subnet_v6 { + local subnet_params="--ip_version 6 " + subnet_params+="--gateway $IPV6_PUBLIC_NETWORK_GATEWAY " + subnet_params+="--name $IPV6_PUBLIC_SUBNET_NAME " + subnet_params+="$EXT_NET_ID $IPV6_PUBLIC_RANGE " + subnet_params+="-- --enable_dhcp=False" + local ipv6_id_and_ext_gw_ip=$(neutron subnet-create $subnet_params | grep -e 'gateway_ip' -e ' id ') + die_if_not_set $LINENO ipv6_id_and_ext_gw_ip "Failure creating an IPv6 public subnet" + echo $ipv6_id_and_ext_gw_ip +} + +# Configure neutron router for IPv4 public access +function _neutron_configure_router_v4 { + neutron router-interface-add $ROUTER_ID $SUBNET_ID + # Create a public subnet on the external network + local id_and_ext_gw_ip=$(_neutron_create_public_subnet_v4 $EXT_NET_ID) + local ext_gw_ip=$(echo $id_and_ext_gw_ip | get_field 2) + PUB_SUBNET_ID=$(echo $id_and_ext_gw_ip | get_field 5) + # Configure the external network as the default router gateway + neutron router-gateway-set $ROUTER_ID $EXT_NET_ID + + # This logic is specific to using the l3-agent for layer 3 + if is_service_enabled q-l3; then + # Configure and enable public bridge + if is_neutron_ovs_base_plugin && [[ "$Q_USE_NAMESPACE" = "True" ]]; then + local ext_gw_interface=$(_neutron_get_ext_gw_interface) + local cidr_len=${FLOATING_RANGE#*/} + sudo ip addr add $ext_gw_ip/$cidr_len dev $ext_gw_interface + sudo ip link set $ext_gw_interface up + ROUTER_GW_IP=`neutron port-list -c fixed_ips -c device_owner | grep router_gateway | awk -F '"' -v subnet_id=$PUB_SUBNET_ID '$4 == subnet_id { print $8; }'` + die_if_not_set $LINENO ROUTER_GW_IP "Failure retrieving ROUTER_GW_IP" + sudo route add -net $FIXED_RANGE gw $ROUTER_GW_IP + fi + _neutron_set_router_id + fi +} + +# Configure neutron router for IPv6 public access +function _neutron_configure_router_v6 { + neutron router-interface-add $ROUTER_ID $IPV6_SUBNET_ID + # Create a public subnet on the external network + local ipv6_id_and_ext_gw_ip=$(_neutron_create_public_subnet_v6 $EXT_NET_ID) + local ipv6_ext_gw_ip=$(echo $ipv6_id_and_ext_gw_ip | get_field 2) + local ipv6_pub_subnet_id=$(echo $ipv6_id_and_ext_gw_ip | get_field 5) + + # If the external network has not already been set as the default router + # gateway when configuring an IPv4 public subnet, do so now + if [[ "$IP_VERSION" == "6" ]]; then + neutron router-gateway-set $ROUTER_ID $EXT_NET_ID + fi + + # This logic is specific to using the l3-agent for layer 3 + if is_service_enabled q-l3; then + local ipv6_router_gw_port + # Ensure IPv6 forwarding is enabled on the host + sudo sysctl -w net.ipv6.conf.all.forwarding=1 + # Configure and enable public bridge + if [[ "$IP_VERSION" = "6" ]]; then + # Override global IPV6_ROUTER_GW_IP with the true value from neutron + IPV6_ROUTER_GW_IP=`neutron port-list -c fixed_ips -c device_owner | grep router_gateway | awk -F '"' -v subnet_id=$ipv6_pub_subnet_id '$4 == subnet_id { print $8; }'` + die_if_not_set $LINENO IPV6_ROUTER_GW_IP "Failure retrieving IPV6_ROUTER_GW_IP" + ipv6_router_gw_port=`neutron port-list -c id -c fixed_ips -c device_owner | grep router_gateway | awk -F '"' -v subnet_id=$ipv6_pub_subnet_id '$4 == subnet_id { print $1; }' | awk -F ' | ' '{ print $2; }'` + die_if_not_set $LINENO ipv6_router_gw_port "Failure retrieving ipv6_router_gw_port" + else + ipv6_router_gw_port=`neutron port-list -c id -c fixed_ips -c device_owner | grep router_gateway | awk -F '"' -v subnet_id=$PUB_SUBNET_ID '$4 == subnet_id { print $1; }' | awk -F ' | ' '{ print $2; }'` + die_if_not_set $LINENO ipv6_router_gw_port "Failure retrieving ipv6_router_gw_port" + fi + + # The ovs_base_configure_l3_agent function flushes the public + # bridge's ip addresses, so turn IPv6 support in the host off + # and then on to recover the public bridge's link local address + sudo sysctl -w net.ipv6.conf.${PUBLIC_BRIDGE}.disable_ipv6=1 + sudo sysctl -w net.ipv6.conf.${PUBLIC_BRIDGE}.disable_ipv6=0 + if is_neutron_ovs_base_plugin && [[ "$Q_USE_NAMESPACE" = "True" ]]; then + local ext_gw_interface=$(_neutron_get_ext_gw_interface) + local ipv6_cidr_len=${IPV6_PUBLIC_RANGE#*/} + + # Define router_ns based on whether DVR is enabled + local router_ns=qrouter + if [[ "$Q_DVR_MODE" == "dvr_snat" ]]; then + router_ns=snat + fi + + # Configure interface for public bridge + sudo ip -6 addr add $ipv6_ext_gw_ip/$ipv6_cidr_len dev $ext_gw_interface + + # Wait until layer 3 agent has configured the gateway port on + # the public bridge, then add gateway address to the interface + # TODO (john-davidge) Remove once l3-agent supports dual-stack + if [[ "$IP_VERSION" == "4+6" ]]; then + if ! timeout $GATEWAY_TIMEOUT sh -c "until sudo ip netns exec $router_ns-$ROUTER_ID ip addr show qg-${ipv6_router_gw_port:0:11} | grep $ROUTER_GW_IP; do sleep 1; done"; then + die $LINENO "Timeout retrieving ROUTER_GW_IP" + fi + # Configure the gateway port with the public IPv6 adress + sudo ip netns exec $router_ns-$ROUTER_ID ip -6 addr add $IPV6_ROUTER_GW_IP/$ipv6_cidr_len dev qg-${ipv6_router_gw_port:0:11} + # Add a default IPv6 route to the neutron router as the + # l3-agent does not add one in the dual-stack case + sudo ip netns exec $router_ns-$ROUTER_ID ip -6 route replace default via $ipv6_ext_gw_ip dev qg-${ipv6_router_gw_port:0:11} + fi + sudo ip -6 route add $FIXED_RANGE_V6 via $IPV6_ROUTER_GW_IP dev $ext_gw_interface + fi + _neutron_set_router_id + fi +} + +# Explicitly set router id in l3 agent configuration +function _neutron_set_router_id { + if [[ "$Q_USE_NAMESPACE" == "False" ]]; then + iniset $Q_L3_CONF_FILE DEFAULT router_id $ROUTER_ID + fi +} + +# Get ext_gw_interface depending on value of Q_USE_PUBLIC_VETH +function _neutron_get_ext_gw_interface { + if [[ "$Q_USE_PUBLIC_VETH" == "True" ]]; then + echo $Q_PUBLIC_VETH_EX + else + # Disable in-band as we are going to use local port + # to communicate with VMs + sudo ovs-vsctl set Bridge $PUBLIC_BRIDGE \ + other_config:disable-in-band=true + echo $PUBLIC_BRIDGE + fi +} + # Functions for Neutron Exercises #-------------------------------- From b3fdb1c93593faa6fb674937155f911beb2f0200 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Mon, 17 Nov 2014 12:45:09 -0600 Subject: [PATCH 0092/3333] Simplify docs build Remove unnecessary old code from tools/build_docs.sh; it now only builds docs for the current branch in the current working directory. Fix the merging if the git log changes into changes.html. Change-Id: I965dc3383b6317807ca0d47fe42648a19e96b57b --- doc/source/changes.rst | 2 + tools/build_docs.sh | 87 ++++-------------------------------------- tox.ini | 2 +- 3 files changed, 11 insertions(+), 80 deletions(-) diff --git a/doc/source/changes.rst b/doc/source/changes.rst index f4a326d60e..abe132c31c 100644 --- a/doc/source/changes.rst +++ b/doc/source/changes.rst @@ -8,3 +8,5 @@ Recent Changes What's been happening? These are the commits to DevStack for the last six months. For the complete list see `the DevStack project in Gerrit `__. + +%GIT_LOG% diff --git a/tools/build_docs.sh b/tools/build_docs.sh index f52b179b7e..929d1e0e6c 100755 --- a/tools/build_docs.sh +++ b/tools/build_docs.sh @@ -1,35 +1,19 @@ #!/usr/bin/env bash -# **build_docs.sh** - Build the gh-pages docs for DevStack +# **build_docs.sh** - Build the docs for DevStack # # - Install shocco if not found on PATH and INSTALL_SHOCCO is set # - Clone MASTER_REPO branch MASTER_BRANCH # - Re-creates ``doc/build/html`` directory from existing repo + new generated script docs # Usage: -## build_docs.sh [-o ] [-g] [master| []] -## The DevStack repository to clone (default is DevStack github repo) -## If a repo is not supplied use the current directory -## (assumed to be a DevStack checkout) as the source. -## The DevStack branch to check out (default is master; ignored if -## repo is not specified) -## . Use the current repo and branch (do not use with -p to -## prevent stray files in the workspace being added tot he docs) +## build_docs.sh [-o ] ## -o Write the static HTML output to ## (Note that will be deleted and re-created to ensure it is clean) -## -g Update the old gh-pages repo (set PUSH=1 to actually push up to RCB) # Defaults # -------- -# Source repo/branch for DevStack -MASTER_REPO=${MASTER_REPO:-git://git.openstack.org/openstack-dev/devstack} -MASTER_BRANCH=${MASTER_BRANCH:-master} - -# http://devstack.org is a GitHub gh-pages site in the https://github.com/cloudbuilders/devtack.git repo -GH_PAGES_REPO=git@github.com:cloudbuilders/devstack.git - -DOCS_SOURCE=doc/source HTML_BUILD=doc/build/html # Keep track of the devstack directory @@ -60,10 +44,8 @@ if ! which shocco; then fi # Process command-line args -while getopts go: c; do +while getopts o: c; do case $c in - g) GH_UPDATE=1 - ;; o) HTML_BUILD=$OPTARG ;; esac @@ -71,55 +53,24 @@ done shift `expr $OPTIND - 1` -if [[ -n "$1" ]]; then - master="master" - if [[ "${master/#$1}" != "master" ]]; then - # Partial match on "master" - REPO=$MASTER_REPO - else - REPO=$1 - fi - REPO_BRANCH=${2:-$MASTER_BRANCH} -fi - -# Check out a specific DevStack branch -if [[ -n $REPO ]]; then - # Make a workspace - TMP_ROOT=$(mktemp -d work-docs-XXXX) - echo "Building docs in $TMP_ROOT" - cd $TMP_ROOT - - # Get the master branch - git clone $REPO devstack - cd devstack - if [[ -n "$REPO_BRANCH" ]]; then - git checkout $REPO_BRANCH - fi -fi - -# Assumption is we are now in the DevStack workspace to be processed - # Processing # ---------- -# Clean up build dir -rm -rf $HTML_BUILD +# Ensure build dir exists mkdir -p $HTML_BUILD # Get fully qualified dirs -FQ_DOCS_SOURCE=$(cd $DOCS_SOURCE && pwd) FQ_HTML_BUILD=$(cd $HTML_BUILD && pwd) -# Get repo static -cp -pr $FQ_DOCS_SOURCE/* $FQ_HTML_BUILD - # Insert automated bits GLOG=$(mktemp gitlogXXXX) +echo "
      " >$GLOG git log \ --pretty=format:'
    • %s - Commit %h %cd
    • ' \ --date=short \ - --since '6 months ago' | grep -v Merge >$GLOG -sed -e $"/%GIT_LOG%/r $GLOG" $FQ_DOCS_SOURCE/changes.html >$FQ_HTML_BUILD/changes.html + --since '6 months ago' | grep -v Merge >>$GLOG +echo "
    " >>$GLOG +sed -i~ -e $"/^.*%GIT_LOG%.*$/r $GLOG" -e $"/^.*%GIT_LOG%.*$/s/^.*%GIT_LOG%.*$//" $FQ_HTML_BUILD/changes.html rm -f $GLOG # Build list of scripts to process @@ -138,28 +89,6 @@ for f in $(find functions functions-common lib samples -type f -name \*); do done echo "$FILES" >doc/files -if [[ -n $GH_UPDATE ]]; then - GH_ROOT=$(mktemp -d work-gh-XXXX) - cd $GH_ROOT - - # Pull the latest docs branch from devstack.org repo - git clone -b gh-pages $GH_PAGES_REPO gh-docs - - # Get the generated files - cp -pr $FQ_HTML_BUILD/* gh-docs - - # Collect the new generated pages - (cd gh-docs; find . -name \*.html -print0 | xargs -0 git add) - - # Push our changes back up to the docs branch - if ! git diff-index HEAD --quiet; then - git commit -a -m "Update script docs" - if [[ -n $PUSH ]]; then - git push - fi - fi -fi - # Clean up or report the temp workspace if [[ -n REPO && -n $PUSH_REPO ]]; then echo rm -rf $TMP_ROOT diff --git a/tox.ini b/tox.ini index c8d3909805..a958ae7ba4 100644 --- a/tox.ini +++ b/tox.ini @@ -36,5 +36,5 @@ setenv = TOP_DIR={toxinidir} INSTALL_SHOCCO=true commands = - bash tools/build_docs.sh python setup.py build_sphinx + bash tools/build_docs.sh From ffd66ad77ff07fff9812836b832bbcd952a61fff Mon Sep 17 00:00:00 2001 From: Adam Gandelman Date: Mon, 17 Nov 2014 12:26:08 -0800 Subject: [PATCH 0093/3333] Log early boot of Ironic VMs to serial with sgabios This adds sgabios to the list of packages for Ironic and configures the libvirt domain to redirect BIOS messages to serial via sgabios, when console logging is enabled. The sgabios package in Ubuntu currently has an apparmor bug, so that is worked around here. This allows visibility into early boot of Ironic nodes and should help get to the bottom of a frequent failure we're seeing in the gate. Change-Id: Ifd18851e2d23d198d36e67883a81afc6a92d2a58 Related-Bug: #1393099 --- files/apts/ironic | 1 + files/rpms/ironic | 1 + lib/ironic | 8 ++++++++ tools/ironic/scripts/configure-vm | 2 ++ tools/ironic/templates/vm.xml | 1 + 5 files changed, 13 insertions(+) diff --git a/files/apts/ironic b/files/apts/ironic index 45fdeccbb4..f6c7b74494 100644 --- a/files/apts/ironic +++ b/files/apts/ironic @@ -12,6 +12,7 @@ python-libvirt qemu qemu-kvm qemu-utils +sgabios syslinux tftpd-hpa xinetd diff --git a/files/rpms/ironic b/files/rpms/ironic index e646f3a8aa..0a46314964 100644 --- a/files/rpms/ironic +++ b/files/rpms/ironic @@ -9,6 +9,7 @@ net-tools openssh-clients openvswitch python-libguestfs +sgabios syslinux tftp-server xinetd diff --git a/lib/ironic b/lib/ironic index afe69f2df8..a8a78d42b2 100644 --- a/lib/ironic +++ b/lib/ironic @@ -147,6 +147,14 @@ function install_ironic { if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then install_apache_wsgi fi + + if [[ "$IRONIC_VM_LOG_CONSOLE" == "True" ]] && is_ubuntu; then + # Ubuntu packaging+apparmor issue prevents libvirt from loading + # the ROM from /usr/share/misc. Workaround by installing it directly + # to a directory that it can read from. (LP: #1393548) + sudo rm -rf /usr/share/qemu/sgabios.bin + sudo cp /usr/share/misc/sgabios.bin /usr/share/qemu/sgabios.bin + fi } # install_ironicclient() - Collect sources and prepare diff --git a/tools/ironic/scripts/configure-vm b/tools/ironic/scripts/configure-vm index 4c42c491c5..378fcb85ad 100755 --- a/tools/ironic/scripts/configure-vm +++ b/tools/ironic/scripts/configure-vm @@ -78,8 +78,10 @@ def main(): params['emulator'] = "/usr/bin/qemu-kvm" if args.console_log: + params['bios_serial'] = "" params['console_log'] = CONSOLE_LOG % {'console_log': args.console_log} else: + params['bios_serial'] = '' params['console_log'] = '' libvirt_template = source_template % params conn = libvirt.open("qemu:///system") diff --git a/tools/ironic/templates/vm.xml b/tools/ironic/templates/vm.xml index 4f40334b7d..ae7d685256 100644 --- a/tools/ironic/templates/vm.xml +++ b/tools/ironic/templates/vm.xml @@ -6,6 +6,7 @@ hvm + %(bios_serial)s From 958111e188eab1023cea8a499eeb90bfe7164b23 Mon Sep 17 00:00:00 2001 From: Davanum Srinivas Date: Mon, 17 Nov 2014 17:35:40 -0500 Subject: [PATCH 0094/3333] Add oslo.context Treat the new oslo.context library just like the other Oslo libraries. i.e. make it possible to either test with upstream released library, or with git versions of oslo.context. Change-Id: I2dc498324d6c405655a8e2e249465c5b351ca960 --- lib/oslo | 1 + stackrc | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib/oslo b/lib/oslo index a20aa1450f..d00580b14a 100644 --- a/lib/oslo +++ b/lib/oslo @@ -23,6 +23,7 @@ set +o xtrace GITDIR["cliff"]=$DEST/cliff GITDIR["oslo.config"]=$DEST/oslo.config GITDIR["oslo.concurrency"]=$DEST/oslo.concurrency +GITDIR["oslo.context"]=$DEST/oslo.context GITDIR["oslo.db"]=$DEST/oslo.db GITDIR["oslo.i18n"]=$DEST/oslo.i18n GITDIR["oslo.log"]=$DEST/oslo.log diff --git a/stackrc b/stackrc index 18e1de3b19..bd9548f730 100644 --- a/stackrc +++ b/stackrc @@ -279,6 +279,10 @@ GITBRANCH["oslo.concurrency"]=${OSLOCON_BRANCH:-master} GITREPO["oslo.config"]=${OSLOCFG_REPO:-${GIT_BASE}/openstack/oslo.config.git} GITBRANCH["oslo.config"]=${OSLOCFG_BRANCH:-master} +# oslo.context +GITREPO["oslo.context"]=${OSLOCTX_REPO:-${GIT_BASE}/openstack/oslo.context.git} +GITBRANCH["oslo.context"]=${OSLOCTX_BRANCH:-master} + # oslo.db GITREPO["oslo.db"]=${OSLODB_REPO:-${GIT_BASE}/openstack/oslo.db.git} GITBRANCH["oslo.db"]=${OSLODB_BRANCH:-master} From 42373c7bfe68302922feb76015534a16d8c00bf5 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Tue, 18 Nov 2014 12:30:16 +0900 Subject: [PATCH 0095/3333] lib/dstat: Fix a comment Apparently this file was copied from lib/apache. Change-Id: Ie89d423ca225c697122820a1d9e859769aea9f86 --- lib/dstat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dstat b/lib/dstat index a2c522c02a..a6990bbca9 100644 --- a/lib/dstat +++ b/lib/dstat @@ -1,4 +1,4 @@ -# lib/apache +# lib/dstat # Functions to start and stop dstat # Dependencies: From 44f4e205aa81f8fdb0b47b354192b4bb44efad56 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Tue, 18 Nov 2014 13:03:08 +0900 Subject: [PATCH 0096/3333] lib/dstat: Include page stats Add -g option for dstat. From the man page: -g, --page enable page stats (page in, page out) Change-Id: I865304483af0a529ea8722ed0a9f35ab350670d2 --- lib/dstat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dstat b/lib/dstat index a2c522c02a..3852652c8f 100644 --- a/lib/dstat +++ b/lib/dstat @@ -24,7 +24,7 @@ DSTAT_FILE=${DSTAT_FILE:-"dstat.txt"} # start_dstat() - Start running processes, including screen function start_dstat { # A better kind of sysstat, with the top process per time slice - DSTAT_OPTS="-tcmndrylp --top-cpu-adv" + DSTAT_OPTS="-tcmndrylpg --top-cpu-adv" if [[ -n ${SCREEN_LOGDIR} ]]; then screen_it dstat "cd $TOP_DIR; dstat $DSTAT_OPTS | tee $SCREEN_LOGDIR/$DSTAT_FILE" else From 45ce98275c15472f0b6c92b75088064cd3763ff1 Mon Sep 17 00:00:00 2001 From: David Lyle Date: Thu, 11 Sep 2014 17:50:08 -0600 Subject: [PATCH 0097/3333] Moving horizon compression offline Making the horizon scss compilation and compression happen offline. Potentially fixing an issue with parallel compression in devstack. Related-Bug: #1345955 Change-Id: I066c80e06a92302a3f8dc5fd45d127fbde6cf99c --- lib/horizon | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/horizon b/lib/horizon index 1b53831135..872e77a040 100644 --- a/lib/horizon +++ b/lib/horizon @@ -99,6 +99,8 @@ function init_horizon { local local_settings=$HORIZON_DIR/openstack_dashboard/local/local_settings.py cp $HORIZON_SETTINGS $local_settings + _horizon_config_set $local_settings "" COMPRESS_OFFLINE True + _horizon_config_set $local_settings "" OPENSTACK_HOST \"${KEYSTONE_SERVICE_HOST}\" _horizon_config_set $local_settings "" OPENSTACK_KEYSTONE_URL "\"${KEYSTONE_SERVICE_PROTOCOL}://${KEYSTONE_SERVICE_HOST}:${KEYSTONE_SERVICE_PORT}/v2.0\"" if [[ -n "$KEYSTONE_TOKEN_HASH_ALGORITHM" ]]; then @@ -140,6 +142,9 @@ function init_horizon { # and run_process sudo rm -f /var/log/$APACHE_NAME/horizon_* + DJANGO_SETTINGS_MODULE=openstack_dashboard.settings django-admin.py collectstatic --noinput + DJANGO_SETTINGS_MODULE=openstack_dashboard.settings django-admin.py compress --force + } # install_django_openstack_auth() - Collect source and prepare From 8f003ef9bf466f931cecfc5a34b51a40b2203f43 Mon Sep 17 00:00:00 2001 From: Akihiro Motoki Date: Tue, 18 Nov 2014 13:41:58 +0900 Subject: [PATCH 0098/3333] Use mysql in Ubuntu 12.04 (precise) After commit 6d20f090, devstack does not work on Ubuntu 12.04 because Ubuntu 12.04 does not provide mariadb but devstack expects it. Change-Id: Iae9a7a1c09f1fc83573c3926b3470955c244c401 --- lib/databases/mysql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/databases/mysql b/lib/databases/mysql index 7a444a3140..bbf2fd0861 100644 --- a/lib/databases/mysql +++ b/lib/databases/mysql @@ -142,7 +142,7 @@ EOF fi # Install mysql-server if is_ubuntu || is_fedora; then - if [[ $DISTRO =~ (rhel6) ]]; then + if [[ $DISTRO =~ (rhel6|precise) ]]; then install_package mysql-server else install_package mariadb-server From 683ed9eeb2dedddb5053b09ded060a276bed928c Mon Sep 17 00:00:00 2001 From: lokesh Date: Mon, 10 Nov 2014 15:07:59 +0530 Subject: [PATCH 0099/3333] fixes cleaning up of ironic directory from /etc Closes-Bug: 1391083 Change-Id: Ic47161ab375716cc39ee1a7dd57034782717e323 --- lib/ironic | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ironic b/lib/ironic index cf005a74d6..ffbfc727be 100644 --- a/lib/ironic +++ b/lib/ironic @@ -177,7 +177,7 @@ function _config_ironic_apache_wsgi { # cleanup_ironic() - Remove residual data files, anything left over from previous # runs that would need to clean up. function cleanup_ironic { - sudo rm -rf $IRONIC_AUTH_CACHE_DIR + sudo rm -rf $IRONIC_AUTH_CACHE_DIR $IRONIC_CONF_DIR } # configure_ironic_dirs() - Create all directories required by Ironic and From 1f26c0ef61e4e37bacac68014d993df108f70296 Mon Sep 17 00:00:00 2001 From: Oleg Gashev Date: Tue, 18 Nov 2014 02:16:01 -0500 Subject: [PATCH 0100/3333] Fixed conditions to determine if current distribution is a Fedora based distribution stack.sh line 223: if [[ is_fedora && $DISTRO == "rhel6" ]]; then stack.sh line 234: if [[ is_fedora && ( $DISTRO == "rhel6" || $DISTRO == "rhel7" ) ]]; then stack.sh line 358: if [[ is_fedora && $DISTRO == "rhel6" ]]; then Condition [[ is_fedora && $DISTRO == "rhel6" ]] return wrong result. This condition is equivalent to the [[ -n is_fedora && $DISTRO == "rhel6" ]]. First expression -n is_fedora always not null, therefore this condition the same is [[ $DISTRO = "rhel6" ]]. Change-Id: Ida9eaa7950554bcd2f183dede7ad19522f9ca558 Closes-Bug: #1393684 --- stack.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stack.sh b/stack.sh index 7635f32298..940c4e50e9 100755 --- a/stack.sh +++ b/stack.sh @@ -220,7 +220,7 @@ fi # Some distros need to add repos beyond the defaults provided by the vendor # to pick up required packages. -if [[ is_fedora && $DISTRO == "rhel6" ]]; then +if is_fedora && [ $DISTRO == "rhel6" ]; then # Installing Open vSwitch on RHEL requires enabling the RDO repo. RHEL6_RDO_REPO_RPM=${RHEL6_RDO_REPO_RPM:-"http://rdo.fedorapeople.org/openstack-icehouse/rdo-release-icehouse.rpm"} RHEL6_RDO_REPO_ID=${RHEL6_RDO_REPO_ID:-"openstack-icehouse"} @@ -231,7 +231,7 @@ if [[ is_fedora && $DISTRO == "rhel6" ]]; then fi fi -if [[ is_fedora && ( $DISTRO == "rhel6" || $DISTRO == "rhel7" ) ]]; then +if is_fedora && [[ $DISTRO == "rhel6" || $DISTRO == "rhel7" ]]; then # RHEL requires EPEL for many Open Stack dependencies # note we always remove and install latest -- some environments @@ -355,7 +355,7 @@ function echo_nolog { echo $@ >&3 } -if [[ is_fedora && $DISTRO == "rhel6" ]]; then +if is_fedora && [ $DISTRO == "rhel6" ]; then # poor old python2.6 doesn't have argparse by default, which # outfilter.py uses is_package_installed python-argparse || install_package python-argparse From 9f20ea13826234ac2c508ea1d50a0822b68d42dc Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Mon, 17 Nov 2014 15:14:49 -0500 Subject: [PATCH 0101/3333] make run_tests.sh run devstack unit tests run_tests.sh was created as an entry point for bashate. We stopped using it now that we know how to run bashate directly in the gate. We lost running an unrelated bashate test when that happened. Devstack does have unit tests. We don't run them. We should. Especially when working on things like the LIBS_FROM_GIT which is sufficiently tricky that we really need to add unit tests to ensure that we don't break it. Change-Id: Ife067855569e2eae4c085471d326e8086de37332 --- run_tests.sh | 45 ++++++++------------------------------------- tests/test_refs.sh | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 37 deletions(-) create mode 100755 tests/test_refs.sh diff --git a/run_tests.sh b/run_tests.sh index bf90332698..3ba7e1023d 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -18,47 +18,18 @@ PASSES="" FAILURES="" -# Check the return code and add the test to PASSES or FAILURES as appropriate -# pass_fail -function pass_fail { - local result=$1 - local expected=$2 - local test_name=$3 +# Test that no one is trying to land crazy refs as branches - if [[ $result -ne $expected ]]; then - FAILURES="$FAILURES $test_name" +for testfile in tests/test_*.sh; do + $testfile + if [[ $? -eq 0 ]]; then + PASSES="$PASSES $testfile" else - PASSES="$PASSES $test_name" + FAILURES="$FAILURES $testfile" fi -} - -if [[ -n $@ ]]; then - FILES=$@ -else - LIBS=`find lib -type f | grep -v \.md` - SCRIPTS=`find . -type f -name \*\.sh` - EXTRA="functions functions-common stackrc openrc exerciserc eucarc" - FILES="$SCRIPTS $LIBS $EXTRA" -fi - -echo "Running bash8..." - -tox -ebashate -pass_fail $? 0 bash8 - - -# Test that no one is trying to land crazy refs as branches - -echo "Ensuring we don't have crazy refs" - -REFS=`grep BRANCH stackrc | grep -v -- '-master'` -rc=$? -pass_fail $rc 1 crazy-refs -if [[ $rc -eq 0 ]]; then - echo "Branch defaults must be master. Found:" - echo $REFS -fi +done +# Summary display now that all is said and done echo "=====================================================================" for script in $PASSES; do echo PASS $script diff --git a/tests/test_refs.sh b/tests/test_refs.sh new file mode 100755 index 0000000000..bccca5dff7 --- /dev/null +++ b/tests/test_refs.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# +# 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. + + +echo "Ensuring we don't have crazy refs" + +REFS=`grep BRANCH stackrc | grep -v -- '-master'` +rc=$? +if [[ $rc -eq 0 ]]; then + echo "Branch defaults must be master. Found:" + echo $REFS + exit 1 +fi From 07d7e5b1f9b2201da006201f99a9b357a45b9b37 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Mon, 17 Nov 2014 07:10:14 -0500 Subject: [PATCH 0102/3333] add LIBS_FROM_GIT to docs Also reformat common configuration variables to have an additional header level which makes it easy to direct link to specific configuration vars when directing someone. Reformat header markup to us a more standard == = - for h1, h2, h3 Change-Id: I10bac5a93529cdfbcde0a05f9ebdbc1799d403cd --- doc/source/configuration.rst | 68 +++++++++++++++++++++++++++++------- stackrc | 13 +++++++ 2 files changed, 69 insertions(+), 12 deletions(-) diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst index a4d940d762..869908fa81 100644 --- a/doc/source/configuration.rst +++ b/doc/source/configuration.rst @@ -22,7 +22,7 @@ simplify this process and meet the following goals: - allow settings in arbitrary configuration files to be changed local.conf -~~~~~~~~~~ +========== The new configuration file is ``local.conf`` and resides in the root DevStack directory like the old ``localrc`` file. It is a modified INI @@ -96,7 +96,7 @@ fragment amd MUST conform to the shell requirements, specifically no whitespace around ``=`` (equals). Minimal Configuration -~~~~~~~~~~~~~~~~~~~~~ +===================== While ``stack.sh`` is happy to run without a ``localrc`` section in ``local.conf``, devlife is better when there are a few minimal variables @@ -136,9 +136,11 @@ available for ``openrc`` to set ``OS_AUTH_URL``. ``HOST_IP`` is not set by default. Common Configuration Variables -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +============================== + +Installation Directory +---------------------- -Set DevStack install directory | *Default: ``DEST=/opt/stack``* | The DevStack install directory is set by the ``DEST`` variable. | By setting it early in the ``localrc`` section you can reference it @@ -150,7 +152,27 @@ Set DevStack install directory DEST=/opt/stack -stack.sh logging +Libraries from Git +------------------ + + | *Default: ``LIBS_FROM_GIT=""``* + + | By default devstack installs OpenStack server components from + git, however it installs client libraries from released versions + on pypi. This is appropriate if you are working on server + development, but if you want to see how an unreleased version of + the client affects the system you can have devstack install it + from upstream, or from local git trees. + | Multiple libraries can be specified as a comma separated list. + | + + :: + + LIBS_FROM_GIT=python-keystoneclient,oslo.config + +Enable Logging +-------------- + | *Defaults: ``LOGFILE="" LOGDAYS=7 LOG_COLOR=True``* | By default ``stack.sh`` output is only written to the console where is runs. It can be sent to a file in addition to the console @@ -178,7 +200,9 @@ stack.sh logging LOG_COLOR=False -Screen logging +Logging the Screen Output +------------------------- + | *Default: ``SCREEN_LOGDIR=""``* | By default DevStack runs the OpenStack services using ``screen`` which is useful for watching log and debug output. However, in @@ -196,7 +220,9 @@ Screen logging *Note the use of ``DEST`` to locate the main install directory; this is why we suggest setting it in ``local.conf``.* -One syslog to bind them all +Enabling Syslog +--------------- + | *Default: ``SYSLOG=False SYSLOG_HOST=$HOST_IP SYSLOG_PORT=516``* | Logging all services to a single syslog can be convenient. Enable syslogging by setting ``SYSLOG`` to ``True``. If the destination log @@ -211,6 +237,8 @@ One syslog to bind them all SYSLOG_PORT=516 A clean install every time +-------------------------- + | *Default: ``RECLONE=""``* | By default ``stack.sh`` only clones the project repos if they do not exist in ``$DEST``. ``stack.sh`` will freshen each repo on each @@ -222,10 +250,18 @@ A clean install every time RECLONE=yes - Swift - Default: SWIFT_HASH="" SWIFT_REPLICAS=1 SWIFT_DATA_DIR=$DEST/data/swift - Swift is now used as the back-end for the S3-like object store. When enabled Nova's objectstore (n-obj in ENABLED_SERVICES) is automatically disabled. Enable Swift by adding it services to ENABLED_SERVICES: - enable_service s-proxy s-object s-container s-account +Swift +----- + + | Default: SWIFT_HASH="" + | SWIFT_REPLICAS=1 + | SWIFT_DATA_DIR=$DEST/data/swift + + | Swift is now used as the back-end for the S3-like object store. + When enabled Nova's objectstore (n-obj in ENABLED_SERVICES) is + automatically disabled. Enable Swift by adding it services to + ENABLED_SERVICES: enable_service s-proxy s-object s-container + s-account Setting Swift's hash value is required and you will be prompted for it if Swift is enabled so just set it to something already: @@ -259,6 +295,8 @@ A clean install every time work correctly.* Service Catalog Backend +----------------------- + | *Default: ``KEYSTONE_CATALOG_BACKEND=sql``* | DevStack uses Keystone's ``sql`` service catalog backend. An alternate ``template`` backend is also available. However, it does @@ -274,6 +312,8 @@ Service Catalog Backend ``files/keystone_data.sh`` Cinder +------ + | Default: | VOLUME_GROUP="stack-volumes" VOLUME_NAME_PREFIX="volume-" VOLUME_BACKING_FILE_SIZE=10250M | The logical volume group used to hold the Cinder-managed volumes @@ -289,6 +329,8 @@ Cinder VOLUME_BACKING_FILE_SIZE=10250M Multi-host DevStack +------------------- + | *Default: ``MULTI_HOST=False``* | Running DevStack with multiple hosts requires a custom ``local.conf`` section for each host. The master is the same as a @@ -311,6 +353,8 @@ Multi-host DevStack ENABLED_SERVICES=n-vol,n-cpu,n-net,n-api API rate limits +--------------- + | Default: ``API_RATE_LIMIT=True`` | Integration tests such as Tempest will likely run afoul of the default rate limits configured for Nova. Turn off rate limiting @@ -322,7 +366,7 @@ API rate limits API_RATE_LIMIT=False Examples -~~~~~~~~ +======== - Eliminate a Cinder pass-through (``CINDER_PERIODIC_INTERVAL``): diff --git a/stackrc b/stackrc index 18e1de3b19..b1a9e20a97 100644 --- a/stackrc +++ b/stackrc @@ -134,6 +134,19 @@ REQUIREMENTS_MODE=${REQUIREMENTS_MODE:-strict} # Another option is https://git.openstack.org GIT_BASE=${GIT_BASE:-git://git.openstack.org} +# Which libraries should we install from git instead of using released +# versions on pypi? +# +# By default devstack is now installing libraries from pypi instead of +# from git repositories by default. This works great if you are +# developing server components, but if you want to develop libraries +# and see them live in devstack you need to tell devstack it should +# install them from git. +# +# ex: LIBS_FROM_GIT=python-keystoneclient,oslo.config +# +# Will install those 2 libraries from git, the rest from pypi. + ############## # # OpenStack Server Components From 3293046d3091e7017beafe92bfe361e6d204bfb1 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Tue, 18 Nov 2014 06:51:16 -0500 Subject: [PATCH 0103/3333] use a more common rst header hiearchy While rst doesn't actually care about the order of headers, reviewers sometimes do. And the build in emacs mode has a certain order specified that it can easily rotate between. Standardize on == h1, = h2, - h3, ~ h4 in the code. Change-Id: I80ff6df6ef0703a3c3005809069428018bb355d4 --- doc/source/changes.rst | 2 +- doc/source/contributing.rst | 12 ++++----- doc/source/faq.rst | 6 ++--- doc/source/guides/multinode-lab.rst | 40 ++++++++++++++-------------- doc/source/guides/single-machine.rst | 16 +++++------ doc/source/guides/single-vm.rst | 14 +++++----- doc/source/overview.rst | 18 ++++++------- doc/source/plugins.rst | 4 +-- 8 files changed, 56 insertions(+), 56 deletions(-) diff --git a/doc/source/changes.rst b/doc/source/changes.rst index f4a326d60e..7b753753e5 100644 --- a/doc/source/changes.rst +++ b/doc/source/changes.rst @@ -3,7 +3,7 @@ Changes ======= Recent Changes What's been happening? -------------------------------------- +===================================== These are the commits to DevStack for the last six months. For the complete list see `the DevStack project in diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst index 7ca3d64afd..8c9e6584ec 100644 --- a/doc/source/contributing.rst +++ b/doc/source/contributing.rst @@ -10,9 +10,9 @@ License Agreement (CLA). If you have already done that for another OpenStack project you are good to go. Things To Know -~~~~~~~~~~~~~~ +============== -| +| | **Where Things Are** The official DevStack repository is located at @@ -30,7 +30,7 @@ queue `__ is, however, used for all commits except for the text of this website. That should also change in the near future. -| +| | **HACKING.rst** Like most OpenStack projects, DevStack includes a ``HACKING.rst`` file @@ -38,7 +38,7 @@ that describes the layout, style and conventions of the project. Because ``HACKING.rst`` is in the main DevStack repo it is considered authoritative. Much of the content on this page is taken from there. -| +| | **bashate Formatting** Around the time of the OpenStack Havana release we added a tool to do @@ -51,9 +51,9 @@ the script pages for devstack.org and possibly even simple code formatting. Run it on the entire project with ``./run_tests.sh``. Code -~~~~ +==== -| +| | **Repo Layout** The DevStack repo generally keeps all of the primary scripts at the root diff --git a/doc/source/faq.rst b/doc/source/faq.rst index b7943ba130..f39471cb4e 100644 --- a/doc/source/faq.rst +++ b/doc/source/faq.rst @@ -7,7 +7,7 @@ FAQ - `Miscellaneous <#misc>`__ General Questions -~~~~~~~~~~~~~~~~~ +================= Q: Can I use DevStack for production? A: No. We mean it. Really. DevStack makes some implementation @@ -77,7 +77,7 @@ Q: How about RHEL 6? is valuable so we do it... Operation and Configuration -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +=========================== Q: Can DevStack handle a multi-node installation? A: Indirectly, yes. You run DevStack on each node with the @@ -157,7 +157,7 @@ Q: Why are my configuration changes ignored? ``FORCE_PREREQ=1`` and the package checks will never be skipped. Miscellaneous -~~~~~~~~~~~~~ +============= Q: ``tools/fixup_stuff.sh`` is broken and shouldn't 'fix' just one version of packages. A: [Another not-a-question] No it isn't. Stuff in there is to diff --git a/doc/source/guides/multinode-lab.rst b/doc/source/guides/multinode-lab.rst index 4c60b6a745..44601d8713 100644 --- a/doc/source/guides/multinode-lab.rst +++ b/doc/source/guides/multinode-lab.rst @@ -6,10 +6,10 @@ Here is OpenStack in a realistic test configuration with multiple physical servers. Prerequisites Linux & Network ------------------------------ +============================= Minimal Install -~~~~~~~~~~~~~~~ +--------------- You need to have a system with a fresh install of Linux. You can download the `Minimal @@ -27,7 +27,7 @@ Install a couple of packages to bootstrap configuration: apt-get install -y git sudo || yum install -y git sudo Network Configuration -~~~~~~~~~~~~~~~~~~~~~ +--------------------- The first iteration of the lab uses OpenStack's FlatDHCP network controller so only a single network will be required. It should be on @@ -60,10 +60,10 @@ For Fedora and CentOS/RHEL edit GATEWAY=192.168.42.1 Installation shake and bake ---------------------------- +=========================== Add the DevStack User -~~~~~~~~~~~~~~~~~~~~~ +--------------------- OpenStack runs as a non-root user that has sudo access to root. There is nothing special about the name, we'll use ``stack`` here. Every node @@ -88,7 +88,7 @@ From here on use the ``stack`` user. **Logout** and **login** as the ``stack`` user. Set Up Ssh -~~~~~~~~~~ +---------- Set up the stack user on each node with an ssh key for access: @@ -98,7 +98,7 @@ Set up the stack user on each node with an ssh key for access: echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyYjfgyPazTvGpd8OaAvtU2utL8W6gWC4JdRS1J95GhNNfQd657yO6s1AH5KYQWktcE6FO/xNUC2reEXSGC7ezy+sGO1kj9Limv5vrvNHvF1+wts0Cmyx61D2nQw35/Qz8BvpdJANL7VwP/cFI/p3yhvx2lsnjFE3hN8xRB2LtLUopUSVdBwACOVUmH2G+2BWMJDjVINd2DPqRIA4Zhy09KJ3O1Joabr0XpQL0yt/I9x8BVHdAx6l9U0tMg9dj5+tAjZvMAFfye3PJcYwwsfJoFxC8w/SLtqlFX7Ehw++8RtvomvuipLdmWCy+T9hIkl+gHYE4cS3OIqXH7f49jdJf jesse@spacey.local" > ~/.ssh/authorized_keys Download DevStack -~~~~~~~~~~~~~~~~~ +----------------- Grab the latest version of DevStack: @@ -112,7 +112,7 @@ From here on there are some differences between the cluster controller (aka 'head node') and the compute nodes. Configure Cluster Controller -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------- The cluster controller runs all OpenStack services. Configure the cluster controller's DevStack in ``local.conf``: @@ -153,7 +153,7 @@ to poke at your shiny new OpenStack. The most recent log file is available in ``stack.sh.log``. Configure Compute Nodes -~~~~~~~~~~~~~~~~~~~~~~~ +----------------------- The compute nodes only run the OpenStack worker services. For additional machines, create a ``local.conf`` with: @@ -196,7 +196,7 @@ to poke at your shiny new OpenStack. The most recent log file is available in ``stack.sh.log``. Cleaning Up After DevStack -~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------------- Shutting down OpenStack is now as simple as running the included ``unstack.sh`` script: @@ -223,10 +223,10 @@ this when it runs but there are times it needs to still be done by hand: sudo virsh list | grep inst | awk '{print $1}' | xargs -n1 virsh destroy Options pimp your stack ------------------------ +======================= Additional Users -~~~~~~~~~~~~~~~~ +---------------- DevStack creates two OpenStack users (``admin`` and ``demo``) and two tenants (also ``admin`` and ``demo``). ``admin`` is exactly what it @@ -242,7 +242,7 @@ for scripting: # Get admin creds . openrc admin admin - + # List existing tenants keystone tenant-list @@ -260,7 +260,7 @@ for scripting: # keystone role-list Swift -~~~~~ +----- Swift requires a significant amount of resources and is disabled by default in DevStack. The support in DevStack is geared toward a minimal @@ -280,7 +280,7 @@ Swift config files are located in ``SWIFT_CONFIG_DIR`` (default it...) ``local.conf``. Volumes -~~~~~~~ +------- DevStack will automatically use an existing LVM volume group named ``stack-volumes`` to store cloud-created volumes. If ``stack-volumes`` @@ -305,7 +305,7 @@ involved but looks something like this: vgcreate stack-volumes /dev/sdc Syslog -~~~~~~ +------ DevStack is capable of using ``rsyslog`` to aggregate logging across the cluster. It is off by default; to turn it on set ``SYSLOG=True`` in @@ -319,7 +319,7 @@ output there. In the example above, add this to the compute node SYSLOG_HOST=192.168.42.11 Using Alternate Repositories/Branches -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------- The git repositories for all of the OpenStack services are defined in ``stackrc``. Since this file is a part of the DevStack package changes @@ -349,10 +349,10 @@ To pull Glance from an experimental fork: GLANCE_REPO=https://github.com/mcuser/glance.git Notes stuff you might need to know ----------------------------------- +================================== Reset the Bridge -~~~~~~~~~~~~~~~~ +---------------- How to reset the bridge configuration: @@ -363,7 +363,7 @@ How to reset the bridge configuration: sudo brctl delbr br100 Set MySQL Password -~~~~~~~~~~~~~~~~~~ +------------------ If you forgot to set the root password you can do this: diff --git a/doc/source/guides/single-machine.rst b/doc/source/guides/single-machine.rst index a7a1099bc7..17e9b9e153 100644 --- a/doc/source/guides/single-machine.rst +++ b/doc/source/guides/single-machine.rst @@ -7,10 +7,10 @@ nice for kicking the tires, but doesn't compare to the feeling you get with hardware. Prerequisites Linux & Network ------------------------------ +============================= Minimal Install -~~~~~~~~~~~~~~~ +--------------- You need to have a system with a fresh install of Linux. You can download the `Minimal @@ -25,7 +25,7 @@ work but you may need to tell Network Manager to keep its fingers off the interface(s) that OpenStack uses for bridging. Network Configuration -~~~~~~~~~~~~~~~~~~~~~ +--------------------- Determine the network configuration on the interface used to integrate your OpenStack cloud with your existing network. For example, if the IPs @@ -36,10 +36,10 @@ To make things easier later change your host to use a static IP instead of DHCP (i.e. 192.168.1.201). Installation shake and bake ---------------------------- +=========================== Add your user -~~~~~~~~~~~~~ +------------- We need to add a user to install DevStack. (if you created a user during install you can skip this step and just give the user sudo privileges @@ -61,7 +61,7 @@ From here on you should use the user you created. **Logout** and **login** as that user. Download DevStack -~~~~~~~~~~~~~~~~~ +----------------- We'll grab the latest version of DevStack via https: @@ -72,7 +72,7 @@ We'll grab the latest version of DevStack via https: cd devstack Run DevStack -~~~~~~~~~~~~ +------------ Now to configure ``stack.sh``. DevStack includes a sample in ``devstack/samples/local.conf``. Create ``local.conf`` as shown below to @@ -120,7 +120,7 @@ see a summary of ``stack.sh``'s work, including the relevant URLs, accounts and passwords to poke at your shiny new OpenStack. Using OpenStack -~~~~~~~~~~~~~~~ +--------------- At this point you should be able to access the dashboard from other computers on the local network. In this example that would be diff --git a/doc/source/guides/single-vm.rst b/doc/source/guides/single-vm.rst index ef59953eb6..a41c4e14f1 100644 --- a/doc/source/guides/single-vm.rst +++ b/doc/source/guides/single-vm.rst @@ -9,16 +9,16 @@ launched in the cloud will be slow as they are running in QEMU operation. Speed not required. Prerequisites Cloud & Image ---------------------------- +=========================== Virtual Machine -~~~~~~~~~~~~~~~ +--------------- DevStack should run in any virtual machine running a supported Linux release. It will perform best with 2Gb or more of RAM. OpenStack Deployment & cloud-init -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +--------------------------------- If the cloud service has an image with ``cloud-init`` pre-installed, use it. You can get one from `Ubuntu's Daily @@ -33,10 +33,10 @@ can manually kick off the script below as a non-root user in a bare-bones server installation. Installation shake and bake ---------------------------- +=========================== Launching With Cloud-Init -~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------- This cloud config grabs the latest version of DevStack via git, creates a minimal ``local.conf`` file and kicks off ``stack.sh``. It should be @@ -79,13 +79,13 @@ As DevStack will refuse to run as root, this configures ``cloud-init`` to create a non-root user and run the ``start.sh`` script as that user. Launching By Hand -~~~~~~~~~~~~~~~~~ +----------------- Using a hypervisor directly, launch the VM and either manually perform the steps in the embedded shell script above or copy it into the VM. Using OpenStack -~~~~~~~~~~~~~~~ +--------------- At this point you should be able to access the dashboard. Launch VMs and if you give them floating IPs access those VMs from other machines on diff --git a/doc/source/overview.rst b/doc/source/overview.rst index 40782403fa..23ccf27d0a 100644 --- a/doc/source/overview.rst +++ b/doc/source/overview.rst @@ -13,10 +13,10 @@ Below is a list of what is specifically is supported (read that as "tested") going forward. Supported Components --------------------- +==================== Base OS -~~~~~~~ +------- *The OpenStack Technical Committee (TC) has defined the current CI strategy to include the latest Ubuntu release and the latest RHEL @@ -33,7 +33,7 @@ release (for Python 2.6 testing).* side-effects on other OS platforms. Databases -~~~~~~~~~ +--------- *As packaged by the host OS* @@ -41,7 +41,7 @@ Databases - PostgreSQL Queues -~~~~~~ +------ *As packaged by the host OS* @@ -49,14 +49,14 @@ Queues - Qpid Web Server -~~~~~~~~~~ +---------- *As packaged by the host OS* - Apache OpenStack Network -~~~~~~~~~~~~~~~~~ +----------------- *Default to Nova Network, optionally use Neutron* @@ -65,7 +65,7 @@ OpenStack Network mode using linuxbridge or OpenVSwitch. Services -~~~~~~~~ +-------- The default services configured by DevStack are Identity (Keystone), Object Storage (Swift), Image Storage (Glance), Block Storage (Cinder), @@ -77,14 +77,14 @@ Additional services not included directly in DevStack can be tied in to scripts that perform the configuration and startup of the service. Node Configurations -~~~~~~~~~~~~~~~~~~~ +------------------- - single node - multi-node is not tested regularly by the core team, and even then only minimal configurations are reviewed Exercises -~~~~~~~~~ +--------- The DevStack exercise scripts are no longer used as integration and gate testing as that job has transitioned to Tempest. They are still diff --git a/doc/source/plugins.rst b/doc/source/plugins.rst index b4136c4653..485cd0f04e 100644 --- a/doc/source/plugins.rst +++ b/doc/source/plugins.rst @@ -6,7 +6,7 @@ DevStack has a couple of plugin mechanisms to allow easily adding support for additional projects and features. Extras.d Hooks -~~~~~~~~~~~~~~ +============== These hooks are an extension of the service calls in ``stack.sh`` at specific points in its run, plus ``unstack.sh`` and @@ -93,7 +93,7 @@ The arguments are: but after ``unstack.sh`` has been called. Hypervisor -~~~~~~~~~~ +========== Hypervisor plugins are fairly new and condense most hypervisor configuration into one place. From 91b229058cd8204d0c3a038d24aa09d1baadef2f Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Tue, 18 Nov 2014 07:13:35 -0500 Subject: [PATCH 0104/3333] apparently the upstream naming is tempest-lib tempest_lib was how this was generally referred to, however that meant that the job naming wasn't specifying the correctly src library. Change to tempest-lib to actually test these things before release. Change-Id: I4c0712156d7ff71ee43747f30ab940e249d12ebc --- lib/tempest | 8 ++++---- stackrc | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/tempest b/lib/tempest index 9e025a1096..e903ec3bc1 100644 --- a/lib/tempest +++ b/lib/tempest @@ -45,7 +45,7 @@ set +o xtrace # -------- # Set up default directories -GITDIR["tempest_lib"]=$DEST/tempest-lib +GITDIR["tempest-lib"]=$DEST/tempest-lib TEMPEST_DIR=$DEST/tempest TEMPEST_CONFIG_DIR=${TEMPEST_CONFIG_DIR:-$TEMPEST_DIR/etc} @@ -446,9 +446,9 @@ function create_tempest_accounts { # install_tempest_lib() - Collect source, prepare, and install tempest-lib function install_tempest_lib { - if use_library_from_git "tempest_lib"; then - git_clone_by_name "tempest_lib" - setup_develop "tempest_lib" + if use_library_from_git "tempest-lib"; then + git_clone_by_name "tempest-lib" + setup_develop "tempest-lib" fi } diff --git a/stackrc b/stackrc index 18e1de3b19..8497f0f627 100644 --- a/stackrc +++ b/stackrc @@ -203,8 +203,8 @@ TEMPEST_REPO=${TEMPEST_REPO:-${GIT_BASE}/openstack/tempest.git} TEMPEST_BRANCH=${TEMPEST_BRANCH:-master} # TODO(sdague): this should end up as a library component like below -GITREPO["tempest_lib"]=${TEMPEST_LIB_REPO:-${GIT_BASE}/openstack/tempest-lib.git} -GITBRANCH["tempest_lib"]=${TEMPEST_LIB_BRANCH:-master} +GITREPO["tempest-lib"]=${TEMPEST_LIB_REPO:-${GIT_BASE}/openstack/tempest-lib.git} +GITBRANCH["tempest-lib"]=${TEMPEST_LIB_BRANCH:-master} ############## From d591a25e424ea8cec4d67854fcce236671210139 Mon Sep 17 00:00:00 2001 From: Steven Hardy Date: Mon, 27 Oct 2014 17:22:17 +0000 Subject: [PATCH 0105/3333] Add support for tuskar-api service Adds initial support for configuring and starting the tuskar-api service. To enable, add the following to your localrc: enable_service tuskar enable_service tuskar-api The aim of this addition is to provide a more accessible (non devtest) way for developers to run up tuskar in a familiar devstack environment. See the official repos for more information: https://github.com/openstack/tuskar/ https://github.com/openstack/python-tuskarclient Change-Id: Id0c3c0d3a38100c66dbe6e3adf1f715162f99742 --- doc/source/index.rst | 1 + extras.d/70-tuskar.sh | 205 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 extras.d/70-tuskar.sh diff --git a/doc/source/index.rst b/doc/source/index.rst index dbefdec144..17499c520d 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -165,6 +165,7 @@ Scripts * `extras.d/60-ceph.sh `__ * `extras.d/70-sahara.sh `__ * `extras.d/70-trove.sh `__ +* `extras.d/70-tuskar.sh `__ * `extras.d/70-zaqar.sh `__ * `extras.d/80-opendaylight.sh `__ * `extras.d/80-tempest.sh `__ diff --git a/extras.d/70-tuskar.sh b/extras.d/70-tuskar.sh new file mode 100644 index 0000000000..e77c504db0 --- /dev/null +++ b/extras.d/70-tuskar.sh @@ -0,0 +1,205 @@ +# Install and start the **Tuskar** service +# +# To enable, add the following to your localrc +# +# enable_service tuskar +# enable_service tuskar-api + + +if is_service_enabled tuskar; then + if [[ "$1" == "source" ]]; then + # Initial source, do nothing as functions sourced + # are below rather than in lib/tuskar + echo_summary "source extras tuskar" + elif [[ "$1" == "stack" && "$2" == "install" ]]; then + echo_summary "Installing Tuskar" + install_tuskarclient + install_tuskar + elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then + echo_summary "Configuring Tuskar" + configure_tuskar + configure_tuskarclient + + if is_service_enabled key; then + create_tuskar_accounts + fi + + elif [[ "$1" == "stack" && "$2" == "extra" ]]; then + echo_summary "Initializing Tuskar" + init_tuskar + start_tuskar + fi + + if [[ "$1" == "unstack" ]]; then + stop_tuskar + fi +fi + +# library code (equivalent to lib/tuskar) +# --------- +# - install_tuskarclient +# - install_tuskar +# - configure_tuskarclient +# - configure_tuskar +# - init_tuskar +# - start_tuskar +# - stop_tuskar +# - cleanup_tuskar + +# Save trace setting +XTRACE=$(set +o | grep xtrace) +set +o xtrace + + +# Defaults +# -------- + +# tuskar repos +TUSKAR_REPO=${TUSKAR_REPO:-${GIT_BASE}/openstack/tuskar.git} +TUSKAR_BRANCH=${TUSKAR_BRANCH:-master} + +TUSKARCLIENT_REPO=${TUSKARCLIENT_REPO:-${GIT_BASE}/openstack/python-tuskarclient.git} +TUSKARCLIENT_BRANCH=${TUSKARCLIENT_BRANCH:-master} + +# set up default directories +TUSKAR_DIR=$DEST/tuskar +TUSKARCLIENT_DIR=$DEST/python-tuskarclient +TUSKAR_AUTH_CACHE_DIR=${TUSKAR_AUTH_CACHE_DIR:-/var/cache/tuskar} +TUSKAR_STANDALONE=`trueorfalse False $TUSKAR_STANDALONE` +TUSKAR_CONF_DIR=/etc/tuskar +TUSKAR_CONF=$TUSKAR_CONF_DIR/tuskar.conf +TUSKAR_API_HOST=${TUSKAR_API_HOST:-$HOST_IP} +TUSKAR_API_PORT=${TUSKAR_API_PORT:-8585} + +# Tell Tempest this project is present +TEMPEST_SERVICES+=,tuskar + +# Functions +# --------- + +# Test if any Tuskar services are enabled +# is_tuskar_enabled +function is_tuskar_enabled { + [[ ,${ENABLED_SERVICES} =~ ,"tuskar-" ]] && return 0 + return 1 +} + +# cleanup_tuskar() - Remove residual data files, anything left over from previous +# runs that a clean run would need to clean up +function cleanup_tuskar { + sudo rm -rf $TUSKAR_AUTH_CACHE_DIR +} + +# configure_tuskar() - Set config files, create data dirs, etc +function configure_tuskar { + setup_develop $TUSKAR_DIR + + if [[ ! -d $TUSKAR_CONF_DIR ]]; then + sudo mkdir -p $TUSKAR_CONF_DIR + fi + sudo chown $STACK_USER $TUSKAR_CONF_DIR + # remove old config files + rm -f $TUSKAR_CONF_DIR/tuskar-*.conf + + TUSKAR_POLICY_FILE=$TUSKAR_CONF_DIR/policy.json + + cp $TUSKAR_DIR/etc/tuskar/policy.json $TUSKAR_POLICY_FILE + cp $TUSKAR_DIR/etc/tuskar/tuskar.conf.sample $TUSKAR_CONF + + # common options + iniset $TUSKAR_CONF database connection `database_connection_url tuskar` + + # logging + iniset $TUSKAR_CONF DEFAULT debug $ENABLE_DEBUG_LOG_LEVEL + iniset $TUSKAR_CONF DEFAULT use_syslog $SYSLOG + if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ]; then + # Add color to logging output + setup_colorized_logging $TUSKAR_CONF DEFAULT tenant user + fi + + configure_auth_token_middleware $TUSKAR_CONF tuskar $TUSKAR_AUTH_CACHE_DIR + + if is_ssl_enabled_service "key"; then + iniset $TUSKAR_CONF clients_keystone ca_file $SSL_BUNDLE_FILE + fi + + iniset $TUSKAR_CONF tuskar_api bind_port $TUSKAR_API_PORT + +} + +# init_tuskar() - Initialize database +function init_tuskar { + + # (re)create tuskar database + recreate_database tuskar utf8 + + tuskar-dbsync --config-file $TUSKAR_CONF + create_tuskar_cache_dir +} + +# create_tuskar_cache_dir() - Part of the init_tuskar() process +function create_tuskar_cache_dir { + # Create cache dirs + sudo mkdir -p $TUSKAR_AUTH_CACHE_DIR + sudo chown $STACK_USER $TUSKAR_AUTH_CACHE_DIR +} + +# install_tuskarclient() - Collect source and prepare +function install_tuskarclient { + git_clone $TUSKARCLIENT_REPO $TUSKARCLIENT_DIR $TUSKARCLIENT_BRANCH + setup_develop $TUSKARCLIENT_DIR +} + +# configure_tuskarclient() - Set config files, create data dirs, etc +function configure_tuskarclient { + setup_develop $TUSKARCLIENT_DIR +} + +# install_tuskar() - Collect source and prepare +function install_tuskar { + git_clone $TUSKAR_REPO $TUSKAR_DIR $TUSKAR_BRANCH +} + +# start_tuskar() - Start running processes, including screen +function start_tuskar { + run_process tuskar-api "tuskar-api --config-file=$TUSKAR_CONF" +} + +# stop_tuskar() - Stop running processes +function stop_tuskar { + # Kill the screen windows + local serv + for serv in tuskar-api; do + stop_process $serv + done +} + +# create_tuskar_accounts() - Set up common required tuskar accounts +function create_tuskar_accounts { + # migrated from files/keystone_data.sh + local service_tenant=$(openstack project list | awk "/ $SERVICE_TENANT_NAME / { print \$2 }") + local admin_role=$(openstack role list | awk "/ admin / { print \$2 }") + + local tuskar_user=$(get_or_create_user "tuskar" \ + "$SERVICE_PASSWORD" $service_tenant) + get_or_add_user_role $admin_role $tuskar_user $service_tenant + + if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then + + local tuskar_service=$(get_or_create_service "tuskar" \ + "management" "Tuskar Management Service") + get_or_create_endpoint $tuskar_service \ + "$REGION_NAME" \ + "$SERVICE_PROTOCOL://$TUSKAR_API_HOST:$TUSKAR_API_PORT" \ + "$SERVICE_PROTOCOL://$TUSKAR_API_HOST:$TUSKAR_API_PORT" \ + "$SERVICE_PROTOCOL://$TUSKAR_API_HOST:$TUSKAR_API_PORT" + fi +} + +# Restore xtrace +$XTRACE + +# Tell emacs to use shell-script-mode +## Local variables: +## mode: shell-script +## End: From 4b45fca7bb3ad93d7ee3fb0f121eb715798044f4 Mon Sep 17 00:00:00 2001 From: Adam Gandelman Date: Mon, 17 Nov 2014 09:59:23 -0800 Subject: [PATCH 0106/3333] Do not hardcode ironic svc port, protocol The Ironic API server's port and protocol are hardcoded in various places. This updates the ironic bits to use configured values instead and fixes a bug around iptables rule creationl. Change-Id: I1ace68affff3afdbc0058be4d32f8044a24e9338 Closes-bug: #1393498 --- lib/ironic | 12 +++++++----- lib/nova_plugins/hypervisor-ironic | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/ironic b/lib/ironic index a56ab7ae65..30ae9e9500 100644 --- a/lib/ironic +++ b/lib/ironic @@ -104,7 +104,8 @@ IRONIC_BIN_DIR=$(get_python_exec_prefix) # Ironic connection info. Note the port must be specified. IRONIC_SERVICE_PROTOCOL=http -IRONIC_HOSTPORT=${IRONIC_HOSTPORT:-$SERVICE_HOST:6385} +IRONIC_SERVICE_PORT=${IRONIC_SERVICE_PORT:-6385} +IRONIC_HOSTPORT=${IRONIC_HOSTPORT:-$SERVICE_HOST:$IRONIC_SERVICE_PORT} # Tell Tempest this project is present TEMPEST_SERVICES+=,ironic @@ -277,6 +278,7 @@ function configure_ironic_api { iniset $IRONIC_CONF_FILE DEFAULT policy_file $IRONIC_POLICY_JSON configure_auth_token_middleware $IRONIC_CONF_FILE ironic $IRONIC_AUTH_CACHE_DIR/api iniset_rpc_backend ironic $IRONIC_CONF_FILE DEFAULT + iniset $IRONIC_CONF_FILE api port $IRONIC_SERVICE_PORT cp -p $IRONIC_DIR/etc/ironic/policy.json $IRONIC_POLICY_JSON } @@ -298,7 +300,7 @@ function configure_ironic_conductor { iniset $IRONIC_CONF_FILE DEFAULT rootwrap_config $IRONIC_ROOTWRAP_CONF iniset $IRONIC_CONF_FILE DEFAULT enabled_drivers $IRONIC_ENABLED_DRIVERS - iniset $IRONIC_CONF_FILE conductor api_url http://$HOST_IP:6385 + iniset $IRONIC_CONF_FILE conductor api_url $IRONIC_SERVICE_PROTOCOL://$HOST_IP:$IRONIC_SERVICE_PORT iniset $IRONIC_CONF_FILE pxe tftp_server $IRONIC_TFTPSERVER_IP iniset $IRONIC_CONF_FILE pxe tftp_root $IRONIC_TFTPBOOT_DIR iniset $IRONIC_CONF_FILE pxe tftp_master_path $IRONIC_TFTPBOOT_DIR/master_images @@ -419,7 +421,7 @@ function start_ironic { function start_ironic_api { run_process ir-api "$IRONIC_BIN_DIR/ironic-api --config-file=$IRONIC_CONF_FILE" echo "Waiting for ir-api ($IRONIC_HOSTPORT) to start..." - if ! timeout $SERVICE_TIMEOUT sh -c "while ! wget --no-proxy -q -O- http://$IRONIC_HOSTPORT; do sleep 1; done"; then + if ! timeout $SERVICE_TIMEOUT sh -c "while ! wget --no-proxy -q -O- $IRONIC_SERVICE_PROTOCOL://$IRONIC_HOSTPORT; do sleep 1; done"; then die $LINENO "ir-api did not start" fi } @@ -586,7 +588,7 @@ function configure_iptables { sudo modprobe nf_nat_tftp # nodes boot from TFTP and callback to the API server listening on $HOST_IP sudo iptables -I INPUT -d $HOST_IP -p udp --dport 69 -j ACCEPT || true - sudo iptables -I INPUT -d $HOST_IP -p tcp --dport $IRONIC_HOSTPORT -j ACCEPT || true + sudo iptables -I INPUT -d $HOST_IP -p tcp --dport $IRONIC_SERVICE_PORT -j ACCEPT || true if [ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]; then # agent ramdisk gets instance image from swift sudo iptables -I INPUT -d $HOST_IP -p tcp --dport ${SWIFT_DEFAULT_BIND_PORT:-8080} -j ACCEPT || true @@ -748,7 +750,7 @@ function cleanup_baremetal_basic_ops { sudo rm -rf /etc/xinetd.d/tftp /etc/init/tftpd-hpa.override restart_service xinetd sudo iptables -D INPUT -d $HOST_IP -p udp --dport 69 -j ACCEPT || true - sudo iptables -D INPUT -d $HOST_IP -p tcp --dport 6385 -j ACCEPT || true + sudo iptables -D INPUT -d $HOST_IP -p tcp --dport $IRONIC_SERVICE_PORT -j ACCEPT || true if [ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]; then # agent ramdisk gets instance image from swift sudo iptables -D INPUT -d $HOST_IP -p tcp --dport ${SWIFT_DEFAULT_BIND_PORT:-8080} -j ACCEPT || true diff --git a/lib/nova_plugins/hypervisor-ironic b/lib/nova_plugins/hypervisor-ironic index 4004cc935a..420950328e 100644 --- a/lib/nova_plugins/hypervisor-ironic +++ b/lib/nova_plugins/hypervisor-ironic @@ -47,7 +47,7 @@ function configure_nova_hypervisor { iniset $NOVA_CONF ironic admin_password $ADMIN_PASSWORD iniset $NOVA_CONF ironic admin_url $KEYSTONE_AUTH_URI/v2.0 iniset $NOVA_CONF ironic admin_tenant_name demo - iniset $NOVA_CONF ironic api_endpoint http://$SERVICE_HOST:6385/v1 + iniset $NOVA_CONF ironic api_endpoint $IRONIC_SERVICE_PROTOCOL://$IRONIC_HOSTPORT/v1 } # install_nova_hypervisor() - Install external components From 849d0b8ebb9aff4a2106c01a691112578f25281c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Han?= Date: Tue, 18 Nov 2014 11:10:11 -0800 Subject: [PATCH 0107/3333] Fix the variable substitution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prior to that commit if ceph_version was equal to 0.80.5, the variable substitution ${ceph_version%.*} was returning 0.80 and not 0. Using ${ceph_version%%.*} returns the desired value. Also refactoring the version output to get a X.X format since only major and minor are important. Change-Id: Iab50f3c4b24a01a68acda417eae0501f00038f54 Signed-off-by: Sébastien Han --- lib/ceph | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ceph b/lib/ceph index 2ddf5dbb6a..bfad3dcf60 100644 --- a/lib/ceph +++ b/lib/ceph @@ -72,7 +72,7 @@ CEPH_REPLICAS_SEQ=$(seq ${CEPH_REPLICAS}) # ------------ function get_ceph_version { - local ceph_version_str=$(sudo ceph daemon mon.$(hostname) version | cut -d '"' -f 4) + local ceph_version_str=$(sudo ceph daemon mon.$(hostname) version | cut -d '"' -f 4 | cut -f 1,2 -d '.') echo $ceph_version_str } @@ -162,7 +162,7 @@ EOF # pools data and metadata were removed in the Giant release so depending on the version we apply different commands local ceph_version=$(get_ceph_version) # change pool replica size according to the CEPH_REPLICAS set by the user - if [[ ${ceph_version%.*} -eq 0 ]] && [[ ${ceph_version##*.} -lt 87 ]]; then + if [[ ${ceph_version%%.*} -eq 0 ]] && [[ ${ceph_version##*.} -lt 87 ]]; then sudo ceph -c ${CEPH_CONF_FILE} osd pool set rbd size ${CEPH_REPLICAS} sudo ceph -c ${CEPH_CONF_FILE} osd pool set data size ${CEPH_REPLICAS} sudo ceph -c ${CEPH_CONF_FILE} osd pool set metadata size ${CEPH_REPLICAS} From 088e66028c4eb41cf583a76409febce13475b66c Mon Sep 17 00:00:00 2001 From: Mikhail S Medvedev Date: Tue, 18 Nov 2014 12:11:26 -0600 Subject: [PATCH 0108/3333] Deal with different django-admin executables After the recent patch [1] the devstack is broken for Fedora 20 with the error "django-admin.py: command not found" during horizon setup. This is due to differences in how django currently packaged for Fedora, where we should use "django-admin", without the .py This patch sets up executable alias by checking if "django-admin" exists, and falling back on "django-admin.py". [1] https://review.openstack.org/#/c/120940/ Change-Id: I2b6de25fe32446edbdc0418674fea8579ec739d9 --- lib/horizon | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/horizon b/lib/horizon index 872e77a040..9fd1b854c8 100644 --- a/lib/horizon +++ b/lib/horizon @@ -142,8 +142,16 @@ function init_horizon { # and run_process sudo rm -f /var/log/$APACHE_NAME/horizon_* - DJANGO_SETTINGS_MODULE=openstack_dashboard.settings django-admin.py collectstatic --noinput - DJANGO_SETTINGS_MODULE=openstack_dashboard.settings django-admin.py compress --force + # Setup alias for django-admin which could be different depending on distro + local django_admin + if type -p django-admin > /dev/null; then + django_admin=django-admin + else + django_admin=django-admin.py + fi + + DJANGO_SETTINGS_MODULE=openstack_dashboard.settings $django_admin collectstatic --noinput + DJANGO_SETTINGS_MODULE=openstack_dashboard.settings $django_admin compress --force } From fe96ed66f5fea37484dfaae597c43756c16e5779 Mon Sep 17 00:00:00 2001 From: yunhong jiang Date: Wed, 5 Nov 2014 03:30:25 -0700 Subject: [PATCH 0109/3333] Add agent_ipmitool support This patch enables to use the agent_ipmitool deploy driver to deploy the ironic on real hardware, instead of virtual machine. It also append the deploy driver name to the kernel/ramdisk path, so that if developer switch the deploy driver after ./unstack.sh, devstack will use the correct kernel/ramdisk. Change-Id: Iac0415f6895d037c876e137aa4f2bf2990eb47c5 --- lib/ironic | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/ironic b/lib/ironic index 98619c5f51..f2b1fb2f6a 100644 --- a/lib/ironic +++ b/lib/ironic @@ -93,7 +93,7 @@ IRONIC_AGENT_KERNEL_URL=${IRONIC_AGENT_KERNEL_URL:-http://tarballs.openstack.org IRONIC_AGENT_RAMDISK_URL=${IRONIC_AGENT_RAMDISK_URL:-http://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe_image-oem.cpio.gz} # Which deploy driver to use - valid choices right now -# are 'pxe_ssh', 'pxe_ipmitool' and 'agent_ssh'. +# are 'pxe_ssh', 'pxe_ipmitool', 'agent_ssh' and 'agent_ipmitool'. IRONIC_DEPLOY_DRIVER=${IRONIC_DEPLOY_DRIVER:-pxe_ssh} #TODO(agordeev): replace 'ubuntu' with host distro name getting @@ -152,6 +152,11 @@ function is_ironic_hardware { return 1 } +function is_deployed_by_agent { + [[ -z "${IRONIC_DEPLOY_DRIVER%%agent*}" ]] && return 0 + return 1 +} + # install_ironic() - Collect source and prepare function install_ironic { # make sure all needed service were enabled @@ -307,7 +312,7 @@ function configure_ironic_conductor { if [[ "$IRONIC_VM_LOG_CONSOLE" == "True" ]] ; then iniset $IRONIC_CONF_FILE pxe pxe_append_params "nofb nomodeset vga=normal console=ttyS0" fi - if [[ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]] ; then + if is_deployed_by_agent; then if [[ "$SWIFT_ENABLE_TEMPURLS" == "True" ]] ; then iniset $IRONIC_CONF_FILE glance swift_temp_url_key $SWIFT_TEMPURL_KEY else @@ -510,7 +515,7 @@ function enroll_nodes { if [[ "$IRONIC_DEPLOY_DRIVER" == "pxe_ssh" ]] ; then local _IRONIC_DEPLOY_KERNEL_KEY=pxe_deploy_kernel local _IRONIC_DEPLOY_RAMDISK_KEY=pxe_deploy_ramdisk - elif [[ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]] ; then + elif is_deployed_by_agent; then local _IRONIC_DEPLOY_KERNEL_KEY=deploy_kernel local _IRONIC_DEPLOY_RAMDISK_KEY=deploy_ramdisk fi @@ -552,6 +557,10 @@ function enroll_nodes { # we create the bare metal flavor with minimum value local node_options="-i ipmi_address=$ipmi_address -i ipmi_password=$ironic_ipmi_passwd\ -i ipmi_username=$ironic_ipmi_username" + if is_deployed_by_agent; then + node_options+=" -i $_IRONIC_DEPLOY_KERNEL_KEY=$IRONIC_DEPLOY_KERNEL_ID" + node_options+=" -i $_IRONIC_DEPLOY_RAMDISK_KEY=$IRONIC_DEPLOY_RAMDISK_ID" + fi fi local node_id=$(ironic node-create --chassis_uuid $chassis_id \ @@ -589,7 +598,7 @@ function configure_iptables { # nodes boot from TFTP and callback to the API server listening on $HOST_IP sudo iptables -I INPUT -d $HOST_IP -p udp --dport 69 -j ACCEPT || true sudo iptables -I INPUT -d $HOST_IP -p tcp --dport $IRONIC_SERVICE_PORT -j ACCEPT || true - if [ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]; then + if is_deployed_by_agent; then # agent ramdisk gets instance image from swift sudo iptables -I INPUT -d $HOST_IP -p tcp --dport ${SWIFT_DEFAULT_BIND_PORT:-8080} -j ACCEPT || true fi @@ -665,8 +674,8 @@ function upload_baremetal_ironic_deploy { fi if [ -z "$IRONIC_DEPLOY_KERNEL" -o -z "$IRONIC_DEPLOY_RAMDISK" ]; then - local IRONIC_DEPLOY_KERNEL_PATH=$TOP_DIR/files/ir-deploy.kernel - local IRONIC_DEPLOY_RAMDISK_PATH=$TOP_DIR/files/ir-deploy.initramfs + local IRONIC_DEPLOY_KERNEL_PATH=$TOP_DIR/files/ir-deploy-$IRONIC_DEPLOY_DRIVER.kernel + local IRONIC_DEPLOY_RAMDISK_PATH=$TOP_DIR/files/ir-deploy-$IRONIC_DEPLOY_DRIVER.initramfs else local IRONIC_DEPLOY_KERNEL_PATH=$IRONIC_DEPLOY_KERNEL local IRONIC_DEPLOY_RAMDISK_PATH=$IRONIC_DEPLOY_RAMDISK @@ -677,17 +686,17 @@ function upload_baremetal_ironic_deploy { if [ "$IRONIC_BUILD_DEPLOY_RAMDISK" = "True" ]; then # we can build them only if we're not offline if [ "$OFFLINE" != "True" ]; then - if [ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]; then + if is_deployed_by_agent; then build_ipa_coreos_ramdisk $IRONIC_DEPLOY_KERNEL_PATH $IRONIC_DEPLOY_RAMDISK_PATH else ramdisk-image-create $IRONIC_DEPLOY_FLAVOR \ - -o $TOP_DIR/files/ir-deploy + -o $TOP_DIR/files/ir-deploy-$IRONIC_DEPLOY_DRIVER fi else die $LINENO "Deploy kernel+ramdisk files don't exist and cannot be build in OFFLINE mode" fi else - if [ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]; then + if is_deployed_by_agent; then # download the agent image tarball wget "$IRONIC_AGENT_KERNEL_URL" -O $IRONIC_DEPLOY_KERNEL_PATH wget "$IRONIC_AGENT_RAMDISK_URL" -O $IRONIC_DEPLOY_RAMDISK_PATH @@ -751,7 +760,7 @@ function cleanup_baremetal_basic_ops { restart_service xinetd sudo iptables -D INPUT -d $HOST_IP -p udp --dport 69 -j ACCEPT || true sudo iptables -D INPUT -d $HOST_IP -p tcp --dport $IRONIC_SERVICE_PORT -j ACCEPT || true - if [ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]; then + if is_deployed_by_agent; then # agent ramdisk gets instance image from swift sudo iptables -D INPUT -d $HOST_IP -p tcp --dport ${SWIFT_DEFAULT_BIND_PORT:-8080} -j ACCEPT || true fi From e4e535b0bf07bc823bdd72b31f66628e5ea96465 Mon Sep 17 00:00:00 2001 From: salvatore Date: Wed, 29 Oct 2014 18:22:46 +0100 Subject: [PATCH 0110/3333] Ensure syslog option is honored by neutron and tempest Syslog settings were not configured at all for these two projects. As a result, regardless of the value of the SYSLOG environment variable, the use_syslog options for these two projects was always set to False. Change-Id: Iba6155d62beffa06e5bb9ac16b06082ec64d0926 Closes-Bug: #1394024 --- lib/neutron | 2 +- lib/tempest | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/neutron b/lib/neutron index db6bd47ced..1d4fe1bd5f 100644 --- a/lib/neutron +++ b/lib/neutron @@ -785,7 +785,7 @@ function _configure_neutron_common { iniset $NEUTRON_CONF database connection `database_connection_url $Q_DB_NAME` iniset $NEUTRON_CONF DEFAULT state_path $DATA_DIR/neutron - + iniset $NEUTRON_CONF DEFAULT use_syslog $SYSLOG # If addition config files are set, make sure their path name is set as well if [[ ${#Q_PLUGIN_EXTRA_CONF_FILES[@]} > 0 && $Q_PLUGIN_EXTRA_CONF_PATH == '' ]]; then die $LINENO "Neutron additional plugin config not set.. exiting" diff --git a/lib/tempest b/lib/tempest index 8931300b98..d3fb9fb2dc 100644 --- a/lib/tempest +++ b/lib/tempest @@ -247,6 +247,7 @@ function configure_tempest { fi fi + iniset $TEMPEST_CONF DEFAULT use_syslog $SYSLOG # Oslo iniset $TEMPEST_CONFIG DEFAULT lock_path $TEMPEST_STATE_PATH mkdir -p $TEMPEST_STATE_PATH From 9d09f0980285b5b5d5ccf3865cab1c5df49b25d5 Mon Sep 17 00:00:00 2001 From: Oleg Gashev Date: Wed, 19 Nov 2014 00:29:03 -0500 Subject: [PATCH 0111/3333] Remove is_rackspace function from functions-common is_rackspace function never used and can be removed from code. Change-Id: Ic5d1dc419bdea3619fe248afad027e7d7c602b4f Closes-Bug: #1394076 --- functions-common | 7 ------- 1 file changed, 7 deletions(-) diff --git a/functions-common b/functions-common index e890b75d13..a96c702728 100644 --- a/functions-common +++ b/functions-common @@ -499,13 +499,6 @@ function is_arch { [[ "$(uname -m)" == "$1" ]] } -# Quick check for a rackspace host; n.b. rackspace provided images -# have these Xen tools installed but a custom image may not. -function is_rackspace { - [ -f /usr/bin/xenstore-ls ] && \ - sudo /usr/bin/xenstore-ls vm-data | grep -q "Rackspace" -} - # Determine if current distribution is a Fedora-based distribution # (Fedora, RHEL, CentOS, etc). # is_fedora From 48bbfe93f5b4b600db0f12c1f8574d4177ccce36 Mon Sep 17 00:00:00 2001 From: gordon chung Date: Wed, 19 Nov 2014 15:54:17 -0500 Subject: [PATCH 0112/3333] switch to use ceilometer specific connections in Juno/Kilo, we added ceilometer purpose specific connections for: metering, alarms, event. Rather than piggyback off oslo.db's connection option (which gives misleading sql help message), we should use Ceilometer specific connections. Change-Id: I7703b73708a5807fb8de89fbb828f06b488acf69 --- lib/ceilometer | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/ceilometer b/lib/ceilometer index c4377e04c0..cdef422bb5 100644 --- a/lib/ceilometer +++ b/lib/ceilometer @@ -183,10 +183,14 @@ function configure_ceilometer { configure_auth_token_middleware $CEILOMETER_CONF ceilometer $CEILOMETER_AUTH_CACHE_DIR if [ "$CEILOMETER_BACKEND" = 'mysql' ] || [ "$CEILOMETER_BACKEND" = 'postgresql' ] ; then - iniset $CEILOMETER_CONF database connection $(database_connection_url ceilometer) + iniset $CEILOMETER_CONF database alarm_connection $(database_connection_url ceilometer) + iniset $CEILOMETER_CONF database event_connection $(database_connection_url ceilometer) + iniset $CEILOMETER_CONF database metering_connection $(database_connection_url ceilometer) iniset $CEILOMETER_CONF DEFAULT collector_workers $API_WORKERS else - iniset $CEILOMETER_CONF database connection mongodb://localhost:27017/ceilometer + iniset $CEILOMETER_CONF database alarm_connection mongodb://localhost:27017/ceilometer + iniset $CEILOMETER_CONF database event_connection mongodb://localhost:27017/ceilometer + iniset $CEILOMETER_CONF database metering_connection mongodb://localhost:27017/ceilometer configure_mongodb cleanup_ceilometer fi From 8df690c52530589816a7323c24e4d616478b596c Mon Sep 17 00:00:00 2001 From: Louis Taylor Date: Thu, 20 Nov 2014 13:09:03 +0000 Subject: [PATCH 0113/3333] Install bash completion for glanceclient This installs the new bash-complete file in the standard location, alongside the rest of the completion files: /etc/bash_completion.d/glance.bash_completion Change-Id: I2944c47d857f7125f370b2b1ee041d1282db09c5 --- lib/glance | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/glance b/lib/glance index 04c088aa6d..5b456393ff 100644 --- a/lib/glance +++ b/lib/glance @@ -290,6 +290,7 @@ function install_glanceclient { if use_library_from_git "python-glanceclient"; then git_clone_by_name "python-glanceclient" setup_dev_lib "python-glanceclient" + sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-glanceclient"]}/tools/,/etc/bash_completion.d/}glance.bash_completion fi } From aecd189f80533b2680184d648f393bd0f5479882 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Wed, 19 Nov 2014 15:19:51 -0500 Subject: [PATCH 0114/3333] add unit tests for GIT* definitions This adds unit tests for all the GIT* definitions, ensuring that for libraries we think should be defined, they are. It exposed a bug in glance_store definitions in the process. The GITDIR definition for python-openstackclient is moved to stackrc for testability. Change-Id: Ibd9ab665f0362a84f4f7e80e80da56a4737f584e --- lib/glance | 2 +- stack.sh | 3 -- stackrc | 2 + tests/test_libs_from_pypi.sh | 96 ++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 4 deletions(-) create mode 100755 tests/test_libs_from_pypi.sh diff --git a/lib/glance b/lib/glance index 04c088aa6d..0c1045fd12 100644 --- a/lib/glance +++ b/lib/glance @@ -28,7 +28,7 @@ set +o xtrace # Set up default directories GITDIR["python-glanceclient"]=$DEST/python-glanceclient -GIRDIR["glance_store"]=$DEST/glance_store +GITDIR["glance_store"]=$DEST/glance_store GLANCE_DIR=$DEST/glance GLANCE_CACHE_DIR=${GLANCE_CACHE_DIR:=$DATA_DIR/glance/cache} diff --git a/stack.sh b/stack.sh index 93e4541990..24bda01782 100755 --- a/stack.sh +++ b/stack.sh @@ -575,9 +575,6 @@ if [[ -d $TOP_DIR/extras.d ]]; then done fi -# Set the destination directories for other OpenStack projects -GITDIR["python-openstackclient"]=$DEST/python-openstackclient - # Interactive Configuration # ------------------------- diff --git a/stackrc b/stackrc index e0e886d22c..5c5acb137c 100644 --- a/stackrc +++ b/stackrc @@ -273,6 +273,8 @@ GITBRANCH["python-troveclient"]=${TROVECLIENT_BRANCH:-master} # consolidated openstack python client GITREPO["python-openstackclient"]=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git} GITBRANCH["python-openstackclient"]=${OPENSTACKCLIENT_BRANCH:-master} +# this doesn't exist in a lib file, so set it here +GITDIR["python-openstackclient"]=$DEST/python-openstackclient ################### # diff --git a/tests/test_libs_from_pypi.sh b/tests/test_libs_from_pypi.sh new file mode 100755 index 0000000000..1b576d87c2 --- /dev/null +++ b/tests/test_libs_from_pypi.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash +# +# 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. + + +TOP=$(cd $(dirname "$0")/.. && pwd) + +export TOP_DIR=$TOP + +# Import common functions +source $TOP/functions +source $TOP/stackrc +source $TOP/lib/tls +for i in $TOP/lib/*; do + if [[ -f $i ]]; then + source $i + fi +done + +ALL_LIBS="python-novaclient oslo.config pbr oslo.context python-troveclient python-keystoneclient taskflow oslo.middleware pycadf python-glanceclient python-ironicclient tempest-lib oslo.messaging oslo.log cliff python-heatclient stevedore python-cinderclient glance_store oslo.concurrency oslo.db oslo.vmware keystonemiddleware oslo.serialization python-saharaclient django_openstack_auth python-openstackclient oslo.rootwrap oslo.i18n python-ceilometerclient oslo.utils python-swiftclient python-neutronclient" + +# Generate the above list with +# echo ${!GITREPO[@]} + +function check_exists { + local thing=$1 + local hash=$2 + local key=$3 + if [[ ! -z "$VERBOSE" ]]; then + echo "Checking for $hash[$key]" + fi + if [[ -z $thing ]]; then + echo "$hash[$key] does not exit!" + exit 1 + else + if [[ ! -z "$VERBOSE" ]]; then + echo "$hash[$key] => $thing" + fi + fi +} + +function test_all_libs_upto_date { + # this is all the magics + local found_libs=${!GITREPO[@]} + declare -A all_libs + for lib in $ALL_LIBS; do + all_libs[$lib]=1 + done + + for lib in $found_libs; do + if [[ -z ${all_libs[$lib]} ]]; then + echo "Library '$lib' not listed in unit tests, please add to ALL_LIBS" + exit 1 + fi + + done + echo "test_all_libs_upto_date PASSED" +} + +function test_libs_exist { + local lib="" + for lib in $ALL_LIBS; do + check_exists "${GITREPO[$lib]}" "GITREPO" "$lib" + check_exists "${GITBRANCH[$lib]}" "GITBRANCH" "$lib" + check_exists "${GITDIR[$lib]}" "GITDIR" "$lib" + done + + echo "test_libs_exist PASSED" +} + +function test_branch_master { + for lib in $ALL_LIBS; do + if [[ ${GITBRANCH[$lib]} != "master" ]]; then + echo "GITBRANCH for $lib not master (${GITBRANCH[$lib]})" + exit 1 + fi + done + + echo "test_branch_master PASSED" +} + +set -o errexit + +test_libs_exist +test_branch_master +test_all_libs_upto_date From 34296016632a82ebbc88978a41f12ac2af1730e6 Mon Sep 17 00:00:00 2001 From: "Sean M. Collins" Date: Mon, 27 Oct 2014 11:57:20 -0400 Subject: [PATCH 0115/3333] Documentation: Using Neutron with DevStack Change-Id: I75f30a6809a6276dbd8a61e73535913be63b54f0 --- doc/source/guides/neutron.rst | 195 ++++++++++++++++++++++++++++++++++ doc/source/index.rst | 8 ++ 2 files changed, 203 insertions(+) create mode 100644 doc/source/guides/neutron.rst diff --git a/doc/source/guides/neutron.rst b/doc/source/guides/neutron.rst new file mode 100644 index 0000000000..59b7a9d55b --- /dev/null +++ b/doc/source/guides/neutron.rst @@ -0,0 +1,195 @@ +====================================== +Using DevStack with Neutron Networking +====================================== + +This guide will walk you through using OpenStack Neutron with the ML2 +plugin and the Open vSwitch mechanism driver. + +Network Interface Configuration +=============================== + +To use Neutron, it is suggested that two network interfaces be present +in the host operating system. + +The first interface, eth0 is used for the OpenStack management (API, +message bus, etc) as well as for ssh for an administrator to access +the machine. + +:: + + stack@compute:~$ ifconfig eth0 + eth0 Link encap:Ethernet HWaddr bc:16:65:20:af:fc + inet addr:192.168.1.18 + +eth1 is manually configured at boot to not have an IP address. +Consult your operating system documentation for the appropriate +technique. For Ubuntu, the contents of `/etc/networking/interfaces` +contains: + +:: + + auto eth1 + iface eth1 inet manual + up ifconfig $IFACE 0.0.0.0 up + down ifconfig $IFACE 0.0.0.0 down + +The second physical interface, eth1 is added to a bridge (in this case +named br-ex), which is used to forward network traffic from guest VMs. +Network traffic from eth1 on the compute nodes is then NAT'd by the +controller node that runs Neutron's `neutron-l3-agent` and provides L3 +connectivity. + +:: + + stack@compute:~$ sudo ovs-vsctl add-br br-ex + stack@compute:~$ sudo ovs-vsctl add-port br-ex eth1 + stack@compute:~$ sudo ovs-vsctl show + 9a25c837-32ab-45f6-b9f2-1dd888abcf0f + Bridge br-ex + Port br-ex + Interface br-ex + type: internal + Port phy-br-ex + Interface phy-br-ex + type: patch + options: {peer=int-br-ex} + Port "eth1" + Interface "eth1" + + + + +Neutron Networking with Open vSwitch +==================================== + +Configuring Neutron networking in DevStack is very similar to +configuring `nova-network` - many of the same configuration variables +(like `FIXED_RANGE` and `FLOATING_RANGE`) used by `nova-network` are +used by Neutron, which is intentional. + +The only difference is the disabling of `nova-network` in your +local.conf, and the enabling of the Neutron components. + + +Configuration +------------- + +:: + + FIXED_RANGE=10.0.0.0/24 + FLOATING_RANGE=192.168.27.0/24 + PUBLIC_NETWORK_GATEWAY=192.168.27.2 + + disable_service n-net + enable_service q-svc + enable_service q-agt + enable_service q-dhcp + enable_service q-meta + enable_service q-l3 + + Q_USE_SECGROUP=True + ENABLE_TENANT_VLANS=True + TENANT_VLAN_RANGE=1000:1999 + PHYSICAL_NETWORK=default + OVS_PHYSICAL_BRIDGE=br-ex + +In this configuration we are defining FLOATING_RANGE to be a +subnet that exists in the private RFC1918 address space - however in +in a real setup FLOATING_RANGE would be a public IP address range. + +Neutron Networking with Open vSwitch and Provider Networks +========================================================== + +In some instances, it is desirable to use Neutron's provider +networking extension, so that networks that are configured on an +external router can be utilized by Neutron, and instances created via +Nova can attach to the network managed by the external router. + +For example, in some lab environments, a hardware router has been +pre-configured by another party, and an OpenStack developer has been +given a VLAN tag and IP address range, so that instances created via +DevStack will use the external router for L3 connectivity, as opposed +to the Neutron L3 service. + + +Service Configuration +--------------------- + +**Control Node** + +In this example, the control node will run the majority of the +OpenStack API and management services (Keystone, Glance, +Nova, Neutron, etc..) + + +**Compute Nodes** + +In this example, the nodes that will host guest instances will run +the `neutron-openvswitch-agent` for network connectivity, as well as +the compute service `nova-compute`. + +DevStack Configuration +---------------------- + +The following is a snippet of the DevStack configuration on the +controller node. + +:: + + PUBLIC_INTERFACE=eth1 + + ## Neutron options + Q_USE_SECGROUP=True + ENABLE_TENANT_VLANS=True + TENANT_VLAN_RANGE=3001:4000 + PHYSICAL_NETWORK=default + OVS_PHYSICAL_BRIDGE=br-ex + + Q_USE_PROVIDER_NETWORKING=True + Q_L3_ENABLED=False + + # Do not use Nova-Network + disable_service n-net + + # Neutron + ENABLED_SERVICES+=,q-svc,q-dhcp,q-meta,q-agt + + ## Neutron Networking options used to create Neutron Subnets + + FIXED_RANGE="10.1.1.0/24" + PROVIDER_SUBNET_NAME="provider_net" + PROVIDER_NETWORK_TYPE="vlan" + SEGMENTATION_ID=2010 + +In this configuration we are defining FIXED_RANGE to be a +subnet that exists in the private RFC1918 address space - however in +in a real setup FIXED_RANGE would be a public IP address range, so +that you could access your instances from the public internet. + +The following is a snippet of the DevStack configuration on the +compute node. + +:: + + # Services that a compute node runs + ENABLED_SERVICES=n-cpu,rabbit,q-agt + + ## Neutron options + Q_USE_SECGROUP=True + ENABLE_TENANT_VLANS=True + TENANT_VLAN_RANGE=3001:4000 + PHYSICAL_NETWORK=default + OVS_PHYSICAL_BRIDGE=br-ex + PUBLIC_INTERFACE=eth1 + Q_USE_PROVIDER_NETWORKING=True + Q_L3_ENABLED=False + +When DevStack is configured to use provider networking (via +`Q_USE_PROVIDER_NETWORKING` is True and `Q_L3_ENABLED` is False) - +DevStack will automatically add the network interface defined in +`PUBLIC_INTERFACE` to the `OVS_PHYSICAL_BRIDGE` + +For example, with the above configuration, a bridge is +created, named `br-ex` which is managed by Open vSwitch, and the +second interface on the compute node, `eth1` is attached to the +bridge, to forward traffic sent by guest vms. diff --git a/doc/source/index.rst b/doc/source/index.rst index dbefdec144..21b31e4925 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -63,6 +63,7 @@ Walk through various setups used by stackers guides/single-vm guides/single-machine guides/multinode-lab + guides/neutron All-In-One Single VM -------------------- @@ -84,6 +85,13 @@ Multi-Node Lab Setup a :doc:`multi-node cluster ` with dedicated VLANs for VMs & Management. :doc:`[Read] ` +DevStack with Neutron Networking +-------------------------------- + +Building a DevStack cluster with :doc:`Neutron Networking `. +This guide is meant for building lab environments with a dedicated +control node and multiple compute nodes. + DevStack Documentation ====================== From a6dfe8199831019a53c937aa7f1f85549bb268e7 Mon Sep 17 00:00:00 2001 From: JordanP Date: Thu, 20 Nov 2014 18:06:23 +0100 Subject: [PATCH 0116/3333] Remove unused and deprecated SWIFT_CONFIG_DIR variable Change-Id: Id9b9f2300288b98e4952ef8da6732232a683338d --- doc/source/guides/multinode-lab.rst | 2 +- lib/swift | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/source/guides/multinode-lab.rst b/doc/source/guides/multinode-lab.rst index 44601d8713..ff81c93975 100644 --- a/doc/source/guides/multinode-lab.rst +++ b/doc/source/guides/multinode-lab.rst @@ -275,7 +275,7 @@ simple as enabling the ``swift`` service in ``local.conf``: Swift will put its data files in ``SWIFT_DATA_DIR`` (default ``/opt/stack/data/swift``). The size of the data 'partition' created (really a loop-mounted file) is set by ``SWIFT_LOOPBACK_DISK_SIZE``. The -Swift config files are located in ``SWIFT_CONFIG_DIR`` (default +Swift config files are located in ``SWIFT_CONF_DIR`` (default ``/etc/swift``). All of these settings can be overridden in (wait for it...) ``local.conf``. diff --git a/lib/swift b/lib/swift index ae0874ebdf..9e61331404 100644 --- a/lib/swift +++ b/lib/swift @@ -54,8 +54,7 @@ SWIFT_DISK_IMAGE=${SWIFT_DATA_DIR}/drives/images/swift.img # Set ``SWIFT_CONF_DIR`` to the location of the configuration files. # Default is ``/etc/swift``. -# TODO(dtroyer): remove SWIFT_CONFIG_DIR after cutting stable/grizzly -SWIFT_CONF_DIR=${SWIFT_CONF_DIR:-${SWIFT_CONFIG_DIR:-/etc/swift}} +SWIFT_CONF_DIR=${SWIFT_CONF_DIR:-/etc/swift} if is_service_enabled s-proxy && is_service_enabled swift3; then # If we are using swift3, we can default the s3 port to swift instead From 86b65dd77b14a757b1bdbec2b6ae6b4900a88bed Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Thu, 20 Nov 2014 17:23:04 -0500 Subject: [PATCH 0117/3333] fix tempest-lib setup The setup should have been with setup_dev_lib, which looks up the path from GITDIR. This should let tempest-lib src jobs function. Change-Id: Ia160708c089adce469d878030196b6fed8acc92d --- lib/tempest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tempest b/lib/tempest index d3fb9fb2dc..6bcfaec84b 100644 --- a/lib/tempest +++ b/lib/tempest @@ -450,7 +450,7 @@ function create_tempest_accounts { function install_tempest_lib { if use_library_from_git "tempest-lib"; then git_clone_by_name "tempest-lib" - setup_develop "tempest-lib" + setup_dev_lib "tempest-lib" fi } From a1ffcfab478888ac4b0953c51e6d92f586d31d42 Mon Sep 17 00:00:00 2001 From: Adam Gandelman Date: Thu, 20 Nov 2014 16:42:32 -0800 Subject: [PATCH 0118/3333] Set libvirt live_migration_uri Sets up n-cpu to migrate domains via SSH. By default, hosts attempt to connect to each other as root, so this specifies STACK_USER instead. Change-Id: Ic6e868091c89a2cc6b2f0fada3f7e95002aaff8b --- lib/nova_plugins/hypervisor-libvirt | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/nova_plugins/hypervisor-libvirt b/lib/nova_plugins/hypervisor-libvirt index 259bf15a27..53dbfb976f 100644 --- a/lib/nova_plugins/hypervisor-libvirt +++ b/lib/nova_plugins/hypervisor-libvirt @@ -42,6 +42,7 @@ function configure_nova_hypervisor { iniset $NOVA_CONF libvirt virt_type "$LIBVIRT_TYPE" iniset $NOVA_CONF libvirt cpu_mode "none" iniset $NOVA_CONF libvirt use_usb_tablet "False" + iniset $NOVA_CONF libvirt live_migration_uri "qemu+ssh://$STACK_USER@%s/system" iniset $NOVA_CONF DEFAULT default_ephemeral_format "ext4" iniset $NOVA_CONF DEFAULT compute_driver "libvirt.LibvirtDriver" LIBVIRT_FIREWALL_DRIVER=${LIBVIRT_FIREWALL_DRIVER:-"nova.virt.libvirt.firewall.IptablesFirewallDriver"} From 98a0ad44722182453a74872c93c904d35bcac708 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Fri, 21 Nov 2014 10:42:18 +0900 Subject: [PATCH 0119/3333] ovs_base: Fix debug-agent config for Q_USE_PROVIDERNET_FOR_PUBLIC=True Set up external_network_bridge correctly for the case of Q_USE_PROVIDERNET_FOR_PUBLIC=True. This is an oversight in commit 6a633fd024347aade777ecd6545fa3efde5a959c. Closes-Bug: #1394826 Change-Id: I33f0fe15bafb7071d8a09899d636471f49031606 --- lib/neutron_plugins/ovs_base | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/neutron_plugins/ovs_base b/lib/neutron_plugins/ovs_base index f0ef194569..07aa7cca9b 100644 --- a/lib/neutron_plugins/ovs_base +++ b/lib/neutron_plugins/ovs_base @@ -60,7 +60,11 @@ function _neutron_ovs_base_install_agent_packages { } function _neutron_ovs_base_configure_debug_command { - iniset $NEUTRON_TEST_CONFIG_FILE DEFAULT external_network_bridge $PUBLIC_BRIDGE + if [ "$Q_USE_PROVIDERNET_FOR_PUBLIC" = "True" ]; then + iniset $NEUTRON_TEST_CONFIG_FILE DEFAULT external_network_bridge "" + else + iniset $NEUTRON_TEST_CONFIG_FILE DEFAULT external_network_bridge $PUBLIC_BRIDGE + fi } function _neutron_ovs_base_configure_firewall_driver { From 90c20209088eca3dcf830856a3a3118367dbc09f Mon Sep 17 00:00:00 2001 From: Rob Crittenden Date: Mon, 17 Nov 2014 01:16:22 -0500 Subject: [PATCH 0120/3333] Configure boto.cfg in tempest to point to SSL bundle The boto client uses the ca_certificate_files value in the Boto section of /etc/boto.cfg when making an SSL client connection. Configure that to be the devstack SSL CA bundle so the boto tests will pass when running against an SSL or TLS-proxy configured devstack environment. Change-Id: I55ae6d6e0c5b3adb4370ec93f40ae1cd47741457 --- lib/tempest | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/tempest b/lib/tempest index 8931300b98..ec045a9a4f 100644 --- a/lib/tempest +++ b/lib/tempest @@ -63,6 +63,7 @@ BUILD_TIMEOUT=${BUILD_TIMEOUT:-196} BOTO_MATERIALS_PATH="$FILES/images/s3-materials/cirros-${CIRROS_VERSION}" +BOTO_CONF=$TEMPEST_DIR/boto.cfg # Cinder/Volume variables TEMPEST_VOLUME_DRIVER=${TEMPEST_VOLUME_DRIVER:-default} @@ -424,6 +425,12 @@ function configure_tempest { fi done + if is_ssl_enabled_service "keystone" || is_service_enabled tls-proxy; then + # Use the BOTO_CONFIG environment variable to point to this file + iniset $BOTO_CONF Boto ca_certificates_file $SSL_BUNDLE_FILE + sudo chown $STACK_USER $BOTO_CONF + fi + # Restore IFS IFS=$ifs } From af14029553a3aaeb3edaf49568b175c47f88fbc0 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Thu, 20 Nov 2014 21:13:15 -0600 Subject: [PATCH 0121/3333] Rework the old logo * Re-work the old banner logo for the Sphinx docs * Remove the remaining leftover assets from the old web site So this is one possibility, I retained the other logo files so we have options to play with. Change-Id: Iac15899780072450dc30600a719283c0e2b0c0ae --- doc/source/assets/css/bootstrap.css | 616 -------- doc/source/assets/css/local.css | 122 -- doc/source/assets/images/header_bg.png | Bin 1014 -> 0 bytes doc/source/assets/images/logo-blue.png | Bin 0 -> 10568 bytes doc/source/assets/images/logo-blue.xcf | Bin 0 -> 33947 bytes doc/source/assets/images/quickstart.png | Bin 9491 -> 0 bytes doc/source/assets/js/bootstrap.js | 1722 ---------------------- doc/source/assets/js/bootstrap.min.js | 1 - doc/source/assets/js/jquery-1.7.1.min.js | 4 - doc/source/index.rst | 2 + 10 files changed, 2 insertions(+), 2465 deletions(-) delete mode 100644 doc/source/assets/css/bootstrap.css delete mode 100644 doc/source/assets/css/local.css delete mode 100644 doc/source/assets/images/header_bg.png create mode 100644 doc/source/assets/images/logo-blue.png create mode 100644 doc/source/assets/images/logo-blue.xcf delete mode 100644 doc/source/assets/images/quickstart.png delete mode 100644 doc/source/assets/js/bootstrap.js delete mode 100644 doc/source/assets/js/bootstrap.min.js delete mode 100644 doc/source/assets/js/jquery-1.7.1.min.js diff --git a/doc/source/assets/css/bootstrap.css b/doc/source/assets/css/bootstrap.css deleted file mode 100644 index 5fd10bcceb..0000000000 --- a/doc/source/assets/css/bootstrap.css +++ /dev/null @@ -1,616 +0,0 @@ -article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} -audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} -audio:not([controls]){display:none;} -html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} -a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -a:hover,a:active{outline:0;} -sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} -sup{top:-0.5em;} -sub{bottom:-0.25em;} -img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} -button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} -button,input{*overflow:visible;line-height:normal;} -button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} -button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} -input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} -input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} -textarea{overflow:auto;vertical-align:top;} -body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} -a{color:#0088cc;text-decoration:none;} -a:hover{color:#005580;text-decoration:underline;} -.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} -.row:after{clear:both;} -[class*="span"]{float:left;margin-left:20px;} -.span1{width:60px;} -.span2{width:140px;} -.span3{width:220px;} -.span4{width:300px;} -.span5{width:380px;} -.span6{width:460px;} -.span7{width:540px;} -.span8{width:620px;} -.span9{width:700px;} -.span10{width:780px;} -.span11{width:860px;} -.span12,.container{width:940px;} -.offset1{margin-left:100px;} -.offset2{margin-left:180px;} -.offset3{margin-left:260px;} -.offset4{margin-left:340px;} -.offset5{margin-left:420px;} -.offset6{margin-left:500px;} -.offset7{margin-left:580px;} -.offset8{margin-left:660px;} -.offset9{margin-left:740px;} -.offset10{margin-left:820px;} -.offset11{margin-left:900px;} -.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} -.row-fluid:after{clear:both;} -.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} -.row-fluid>[class*="span"]:first-child{margin-left:0;} -.row-fluid .span1{width:6.382978723%;} -.row-fluid .span2{width:14.89361702%;} -.row-fluid .span3{width:23.404255317%;} -.row-fluid .span4{width:31.914893614%;} -.row-fluid .span5{width:40.425531911%;} -.row-fluid .span6{width:48.93617020799999%;} -.row-fluid .span7{width:57.446808505%;} -.row-fluid .span8{width:65.95744680199999%;} -.row-fluid .span9{width:74.468085099%;} -.row-fluid .span10{width:82.97872339599999%;} -.row-fluid .span11{width:91.489361693%;} -.row-fluid .span12{width:99.99999998999999%;} -.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} -.container:after{clear:both;} -.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} -.container-fluid:after{clear:both;} -p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} -.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} -h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} -h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} -h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} -h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} -h4,h5,h6{line-height:18px;} -h4{font-size:14px;}h4 small{font-size:12px;} -h5{font-size:12px;} -h6{font-size:11px;color:#999999;text-transform:uppercase;} -.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} -.page-header h1{line-height:1;} -ul,ol{padding:0;margin:0 0 9px 25px;} -ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} -ul{list-style:disc;} -ol{list-style:decimal;} -li{line-height:18px;} -ul.unstyled{margin-left:0;list-style:none;} -dl{margin-bottom:18px;} -dt,dd{line-height:18px;} -dt{font-weight:bold;} -dd{margin-left:9px;} -hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} -strong{font-weight:bold;} -em{font-style:italic;} -.muted{color:#999999;} -abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} -blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} -blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} -blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} -q:before,q:after,blockquote:before,blockquote:after{content:"";} -address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} -small{font-size:100%;} -cite{font-style:normal;} -code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} -pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;} -pre code{padding:0;background-color:transparent;} -form{margin:0 0 18px;} -fieldset{padding:0;margin:0;border:0;} -legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;} -label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} -label{display:block;margin-bottom:5px;color:#333333;} -input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.uneditable-textarea{width:auto;height:auto;} -label input,label textarea,label select{display:block;} -input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;border-radius:0 \0/;} -input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} -select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} -select{width:220px;background-color:#ffffff;} -select[multiple],select[size]{height:auto;} -input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -textarea{height:auto;} -input[type="hidden"]{display:none;} -.radio,.checkbox{padding-left:18px;} -.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} -.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} -.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} -.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} -.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} -input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} -input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} -input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.input-mini{width:60px;} -.input-small{width:90px;} -.input-medium{width:150px;} -.input-large{width:210px;} -.input-xlarge{width:270px;} -.input-xxlarge{width:530px;} -input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} -input.span1,textarea.span1,.uneditable-input.span1{width:50px;} -input.span2,textarea.span2,.uneditable-input.span2{width:130px;} -input.span3,textarea.span3,.uneditable-input.span3{width:210px;} -input.span4,textarea.span4,.uneditable-input.span4{width:290px;} -input.span5,textarea.span5,.uneditable-input.span5{width:370px;} -input.span6,textarea.span6,.uneditable-input.span6{width:450px;} -input.span7,textarea.span7,.uneditable-input.span7{width:530px;} -input.span8,textarea.span8,.uneditable-input.span8{width:610px;} -input.span9,textarea.span9,.uneditable-input.span9{width:690px;} -input.span10,textarea.span10,.uneditable-input.span10{width:770px;} -input.span11,textarea.span11,.uneditable-input.span11{width:850px;} -input.span12,textarea.span12,.uneditable-input.span12{width:930px;} -input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} -.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} -.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} -.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} -.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} -.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} -.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} -.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} -.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} -.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} -input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} -.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} -.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} -:-moz-placeholder{color:#999999;} -::-webkit-input-placeholder{color:#999999;} -.help-block{margin-top:5px;margin-bottom:0;color:#999999;} -.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} -.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} -.input-prepend:after,.input-append:after{clear:both;} -.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} -.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} -.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} -.input-prepend .add-on{*margin-top:1px;} -.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.input-append .uneditable-input{border-right-color:#ccc;} -.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} -.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} -.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} -.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} -.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} -.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} -.control-group{margin-bottom:9px;} -.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} -.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} -.form-horizontal .control-group:after{clear:both;} -.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} -.form-horizontal .controls{margin-left:160px;} -.form-horizontal .form-actions{padding-left:160px;} -table{max-width:100%;border-collapse:collapse;border-spacing:0;} -.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} -.table th{font-weight:bold;vertical-align:bottom;} -.table td{vertical-align:top;} -.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} -.table tbody+tbody{border-top:2px solid #ddd;} -.table-condensed th,.table-condensed td{padding:4px 5px;} -.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} -.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} -.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} -.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} -.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} -.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} -.table-striped tbody tr:nth-child(even) td,.table-striped tbody tr:nth-child(even) th{background-color:#f1f1f1;} -table .span1{float:none;width:44px;margin-left:0;} -table .span2{float:none;width:124px;margin-left:0;} -table .span3{float:none;width:204px;margin-left:0;} -table .span4{float:none;width:284px;margin-left:0;} -table .span5{float:none;width:364px;margin-left:0;} -table .span6{float:none;width:444px;margin-left:0;} -table .span7{float:none;width:524px;margin-left:0;} -table .span8{float:none;width:604px;margin-left:0;} -table .span9{float:none;width:684px;margin-left:0;} -table .span10{float:none;width:764px;margin-left:0;} -table .span11{float:none;width:844px;margin-left:0;} -table .span12{float:none;width:924px;margin-left:0;} -[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} -.icon-white{background-image:url(../img/glyphicons-halflings-white.png);} -.icon-glass{background-position:0 0;} -.icon-music{background-position:-24px 0;} -.icon-search{background-position:-48px 0;} -.icon-envelope{background-position:-72px 0;} -.icon-heart{background-position:-96px 0;} -.icon-star{background-position:-120px 0;} -.icon-star-empty{background-position:-144px 0;} -.icon-user{background-position:-168px 0;} -.icon-film{background-position:-192px 0;} -.icon-th-large{background-position:-216px 0;} -.icon-th{background-position:-240px 0;} -.icon-th-list{background-position:-264px 0;} -.icon-ok{background-position:-288px 0;} -.icon-remove{background-position:-312px 0;} -.icon-zoom-in{background-position:-336px 0;} -.icon-zoom-out{background-position:-360px 0;} -.icon-off{background-position:-384px 0;} -.icon-signal{background-position:-408px 0;} -.icon-cog{background-position:-432px 0;} -.icon-trash{background-position:-456px 0;} -.icon-home{background-position:0 -24px;} -.icon-file{background-position:-24px -24px;} -.icon-time{background-position:-48px -24px;} -.icon-road{background-position:-72px -24px;} -.icon-download-alt{background-position:-96px -24px;} -.icon-download{background-position:-120px -24px;} -.icon-upload{background-position:-144px -24px;} -.icon-inbox{background-position:-168px -24px;} -.icon-play-circle{background-position:-192px -24px;} -.icon-repeat{background-position:-216px -24px;} -.icon-refresh{background-position:-240px -24px;} -.icon-list-alt{background-position:-264px -24px;} -.icon-lock{background-position:-287px -24px;} -.icon-flag{background-position:-312px -24px;} -.icon-headphones{background-position:-336px -24px;} -.icon-volume-off{background-position:-360px -24px;} -.icon-volume-down{background-position:-384px -24px;} -.icon-volume-up{background-position:-408px -24px;} -.icon-qrcode{background-position:-432px -24px;} -.icon-barcode{background-position:-456px -24px;} -.icon-tag{background-position:0 -48px;} -.icon-tags{background-position:-25px -48px;} -.icon-book{background-position:-48px -48px;} -.icon-bookmark{background-position:-72px -48px;} -.icon-print{background-position:-96px -48px;} -.icon-camera{background-position:-120px -48px;} -.icon-font{background-position:-144px -48px;} -.icon-bold{background-position:-167px -48px;} -.icon-italic{background-position:-192px -48px;} -.icon-text-height{background-position:-216px -48px;} -.icon-text-width{background-position:-240px -48px;} -.icon-align-left{background-position:-264px -48px;} -.icon-align-center{background-position:-288px -48px;} -.icon-align-right{background-position:-312px -48px;} -.icon-align-justify{background-position:-336px -48px;} -.icon-list{background-position:-360px -48px;} -.icon-indent-left{background-position:-384px -48px;} -.icon-indent-right{background-position:-408px -48px;} -.icon-facetime-video{background-position:-432px -48px;} -.icon-picture{background-position:-456px -48px;} -.icon-pencil{background-position:0 -72px;} -.icon-map-marker{background-position:-24px -72px;} -.icon-adjust{background-position:-48px -72px;} -.icon-tint{background-position:-72px -72px;} -.icon-edit{background-position:-96px -72px;} -.icon-share{background-position:-120px -72px;} -.icon-check{background-position:-144px -72px;} -.icon-move{background-position:-168px -72px;} -.icon-step-backward{background-position:-192px -72px;} -.icon-fast-backward{background-position:-216px -72px;} -.icon-backward{background-position:-240px -72px;} -.icon-play{background-position:-264px -72px;} -.icon-pause{background-position:-288px -72px;} -.icon-stop{background-position:-312px -72px;} -.icon-forward{background-position:-336px -72px;} -.icon-fast-forward{background-position:-360px -72px;} -.icon-step-forward{background-position:-384px -72px;} -.icon-eject{background-position:-408px -72px;} -.icon-chevron-left{background-position:-432px -72px;} -.icon-chevron-right{background-position:-456px -72px;} -.icon-plus-sign{background-position:0 -96px;} -.icon-minus-sign{background-position:-24px -96px;} -.icon-remove-sign{background-position:-48px -96px;} -.icon-ok-sign{background-position:-72px -96px;} -.icon-question-sign{background-position:-96px -96px;} -.icon-info-sign{background-position:-120px -96px;} -.icon-screenshot{background-position:-144px -96px;} -.icon-remove-circle{background-position:-168px -96px;} -.icon-ok-circle{background-position:-192px -96px;} -.icon-ban-circle{background-position:-216px -96px;} -.icon-arrow-left{background-position:-240px -96px;} -.icon-arrow-right{background-position:-264px -96px;} -.icon-arrow-up{background-position:-289px -96px;} -.icon-arrow-down{background-position:-312px -96px;} -.icon-share-alt{background-position:-336px -96px;} -.icon-resize-full{background-position:-360px -96px;} -.icon-resize-small{background-position:-384px -96px;} -.icon-plus{background-position:-408px -96px;} -.icon-minus{background-position:-433px -96px;} -.icon-asterisk{background-position:-456px -96px;} -.icon-exclamation-sign{background-position:0 -120px;} -.icon-gift{background-position:-24px -120px;} -.icon-leaf{background-position:-48px -120px;} -.icon-fire{background-position:-72px -120px;} -.icon-eye-open{background-position:-96px -120px;} -.icon-eye-close{background-position:-120px -120px;} -.icon-warning-sign{background-position:-144px -120px;} -.icon-plane{background-position:-168px -120px;} -.icon-calendar{background-position:-192px -120px;} -.icon-random{background-position:-216px -120px;} -.icon-comment{background-position:-240px -120px;} -.icon-magnet{background-position:-264px -120px;} -.icon-chevron-up{background-position:-288px -120px;} -.icon-chevron-down{background-position:-313px -119px;} -.icon-retweet{background-position:-336px -120px;} -.icon-shopping-cart{background-position:-360px -120px;} -.icon-folder-close{background-position:-384px -120px;} -.icon-folder-open{background-position:-408px -120px;} -.icon-resize-vertical{background-position:-432px -119px;} -.icon-resize-horizontal{background-position:-456px -118px;} -.dropdown{position:relative;} -.dropdown-toggle{*margin-bottom:-3px;} -.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} -.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} -.dropdown .caret{margin-top:8px;margin-left:2px;} -.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} -.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} -.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} -.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} -.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} -.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} -.dropdown.open .dropdown-menu{display:block;} -.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} -.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} -.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} -.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} -.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} -.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} -.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;} -.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.btn-large .icon{margin-top:1px;} -.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} -.btn-small .icon{margin-top:-1px;} -.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} -.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} -.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} -.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} -.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} -.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} -.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} -.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} -.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} -.btn-success:active,.btn-success.active{background-color:#408140 \9;} -.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} -.btn-info:active,.btn-info.active{background-color:#24748c \9;} -button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} -button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} -button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} -.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} -.btn-group:after{clear:both;} -.btn-group:first-child{*margin-left:0;} -.btn-group+.btn-group{margin-left:5px;} -.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} -.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} -.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} -.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} -.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} -.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} -.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} -.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} -.btn .caret{margin-top:7px;margin-left:0;} -.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} -.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} -.btn-small .caret{margin-top:4px;} -.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.alert,.alert-heading{color:#c09853;} -.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} -.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} -.alert-success,.alert-success .alert-heading{color:#468847;} -.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} -.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} -.alert-info{background-color:#d9edf7;border-color:#bce8f1;} -.alert-info,.alert-info .alert-heading{color:#3a87ad;} -.alert-block{padding-top:14px;padding-bottom:14px;} -.alert-block>p,.alert-block>ul{margin-bottom:0;} -.alert-block p+p{margin-top:5px;} -.nav{margin-left:0;margin-bottom:18px;list-style:none;} -.nav>li>a{display:block;} -.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} -.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} -.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} -.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} -.nav-list>li+.nav-header{margin-top:9px;} -.nav-list .active>a{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} -.nav-list .icon{margin-right:2px;} -.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} -.nav-tabs:after,.nav-pills:after{clear:both;} -.nav-tabs>li,.nav-pills>li{float:left;} -.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} -.nav-tabs{border-bottom:1px solid #ddd;} -.nav-tabs>li{margin-bottom:-1px;} -.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} -.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} -.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} -.nav-stacked>li{float:none;} -.nav-stacked>li>a{margin-right:0;} -.nav-tabs.nav-stacked{border-bottom:0;} -.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} -.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} -.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} -.nav-pills.nav-stacked>li>a{margin-bottom:3px;} -.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} -.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} -.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} -.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} -.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} -.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} -.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} -.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} -.tabs-stacked .open>a:hover{border-color:#999999;} -.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} -.tabbable:after{clear:both;} -.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} -.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} -.tab-content>.active,.pill-content>.active{display:block;} -.tabs-below .nav-tabs{border-top:1px solid #ddd;} -.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} -.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} -.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} -.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} -.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} -.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} -.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} -.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} -.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} -.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} -.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} -.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} -.navbar{overflow:visible;margin-bottom:18px;} -.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} -.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} -.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} -.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} -.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} -.nav-collapse.collapse{height:auto;} -.navbar .brand:hover{text-decoration:none;} -.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} -.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} -.navbar .btn,.navbar .btn-group{margin-top:5px;} -.navbar .btn-group .btn{margin-top:0;} -.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} -.navbar-form:after{clear:both;} -.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} -.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} -.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} -.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} -.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} -.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} -.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} -.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} -.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} -.navbar .nav.pull-right{float:right;} -.navbar .nav>li{display:block;float:left;} -.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} -.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} -.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} -.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} -.navbar .nav.pull-right{margin-left:10px;margin-right:0;} -.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} -.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} -.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} -.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} -.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} -.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} -.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} -.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} -.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} -.breadcrumb .divider{padding:0 5px;color:#999999;} -.breadcrumb .active a{color:#333333;} -.pagination{height:36px;margin:18px 0;} -.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} -.pagination li{display:inline;} -.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} -.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} -.pagination .active a{color:#999999;cursor:default;} -.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} -.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} -.pagination-centered{text-align:center;} -.pagination-right{text-align:right;} -.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} -.pager:after{clear:both;} -.pager li{display:inline;} -.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.pager a:hover{text-decoration:none;background-color:#f5f5f5;} -.pager .next a{float:right;} -.pager .previous a{float:left;} -.modal-open .dropdown-menu{z-index:2050;} -.modal-open .dropdown.open{*z-index:2050;} -.modal-open .popover{z-index:2060;} -.modal-open .tooltip{z-index:2070;} -.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} -.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} -.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} -.modal.fade.in{top:50%;} -.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} -.modal-body{padding:15px;} -.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} -.modal-footer:after{clear:both;} -.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} -.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} -.tooltip.top{margin-top:-2px;} -.tooltip.right{margin-left:2px;} -.tooltip.bottom{margin-top:2px;} -.tooltip.left{margin-left:-2px;} -.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} -.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} -.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} -.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} -.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.tooltip-arrow{position:absolute;width:0;height:0;} -.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} -.popover.right{margin-left:5px;} -.popover.bottom{margin-top:5px;} -.popover.left{margin-left:-5px;} -.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} -.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} -.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} -.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} -.popover .arrow{position:absolute;width:0;height:0;} -.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} -.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} -.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} -.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} -.thumbnails:after{clear:both;} -.thumbnails>li{float:left;margin:0 0 18px 20px;} -.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} -a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} -.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} -.thumbnail .caption{padding:9px;} -.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.label-important{background-color:#b94a48;} -.label-warning{background-color:#f89406;} -.label-success{background-color:#468847;} -.label-info{background-color:#3a87ad;} -@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} -.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} -.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} -.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} -.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} -.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} -.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.accordion{margin-bottom:18px;} -.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.accordion-heading{border-bottom:0;} -.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} -.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} -.carousel{position:relative;margin-bottom:18px;line-height:1;} -.carousel-inner{overflow:hidden;width:100%;position:relative;} -.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} -.carousel .item>img{display:block;line-height:1;} -.carousel .active,.carousel .next,.carousel .prev{display:block;} -.carousel .active{left:0;} -.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} -.carousel .next{left:100%;} -.carousel .prev{left:-100%;} -.carousel .next.left,.carousel .prev.right{left:0;} -.carousel .active.left{left:-100%;} -.carousel .active.right{left:100%;} -.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} -.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} -.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} -.carousel-caption h4,.carousel-caption p{color:#ffffff;} -.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} -.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} -.pull-right{float:right;} -.pull-left{float:left;} -.hide{display:none;} -.show{display:block;} -.invisible{visibility:hidden;} - - -/* Responsive css */ - -/*.hidden{display:none;visibility:hidden;}*/ -/*@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}}*/ diff --git a/doc/source/assets/css/local.css b/doc/source/assets/css/local.css deleted file mode 100644 index c8667c45ff..0000000000 --- a/doc/source/assets/css/local.css +++ /dev/null @@ -1,122 +0,0 @@ - -a.brand { - background: url(../images/small_logo.png) no-repeat left 6px; - width: 166px; - text-indent: -9999px; -} - -code { - background-color: #ffffff; -} - -#home .hero-unit { - background: url(../images/header_bg.png) top left repeat-x; - color: #fff; - padding-left: 25px; - padding-right: 25px; - height: 161px; -} - -#home .hero-unit { - margin-right: ; -} - -h1#main_header { - background: url(../images/logo.png) top left no-repeat; - text-indent: -9999px; -} - -.sub_header { - font-size: 12px; - font-family: "anivers"; - font-weight: normal; - width: 420px; -} - -#home .hero-unit a { - color: #fff; - text-decoration: underline; -} - -.clear { - clear: both; -} - -ol#getting_started { - list-style: none; - width: 396px; - margin-top: -45px; - margin-right: 0; - margin-left: 72px; -} - -ol#getting_started li { - background: url(../images/quickstart.png) top left no-repeat; -} - -ol#getting_started li pre { - font-size: 11px; - padding: 5px; - background: #4d7ead; - border-color: #2c5d8d; - color: #fff; - overflow: auto; -} - -li#ubuntu { - height: 46px; - padding: ; - padding-left: 82px; - padding-top: 27px; - margin-bottom: 14px; -} - -li#git { - background-position: left -70px !important; - height: 61px; - padding: ; - padding-left: 82px; - padding-top: 4px; - margin-bottom: 25px; -} - - -li#install { - background-position: left bottom !important; - height: 61px; - padding: ; - padding-left: 82px; - padding-top: 4px; - margin-bottom: 25px; -} - -h2 small { - font-size: 12px; - font-style: italic; -} - -.container section { - margin-bottom: 25px; -} - - -thead, tfoot{ - background: #ededed; - color: #444444; -} - -table { - color: #444; -} -a.table-action { - display: block; - width: 45px; -} - -footer { - clear: both; -} - -.wat { - margin-top: 33px; -} diff --git a/doc/source/assets/images/header_bg.png b/doc/source/assets/images/header_bg.png deleted file mode 100644 index 4e6b2b899b5787479204ae00ebe2c4fdb8e3ece1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1014 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 U(KlZnG>=$XYTByR%I_ln2eN+=Qvd(} literal 0 HcmV?d00001 diff --git a/doc/source/assets/images/logo-blue.xcf b/doc/source/assets/images/logo-blue.xcf new file mode 100644 index 0000000000000000000000000000000000000000..fff75ee21d4035be50343b3ff766966582822cb0 GIT binary patch literal 33947 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 literal 0 HcmV?d00001 diff --git a/doc/source/assets/images/quickstart.png b/doc/source/assets/images/quickstart.png deleted file mode 100644 index 735617b8cd4845e1afa9b85524c96d9015fbc410..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9491 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 V6fLn*CGz?bpe(O0S0iH?{y%IZ@nHY} diff --git a/doc/source/assets/js/bootstrap.js b/doc/source/assets/js/bootstrap.js deleted file mode 100644 index c832ccb2e6..0000000000 --- a/doc/source/assets/js/bootstrap.js +++ /dev/null @@ -1,1722 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * 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. - * ========================================================== */ - -!function( $ ) { - - $(function () { - - "use strict" - - /* CSS TRANSITION SUPPORT (https://gist.github.com/373874) - * ======================================================= */ - - $.support.transition = (function () { - var thisBody = document.body || document.documentElement - , thisStyle = thisBody.style - , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined - - return support && { - end: (function () { - var transitionEnd = "TransitionEnd" - if ( $.browser.webkit ) { - transitionEnd = "webkitTransitionEnd" - } else if ( $.browser.mozilla ) { - transitionEnd = "transitionend" - } else if ( $.browser.opera ) { - transitionEnd = "oTransitionEnd" - } - return transitionEnd - }()) - } - })() - - }) - -}( window.jQuery ) -/* ========================================================== - * bootstrap-alert.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * 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. - * ========================================================== */ - - -!function( $ ){ - - "use strict" - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function ( el ) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype = { - - constructor: Alert - - , close: function ( e ) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.trigger('close') - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.removeClass('in') - - function removeElement() { - $parent.remove() - $parent.trigger('closed') - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - $.fn.alert = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT DATA-API - * ============== */ - - $(function () { - $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) - }) - -}( window.jQuery ) -/* ============================================================ - * bootstrap-button.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * 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. - * ============================================================ */ - -!function( $ ){ - - "use strict" - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function ( element, options ) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype = { - - constructor: Button - - , setState: function ( state ) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - , toggle: function () { - var $parent = this.$element.parent('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - $.fn.button = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON DATA-API - * =============== */ - - $(function () { - $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { - $(e.target).button('toggle') - }) - }) - -}( window.jQuery ) -/* ========================================================== - * bootstrap-carousel.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * 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. - * ========================================================== */ - - -!function( $ ){ - - "use strict" - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.carousel.defaults, options) - this.options.slide && this.slide(this.options.slide) - } - - Carousel.prototype = { - - cycle: function () { - this.interval = setInterval($.proxy(this.next, this), this.options.interval) - return this - } - - , to: function (pos) { - var $active = this.$element.find('.active') - , children = $active.parent().children() - , activePos = children.index($active) - , that = this - - if (pos > (children.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activePos == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) - } - - , pause: function () { - clearInterval(this.interval) - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - if (!$.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger('slide') - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } else { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.trigger('slide') - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - $.fn.carousel = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = typeof option == 'object' && option - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (typeof option == 'string' || (option = options.slide)) data[option]() - else data.cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL DATA-API - * ================= */ - - $(function () { - $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) - $target.carousel(options) - e.preventDefault() - }) - }) - -}( window.jQuery ) -/* ============================================================= - * bootstrap-collapse.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * 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. - * ============================================================ */ - -!function( $ ){ - - "use strict" - - var Collapse = function ( element, options ) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options["parent"]) { - this.$parent = $(this.options["parent"]) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension = this.dimension() - , scroll = $.camelCase(['scroll', dimension].join('-')) - , actives = this.$parent && this.$parent.find('.in') - , hasData - - if (actives && actives.length) { - hasData = actives.data('collapse') - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', 'show', 'shown') - this.$element[dimension](this.$element[0][scroll]) - - } - - , hide: function () { - var dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', 'hide', 'hidden') - this.$element[dimension](0) - } - - , reset: function ( size ) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element.addClass('collapse') - } - - , transition: function ( method, startEvent, completeEvent ) { - var that = this - , complete = function () { - if (startEvent == 'show') that.reset() - that.$element.trigger(completeEvent) - } - - this.$element - .trigger(startEvent) - [method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - /* COLLAPSIBLE PLUGIN DEFINITION - * ============================== */ - - $.fn.collapse = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = typeof option == 'object' && option - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSIBLE DATA-API - * ==================== */ - - $(function () { - $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $(target).collapse(option) - }) - }) - -}( window.jQuery ) -/* ============================================================ - * bootstrap-dropdown.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * 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. - * ============================================================ */ - - -!function( $ ){ - - "use strict" - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle="dropdown"]' - , Dropdown = function ( element ) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function ( e ) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - , isActive - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.length || ($parent = $this.parent()) - - isActive = $parent.hasClass('open') - - clearMenus() - !isActive && $parent.toggleClass('open') - - return false - } - - } - - function clearMenus() { - $(toggle).parent().removeClass('open') - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - $.fn.dropdown = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(function () { - $('html').on('click.dropdown.data-api', clearMenus) - $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) - }) - -}( window.jQuery ) -/* ========================================================= - * bootstrap-modal.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, Inc. - * - * 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. - * ========================================================= */ - - -!function( $ ){ - - "use strict" - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function ( content, options ) { - this.options = $.extend({}, $.fn.modal.defaults, options) - this.$element = $(content) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - - if (this.isShown) return - - $('body').addClass('modal-open') - - this.isShown = true - this.$element.trigger('show') - - escape.call(this) - backdrop.call(this, function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position - - that.$element - .show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : - that.$element.trigger('shown') - - }) - } - - , hide: function ( e ) { - e && e.preventDefault() - - if (!this.isShown) return - - var that = this - this.isShown = false - - $('body').removeClass('modal-open') - - escape.call(this) - - this.$element - .trigger('hide') - .removeClass('in') - - $.support.transition && this.$element.hasClass('fade') ? - hideWithTransition.call(this) : - hideModal.call(this) - } - - } - - - /* MODAL PRIVATE METHODS - * ===================== */ - - function hideWithTransition() { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - hideModal.call(that) - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - hideModal.call(that) - }) - } - - function hideModal( that ) { - this.$element - .hide() - .trigger('hidden') - - backdrop.call(this) - } - - function backdrop( callback ) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('