Merge "Update multiple backend configuration in tempest script"
diff --git a/HACKING.rst b/HACKING.rst
index d69bb49..3b86529 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -10,8 +10,8 @@
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/MAINTAINERS.rst b/MAINTAINERS.rst
index d754c08..d55135d 100644
--- a/MAINTAINERS.rst
+++ b/MAINTAINERS.rst
@@ -48,7 +48,7 @@
OpenDaylight
~~~~~~~~~~~~
-* Kyle Mestery <kmestery@cisco.com>
+* Kyle Mestery <mestery@mestery.com>
OpenFlow Agent (ofagent)
~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/source/assets/css/local.css b/doc/source/assets/css/local.css
index 5c703af..c8667c4 100644
--- a/doc/source/assets/css/local.css
+++ b/doc/source/assets/css/local.css
@@ -71,7 +71,7 @@
margin-bottom: 14px;
}
-li#github {
+li#git {
background-position: left -70px !important;
height: 61px;
padding: ;
@@ -119,4 +119,4 @@
.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 5400a6f..735617b 100644
--- a/doc/source/assets/images/quickstart.png
+++ b/doc/source/assets/images/quickstart.png
Binary files differ
diff --git a/doc/source/changes.html b/doc/source/changes.html
index 966b0c9..028e1cf 100644
--- a/doc/source/changes.html
+++ b/doc/source/changes.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/doc/source/configuration.html b/doc/source/configuration.html
index 044bafc..88d7476 100644
--- a/doc/source/configuration.html
+++ b/doc/source/configuration.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/doc/source/contributing.html b/doc/source/contributing.html
index f3d4b5a..9826fc7 100644
--- a/doc/source/contributing.html
+++ b/doc/source/contributing.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
@@ -52,7 +52,7 @@
<h3>Things To Know</h3>
<br /><strong>Where Things Are</strong>
- <p>The official DevStack repository is located at <code>git://github.com/openstack-dev/devstack.git</code> and <code>git://git.openstack.org/openstack-dev/devstack.git</code>, both mirrors of the official repo maintained by Gerrit.</p>
+ <p>The official DevStack repository is located at <code>git://git.openstack.org/openstack-dev/devstack.git</code>, replicated from the repo maintained by Gerrit. GitHub also has a mirror at <code>git://github.com/openstack-dev/devstack.git</code>.</p>
<p>The <a href="https://blueprints.launchpad.net/devstack">blueprint</a> and <a href="https://bugs.launchpad.net/devstack">bug trackers</a> 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.</p>
<p>The <a href="https://review.openstack.org/#/q/project:openstack-dev/devstack,n,z">Gerrit review queue</a> is, however, used for all commits except for the text of this website. That should also change in the near future.</p>
diff --git a/doc/source/eucarc.html b/doc/source/eucarc.html
index df52972..1dd8096 100644
--- a/doc/source/eucarc.html
+++ b/doc/source/eucarc.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/doc/source/exerciserc.html b/doc/source/exerciserc.html
index 7e4dd54..313b0a1 100644
--- a/doc/source/exerciserc.html
+++ b/doc/source/exerciserc.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/doc/source/faq.html b/doc/source/faq.html
index 2c74a66..7cbb9d2 100644
--- a/doc/source/faq.html
+++ b/doc/source/faq.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
@@ -73,7 +73,7 @@
<dd>A: DevStack is optimized for documentation & developers. As some of us use <a href="https://github.com/dellcloudedge/crowbar">Crowbar</a> for production deployments, we hope developers documenting how they setup systems for new features supports projects like Crowbar.</dd>
<dt>Q: I'd like to help!</dt>
- <dd>A: That isn't a question, but please do! The source for DevStack is <a href="http://github.com/openstack-dev/devstack">github</a> and bug reports go to <a href="http://bugs.launchpad.net/devstack/">LaunchPad</a>. Contributions follow the usual process as described in the <a href="http://wiki.openstack.org/HowToContribute">OpenStack wiki</a> even though DevStack is not an official OpenStack project. This site is housed in the CloudBuilder's <a href="http://github.com/cloudbuilders/devstack">github</a> in the gh-pages branch.</dd>
+ <dd>A: That isn't a question, but please do! The source for DevStack is at <a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a> and bug reports go to <a href="http://bugs.launchpad.net/devstack/">LaunchPad</a>. Contributions follow the usual process as described in the <a href="http://wiki.openstack.org/HowToContribute">OpenStack wiki</a> even though DevStack is not an official OpenStack project. This site is housed in the CloudBuilder's <a href="http://github.com/cloudbuilders/devstack">github</a> in the gh-pages branch.</dd>
<dt>Q: Why not use packages?</dt>
<dd>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.</dd>
diff --git a/doc/source/guides/multinode-lab.html b/doc/source/guides/multinode-lab.html
index 62232ef..6a5f98c 100644
--- a/doc/source/guides/multinode-lab.html
+++ b/doc/source/guides/multinode-lab.html
@@ -34,7 +34,7 @@
<li><a href="../overview.html">Overview</a></li>
<li><a href="../changes.html">Changes</a></li>
<li><a href="../faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
@@ -129,8 +129,8 @@
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyYjfgyPazTvGpd8OaAvtU2utL8W6gWC4JdRS1J95GhNNfQd657yO6s1AH5KYQWktcE6FO/xNUC2reEXSGC7ezy+sGO1kj9Limv5vrvNHvF1+wts0Cmyx61D2nQw35/Qz8BvpdJANL7VwP/cFI/p3yhvx2lsnjFE3hN8xRB2LtLUopUSVdBwACOVUmH2G+2BWMJDjVINd2DPqRIA4Zhy09KJ3O1Joabr0XpQL0yt/I9x8BVHdAx6l9U0tMg9dj5+tAjZvMAFfye3PJcYwwsfJoFxC8w/SLtqlFX7Ehw++8RtvomvuipLdmWCy+T9hIkl+gHYE4cS3OIqXH7f49jdJf jesse@spacey.local" > ~/.ssh/authorized_keys</pre>
<h3>Download DevStack</h3>
- <p>Grab the latest version of DevStack from github:</p>
- <pre>git clone https://github.com/openstack-dev/devstack.git
+ <p>Grab the latest version of DevStack:</p>
+ <pre>git clone https://git.openstack.org/openstack-dev/devstack
cd devstack</pre>
<p>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 4dc61a3..d52b25f 100644
--- a/doc/source/guides/pxe-boot.html
+++ b/doc/source/guides/pxe-boot.html
@@ -34,7 +34,7 @@
<li><a href="../overview.html">Overview</a></li>
<li><a href="../changes.html">Changes</a></li>
<li><a href="../faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/doc/source/guides/ramdisk.html b/doc/source/guides/ramdisk.html
index eaef16e..23239e2 100644
--- a/doc/source/guides/ramdisk.html
+++ b/doc/source/guides/ramdisk.html
@@ -34,7 +34,7 @@
<li><a href="../overview.html">Overview</a></li>
<li><a href="../changes.html">Changes</a></li>
<li><a href="../faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
@@ -74,7 +74,7 @@
<h3>Install DevStack</h3>
<p>Grab the latest version of DevStack via https:</p>
<pre>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</pre>
<h3>Prepare the Boot RAMdisk</h3>
diff --git a/doc/source/guides/single-machine.html b/doc/source/guides/single-machine.html
index 9471972..06cc981 100644
--- a/doc/source/guides/single-machine.html
+++ b/doc/source/guides/single-machine.html
@@ -34,7 +34,7 @@
<li><a href="../overview.html">Overview</a></li>
<li><a href="../changes.html">Changes</a></li>
<li><a href="../faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
@@ -79,7 +79,7 @@
<h3>Download DevStack</h3>
<p>We'll grab the latest version of DevStack via https:</p>
<pre>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</pre>
<h3>Run DevStack</h3>
diff --git a/doc/source/guides/single-vm.html b/doc/source/guides/single-vm.html
index 2f1990a..d189319 100644
--- a/doc/source/guides/single-vm.html
+++ b/doc/source/guides/single-vm.html
@@ -34,7 +34,7 @@
<li><a href="../overview.html">Overview</a></li>
<li><a href="../changes.html">Changes</a></li>
<li><a href="../faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
@@ -96,7 +96,7 @@
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 75adc6f..2a05f89 100644
--- a/doc/source/guides/usb-boot.html
+++ b/doc/source/guides/usb-boot.html
@@ -34,7 +34,7 @@
<li><a href="../overview.html">Overview</a></li>
<li><a href="../changes.html">Changes</a></li>
<li><a href="../faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/doc/source/index.html b/doc/source/index.html
index dada57d..5f1efd7 100644
--- a/doc/source/index.html
+++ b/doc/source/index.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
@@ -55,9 +55,9 @@
<div class="pull-left">
<ol id="getting_started">
<li id="ubuntu">Setup a fresh supported Linux installation.</li>
- <li id="github">
- Clone devstack from devstack.
- <pre>git clone https://github.com/openstack-dev/devstack.git</pre>
+ <li id="git">
+ Clone devstack from git.openstack.org.
+ <pre>git clone https://git.openstack.org/openstack-dev/devstack</pre>
</li>
<li id="install">
Deploy your OpenStack Cloud
@@ -84,7 +84,7 @@
</li>
<li>
<h3>Download DevStack</h3>
- <pre>git clone https://github.com/openstack-dev/devstack.git</pre>
+ <pre>git clone https://git.openstack.org/openstack-dev/devstack</pre>
<p>The <code>devstack</code> repo contains a script that installs OpenStack and templates for configuration files</p>
</li>
<li>
diff --git a/doc/source/local.conf.html b/doc/source/local.conf.html
index ed53adf..2635ac6 100644
--- a/doc/source/local.conf.html
+++ b/doc/source/local.conf.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/doc/source/localrc.html b/doc/source/localrc.html
index 0f669bd..40a2004 100644
--- a/doc/source/localrc.html
+++ b/doc/source/localrc.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/doc/source/openrc.html b/doc/source/openrc.html
index da6697f..94b253d 100644
--- a/doc/source/openrc.html
+++ b/doc/source/openrc.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/doc/source/overview.html b/doc/source/overview.html
index baee400..9cee052 100644
--- a/doc/source/overview.html
+++ b/doc/source/overview.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/doc/source/plugins.html b/doc/source/plugins.html
index 3327128..700a209 100644
--- a/doc/source/plugins.html
+++ b/doc/source/plugins.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/doc/source/stackrc.html b/doc/source/stackrc.html
index d83fbc1..2df9d38 100644
--- a/doc/source/stackrc.html
+++ b/doc/source/stackrc.html
@@ -34,7 +34,7 @@
<li><a href="overview.html">Overview</a></li>
<li><a href="changes.html">Changes</a></li>
<li><a href="faq.html">FAQ</a></li>
- <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li>
+ <li><a href="https://git.openstack.org/cgit/openstack-dev/devstack">git.openstack.org</a></li>
<li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li>
</ul>
</div>
diff --git a/files/apts/general b/files/apts/general
index c308c46..3fe7863 100644
--- a/files/apts/general
+++ b/files/apts/general
@@ -27,3 +27,4 @@
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 7a35961..d4a9fcb 100644
--- a/files/rpms/general
+++ b/files/rpms/general
@@ -26,6 +26,7 @@
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/functions-common b/functions-common
index 9f4acfe..e6f425f 100644
--- a/functions-common
+++ b/functions-common
@@ -119,6 +119,33 @@
[ -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 {
@@ -1224,7 +1251,7 @@
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" &
@@ -1232,14 +1259,14 @@
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
@@ -1247,38 +1274,36 @@
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"
+ # Append the process to the screen rc file
+ screen_rc "$name" "$command"
- screen -S $SCREEN_NAME -X screen -t $service
+ screen -S $SCREEN_NAME -X screen -t $name
- 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
-
- # 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 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
@@ -1385,12 +1410,12 @@
# 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
}
@@ -1449,7 +1474,7 @@
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
diff --git a/lib/ceilometer b/lib/ceilometer
index c997de7..9046b9d 100644
--- a/lib/ceilometer
+++ b/lib/ceilometer
@@ -155,6 +155,11 @@
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
@@ -177,7 +182,7 @@
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
@@ -242,6 +247,9 @@
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
diff --git a/lib/config b/lib/config
index b44e79a..a4d59a3 100644
--- a/lib/config
+++ b/lib/config
@@ -86,7 +86,11 @@
# 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 @@
# 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/lib/horizon b/lib/horizon
index 755be18..0213948 100644
--- a/lib/horizon
+++ b/lib/horizon
@@ -84,6 +84,14 @@
# 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 @@
# 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 @@
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
diff --git a/lib/ironic b/lib/ironic
index 5f3ebcd..1541dcf 100644
--- a/lib/ironic
+++ b/lib/ironic
@@ -354,6 +354,15 @@
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 @@
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 @@
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/lib/neutron b/lib/neutron
index 2253eda..ca9b16c 100644
--- a/lib/neutron
+++ b/lib/neutron
@@ -148,16 +148,31 @@
# 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 @@
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/cisco b/lib/neutron_plugins/cisco
index 1406e37..95e0ab3 100644
--- a/lib/neutron_plugins/cisco
+++ b/lib/neutron_plugins/cisco
@@ -82,6 +82,7 @@
}
function neutron_plugin_configure_debug_command {
+ :
}
function neutron_plugin_configure_dhcp_agent {
@@ -89,6 +90,7 @@
}
function neutron_plugin_configure_l3_agent {
+ :
}
# Configure n1kv plugin
@@ -111,6 +113,7 @@
}
function neutron_plugin_configure_plugin_agent {
+ :
}
function neutron_plugin_configure_service {
diff --git a/lib/neutron_plugins/ofagent_agent b/lib/neutron_plugins/ofagent_agent
index a5a58f4..1c04f2f 100644
--- a/lib/neutron_plugins/ofagent_agent
+++ b/lib/neutron_plugins/ofagent_agent
@@ -77,6 +77,10 @@
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 d913f7c..f0ef194 100644
--- a/lib/neutron_plugins/ovs_base
+++ b/lib/neutron_plugins/ovs_base
@@ -79,11 +79,20 @@
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 {
diff --git a/lib/opendaylight b/lib/opendaylight
index cc29deb..374de95 100644
--- a/lib/opendaylight
+++ b/lib/opendaylight
@@ -48,10 +48,10 @@
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_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 @@
# 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 @@
# -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
diff --git a/lib/tempest b/lib/tempest
index 40d223b..1716bc7 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -65,8 +65,10 @@
# 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)
@@ -376,8 +378,12 @@
done
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
diff --git a/run_tests.sh b/run_tests.sh
index b1aef4f..bf90332 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -43,7 +43,7 @@
echo "Running bash8..."
-./tools/bash8.py -v $FILES
+tox -ebashate
pass_fail $? 0 bash8
diff --git a/tests/test_config.sh b/tests/test_config.sh
index 50e8d7b..cd74cee 100755
--- a/tests/test_config.sh
+++ b/tests/test_config.sh
@@ -108,6 +108,27 @@
[[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 @@
# 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 @@
# 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 @@
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
diff --git a/tools/bash8.py b/tools/bash8.py
deleted file mode 100755
index 3abf87b..0000000
--- 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<indent>[ \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<token>\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())
diff --git a/tools/ironic/scripts/cleanup-node b/tools/ironic/scripts/cleanup-node
new file mode 100755
index 0000000..c4e4e70
--- /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 adeca5c..0000000
--- 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-node b/tools/ironic/scripts/create-node
new file mode 100755
index 0000000..25b53d4
--- /dev/null
+++ b/tools/ironic/scripts/create-node
@@ -0,0 +1,79 @@
+#!/usr/bin/env bash
+
+# **create-nodes**
+
+# Creates baremetal poseur nodes for ironic testing purposes
+
+set -ex
+
+# Keep track of the devstack directory
+TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
+
+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=$(( $4 + 1))
+
+case $5 in
+ i386) ARCH='i686' ;;
+ amd64) ARCH='x86_64' ;;
+ *) echo "Unsupported arch $4!" ; exit 1 ;;
+esac
+
+BRIDGE=$6
+EMULATOR=$7
+LOGDIR=$8
+
+LIBVIRT_NIC_DRIVER=${LIBVIRT_NIC_DRIVER:-"e1000"}
+LIBVIRT_STORAGE_POOL=${LIBVIRT_STORAGE_POOL:-"default"}
+LIBVIRT_CONNECT_URI=${LIBVIRT_CONNECT_URI:-"qemu:///system"}
+
+export VIRSH_DEFAULT_CONNECT_URI=$LIBVIRT_CONNECT_URI
+
+if ! virsh pool-list --all | grep -q $LIBVIRT_STORAGE_POOL; then
+ virsh pool-define-as --name $LIBVIRT_STORAGE_POOL dir --target /var/lib/libvirt/images >&2
+ virsh pool-autostart $LIBVIRT_STORAGE_POOL >&2
+ virsh pool-start $LIBVIRT_STORAGE_POOL >&2
+fi
+
+pool_state=$(virsh pool-info $LIBVIRT_STORAGE_POOL | grep State | awk '{ print $2 }')
+if [ "$pool_state" != "running" ] ; then
+ [ ! -d /var/lib/libvirt/images ] && sudo mkdir /var/lib/libvirt/images
+ virsh pool-start $LIBVIRT_STORAGE_POOL >&2
+fi
+
+if [ -n "$LOGDIR" ] ; then
+ mkdir -p "$LOGDIR"
+fi
+
+PREALLOC=
+if [ -f /etc/debian_version ]; then
+ PREALLOC="--prealloc-metadata"
+fi
+
+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
diff --git a/tools/ironic/scripts/create-nodes b/tools/ironic/scripts/create-nodes
deleted file mode 100755
index 140bffe..0000000
--- a/tools/ironic/scripts/create-nodes
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/usr/bin/env bash
-
-# **create-nodes**
-
-# Creates baremetal poseur nodes for ironic testing purposes
-
-set -ex
-
-# Keep track of the devstack directory
-TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
-
-CPU=$1
-MEM=$(( 1024 * $2 ))
-# extra G to allow fuzz for partition table : flavor size and registered size
-# need to be different to actual size.
-DISK=$(( $3 + 1))
-
-case $4 in
- i386) ARCH='i686' ;;
- amd64) ARCH='x86_64' ;;
- *) echo "Unsupported arch $4!" ; exit 1 ;;
-esac
-
-TOTAL=$(($5 - 1))
-BRIDGE=$6
-EMULATOR=$7
-LOGDIR=$8
-
-LIBVIRT_NIC_DRIVER=${LIBVIRT_NIC_DRIVER:-"e1000"}
-LIBVIRT_STORAGE_POOL=${LIBVIRT_STORAGE_POOL:-"default"}
-LIBVIRT_CONNECT_URI=${LIBVIRT_CONNECT_URI:-"qemu:///system"}
-
-export VIRSH_DEFAULT_CONNECT_URI=$LIBVIRT_CONNECT_URI
-
-if ! virsh pool-list --all | grep -q $LIBVIRT_STORAGE_POOL; then
- virsh pool-define-as --name $LIBVIRT_STORAGE_POOL dir --target /var/lib/libvirt/images >&2
- virsh pool-autostart $LIBVIRT_STORAGE_POOL >&2
- virsh pool-start $LIBVIRT_STORAGE_POOL >&2
-fi
-
-pool_state=$(virsh pool-info $LIBVIRT_STORAGE_POOL | grep State | awk '{ print $2 }')
-if [ "$pool_state" != "running" ] ; then
- [ ! -d /var/lib/libvirt/images ] && sudo mkdir /var/lib/libvirt/images
- virsh pool-start $LIBVIRT_STORAGE_POOL >&2
-fi
-
-if [ -n "$LOGDIR" ] ; then
- mkdir -p "$LOGDIR"
-fi
-
-PREALLOC=
-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
diff --git a/tools/xen/install_os_domU.sh b/tools/xen/install_os_domU.sh
index 75d56a8..439db68 100755
--- a/tools/xen/install_os_domU.sh
+++ b/tools/xen/install_os_domU.sh
@@ -244,6 +244,11 @@
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
#
diff --git a/tools/xen/prepare_guest.sh b/tools/xen/prepare_guest.sh
index cd189db..7383c91 100755
--- a/tools/xen/prepare_guest.sh
+++ b/tools/xen/prepare_guest.sh
@@ -114,7 +114,6 @@
if [ ! -e $1 ]; then
# Simple but usable vimrc
cat > $1 <<EOF
-syntax on
se ts=4
se expandtab
se shiftwidth=4
diff --git a/tools/xen/prepare_guest_template.sh b/tools/xen/prepare_guest_template.sh
index e6a7e02..2d3b898 100755
--- a/tools/xen/prepare_guest_template.sh
+++ b/tools/xen/prepare_guest_template.sh
@@ -93,3 +93,28 @@
# 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