Browse code

use released library versions by default

This patch provides a new path for installing libraries in devstack so
that it's possible to either test with upstream released libraries, or
with git versions of individual libraries.

Libraries are added by name to 3 associative arrays GITREPO,
GITBRANCH, GITDIR. When we get to the library install phase we inspect
LIBS_FROM_GIT and look for libraries by name (i.e. "oslo.config") and
if they exist we'll clone and install those libraries from
git. Otherwise we won't, and just let pip pull them as dependencies
when it needs them.

This patch provides the conversion of the oslo libraries, including
pbr.

Devstack-gate jobs for these libraries will need to change to support
actually forward testing their content.

restructure stackrc into groupings

in order to support installing from stable libraries we first need to
actually sort out all the categories our giant list of git repos fit
into. This will make it much easier to not lose one in the process.

support installing clients and supporting libraries at released versions

expand the devstack support for libraries from released versions to
support python-* clients and supporting libraries. This is a collapse
of the master patch series that took a while to get correct.

(This is a collapsed patchset for backport to make backport fixups easier)

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.

Conflicts:
lib/glance

Change-Id: I26fac0ccf8fd4818e24618d56bf04b32306f88f6

Sean Dague authored on 2014/10/01 22:06:43
Showing 20 changed files
... ...
@@ -11,7 +11,6 @@ if is_service_enabled trove; then
11 11
         cleanup_trove
12 12
     elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
13 13
         echo_summary "Configuring Trove"
14
-        configure_troveclient
15 14
         configure_trove
16 15
 
17 16
         if is_service_enabled key; then
... ...
@@ -36,6 +36,11 @@
36 36
 XTRACE=$(set +o | grep xtrace)
37 37
 set +o xtrace
38 38
 
39
+# Global Config Variables
40
+declare -A GITREPO
41
+declare -A GITBRANCH
42
+declare -A GITDIR
43
+
39 44
 
40 45
 # Config Functions
41 46
 # ================
... ...
@@ -577,6 +582,18 @@ function git_clone {
577 577
     cd $orig_dir
578 578
 }
579 579
 
580
+# A variation on git clone that lets us specify a project by it's
581
+# actual name, like oslo.config. This is exceptionally useful in the
582
+# library installation case
583
+function git_clone_by_name {
584
+    local name=$1
585
+    local repo=${GITREPO[$name]}
586
+    local dir=${GITDIR[$name]}
587
+    local branch=${GITBRANCH[$name]}
588
+    git_clone $repo $dir $branch
589
+}
590
+
591
+
580 592
 # git can sometimes get itself infinitely stuck with transient network
581 593
 # errors or other issues with the remote end.  This wraps git in a
582 594
 # timeout/retry loop and is intended to watch over non-local git
... ...
@@ -1369,6 +1386,37 @@ function pip_install {
1369 1369
         && $SUDO_PIP rm -rf ${pip_build_tmp}
1370 1370
 }
1371 1371
 
1372
+# should we use this library from their git repo, or should we let it
1373
+# get pulled in via pip dependencies.
1374
+function use_library_from_git {
1375
+    local name=$1
1376
+    local enabled=1
1377
+    [[ ,${LIBS_FROM_GIT}, =~ ,${name}, ]] && enabled=0
1378
+    return $enabled
1379
+}
1380
+
1381
+# setup a library by name. If we are trying to use the library from
1382
+# git, we'll do a git based install, otherwise we'll punt and the
1383
+# library should be installed by a requirements pull from another
1384
+# project.
1385
+function setup_lib {
1386
+    local name=$1
1387
+    local dir=${GITDIR[$name]}
1388
+    setup_install $dir
1389
+}
1390
+
1391
+# setup a library by name in editiable mode. If we are trying to use
1392
+# the library from git, we'll do a git based install, otherwise we'll
1393
+# punt and the library should be installed by a requirements pull from
1394
+# another project.
1395
+#
1396
+# use this for non namespaced libraries
1397
+function setup_dev_lib {
1398
+    local name=$1
1399
+    local dir=${GITDIR[$name]}
1400
+    setup_develop $dir
1401
+}
1402
+
1372 1403
 # this should be used if you want to install globally, all libraries should
1373 1404
 # use this, especially *oslo* ones
1374 1405
 function setup_install {
... ...
@@ -35,8 +35,9 @@ set +o xtrace
35 35
 # --------
36 36
 
37 37
 # Set up default directories
38
+GITDIR["python-ceilometerclient"]=$DEST/python-ceilometerclient
39
+
38 40
 CEILOMETER_DIR=$DEST/ceilometer
39
-CEILOMETERCLIENT_DIR=$DEST/python-ceilometerclient
40 41
 CEILOMETER_CONF_DIR=/etc/ceilometer
41 42
 CEILOMETER_CONF=$CEILOMETER_CONF_DIR/ceilometer.conf
42 43
 CEILOMETER_API_LOG_DIR=/var/log/ceilometer-api
... ...
@@ -123,12 +124,6 @@ function cleanup_ceilometer {
123 123
     fi
124 124
 }
125 125
 
126
-# configure_ceilometerclient() - Set config files, create data dirs, etc
127
-function configure_ceilometerclient {
128
-    setup_develop $CEILOMETERCLIENT_DIR
129
-    sudo install -D -m 0644 -o $STACK_USER {$CEILOMETERCLIENT_DIR/tools/,/etc/bash_completion.d/}ceilometer.bash_completion
130
-}
131
-
132 126
 # configure_ceilometer() - Set config files, create data dirs, etc
133 127
 function configure_ceilometer {
134 128
     setup_develop $CEILOMETER_DIR
... ...
@@ -230,7 +225,11 @@ function install_ceilometer {
230 230
 
231 231
 # install_ceilometerclient() - Collect source and prepare
232 232
 function install_ceilometerclient {
233
-    git_clone $CEILOMETERCLIENT_REPO $CEILOMETERCLIENT_DIR $CEILOMETERCLIENT_BRANCH
233
+    if use_library_from_git "python-ceilometerclient"; then
234
+        git_clone_by_name "python-ceilometerclient"
235
+        setup_dev_lib "python-ceilometerclient"
236
+        sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-ceilometerclient"]}/tools/,/etc/bash_completion.d/}ceilometer.bash_completion
237
+    fi
234 238
 }
235 239
 
236 240
 # start_ceilometer() - Start running processes, including screen
... ...
@@ -35,8 +35,9 @@ if [[ -r $CINDER_PLUGINS/$CINDER_DRIVER ]]; then
35 35
 fi
36 36
 
37 37
 # set up default directories
38
+GITDIR["python-cinderclient"]=$DEST/python-cinderclient
39
+
38 40
 CINDER_DIR=$DEST/cinder
39
-CINDERCLIENT_DIR=$DEST/python-cinderclient
40 41
 CINDER_STATE_PATH=${CINDER_STATE_PATH:=$DATA_DIR/cinder}
41 42
 CINDER_AUTH_CACHE_DIR=${CINDER_AUTH_CACHE_DIR:-/var/cache/cinder}
42 43
 
... ...
@@ -475,9 +476,11 @@ function install_cinder {
475 475
 
476 476
 # install_cinderclient() - Collect source and prepare
477 477
 function install_cinderclient {
478
-    git_clone $CINDERCLIENT_REPO $CINDERCLIENT_DIR $CINDERCLIENT_BRANCH
479
-    setup_develop $CINDERCLIENT_DIR
480
-    sudo install -D -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,/etc/bash_completion.d/}cinder.bash_completion
478
+    if use_library_from_git "python-cinderclient"; then
479
+        git_clone_by_name "python-cinderclient"
480
+        setup_dev_lib "python-cinderclient"
481
+        sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-cinderclient"]}/tools/,/etc/bash_completion.d/}cinder.bash_completion
482
+    fi
481 483
 }
482 484
 
483 485
 # apply config.d approach for cinder volumes directory
... ...
@@ -27,8 +27,9 @@ set +o xtrace
27 27
 # --------
28 28
 
29 29
 # Set up default directories
30
+GITDIR["python-glanceclient"]=$DEST/python-glanceclient
31
+
30 32
 GLANCE_DIR=$DEST/glance
31
-GLANCECLIENT_DIR=$DEST/python-glanceclient
32 33
 GLANCE_CACHE_DIR=${GLANCE_CACHE_DIR:=$DATA_DIR/glance/cache}
33 34
 GLANCE_IMAGE_DIR=${GLANCE_IMAGE_DIR:=$DATA_DIR/glance/images}
34 35
 GLANCE_AUTH_CACHE_DIR=${GLANCE_AUTH_CACHE_DIR:-/var/cache/glance}
... ...
@@ -234,8 +235,10 @@ function init_glance {
234 234
 
235 235
 # install_glanceclient() - Collect source and prepare
236 236
 function install_glanceclient {
237
-    git_clone $GLANCECLIENT_REPO $GLANCECLIENT_DIR $GLANCECLIENT_BRANCH
238
-    setup_develop $GLANCECLIENT_DIR
237
+    if use_library_from_git "python-glanceclient"; then
238
+        git_clone_by_name "python-glanceclient"
239
+        setup_dev_lib "python-glanceclient"
240
+    fi
239 241
 }
240 242
 
241 243
 # install_glance() - Collect source and prepare
... ...
@@ -29,8 +29,9 @@ set +o xtrace
29 29
 # --------
30 30
 
31 31
 # set up default directories
32
+GITDIR["python-heatclient"]=$DEST/python-heatclient
33
+
32 34
 HEAT_DIR=$DEST/heat
33
-HEATCLIENT_DIR=$DEST/python-heatclient
34 35
 HEAT_AUTH_CACHE_DIR=${HEAT_AUTH_CACHE_DIR:-/var/cache/heat}
35 36
 HEAT_STANDALONE=`trueorfalse False $HEAT_STANDALONE`
36 37
 HEAT_CONF_DIR=/etc/heat
... ...
@@ -165,9 +166,11 @@ function create_heat_cache_dir {
165 165
 
166 166
 # install_heatclient() - Collect source and prepare
167 167
 function install_heatclient {
168
-    git_clone $HEATCLIENT_REPO $HEATCLIENT_DIR $HEATCLIENT_BRANCH
169
-    setup_develop $HEATCLIENT_DIR
170
-    sudo install -D -m 0644 -o $STACK_USER {$HEATCLIENT_DIR/tools/,/etc/bash_completion.d/}heat.bash_completion
168
+    if use_library_from_git "python-heatclient"; then
169
+        git_clone_by_name "python-heatclient"
170
+        setup_dev_lib "python-heatclient"
171
+        sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-heatclient"]}/tools/,/etc/bash_completion.d/}heat.bash_completion
172
+    fi
171 173
 }
172 174
 
173 175
 # install_heat() - Collect source and prepare
... ...
@@ -25,8 +25,9 @@ set +o xtrace
25 25
 # --------
26 26
 
27 27
 # Set up default directories
28
+GITDIR["django_openstack_auth"]=$DEST/django_openstack_auth
29
+
28 30
 HORIZON_DIR=$DEST/horizon
29
-HORIZONAUTH_DIR=$DEST/django_openstack_auth
30 31
 
31 32
 # local_settings.py is used to customize Dashboard settings.
32 33
 # The example file in Horizon repo is used by default.
... ...
@@ -144,8 +145,12 @@ function init_horizon {
144 144
 
145 145
 # install_django_openstack_auth() - Collect source and prepare
146 146
 function install_django_openstack_auth {
147
-    git_clone $HORIZONAUTH_REPO $HORIZONAUTH_DIR $HORIZONAUTH_BRANCH
148
-    setup_install $HORIZONAUTH_DIR
147
+    if use_library_from_git "django_openstack_auth"; then
148
+        local dir=${GITDIR["django_openstack_auth"]}
149
+        git_clone_by_name "django_openstack_auth"
150
+    fi
151
+    # if we aren't using this library from git, then we just let it
152
+    # get dragged in by the horizon setup.
149 153
 }
150 154
 
151 155
 # install_horizon() - Collect source and prepare
... ...
@@ -20,7 +20,7 @@ set +o xtrace
20 20
 
21 21
 # Defaults
22 22
 # --------
23
-PBR_DIR=$DEST/pbr
23
+GITDIR["pbr"]=$DEST/pbr
24 24
 REQUIREMENTS_DIR=$DEST/requirements
25 25
 
26 26
 # Entry Points
... ...
@@ -45,8 +45,12 @@ function install_infra {
45 45
     git_clone $REQUIREMENTS_REPO $REQUIREMENTS_DIR $REQUIREMENTS_BRANCH
46 46
 
47 47
     # Install pbr
48
-    git_clone $PBR_REPO $PBR_DIR $PBR_BRANCH
49
-    setup_install $PBR_DIR
48
+    if use_library_from_git "pbr"; then
49
+        git_clone_by_name "pbr"
50
+        setup_lib "pbr"
51
+    else
52
+        pip_install "pbr"
53
+    fi
50 54
 }
51 55
 
52 56
 # Restore xtrace
... ...
@@ -28,10 +28,11 @@ set +o pipefail
28 28
 # --------
29 29
 
30 30
 # Set up default directories
31
+GITDIR["python-ironicclient"]=$DEST/python-ironicclient
32
+
31 33
 IRONIC_DIR=$DEST/ironic
32 34
 IRONIC_DATA_DIR=$DATA_DIR/ironic
33 35
 IRONIC_STATE_PATH=/var/lib/ironic
34
-IRONICCLIENT_DIR=$DEST/python-ironicclient
35 36
 IRONIC_AUTH_CACHE_DIR=${IRONIC_AUTH_CACHE_DIR:-/var/cache/ironic}
36 37
 IRONIC_CONF_DIR=${IRONIC_CONF_DIR:-/etc/ironic}
37 38
 IRONIC_CONF_FILE=$IRONIC_CONF_DIR/ironic.conf
... ...
@@ -108,8 +109,22 @@ function install_ironic {
108 108
 
109 109
 # install_ironicclient() - Collect sources and prepare
110 110
 function install_ironicclient {
111
-    git_clone $IRONICCLIENT_REPO $IRONICCLIENT_DIR $IRONICCLIENT_BRANCH
112
-    setup_develop $IRONICCLIENT_DIR
111
+    if use_library_from_git "python-ironicclient"; then
112
+        git_clone_by_name "python-ironicclient"
113
+        setup_dev_lib "python-ironicclient"
114
+        sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-ironicclient"]}/tools/,/etc/bash_completion.d/}ironic.bash_completion
115
+    else
116
+        # nothing actually "requires" ironicclient, so force instally from pypi
117
+        pip_install python-ironicclient
118
+    fi
119
+}
120
+
121
+# _cleanup_ironic_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file
122
+function _cleanup_ironic_apache_wsgi {
123
+    sudo rm -rf $IRONIC_HTTP_DIR
124
+    disable_apache_site ironic
125
+    sudo rm -f $(apache_site_config_for ironic)
126
+    restart_apache_server
113 127
 }
114 128
 
115 129
 # cleanup_ironic() - Remove residual data files, anything left over from previous
... ...
@@ -32,6 +32,9 @@ set +o xtrace
32 32
 # --------
33 33
 
34 34
 # Set up default directories
35
+GITDIR["python-keystoneclient"]=$DEST/python-keystoneclient
36
+GITDIR["keystonemiddleware"]=$DEST/keystonemiddleware
37
+
35 38
 KEYSTONE_DIR=$DEST/keystone
36 39
 KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-/etc/keystone}
37 40
 KEYSTONE_CONF=$KEYSTONE_CONF_DIR/keystone.conf
... ...
@@ -39,8 +42,6 @@ KEYSTONE_PASTE_INI=${KEYSTONE_PASTE_INI:-$KEYSTONE_CONF_DIR/keystone-paste.ini}
39 39
 KEYSTONE_AUTH_CACHE_DIR=${KEYSTONE_AUTH_CACHE_DIR:-/var/cache/keystone}
40 40
 KEYSTONE_WSGI_DIR=${KEYSTONE_WSGI_DIR:-/var/www/keystone}
41 41
 
42
-KEYSTONECLIENT_DIR=$DEST/python-keystoneclient
43
-
44 42
 # Select the backend for Keystone's service catalog
45 43
 KEYSTONE_CATALOG_BACKEND=${KEYSTONE_CATALOG_BACKEND:-sql}
46 44
 KEYSTONE_CATALOG=$KEYSTONE_CONF_DIR/default_catalog.templates
... ...
@@ -389,9 +390,19 @@ function init_keystone {
389 389
 
390 390
 # install_keystoneclient() - Collect source and prepare
391 391
 function install_keystoneclient {
392
-    git_clone $KEYSTONECLIENT_REPO $KEYSTONECLIENT_DIR $KEYSTONECLIENT_BRANCH
393
-    setup_develop $KEYSTONECLIENT_DIR
394
-    sudo install -D -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,/etc/bash_completion.d/}keystone.bash_completion
392
+    if use_library_from_git "python-keystoneclient"; then
393
+        git_clone_by_name "python-keystoneclient"
394
+        setup_dev_lib "python-keystoneclient"
395
+        sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-keystoneclient"]}/tools/,/etc/bash_completion.d/}keystone.bash_completion
396
+    fi
397
+}
398
+
399
+# install_keystonemiddleware() - Collect source and prepare
400
+function install_keystonemiddleware {
401
+    if use_library_from_git "keystonemiddleware"; then
402
+        git_clone_by_name "keystonemiddleware"
403
+        setup_dev_lib "keystonemiddleware"
404
+    fi
395 405
 }
396 406
 
397 407
 # install_keystone() - Collect source and prepare
... ...
@@ -70,8 +70,10 @@ PRIVATE_SUBNET_NAME=${PRIVATE_SUBNET_NAME:-"private-subnet"}
70 70
 PUBLIC_SUBNET_NAME=${PUBLIC_SUBNET_NAME:-"public-subnet"}
71 71
 
72 72
 # Set up default directories
73
+GITDIR["python-neutronclient"]=$DEST/python-neutronclient
74
+
75
+
73 76
 NEUTRON_DIR=$DEST/neutron
74
-NEUTRONCLIENT_DIR=$DEST/python-neutronclient
75 77
 NEUTRON_AUTH_CACHE_DIR=${NEUTRON_AUTH_CACHE_DIR:-/var/cache/neutron}
76 78
 
77 79
 # Support entry points installation of console scripts
... ...
@@ -450,9 +452,11 @@ function install_neutron {
450 450
 
451 451
 # install_neutronclient() - Collect source and prepare
452 452
 function install_neutronclient {
453
-    git_clone $NEUTRONCLIENT_REPO $NEUTRONCLIENT_DIR $NEUTRONCLIENT_BRANCH
454
-    setup_develop $NEUTRONCLIENT_DIR
455
-    sudo install -D -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,/etc/bash_completion.d/}neutron.bash_completion
453
+    if use_library_from_git "python-neutronclient"; then
454
+        git_clone_by_name "python-neutronclient"
455
+        setup_dev_lib "python-neutronclient"
456
+        sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-neutronclient"]}/tools/,/etc/bash_completion.d/}neutron.bash_completion
457
+    fi
456 458
 }
457 459
 
458 460
 # install_neutron_agent_packages() - Collect source and prepare
... ...
@@ -29,8 +29,10 @@ set +o xtrace
29 29
 # --------
30 30
 
31 31
 # Set up default directories
32
+GITDIR["python-novaclient"]=$DEST/python-novaclient
33
+
34
+
32 35
 NOVA_DIR=$DEST/nova
33
-NOVACLIENT_DIR=$DEST/python-novaclient
34 36
 NOVA_STATE_PATH=${NOVA_STATE_PATH:=$DATA_DIR/nova}
35 37
 # INSTANCES_PATH is the previous name for this
36 38
 NOVA_INSTANCES_PATH=${NOVA_INSTANCES_PATH:=${INSTANCES_PATH:=$NOVA_STATE_PATH/instances}}
... ...
@@ -650,9 +652,11 @@ function init_nova {
650 650
 
651 651
 # install_novaclient() - Collect source and prepare
652 652
 function install_novaclient {
653
-    git_clone $NOVACLIENT_REPO $NOVACLIENT_DIR $NOVACLIENT_BRANCH
654
-    setup_develop $NOVACLIENT_DIR
655
-    sudo install -D -m 0644 -o $STACK_USER {$NOVACLIENT_DIR/tools/,/etc/bash_completion.d/}nova.bash_completion
653
+    if use_library_from_git "python-novaclient"; then
654
+        git_clone_by_name "python-novaclient"
655
+        setup_dev_lib "python-novaclient"
656
+        sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-novaclient"]}/tools/,/etc/bash_completion.d/}nova.bash_completion
657
+    fi
656 658
 }
657 659
 
658 660
 # install_nova() - Collect source and prepare
... ...
@@ -20,59 +20,52 @@ set +o xtrace
20 20
 
21 21
 # Defaults
22 22
 # --------
23
-CLIFF_DIR=$DEST/cliff
24
-OSLOCFG_DIR=$DEST/oslo.config
25
-OSLOMSG_DIR=$DEST/oslo.messaging
26
-OSLORWRAP_DIR=$DEST/oslo.rootwrap
27
-OSLOVMWARE_DIR=$DEST/oslo.vmware
28
-PYCADF_DIR=$DEST/pycadf
29
-STEVEDORE_DIR=$DEST/stevedore
30
-TASKFLOW_DIR=$DEST/taskflow
23
+GITDIR["cliff"]=$DEST/cliff
24
+GITDIR["oslo.config"]=$DEST/oslo.config
25
+GITDIR["oslo.concurrency"]=$DEST/oslo.concurrency
26
+GITDIR["oslo.db"]=$DEST/oslo.db
27
+GITDIR["oslo.i18n"]=$DEST/oslo.i18n
28
+GITDIR["oslo.log"]=$DEST/oslo.log
29
+GITDIR["oslo.middleware"]=$DEST/oslo.middleware
30
+GITDIR["oslo.messaging"]=$DEST/oslo.messaging
31
+GITDIR["oslo.rootwrap"]=$DEST/oslo.rootwrap
32
+GITDIR["oslo.serialization"]=$DEST/oslo.serialization
33
+GITDIR["oslo.utils"]=$DEST/oslo.utils
34
+GITDIR["oslo.vmware"]=$DEST/oslo.vmware
35
+GITDIR["pycadf"]=$DEST/pycadf
36
+GITDIR["stevedore"]=$DEST/stevedore
37
+GITDIR["taskflow"]=$DEST/taskflow
31 38
 
32 39
 # Entry Points
33 40
 # ------------
34 41
 
42
+function _do_install_oslo_lib {
43
+    local name=$1
44
+    if use_library_from_git "$name"; then
45
+        git_clone_by_name "$name"
46
+        setup_lib "$name"
47
+    fi
48
+}
49
+
35 50
 # install_oslo() - Collect source and prepare
36 51
 function install_oslo {
37
-    # TODO(sdague): remove this once we get to Icehouse, this just makes
38
-    # for a smoother transition of existing users.
39
-    cleanup_oslo
40
-
41
-    git_clone $CLIFF_REPO $CLIFF_DIR $CLIFF_BRANCH
42
-    setup_install $CLIFF_DIR
43
-
44
-    git_clone $OSLOCFG_REPO $OSLOCFG_DIR $OSLOCFG_BRANCH
45
-    setup_install $OSLOCFG_DIR
46
-
47
-    git_clone $OSLOMSG_REPO $OSLOMSG_DIR $OSLOMSG_BRANCH
48
-    setup_install $OSLOMSG_DIR
49
-
50
-    git_clone $OSLORWRAP_REPO $OSLORWRAP_DIR $OSLORWRAP_BRANCH
51
-    setup_install $OSLORWRAP_DIR
52
-
53
-    git_clone $OSLOVMWARE_REPO $OSLOVMWARE_DIR $OSLOVMWARE_BRANCH
54
-    setup_install $OSLOVMWARE_DIR
55
-
56
-    git_clone $PYCADF_REPO $PYCADF_DIR $PYCADF_BRANCH
57
-    setup_install $PYCADF_DIR
58
-
59
-    git_clone $STEVEDORE_REPO $STEVEDORE_DIR $STEVEDORE_BRANCH
60
-    setup_install $STEVEDORE_DIR
61
-
62
-    git_clone $TASKFLOW_REPO $TASKFLOW_DIR $TASKFLOW_BRANCH
63
-    setup_install $TASKFLOW_DIR
52
+    _do_install_oslo_lib "cliff"
53
+    _do_install_oslo_lib "oslo.i18n"
54
+    _do_install_oslo_lib "oslo.utils"
55
+    _do_install_oslo_lib "oslo.serialization"
56
+    _do_install_oslo_lib "oslo.config"
57
+    _do_install_oslo_lib "oslo.concurrency"
58
+    _do_install_oslo_lib "oslo.log"
59
+    _do_install_oslo_lib "oslo.middleware"
60
+    _do_install_oslo_lib "oslo.messaging"
61
+    _do_install_oslo_lib "oslo.rootwrap"
62
+    _do_install_oslo_lib "oslo.db"
63
+    _do_install_oslo_lib "oslo.vmware"
64
+    _do_install_oslo_lib "pycadf"
65
+    _do_install_oslo_lib "stevedore"
66
+    _do_install_oslo_lib "taskflow"
64 67
 }
65 68
 
66
-# cleanup_oslo() - purge possibly old versions of oslo
67
-function cleanup_oslo {
68
-    # this means we've got an old oslo installed, lets get rid of it
69
-    if ! python -c 'import oslo.config' 2>/dev/null; then
70
-        echo "Found old oslo.config... removing to ensure consistency"
71
-        local PIP_CMD=$(get_pip_command)
72
-        pip_install oslo.config
73
-        sudo $PIP_CMD uninstall -y oslo.config
74
-    fi
75
-}
76 69
 
77 70
 # Restore xtrace
78 71
 $XTRACE
... ...
@@ -20,12 +20,10 @@ set +o xtrace
20 20
 # Defaults
21 21
 # --------
22 22
 
23
-# Set up default repos
24
-SAHARA_REPO=${SAHARA_REPO:-${GIT_BASE}/openstack/sahara.git}
25
-SAHARA_BRANCH=${SAHARA_BRANCH:-master}
26
-
27 23
 # Set up default directories
24
+GITDIR["python-saharaclient"]=$DEST/python-saharaclient
28 25
 SAHARA_DIR=$DEST/sahara
26
+
29 27
 SAHARA_CONF_DIR=${SAHARA_CONF_DIR:-/etc/sahara}
30 28
 SAHARA_CONF_FILE=${SAHARA_CONF_DIR}/sahara.conf
31 29
 
... ...
@@ -157,6 +155,14 @@ function install_sahara {
157 157
     setup_develop $SAHARA_DIR
158 158
 }
159 159
 
160
+# install_python_saharaclient() - Collect source and prepare
161
+function install_python_saharaclient {
162
+    if use_library_from_git "python-saharaclient"; then
163
+        git_clone_by_name "python-saharaclient"
164
+        setup_dev_lib "python-saharaclient"
165
+    fi
166
+}
167
+
160 168
 # start_sahara() - Start running processes, including screen
161 169
 function start_sahara {
162 170
     run_process sahara "$SAHARA_BIN_DIR/sahara-api --config-file $SAHARA_CONF_FILE"
... ...
@@ -30,8 +30,10 @@ set +o xtrace
30 30
 # --------
31 31
 
32 32
 # Set up default directories
33
+GITDIR["python-swiftclient"]=$DEST/python-swiftclient
34
+
35
+
33 36
 SWIFT_DIR=$DEST/swift
34
-SWIFTCLIENT_DIR=$DEST/python-swiftclient
35 37
 SWIFT_AUTH_CACHE_DIR=${SWIFT_AUTH_CACHE_DIR:-/var/cache/swift}
36 38
 SWIFT_APACHE_WSGI_DIR=${SWIFT_APACHE_WSGI_DIR:-/var/www/swift}
37 39
 SWIFT3_DIR=$DEST/swift3
... ...
@@ -630,8 +632,10 @@ function install_swift {
630 630
 }
631 631
 
632 632
 function install_swiftclient {
633
-    git_clone $SWIFTCLIENT_REPO $SWIFTCLIENT_DIR $SWIFTCLIENT_BRANCH
634
-    setup_develop $SWIFTCLIENT_DIR
633
+    if use_library_from_git "python-swiftclient"; then
634
+        git_clone_by_name "python-swiftclient"
635
+        setup_dev_lib "python-swiftclient"
636
+    fi
635 637
 }
636 638
 
637 639
 # start_swift() - Start running processes, including screen
... ...
@@ -45,6 +45,8 @@ set +o xtrace
45 45
 # --------
46 46
 
47 47
 # Set up default directories
48
+GITDIR["tempest-lib"]=$DEST/tempest-lib
49
+
48 50
 TEMPEST_DIR=$DEST/tempest
49 51
 TEMPEST_CONFIG_DIR=${TEMPEST_CONFIG_DIR:-$TEMPEST_DIR/etc}
50 52
 TEMPEST_CONFIG=$TEMPEST_CONFIG_DIR/tempest.conf
... ...
@@ -417,6 +419,14 @@ function create_tempest_accounts {
417 417
     fi
418 418
 }
419 419
 
420
+# install_tempest_lib() - Collect source, prepare, and install tempest-lib
421
+function install_tempest_lib {
422
+    if use_library_from_git "tempest-lib"; then
423
+        git_clone_by_name "tempest-lib"
424
+        setup_dev_lib "tempest-lib"
425
+    fi
426
+}
427
+
420 428
 # install_tempest() - Collect source and prepare
421 429
 function install_tempest {
422 430
     git_clone $TEMPEST_REPO $TEMPEST_DIR $TEMPEST_BRANCH
... ...
@@ -25,8 +25,9 @@ set +o xtrace
25 25
 NETWORK_GATEWAY=${NETWORK_GATEWAY:-10.0.0.1}
26 26
 
27 27
 # Set up default configuration
28
+GITDIR["python-troveclient"]=$DEST/python-troveclient
29
+
28 30
 TROVE_DIR=$DEST/trove
29
-TROVECLIENT_DIR=$DEST/python-troveclient
30 31
 TROVE_CONF_DIR=/etc/trove
31 32
 TROVE_LOCAL_CONF_DIR=$TROVE_DIR/etc/trove
32 33
 TROVE_AUTH_CACHE_DIR=${TROVE_AUTH_CACHE_DIR:-/var/cache/trove}
... ...
@@ -112,10 +113,6 @@ function cleanup_trove {
112 112
     rm -fr $TROVE_CONF_DIR/*
113 113
 }
114 114
 
115
-# configure_troveclient() - Set config files, create data dirs, etc
116
-function configure_troveclient {
117
-    setup_develop $TROVECLIENT_DIR
118
-}
119 115
 
120 116
 # configure_trove() - Set config files, create data dirs, etc
121 117
 function configure_trove {
... ...
@@ -189,7 +186,10 @@ function configure_trove {
189 189
 
190 190
 # install_troveclient() - Collect source and prepare
191 191
 function install_troveclient {
192
-    git_clone $TROVECLIENT_REPO $TROVECLIENT_DIR $TROVECLIENT_BRANCH
192
+    if use_library_from_git "python-troveclient"; then
193
+        git_clone_by_name "python-troveclient"
194
+        setup_dev_lib "python-troveclient"
195
+    fi
193 196
 }
194 197
 
195 198
 # install_trove() - Collect source and prepare
... ...
@@ -360,9 +360,6 @@ if [[ -d $TOP_DIR/extras.d ]]; then
360 360
     done
361 361
 fi
362 362
 
363
-# Set the destination directories for other OpenStack projects
364
-OPENSTACKCLIENT_DIR=$DEST/python-openstackclient
365
-
366 363
 # Interactive Configuration
367 364
 # -------------------------
368 365
 
... ...
@@ -693,8 +690,13 @@ if is_service_enabled heat horizon; then
693 693
     install_heatclient
694 694
 fi
695 695
 
696
-git_clone $OPENSTACKCLIENT_REPO $OPENSTACKCLIENT_DIR $OPENSTACKCLIENT_BRANCH
697
-setup_develop $OPENSTACKCLIENT_DIR
696
+# install the OpenStack client, needed for most setup commands
697
+if use_library_from_git "python-openstackclient"; then
698
+    git_clone_by_name "python-openstackclient"
699
+    setup_dev_lib "python-openstackclient"
700
+else
701
+    pip_install python-openstackclient
702
+fi
698 703
 
699 704
 if is_service_enabled key; then
700 705
     install_keystone
... ...
@@ -750,7 +752,6 @@ if is_service_enabled ceilometer; then
750 750
     install_ceilometer
751 751
     echo_summary "Configuring Ceilometer"
752 752
     configure_ceilometer
753
-    configure_ceilometerclient
754 753
 fi
755 754
 
756 755
 if is_service_enabled heat; then
... ...
@@ -97,160 +97,246 @@ GIT_TIMEOUT=${GIT_TIMEOUT:-0}
97 97
 # Another option is http://review.openstack.org/p
98 98
 GIT_BASE=${GIT_BASE:-git://git.openstack.org}
99 99
 
100
+##############
101
+#
102
+#  OpenStack Server Components
103
+#
104
+##############
105
+
100 106
 # metering service
101 107
 CEILOMETER_REPO=${CEILOMETER_REPO:-${GIT_BASE}/openstack/ceilometer.git}
102 108
 CEILOMETER_BRANCH=${CEILOMETER_BRANCH:-stable/icehouse}
103 109
 
104
-# ceilometer client library
105
-CEILOMETERCLIENT_REPO=${CEILOMETERCLIENT_REPO:-${GIT_BASE}/openstack/python-ceilometerclient.git}
106
-CEILOMETERCLIENT_BRANCH=${CEILOMETERCLIENT_BRANCH:-master}
107
-
108
-# volume service
110
+# block storage service
109 111
 CINDER_REPO=${CINDER_REPO:-${GIT_BASE}/openstack/cinder.git}
110 112
 CINDER_BRANCH=${CINDER_BRANCH:-stable/icehouse}
111 113
 
112
-# volume client
113
-CINDERCLIENT_REPO=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git}
114
-CINDERCLIENT_BRANCH=${CINDERCLIENT_BRANCH:-master}
115
-
116 114
 # image catalog service
117 115
 GLANCE_REPO=${GLANCE_REPO:-${GIT_BASE}/openstack/glance.git}
118 116
 GLANCE_BRANCH=${GLANCE_BRANCH:-stable/icehouse}
119 117
 
120
-# python glance client library
121
-GLANCECLIENT_REPO=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git}
122
-GLANCECLIENT_BRANCH=${GLANCECLIENT_BRANCH:-master}
123
-
124 118
 # heat service
125 119
 HEAT_REPO=${HEAT_REPO:-${GIT_BASE}/openstack/heat.git}
126 120
 HEAT_BRANCH=${HEAT_BRANCH:-stable/icehouse}
127 121
 
128
-# python heat client library
129
-HEATCLIENT_REPO=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git}
130
-HEATCLIENT_BRANCH=${HEATCLIENT_BRANCH:-master}
131
-
132 122
 # django powered web control panel for openstack
133 123
 HORIZON_REPO=${HORIZON_REPO:-${GIT_BASE}/openstack/horizon.git}
134 124
 HORIZON_BRANCH=${HORIZON_BRANCH:-stable/icehouse}
135 125
 
136
-# django openstack_auth library
137
-HORIZONAUTH_REPO=${HORIZONAUTH_REPO:-${GIT_BASE}/openstack/django_openstack_auth.git}
138
-HORIZONAUTH_BRANCH=${HORIZONAUTH_BRANCH:-master}
139
-
140 126
 # baremetal provisionint service
141 127
 IRONIC_REPO=${IRONIC_REPO:-${GIT_BASE}/openstack/ironic.git}
142 128
 IRONIC_BRANCH=${IRONIC_BRANCH:-stable/icehouse}
143 129
 
144
-# ironic client
145
-IRONICCLIENT_REPO=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git}
146
-IRONICCLIENT_BRANCH=${IRONICCLIENT_BRANCH:-master}
147
-
148 130
 # unified auth system (manages accounts/tokens)
149 131
 KEYSTONE_REPO=${KEYSTONE_REPO:-${GIT_BASE}/openstack/keystone.git}
150 132
 KEYSTONE_BRANCH=${KEYSTONE_BRANCH:-stable/icehouse}
151 133
 
152
-# python keystone client library to nova that horizon uses
153
-KEYSTONECLIENT_REPO=${KEYSTONECLIENT_REPO:-${GIT_BASE}/openstack/python-keystoneclient.git}
154
-KEYSTONECLIENT_BRANCH=${KEYSTONECLIENT_BRANCH:-master}
134
+# neutron service
135
+NEUTRON_REPO=${NEUTRON_REPO:-${GIT_BASE}/openstack/neutron.git}
136
+NEUTRON_BRANCH=${NEUTRON_BRANCH:-stable/icehouse}
155 137
 
156 138
 # compute service
157 139
 NOVA_REPO=${NOVA_REPO:-${GIT_BASE}/openstack/nova.git}
158 140
 NOVA_BRANCH=${NOVA_BRANCH:-stable/icehouse}
159 141
 
142
+# data processing service
143
+SAHARA_REPO=${SAHARA_REPO:-${GIT_BASE}/openstack/sahara.git}
144
+SAHARA_BRANCH=${SAHARA_BRANCH:-master}
145
+
146
+# object storage service
147
+SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git}
148
+SWIFT_BRANCH=${SWIFT_BRANCH:-stable/icehouse}
149
+
150
+# trove service
151
+TROVE_REPO=${TROVE_REPO:-${GIT_BASE}/openstack/trove.git}
152
+TROVE_BRANCH=${TROVE_BRANCH:-stable/icehouse}
153
+
154
+##############
155
+#
156
+#  Testing Components
157
+#
158
+##############
159
+
160
+# consolidated openstack requirements
161
+REQUIREMENTS_REPO=${REQUIREMENTS_REPO:-${GIT_BASE}/openstack/requirements.git}
162
+REQUIREMENTS_BRANCH=${REQUIREMENTS_BRANCH:-stable/icehouse}
163
+
164
+# Tempest test suite
165
+TEMPEST_REPO=${TEMPEST_REPO:-${GIT_BASE}/openstack/tempest.git}
166
+TEMPEST_BRANCH=${TEMPEST_BRANCH:-master}
167
+
168
+# TODO(sdague): this should end up as a library component like below
169
+GITREPO["tempest-lib"]=${TEMPEST_LIB_REPO:-${GIT_BASE}/openstack/tempest-lib.git}
170
+GITBRANCH["tempest-lib"]=${TEMPEST_LIB_BRANCH:-master}
171
+
172
+
173
+##############
174
+#
175
+#  OpenStack Client Library Componets
176
+#
177
+##############
178
+
179
+# ceilometer client library
180
+GITREPO["python-ceilometerclient"]=${CEILOMETERCLIENT_REPO:-${GIT_BASE}/openstack/python-ceilometerclient.git}
181
+GITBRANCH["python-ceilometerclient"]=${CEILOMETERCLIENT_BRANCH:-master}
182
+
183
+# volume client
184
+GITREPO["python-cinderclient"]=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git}
185
+GITBRANCH["python-cinderclient"]=${CINDERCLIENT_BRANCH:-master}
186
+
187
+# python glance client library
188
+GITREPO["python-glanceclient"]=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git}
189
+GITBRANCH["python-glanceclient"]=${GLANCECLIENT_BRANCH:-master}
190
+
191
+# python heat client library
192
+GITREPO["python-heatclient"]=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git}
193
+GITBRANCH["python-heatclient"]=${HEATCLIENT_BRANCH:-master}
194
+
195
+# ironic client
196
+GITREPO["python-ironicclient"]=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git}
197
+GITBRANCH["python-ironicclient"]=${IRONICCLIENT_BRANCH:-master}
198
+
199
+# python keystone client library to nova that horizon uses
200
+GITREPO["python-keystoneclient"]=${KEYSTONECLIENT_REPO:-${GIT_BASE}/openstack/python-keystoneclient.git}
201
+GITBRANCH["python-keystoneclient"]=${KEYSTONECLIENT_BRANCH:-master}
202
+
203
+# neutron client
204
+GITREPO["python-neutronclient"]=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git}
205
+GITBRANCH["python-neutronclient"]=${NEUTRONCLIENT_BRANCH:-master}
206
+
160 207
 # python client library to nova that horizon (and others) use
161
-NOVACLIENT_REPO=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git}
162
-NOVACLIENT_BRANCH=${NOVACLIENT_BRANCH:-master}
208
+GITREPO["python-novaclient"]=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git}
209
+GITBRANCH["python-novaclient"]=${NOVACLIENT_BRANCH:-master}
210
+
211
+# python saharaclient
212
+GITREPO["python-saharaclient"]=${SAHARACLIENT_REPO:-${GIT_BASE}/openstack/python-saharaclient.git}
213
+GITBRANCH["python-saharaclient"]=${SAHARACLIENT_BRANCH:-master}
214
+
215
+# python swift client library
216
+GITREPO["python-swiftclient"]=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git}
217
+GITBRANCH["python-swiftclient"]=${SWIFTCLIENT_BRANCH:-master}
218
+
219
+# trove client library test
220
+GITREPO["python-troveclient"]=${TROVECLIENT_REPO:-${GIT_BASE}/openstack/python-troveclient.git}
221
+GITBRANCH["python-troveclient"]=${TROVECLIENT_BRANCH:-master}
163 222
 
164 223
 # consolidated openstack python client
165
-OPENSTACKCLIENT_REPO=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git}
166
-OPENSTACKCLIENT_BRANCH=${OPENSTACKCLIENT_BRANCH:-master}
224
+GITREPO["python-openstackclient"]=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git}
225
+GITBRANCH["python-openstackclient"]=${OPENSTACKCLIENT_BRANCH:-master}
226
+# this doesn't exist in a lib file, so set it here
227
+GITDIR["python-openstackclient"]=$DEST/python-openstackclient
228
+
229
+###################
230
+#
231
+#  Oslo Libraries
232
+#
233
+###################
167 234
 
168 235
 # cliff command line framework
169
-CLIFF_REPO=${CLIFF_REPO:-${GIT_BASE}/openstack/cliff.git}
170
-CLIFF_BRANCH=${CLIFF_BRANCH:-master}
236
+GITREPO["cliff"]=${CLIFF_REPO:-${GIT_BASE}/openstack/cliff.git}
237
+GITBRANCH["cliff"]=${CLIFF_BRANCH:-master}
171 238
 
172 239
 # oslo.config
173
-OSLOCFG_REPO=${OSLOCFG_REPO:-${GIT_BASE}/openstack/oslo.config.git}
174
-OSLOCFG_BRANCH=${OSLOCFG_BRANCH:-master}
240
+GITREPO["oslo.config"]=${OSLOCFG_REPO:-${GIT_BASE}/openstack/oslo.config.git}
241
+GITBRANCH["oslo.config"]=${OSLOCFG_BRANCH:-master}
242
+
243
+# oslo.db
244
+GITREPO["oslo.db"]=${OSLODB_REPO:-${GIT_BASE}/openstack/oslo.db.git}
245
+GITBRANCH["oslo.db"]=${OSLODB_BRANCH:-master}
246
+
247
+# oslo.i18n
248
+GITREPO["oslo.i18n"]=${OSLOI18N_REPO:-${GIT_BASE}/openstack/oslo.i18n.git}
249
+GITBRANCH["oslo.i18n"]=${OSLOI18N_BRANCH:-master}
250
+
251
+# oslo.log
252
+GITREPO["oslo.log"]=${OSLOLOG_REPO:-${GIT_BASE}/openstack/oslo.log.git}
253
+GITBRANCH["oslo.log"]=${OSLOLOG_BRANCH:-master}
175 254
 
176 255
 # oslo.messaging
177
-OSLOMSG_REPO=${OSLOMSG_REPO:-${GIT_BASE}/openstack/oslo.messaging.git}
178
-OSLOMSG_BRANCH=${OSLOMSG_BRANCH:-master}
256
+GITREPO["oslo.messaging"]=${OSLOMSG_REPO:-${GIT_BASE}/openstack/oslo.messaging.git}
257
+GITBRANCH["oslo.messaging"]=${OSLOMSG_BRANCH:-master}
179 258
 
180 259
 # oslo.rootwrap
181
-OSLORWRAP_REPO=${OSLORWRAP_REPO:-${GIT_BASE}/openstack/oslo.rootwrap.git}
182
-OSLORWRAP_BRANCH=${OSLORWRAP_BRANCH:-master}
260
+GITREPO["oslo.rootwrap"]=${OSLORWRAP_REPO:-${GIT_BASE}/openstack/oslo.rootwrap.git}
261
+GITBRANCH["oslo.rootwrap"]=${OSLORWRAP_BRANCH:-master}
183 262
 
184 263
 # oslo.vmware
185
-OSLOVMWARE_REPO=${OSLOVMWARE_REPO:-${GIT_BASE}/openstack/oslo.vmware.git}
186
-OSLOVMWARE_BRANCH=${OSLOVMWARE_BRANCH:-master}
264
+GITREPO["oslo.vmware"]=${OSLOVMWARE_REPO:-${GIT_BASE}/openstack/oslo.vmware.git}
265
+GITBRANCH["oslo.vmware"]=${OSLOVMWARE_BRANCH:-master}
187 266
 
188 267
 # pycadf auditing library
189
-PYCADF_REPO=${PYCADF_REPO:-${GIT_BASE}/openstack/pycadf.git}
190
-PYCADF_BRANCH=${PYCADF_BRANCH:-master}
268
+GITREPO["pycadf"]=${PYCADF_REPO:-${GIT_BASE}/openstack/pycadf.git}
269
+GITBRANCH["pycadf"]=${PYCADF_BRANCH:-master}
191 270
 
192 271
 # stevedore plugin manager
193
-STEVEDORE_REPO=${STEVEDORE_REPO:-${GIT_BASE}/openstack/stevedore.git}
194
-STEVEDORE_BRANCH=${STEVEDORE_BRANCH:-master}
272
+GITREPO["stevedore"]=${STEVEDORE_REPO:-${GIT_BASE}/openstack/stevedore.git}
273
+GITBRANCH["stevedore"]=${STEVEDORE_BRANCH:-master}
195 274
 
196 275
 # taskflow plugin manager
197
-TASKFLOW_REPO=${TASKFLOW_REPO:-${GIT_BASE}/openstack/taskflow.git}
198
-TASKFLOW_BRANCH=${TASKFLOW_BRANCH:-master}
276
+GITREPO["taskflow"]=${TASKFLOW_REPO:-${GIT_BASE}/openstack/taskflow.git}
277
+GITBRANCH["taskflow"]=${TASKFLOW_BRANCH:-master}
199 278
 
200 279
 # pbr drives the setuptools configs
201
-PBR_REPO=${PBR_REPO:-${GIT_BASE}/openstack-dev/pbr.git}
202
-PBR_BRANCH=${PBR_BRANCH:-master}
280
+GITREPO["pbr"]=${PBR_REPO:-${GIT_BASE}/openstack-dev/pbr.git}
281
+GITBRANCH["pbr"]=${PBR_BRANCH:-master}
203 282
 
204
-# neutron service
205
-NEUTRON_REPO=${NEUTRON_REPO:-${GIT_BASE}/openstack/neutron.git}
206
-NEUTRON_BRANCH=${NEUTRON_BRANCH:-stable/icehouse}
283
+##################
284
+#
285
+#  Libraries managed by OpenStack programs (non oslo)
286
+#
287
+##################
207 288
 
208
-# neutron client
209
-NEUTRONCLIENT_REPO=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git}
210
-NEUTRONCLIENT_BRANCH=${NEUTRONCLIENT_BRANCH:-master}
289
+# heat-cfntools server agent
290
+HEAT_CFNTOOLS_REPO=${HEAT_CFNTOOLS_REPO:-${GIT_BASE}/openstack/heat-cfntools.git}
291
+HEAT_CFNTOOLS_BRANCH=${HEAT_CFNTOOLS_BRANCH:-master}
211 292
 
212
-# consolidated openstack requirements
213
-REQUIREMENTS_REPO=${REQUIREMENTS_REPO:-${GIT_BASE}/openstack/requirements.git}
214
-REQUIREMENTS_BRANCH=${REQUIREMENTS_BRANCH:-stable/icehouse}
293
+# heat example templates and elements
294
+HEAT_TEMPLATES_REPO=${HEAT_TEMPLATES_REPO:-${GIT_BASE}/openstack/heat-templates.git}
295
+HEAT_TEMPLATES_BRANCH=${HEAT_TEMPLATES_BRANCH:-master}
215 296
 
216
-# storage service
217
-SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git}
218
-SWIFT_BRANCH=${SWIFT_BRANCH:-stable/icehouse}
219
-SWIFT3_REPO=${SWIFT3_REPO:-${GIT_BASE}/stackforge/swift3.git}
220
-SWIFT3_BRANCH=${SWIFT3_BRANCH:-master}
297
+# django openstack_auth library
298
+GITREPO["django_openstack_auth"]=${HORIZONAUTH_REPO:-${GIT_BASE}/openstack/django_openstack_auth.git}
299
+GITBRANCH["django_openstack_auth"]=${HORIZONAUTH_BRANCH:-master}
221 300
 
222
-# python swift client library
223
-SWIFTCLIENT_REPO=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git}
224
-SWIFTCLIENT_BRANCH=${SWIFTCLIENT_BRANCH:-master}
301
+# keystone middleware
302
+GITREPO["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_REPO:-${GIT_BASE}/openstack/keystonemiddleware.git}
303
+GITBRANCH["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_BRANCH:-master}
225 304
 
226
-# Tempest test suite
227
-TEMPEST_REPO=${TEMPEST_REPO:-${GIT_BASE}/openstack/tempest.git}
228
-TEMPEST_BRANCH=${TEMPEST_BRANCH:-master}
305
+# s3 support for swift
306
+SWIFT3_REPO=${SWIFT3_REPO:-${GIT_BASE}/stackforge/swift3.git}
307
+SWIFT3_BRANCH=${SWIFT3_BRANCH:-master}
229 308
 
309
+##################
310
+#
311
+#  TripleO Components
312
+#
313
+##################
230 314
 
231 315
 # diskimage-builder
232 316
 DIB_REPO=${DIB_REPO:-${GIT_BASE}/openstack/diskimage-builder.git}
233 317
 DIB_BRANCH=${DIB_BRANCH:-master}
234 318
 
235
-# a websockets/html5 or flash powered VNC console for vm instances
236
-NOVNC_REPO=${NOVNC_REPO:-https://github.com/kanaka/noVNC.git}
237
-NOVNC_BRANCH=${NOVNC_BRANCH:-master}
319
+# os-apply-config configuration template tool
320
+OAC_REPO=${OAC_REPO:-${GIT_BASE}/openstack/os-apply-config.git}
321
+OAC_BRANCH=${OAC_BRANCH:-master}
238 322
 
239
-# ryu service
240
-RYU_REPO=${RYU_REPO:-https://github.com/osrg/ryu.git}
241
-RYU_BRANCH=${RYU_BRANCH:-master}
323
+# os-collect-config configuration agent
324
+OCC_REPO=${OCC_REPO:-${GIT_BASE}/openstack/os-collect-config.git}
325
+OCC_BRANCH=${OCC_BRANCH:-master}
242 326
 
243
-# a websockets/html5 or flash powered SPICE console for vm instances
244
-SPICE_REPO=${SPICE_REPO:-http://anongit.freedesktop.org/git/spice/spice-html5.git}
245
-SPICE_BRANCH=${SPICE_BRANCH:-master}
327
+# os-refresh-config configuration run-parts tool
328
+ORC_REPO=${ORC_REPO:-${GIT_BASE}/openstack/os-refresh-config.git}
329
+ORC_BRANCH=${ORC_BRANCH:-master}
246 330
 
247
-# trove service
248
-TROVE_REPO=${TROVE_REPO:-${GIT_BASE}/openstack/trove.git}
249
-TROVE_BRANCH=${TROVE_BRANCH:-stable/icehouse}
331
+# Tripleo elements for diskimage-builder images
332
+TIE_REPO=${TIE_REPO:-${GIT_BASE}/openstack/tripleo-image-elements.git}
333
+TIE_BRANCH=${TIE_BRANCH:-master}
250 334
 
251
-# trove client library test
252
-TROVECLIENT_REPO=${TROVECLIENT_REPO:-${GIT_BASE}/openstack/python-troveclient.git}
253
-TROVECLIENT_BRANCH=${TROVECLIENT_BRANCH:-master}
335
+#################
336
+#
337
+#  Additional Libraries
338
+#
339
+#################
254 340
 
255 341
 # stackforge libraries that are used by OpenStack core services
256 342
 # wsme
... ...
@@ -262,6 +348,32 @@ PECAN_REPO=${PECAN_REPO:-${GIT_BASE}/stackforge/pecan.git}
262 262
 PECAN_BRANCH=${PECAN_BRANCH:-master}
263 263
 
264 264
 
265
+#################
266
+#
267
+#  3rd Party Components (non pip installable)
268
+#
269
+#  NOTE(sdague): these should be converted to release version installs or removed
270
+#
271
+#################
272
+
273
+# ironic python agent
274
+IRONIC_PYTHON_AGENT_REPO=${IRONIC_PYTHON_AGENT_REPO:-${GIT_BASE}/openstack/ironic-python-agent.git}
275
+IRONIC_PYTHON_AGENT_BRANCH=${IRONIC_PYTHON_AGENT_BRANCH:-master}
276
+
277
+# a websockets/html5 or flash powered VNC console for vm instances
278
+NOVNC_REPO=${NOVNC_REPO:-https://github.com/kanaka/noVNC.git}
279
+NOVNC_BRANCH=${NOVNC_BRANCH:-master}
280
+
281
+# ryu service
282
+RYU_REPO=${RYU_REPO:-https://github.com/osrg/ryu.git}
283
+RYU_BRANCH=${RYU_BRANCH:-master}
284
+
285
+# a websockets/html5 or flash powered SPICE console for vm instances
286
+SPICE_REPO=${SPICE_REPO:-http://anongit.freedesktop.org/git/spice/spice-html5.git}
287
+SPICE_BRANCH=${SPICE_BRANCH:-master}
288
+
289
+
290
+
265 291
 # Nova hypervisor configuration.  We default to libvirt with **kvm** but will
266 292
 # drop back to **qemu** if we are unable to load the kvm module.  ``stack.sh`` can
267 293
 # also install an **LXC**, **OpenVZ** or **XenAPI** based system.  If xenserver-core
268 294
new file mode 100755
... ...
@@ -0,0 +1,97 @@
0
+#!/usr/bin/env bash
1
+#
2
+# Licensed under the Apache License, Version 2.0 (the "License");
3
+# you may not use this file except in compliance with the License.
4
+# You may obtain a copy of the License at
5
+#
6
+#    http://www.apache.org/licenses/LICENSE-2.0
7
+#
8
+# Unless required by applicable law or agreed to in writing, software
9
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11
+# License for the specific language governing permissions and limitations
12
+# under the License.
13
+
14
+
15
+TOP=$(cd $(dirname "$0")/.. && pwd)
16
+
17
+export TOP_DIR=$TOP
18
+
19
+# Import common functions
20
+source $TOP/functions
21
+source $TOP/stackrc
22
+source $TOP/lib/tls
23
+for i in $TOP/lib/*; do
24
+    if [[ -f $i ]]; then
25
+        source $i
26
+    fi
27
+done
28
+
29
+ALL_LIBS="python-novaclient oslo.config pbr python-troveclient python-keystoneclient taskflow pycadf python-glanceclient python-ironicclient tempest-lib oslo.messaging oslo.log cliff python-heatclient stevedore python-cinderclient oslo.db oslo.vmware keystonemiddleware python-saharaclient django_openstack_auth python-openstackclient oslo.rootwrap oslo.i18n python-ceilometerclient python-swiftclient python-neutronclient"
30
+
31
+# Generate the above list with
32
+# echo ${!GITREPO[@]}
33
+# exit 1
34
+
35
+function check_exists {
36
+    local thing=$1
37
+    local hash=$2
38
+    local key=$3
39
+    if [[ ! -z "$VERBOSE" ]]; then
40
+        echo "Checking for $hash[$key]"
41
+    fi
42
+    if [[ -z $thing ]]; then
43
+        echo "$hash[$key] does not exit!"
44
+        exit 1
45
+    else
46
+        if [[ ! -z "$VERBOSE" ]]; then
47
+            echo "$hash[$key] => $thing"
48
+        fi
49
+    fi
50
+}
51
+
52
+function test_all_libs_upto_date {
53
+    # this is all the magics
54
+    local found_libs=${!GITREPO[@]}
55
+    declare -A all_libs
56
+    for lib in $ALL_LIBS; do
57
+        all_libs[$lib]=1
58
+    done
59
+
60
+    for lib in $found_libs; do
61
+        if [[ -z ${all_libs[$lib]} ]]; then
62
+            echo "Library '$lib' not listed in unit tests, please add to ALL_LIBS"
63
+            exit 1
64
+        fi
65
+
66
+    done
67
+    echo "test_all_libs_upto_date PASSED"
68
+}
69
+
70
+function test_libs_exist {
71
+    local lib=""
72
+    for lib in $ALL_LIBS; do
73
+        check_exists "${GITREPO[$lib]}" "GITREPO" "$lib"
74
+        check_exists "${GITBRANCH[$lib]}" "GITBRANCH" "$lib"
75
+        check_exists "${GITDIR[$lib]}" "GITDIR" "$lib"
76
+    done
77
+
78
+    echo "test_libs_exist PASSED"
79
+}
80
+
81
+function test_branch_master {
82
+    for lib in $ALL_LIBS; do
83
+        if [[ ${GITBRANCH[$lib]} != "master" ]]; then
84
+            echo "GITBRANCH for $lib not master (${GITBRANCH[$lib]})"
85
+            exit 1
86
+        fi
87
+    done
88
+
89
+    echo "test_branch_master PASSED"
90
+}
91
+
92
+set -o errexit
93
+
94
+test_libs_exist
95
+test_branch_master
96
+test_all_libs_upto_date