Merge "Enable DIB service to build with minimal net access"
diff --git a/docs/source/guides/multinode-lab.html b/docs/source/guides/multinode-lab.html
index db8be08..62232ef 100644
--- a/docs/source/guides/multinode-lab.html
+++ b/docs/source/guides/multinode-lab.html
@@ -247,7 +247,7 @@
         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 <code>swift</code> service in <code>local.conf</code>:
-        <pre>enable_service swift</pre>
+        <pre>enable_service s-proxy s-object s-container s-account</pre>
 
         <p>Swift will put its data files in <code>SWIFT_DATA_DIR</code> (default <code>/opt/stack/data/swift</code>).
         The size of the data 'partition' created (really a loop-mounted file) is set by
diff --git a/docs/source/stackrc.html b/docs/source/stackrc.html
index 23a48c5..d83fbc1 100644
--- a/docs/source/stackrc.html
+++ b/docs/source/stackrc.html
@@ -66,8 +66,8 @@
             Certificate Authentication), Cinder (Scheduler, API, Volume), Horizon, MySQL, RabbitMQ, Tempest.
             <pre>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</pre>
             Other services that are not enabled by default can be enabled in
-            <code>localrc</code>. For example, to add Swift:
-            <pre>enable_service swift</pre>
+            <code>localrc</code>. For example, to add Swift, use the following service names:
+            <pre>enable_service s-proxy s-object s-container s-account</pre>
             A service can similarly be disabled:
             <pre>disable_service horizon</pre></dd>
 
diff --git a/functions b/functions
index bbde27d..bb40a48 100644
--- a/functions
+++ b/functions
@@ -48,10 +48,10 @@
         fi
         image="$FILES/${image_fname}"
     else
-        # File based URL (RFC 1738): file://host/path
+        # File based URL (RFC 1738): ``file://host/path``
         # Remote files are not considered here.
-        # *nix: file:///home/user/path/file
-        # windows: file:///C:/Documents%20and%20Settings/user/path/file
+        # unix: ``file:///home/user/path/file``
+        # windows: ``file:///C:/Documents%20and%20Settings/user/path/file``
         image=$(echo $image_url | sed "s/^file:\/\///g")
         if [[ ! -f $image || "$(stat -c "%s" $image)" == "0" ]]; then
             echo "Not found: $image_url"
@@ -100,7 +100,7 @@
         if [[ "$vmdk_create_type" = "monolithicSparse" ]]; then
             vmdk_disktype="sparse"
         elif [[ "$vmdk_create_type" = "monolithicFlat" || "$vmdk_create_type" = "vmfs" ]]; then
-            # Attempt to retrieve the *-flat.vmdk
+            # Attempt to retrieve the ``*-flat.vmdk``
             local flat_fname="$(head -25 $image | { grep -G 'RW\|RDONLY [0-9]+ FLAT\|VMFS' $image || true; })"
             flat_fname="${flat_fname#*\"}"
             flat_fname="${flat_fname%?}"
diff --git a/functions-common b/functions-common
index c597651..5b29fd3 100644
--- a/functions-common
+++ b/functions-common
@@ -31,6 +31,7 @@
 # - ``TRACK_DEPENDS``
 # - ``UNDO_REQUIREMENTS``
 # - ``http_proxy``, ``https_proxy``, ``no_proxy``
+#
 
 # Save trace setting
 XTRACE=$(set +o | grep xtrace)
@@ -1270,7 +1271,8 @@
         # - 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
+        # 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
diff --git a/lib/cinder_backends/xiv b/lib/cinder_backends/xiv
index dbdb96c..ee5da2d 100644
--- a/lib/cinder_backends/xiv
+++ b/lib/cinder_backends/xiv
@@ -16,6 +16,7 @@
 #
 # Authors:
 #   Alon Marx <alonma@il.ibm.com>
+#
 
 # lib/cinder_plugins/xiv
 # Configure the xiv_ds8k driver for xiv testing
@@ -61,7 +62,7 @@
     fi
 
     # For reference:
-    # XIV_DS8K_BACKEND='IBM-XIV_'${SAN_IP}'_'${SAN_CLUSTERNAME}'_'${CONNECTION_TYPE}
+    # ``XIV_DS8K_BACKEND='IBM-XIV_'${SAN_IP}'_'${SAN_CLUSTERNAME}'_'${CONNECTION_TYPE}``
     iniset $CINDER_CONF DEFAULT xiv_ds8k_driver_version $XIV_DRIVER_VERSION
 
     iniset $CINDER_CONF $be_name san_ip $SAN_IP
diff --git a/lib/config b/lib/config
index 0baa4cc..a0b9b0a 100644
--- a/lib/config
+++ b/lib/config
@@ -82,6 +82,8 @@
     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 { section = "" }
@@ -95,7 +97,7 @@
         }
         /^[^ \t]+/ {
             split($0, d, " *= *")
-            print "iniset " configfile " " section " " d[1] " \"" d[2] "\""
+            print "iniset " configfile " " section " " d[1] " \x27" d[2] "\x27 "
         }
     ' | while read a; do eval "$a"; done
 
diff --git a/lib/heat b/lib/heat
index 737598d..53eca25 100644
--- a/lib/heat
+++ b/lib/heat
@@ -276,7 +276,7 @@
                 --os-identity-api-version=3 domain create heat \
                 --description "Owns users and projects created by heat" \
                 | grep ' id ' | get_field 2)
-            iniset $HEAT_CONF DEFAULT stack_user_domain ${D_ID}
+            iniset $HEAT_CONF DEFAULT stack_user_domain_id ${D_ID}
 
             openstack --os-token $OS_TOKEN --os-url=$ks_endpoint_v3 \
                 --os-identity-api-version=3 user create --password $SERVICE_PASSWORD \
diff --git a/lib/neutron b/lib/neutron
index a48f519..2253eda 100644
--- a/lib/neutron
+++ b/lib/neutron
@@ -186,9 +186,10 @@
 
 # Distributed Virtual Router (DVR) configuration
 # Can be:
-#     legacy   - No DVR functionality
-#     dvr_snat - Controller or single node DVR
-#     dvr      - Compute node in multi-node DVR
+# - ``legacy``   - No DVR functionality
+# - ``dvr_snat`` - Controller or single node DVR
+# - ``dvr``      - Compute node in multi-node DVR
+#
 Q_DVR_MODE=${Q_DVR_MODE:-legacy}
 if [[ "$Q_DVR_MODE" != "legacy" ]]; then
     Q_ML2_PLUGIN_MECHANISM_DRIVERS=openvswitch,linuxbridge,l2population
diff --git a/lib/neutron_plugins/oneconvergence b/lib/neutron_plugins/oneconvergence
index e5f0d71..4fd8c7c 100644
--- a/lib/neutron_plugins/oneconvergence
+++ b/lib/neutron_plugins/oneconvergence
@@ -1,5 +1,6 @@
 # Neutron One Convergence plugin
-# ---------------------------
+# ------------------------------
+
 # Save trace setting
 OC_XTRACE=$(set +o | grep xtrace)
 set +o xtrace
diff --git a/lib/nova b/lib/nova
index fa57432..122f17e 100644
--- a/lib/nova
+++ b/lib/nova
@@ -706,7 +706,7 @@
 
     if [[ "$VIRT_DRIVER" = 'libvirt' ]]; then
         # The group **$LIBVIRT_GROUP** is added to the current user in this script.
-        # sg' will be used in run_process to execute nova-compute as a member of the
+        # ``sg`` is used in run_process to execute nova-compute as a member of the
         # **$LIBVIRT_GROUP** group.
         run_process n-cpu "$NOVA_BIN_DIR/nova-compute --config-file $compute_cell_conf" $LIBVIRT_GROUP
     elif [[ "$VIRT_DRIVER" = 'fake' ]]; then
@@ -763,7 +763,14 @@
 }
 
 function stop_nova_compute {
-    stop_process n-cpu
+    if [ "$VIRT_DRIVER" == "fake" ]; then
+        local i
+        for i in `seq 1 $NUMBER_FAKE_NOVA_COMPUTE`; do
+            stop_process n-cpu-${i}
+        done
+    else
+        stop_process n-cpu
+    fi
     if is_service_enabled n-cpu && [[ -r $NOVA_PLUGINS/hypervisor-$VIRT_DRIVER ]]; then
         stop_nova_hypervisor
     fi
diff --git a/lib/nova_plugins/functions-libvirt b/lib/nova_plugins/functions-libvirt
index 6b9db48..d3c4eab 100644
--- a/lib/nova_plugins/functions-libvirt
+++ b/lib/nova_plugins/functions-libvirt
@@ -10,7 +10,7 @@
 set +o xtrace
 
 # Defaults
-# -------
+# --------
 
 # if we should turn on massive libvirt debugging
 DEBUG_LIBVIRT=$(trueorfalse False $DEBUG_LIBVIRT)
diff --git a/lib/opendaylight b/lib/opendaylight
index 1541ac1..cc29deb 100644
--- a/lib/opendaylight
+++ b/lib/opendaylight
@@ -3,9 +3,9 @@
 
 # Dependencies:
 #
-# - ``functions`` file
-# # ``DEST`` must be defined
-# # ``STACK_USER`` must be defined
+# ``functions`` file
+# ``DEST`` must be defined
+# ``STACK_USER`` must be defined
 
 # ``stack.sh`` calls the entry points in this order:
 #
@@ -55,7 +55,7 @@
 
 # Default arguments for OpenDaylight. This is typically used to set
 # Java memory options.
-#   ODL_ARGS=Xmx1024m -XX:MaxPermSize=512m
+# ``ODL_ARGS=Xmx1024m -XX:MaxPermSize=512m``
 ODL_ARGS=${ODL_ARGS:-"-XX:MaxPermSize=384m"}
 
 # How long to pause after ODL starts to let it complete booting
@@ -64,8 +64,6 @@
 # The physical provider network to device mapping
 ODL_PROVIDER_MAPPINGS=${ODL_PROVIDER_MAPPINGS:-physnet1:eth1}
 
-# Set up default directories
-
 
 # Entry Points
 # ------------
@@ -139,6 +137,7 @@
     # The flags to ODL have the following meaning:
     #   -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"
diff --git a/lib/tls b/lib/tls
index 15e8692..fdb798f 100644
--- a/lib/tls
+++ b/lib/tls
@@ -433,7 +433,7 @@
 
 
 # Cleanup Functions
-# ===============
+# =================
 
 
 # Stops all stud processes. This should be done only after all services
diff --git a/stack.sh b/stack.sh
index 0cec623..3b5fb74 100755
--- a/stack.sh
+++ b/stack.sh
@@ -234,15 +234,35 @@
 
 if [[ is_fedora && ( $DISTRO == "rhel6" || $DISTRO == "rhel7" ) ]]; then
     # RHEL requires EPEL for many Open Stack dependencies
-    if [[ $DISTRO == "rhel7" ]]; then
-        EPEL_RPM=${RHEL7_EPEL_RPM:-"http://dl.fedoraproject.org/pub/epel/beta/7/x86_64/epel-release-7-1.noarch.rpm"}
-    elif [[ $DISTRO == "rhel6" ]]; then
-        EPEL_RPM=${RHEL6_EPEL_RPM:-"http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm"}
-    fi
     if ! sudo yum repolist enabled epel | grep -q 'epel'; then
         echo "EPEL not detected; installing"
-        yum_install ${EPEL_RPM} || \
+        # 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 <<EOF | sudo tee /etc/yum.repos.d/epel-bootstrap.repo
+[epel]
+name=Bootstrap EPEL
+mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-$epel_ver&arch=\$basearch
+failovermethod=priority
+enabled=0
+gpgcheck=0
+EOF
+        # bare yum call due to --enablerepo
+        sudo yum --enablerepo=epel -y install epel-release || \
             die $LINENO "Error installing EPEL repo, cannot continue"
+        # epel rpm has installed it's version
+        sudo rm -f /etc/yum.repos.d/epel-bootstrap.repo
     fi
 
     # ... and also optional to be enabled
diff --git a/stackrc b/stackrc
index af45c77..3899525 100644
--- a/stackrc
+++ b/stackrc
@@ -120,7 +120,7 @@
 # ------------
 
 # Base GIT Repo URL
-# Another option is http://review.openstack.org/p
+# Another option is https://git.openstack.org
 GIT_BASE=${GIT_BASE:-git://git.openstack.org}
 
 ##############
diff --git a/tests/test_config.sh b/tests/test_config.sh
index 2634ce0..7cf75d0 100755
--- a/tests/test_config.sh
+++ b/tests/test_config.sh
@@ -91,6 +91,10 @@
 [[test4|\$TEST4_DIR/\$TEST4_FILE]]
 [fff]
 type=new
+
+[[test-quote|test-quote.conf]]
+[foo]
+foo="foo bar" "baz"
 EOF
 
 echo -n "get_meta_section_files: test0 doesn't exist: "
@@ -206,6 +210,15 @@
 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)
+EXPECT_VAL='
+[foo]
+foo = "foo bar" "baz"'
+check_result "$VAL" "$EXPECT_VAL"
+
 echo -n "merge_config_group test4 variable filename: "
 setup_test4
 merge_config_group test.conf test4
@@ -225,5 +238,5 @@
 type = new"
 check_result "$VAL" "$EXPECT_VAL"
 
-rm -f test.conf test1c.conf test2a.conf test-space.conf
+rm -f test.conf test1c.conf test2a.conf test-quote.conf test-space.conf
 rm -rf test-etc
diff --git a/tools/create_userrc.sh b/tools/create_userrc.sh
index 863fe03..6a07be4 100755
--- a/tools/create_userrc.sh
+++ b/tools/create_userrc.sh
@@ -245,7 +245,7 @@
 }
 
 if [ $MODE != "create" ]; then
-# looks like I can't ask for all tenant related to a specified user
+    # looks like I can't ask for all tenant related to a specified user
     openstack project list --long --quote none -f csv | grep ',True' | grep -v "${SKIP_TENANT}" | while IFS=, read tenant_id tenant_name desc enabled; do
         openstack user list --project $tenant_id --long --quote none -f csv | grep ',True' | while IFS=, read user_id user_name project email enabled; do
             if [ $MODE = one -a "$user_name" != "$USER_NAME" ]; then
@@ -253,8 +253,7 @@
             fi
 
             # Checks for a specific password defined for an user.
-            # Example for an username johndoe:
-            #                     JOHNDOE_PASSWORD=1234
+            # Example for an username johndoe: JOHNDOE_PASSWORD=1234
             eval SPECIFIC_UPASSWORD="\$${USER_NAME^^}_PASSWORD"
             if [ -n "$SPECIFIC_UPASSWORD" ]; then
                 USER_PASS=$SPECIFIC_UPASSWORD