Compare commits
98 Commits
master
...
queens-eol
| Author | SHA1 | Date | |
|---|---|---|---|
| 4da98ee6d4 | |||
| e80f0802e0 | |||
| 1b9ca1751a | |||
| 3fe8887113 | |||
| 775e8f22da | |||
| e6070e3f21 | |||
| 8f368650d0 | |||
| bc5e1eba8f | |||
| 293c97d6ca | |||
| 10877d79d6 | |||
| f4b063b207 | |||
| 12634ba6e2 | |||
| a05fc211ed | |||
| 7d43b099c5 | |||
| 21c448b4cb | |||
| 5ad31be67a | |||
| 4014fb8c52 | |||
| ba3e77b5ef | |||
| cff43f463d | |||
| f58ecb3e75 | |||
| ef37d5742a | |||
| 6591be1c2b | |||
| 786c485cf6 | |||
| ab75fc6557 | |||
| 46cd5ef70b | |||
| a250a41678 | |||
| b3a817956a | |||
| 9219134cb0 | |||
| b80c66e730 | |||
| 7b001f5d6c | |||
| 2281642c88 | |||
| 93a385c005 | |||
| 6f3696c168 | |||
| e3100794d1 | |||
| fb9d5c80c2 | |||
| 1267eca36b | |||
| 72e80739bc | |||
| 3152bdf0d7 | |||
| f99fffb6d7 | |||
| e9cbcba53a | |||
| 4052350d9c | |||
| dd575f7f38 | |||
| 6b7937bf20 | |||
| 7a882a17f7 | |||
| e89179e82f | |||
| e98e7d5ae3 | |||
| e06cc1558b | |||
| 25daf8940f | |||
| 82d7774555 | |||
| c7114582c0 | |||
| ffb6cf7b4a | |||
| fad20e605c | |||
| 97f88fc4e2 | |||
| 27331589e2 | |||
| b11da3f3cf | |||
| cc3750013b | |||
| 2ef1826db7 | |||
| eee6524d09 | |||
| 935ae3f73a | |||
| a24e707724 | |||
| 96aaeda08e | |||
| cd517afc6d | |||
| d60707e88d | |||
| 1089e96d04 | |||
| c246367db0 | |||
| f97a6c3d67 | |||
| fec37dada3 | |||
| 2b65fbd6b4 | |||
| 279aed2b40 | |||
| ba975bbb21 | |||
| 6676f25a27 | |||
| 3a19ac074f | |||
| da5c918d73 | |||
| e1cda1ca59 | |||
| fb65c9d3f9 | |||
| 61e3095615 | |||
| 6c3606bd44 | |||
| 904bb5620a | |||
| 42a0613929 | |||
| f0a7b22b56 | |||
| c0e1d3b341 | |||
| b543369a25 | |||
| ca62e563f2 | |||
| eaa29087df | |||
| f1fa7fc86b | |||
| 58f1f6d04e | |||
| 2f0858e25c | |||
| bb0c101c0c | |||
| 661b186554 | |||
| 95ce0a2539 | |||
| 473ce177a9 | |||
| abe9fd826a | |||
| 0f65575b5f | |||
| 851bc53dfa | |||
| 12a9f246ef | |||
| bf9a2a6c1a | |||
| fd9b8c31a2 | |||
| 96f05a88dd |
@@ -3,6 +3,7 @@
|
||||
*.log
|
||||
*.log.[1-9]
|
||||
*.pem
|
||||
*.pyc
|
||||
.localrc.auto
|
||||
.localrc.password
|
||||
.prereqs
|
||||
|
||||
+3
-2
@@ -1,4 +1,5 @@
|
||||
[gerrit]
|
||||
host=review.openstack.org
|
||||
host=review.opendev.org
|
||||
port=29418
|
||||
project=openstack-dev/devstack.git
|
||||
project=openstack/devstack.git
|
||||
defaultbranch=stable/queens
|
||||
|
||||
+273
-66
@@ -16,53 +16,58 @@
|
||||
- name: compute1
|
||||
label: ubuntu-xenial
|
||||
groups:
|
||||
# Node where tests are executed and test results collected
|
||||
- name: tempest
|
||||
nodes:
|
||||
- controller
|
||||
# Nodes running the compute service
|
||||
- name: compute
|
||||
nodes:
|
||||
- controller
|
||||
- compute1
|
||||
# Nodes that are not the controller
|
||||
- name: subnode
|
||||
nodes:
|
||||
- compute1
|
||||
# Switch node for multinode networking setup
|
||||
- name: switch
|
||||
nodes:
|
||||
- controller
|
||||
# Peer nodes for multinode networking setup
|
||||
- name: peers
|
||||
nodes:
|
||||
- compute1
|
||||
|
||||
- job:
|
||||
name: devstack
|
||||
name: devstack-base
|
||||
parent: multinode
|
||||
description: Base devstack job
|
||||
nodeset: openstack-single-node
|
||||
abstract: true
|
||||
description: |
|
||||
Base abstract Devstack job.
|
||||
|
||||
Defines plays and base variables, but it does not include any project
|
||||
and it does not run any service by default. This is a common base for
|
||||
all single Devstack jobs, single or multinode.
|
||||
Variables are defined in job.vars, which is what is then used by single
|
||||
node jobs and by multi node jobs for the controller, as well as in
|
||||
job.group-vars.peers, which is what is used by multi node jobs for subnode
|
||||
nodes (everything but the controller).
|
||||
required-projects:
|
||||
- openstack-dev/devstack
|
||||
- openstack/cinder
|
||||
- openstack/glance
|
||||
- openstack/keystone
|
||||
- openstack/neutron
|
||||
- openstack/nova
|
||||
- openstack/requirements
|
||||
- openstack/swift
|
||||
- opendev.org/openstack/devstack
|
||||
roles:
|
||||
- zuul: openstack-infra/devstack-gate
|
||||
- zuul: openstack-infra/openstack-zuul-jobs
|
||||
timeout: 7200
|
||||
- zuul: opendev.org/openstack/devstack-gate
|
||||
- zuul: opendev.org/openstack/openstack-zuul-jobs
|
||||
vars:
|
||||
test_matrix_configs: [neutron, tlsproxy]
|
||||
devstack_localrc:
|
||||
DATABASE_PASSWORD: secretdatabase
|
||||
RABBIT_PASSWORD: secretrabbit
|
||||
ADMIN_PASSWORD: secretadmin
|
||||
SERVICE_PASSWORD: secretservice
|
||||
NETWORK_GATEWAY: 10.1.0.1
|
||||
Q_USE_DEBUG_COMMAND: true
|
||||
FIXED_RANGE: 10.1.0.0/20
|
||||
IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
|
||||
FLOATING_RANGE: 172.24.5.0/24
|
||||
PUBLIC_NETWORK_GATEWAY: 172.24.5.1
|
||||
FLOATING_HOST_PREFIX: 172.24.4
|
||||
FLOATING_HOST_MASK: 23
|
||||
SWIFT_REPLICAS: 1
|
||||
SWIFT_START_ALL_SERVICES: false
|
||||
SWIFT_HASH: 1234123412341234
|
||||
LOGFILE: /opt/stack/logs/devstacklog.txt
|
||||
LOG_COLOR: false
|
||||
VERBOSE: true
|
||||
@@ -75,48 +80,72 @@
|
||||
# from the location below for all the CI jobs.
|
||||
ETCD_DOWNLOAD_URL: http://tarballs.openstack.org/etcd/
|
||||
devstack_services:
|
||||
horizon: false
|
||||
tempest: false
|
||||
# Ignore any default set by devstack. Emit a "disable_all_services".
|
||||
base: false
|
||||
zuul_copy_output:
|
||||
'{{ devstack_conf_dir }}/local.conf': 'logs'
|
||||
'{{ devstack_conf_dir }}/localrc': 'logs'
|
||||
'{{ devstack_conf_dir }}/.stackenv': 'logs'
|
||||
'{{ devstack_log_dir }}/dstat-csv.log': 'logs'
|
||||
'{{ devstack_log_dir }}/devstacklog.txt': 'logs'
|
||||
'{{ devstack_log_dir }}/devstacklog.txt.summary': 'logs'
|
||||
'{{ devstack_full_log}}': 'logs'
|
||||
'{{ stage_dir }}/verify_tempest_conf.log': 'logs'
|
||||
'{{ stage_dir }}/apache': 'logs'
|
||||
'{{ stage_dir }}/apache_config': 'logs'
|
||||
'{{ stage_dir }}/etc': 'logs'
|
||||
'/var/log/rabbitmq': 'logs'
|
||||
'/var/log/postgresql': 'logs'
|
||||
'/var/log/mysql.err': 'logs'
|
||||
'/var/log/mysql.log': 'logs'
|
||||
'/var/log/libvirt': 'logs'
|
||||
'/etc/sudoers': 'logs'
|
||||
'/etc/sudoers.d': 'logs'
|
||||
'{{ stage_dir }}/iptables.txt': 'logs'
|
||||
'{{ stage_dir }}/df.txt': 'logs'
|
||||
'{{ stage_dir }}/pip2-freeze.txt': 'logs'
|
||||
'{{ stage_dir }}/pip3-freeze.txt': 'logs'
|
||||
'{{ stage_dir }}/dpkg-l.txt': 'logs'
|
||||
'{{ stage_dir }}/rpm-qa.txt': 'logs'
|
||||
'{{ stage_dir }}/core': 'logs'
|
||||
'{{ stage_dir }}/listen53.txt': 'logs'
|
||||
'{{ stage_dir }}/deprecations.log': 'logs'
|
||||
'/var/log/ceph': 'logs'
|
||||
'/var/log/openvswitch': 'logs'
|
||||
'/var/log/glusterfs': 'logs'
|
||||
'/etc/glusterfs/glusterd.vol': 'logs'
|
||||
'/etc/resolv.conf': 'logs'
|
||||
'/var/log/unbound.log': 'logs'
|
||||
'{{ devstack_conf_dir }}/local.conf': logs
|
||||
'{{ devstack_conf_dir }}/localrc': logs
|
||||
'{{ devstack_conf_dir }}/.localrc.auto': logs
|
||||
'{{ devstack_conf_dir }}/.stackenv': logs
|
||||
'{{ devstack_log_dir }}/dstat-csv.log': logs
|
||||
'{{ devstack_log_dir }}/devstacklog.txt': logs
|
||||
'{{ devstack_log_dir }}/devstacklog.txt.summary': logs
|
||||
'{{ devstack_full_log}}': logs
|
||||
'{{ stage_dir }}/verify_tempest_conf.log': logs
|
||||
'{{ stage_dir }}/apache': logs
|
||||
'{{ stage_dir }}/apache_config': logs
|
||||
'{{ stage_dir }}/etc': logs
|
||||
/var/log/rabbitmq: logs
|
||||
/var/log/postgresql: logs
|
||||
/var/log/mysql.err: logs
|
||||
/var/log/mysql.log: logs
|
||||
/var/log/libvirt: logs
|
||||
/etc/sudoers: logs
|
||||
/etc/sudoers.d: logs
|
||||
'{{ stage_dir }}/iptables.txt': logs
|
||||
'{{ stage_dir }}/df.txt': logs
|
||||
'{{ stage_dir }}/pip2-freeze.txt': logs
|
||||
'{{ stage_dir }}/pip3-freeze.txt': logs
|
||||
'{{ stage_dir }}/dpkg-l.txt': logs
|
||||
'{{ stage_dir }}/rpm-qa.txt': logs
|
||||
'{{ stage_dir }}/core': logs
|
||||
'{{ stage_dir }}/listen53.txt': logs
|
||||
'{{ stage_dir }}/deprecations.log': logs
|
||||
/var/log/ceph: logs
|
||||
/var/log/openvswitch: logs
|
||||
/var/log/glusterfs: logs
|
||||
/etc/glusterfs/glusterd.vol: logs
|
||||
/etc/resolv.conf: logs
|
||||
/var/log/unbound.log: logs
|
||||
extensions_to_txt:
|
||||
conf: True
|
||||
log: True
|
||||
localrc: True
|
||||
stackenv: True
|
||||
summary: True
|
||||
conf: true
|
||||
log: true
|
||||
localrc: true
|
||||
stackenv: true
|
||||
auto: true
|
||||
group-vars:
|
||||
subnode:
|
||||
test_matrix_role: subnode
|
||||
devstack_localrc:
|
||||
DATABASE_PASSWORD: secretdatabase
|
||||
RABBIT_PASSWORD: secretrabbit
|
||||
ADMIN_PASSWORD: secretadmin
|
||||
SERVICE_PASSWORD: secretservice
|
||||
NETWORK_GATEWAY: 10.1.0.1
|
||||
FIXED_RANGE: 10.1.0.0/20
|
||||
IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
|
||||
FLOATING_RANGE: 172.24.5.0/24
|
||||
PUBLIC_NETWORK_GATEWAY: 172.24.5.1
|
||||
LOGFILE: /opt/stack/logs/devstacklog.txt
|
||||
LOG_COLOR: false
|
||||
VERBOSE: true
|
||||
VERBOSE_NO_TIMESTAMP: true
|
||||
NOVNC_FROM_PACKAGE: true
|
||||
ERROR_ON_CLONE: true
|
||||
LIBVIRT_TYPE: qemu
|
||||
ETCD_DOWNLOAD_URL: http://tarballs.openstack.org/etcd/
|
||||
devstack_services:
|
||||
base: false
|
||||
pre-run: playbooks/pre.yaml
|
||||
run: playbooks/devstack.yaml
|
||||
post-run: playbooks/post.yaml
|
||||
@@ -129,15 +158,108 @@
|
||||
# Translations
|
||||
- ^.*/locale/.*po$
|
||||
|
||||
- job:
|
||||
name: devstack-minimal
|
||||
parent: devstack-base
|
||||
description: |
|
||||
Minimal devstack base job, intended for use by jobs that need
|
||||
less than the normal minimum set of required-projects.
|
||||
nodeset: openstack-single-node
|
||||
required-projects:
|
||||
- opendev.org/openstack/requirements
|
||||
vars:
|
||||
devstack_localrc:
|
||||
# Multinode specific settings
|
||||
SERVICE_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
|
||||
HOST_IP: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
|
||||
PUBLIC_BRIDGE_MTU: "{{ external_bridge_mtu }}"
|
||||
devstack_services:
|
||||
# Shared services
|
||||
dstat: true
|
||||
etcd3: false
|
||||
mysql: true
|
||||
peakmem_tracker: true
|
||||
rabbit: true
|
||||
group-vars:
|
||||
subnode:
|
||||
devstack_services:
|
||||
# Shared services
|
||||
dstat: true
|
||||
peakmem_tracker: true
|
||||
devstack_localrc:
|
||||
# Multinode specific settings
|
||||
HOST_IP: "{{ hostvars[inventory_hostname]['nodepool']['private_ipv4'] }}"
|
||||
SERVICE_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
|
||||
PUBLIC_BRIDGE_MTU: "{{ external_bridge_mtu }}"
|
||||
# Subnode specific settings
|
||||
DATABASE_TYPE: mysql
|
||||
RABBIT_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
|
||||
DATABASE_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
|
||||
|
||||
|
||||
- job:
|
||||
name: devstack
|
||||
parent: devstack-minimal
|
||||
description: |
|
||||
Base devstack job for integration gate.
|
||||
|
||||
This base job can be used for single node and multinode devstack jobs.
|
||||
nodeset: openstack-single-node
|
||||
required-projects:
|
||||
- opendev.org/openstack/cinder
|
||||
- opendev.org/openstack/glance
|
||||
- opendev.org/openstack/keystone
|
||||
- opendev.org/openstack/neutron
|
||||
- opendev.org/openstack/nova
|
||||
- opendev.org/openstack/swift
|
||||
timeout: 7200
|
||||
vars:
|
||||
test_matrix_configs: [neutron, tlsproxy]
|
||||
devstack_localrc:
|
||||
# Common OpenStack services settings
|
||||
SWIFT_REPLICAS: 1
|
||||
SWIFT_START_ALL_SERVICES: false
|
||||
SWIFT_HASH: 1234123412341234
|
||||
CINDER_PERIODIC_INTERVAL: 10
|
||||
DEBUG_LIBVIRT_COREDUMPS: true
|
||||
NOVA_VNC_ENABLED: true
|
||||
VNCSERVER_LISTEN: 0.0.0.0
|
||||
VNCSERVER_PROXYCLIENT_ADDRESS: $HOST_IP
|
||||
devstack_local_conf:
|
||||
post-config:
|
||||
$NEUTRON_CONF:
|
||||
DEFAULT:
|
||||
global_physnet_mtu: '{{ external_bridge_mtu }}'
|
||||
devstack_services:
|
||||
base: true
|
||||
# We need this explicitly here to trigger the sync of the CA data
|
||||
tls-proxy: true
|
||||
horizon: false
|
||||
tempest: false
|
||||
# Test matrix emits ceilometer but ceilomenter is not installed in the
|
||||
# integrated gate, so specifying the services has not effect.
|
||||
# ceilometer-*: false
|
||||
group-vars:
|
||||
subnode:
|
||||
devstack_services:
|
||||
base: true
|
||||
# We need this explicitly here to trigger the sync of the CA data
|
||||
tls-proxy: true
|
||||
devstack_localrc:
|
||||
# Subnode specific settings
|
||||
GLANCE_HOSTPORT: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}:9292"
|
||||
Q_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
|
||||
NOVA_VNC_ENABLED: true
|
||||
VNCSERVER_LISTEN: 0.0.0.0
|
||||
VNCSERVER_PROXYCLIENT_ADDRESS: $HOST_IP
|
||||
|
||||
- job:
|
||||
name: devstack-multinode
|
||||
parent: devstack
|
||||
description: Base devstack multinode job
|
||||
nodeset: openstack-two-node
|
||||
# NOTE(andreaf) The multinode job is useful to see the setup of different
|
||||
# services on different nodes, however the subnode configuration is not
|
||||
# ready yet. Until then this job should stay non-voting.
|
||||
voting: false
|
||||
description: |
|
||||
Simple multinode test to verify multinode functionality on devstack side.
|
||||
This is not meant to be used as a parent job.
|
||||
|
||||
- job:
|
||||
name: devstack-tox-base
|
||||
@@ -193,11 +315,96 @@
|
||||
- playbooks/tox/pre.yaml
|
||||
run: playbooks/tox/run.yaml
|
||||
|
||||
- job:
|
||||
name: devstack-unit-tests
|
||||
nodeset: ubuntu-xenial
|
||||
description: |
|
||||
Runs unit tests on devstack project.
|
||||
|
||||
It runs ``run_tests.sh``.
|
||||
pre-run: playbooks/unit-tests/pre.yaml
|
||||
run: playbooks/unit-tests/run.yaml
|
||||
|
||||
- project:
|
||||
templates:
|
||||
- integrated-gate
|
||||
- integrated-gate-py35
|
||||
- publish-openstack-sphinx-docs
|
||||
check:
|
||||
jobs:
|
||||
- devstack
|
||||
- devstack-multinode
|
||||
- devstack-unit-tests
|
||||
- openstack-tox-bashate
|
||||
- ironic-tempest-dsvm-ipa-wholedisk-bios-agent_ipmitool-tinyipa:
|
||||
voting: false
|
||||
- swift-dsvm-functional:
|
||||
voting: false
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
- neutron-grenade:
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
- neutron-grenade-multinode:
|
||||
voting: false
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
- neutron-tempest-linuxbridge:
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
- tempest-multinode-full:
|
||||
voting: false
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
gate:
|
||||
jobs:
|
||||
- devstack
|
||||
- devstack-unit-tests
|
||||
- openstack-tox-bashate
|
||||
#- neutron-grenade-multinode:
|
||||
# irrelevant-files:
|
||||
# - ^.*\.rst$
|
||||
# - ^doc/.*$
|
||||
- neutron-tempest-linuxbridge:
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
#- neutron-grenade:
|
||||
# irrelevant-files:
|
||||
# - ^.*\.rst$
|
||||
# - ^doc/.*$
|
||||
experimental:
|
||||
jobs:
|
||||
- devstack-plugin-ceph-tempest:
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
- devstack-plugin-ceph-tempest-py3:
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
- neutron-tempest-dvr:
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
- legacy-tempest-dsvm-neutron-dvr-multinode-full:
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
- neutron-tempest-dvr-ha-multinode-full:
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
- legacy-tempest-dsvm-lvm-multibackend:
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
- legacy-tempest-dsvm-neutron-pg-full:
|
||||
irrelevant-files:
|
||||
- ^.*\.rst$
|
||||
- ^doc/.*$
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ You can also pick specific OpenStack project releases by setting the appropriate
|
||||
`stackrc` for the default set). Usually just before a release there will be
|
||||
milestone-proposed branches that need to be tested::
|
||||
|
||||
GLANCE_REPO=git://git.openstack.org/openstack/glance.git
|
||||
GLANCE_REPO=https://git.openstack.org/openstack/glance.git
|
||||
GLANCE_BRANCH=milestone-proposed
|
||||
|
||||
Start A Dev Cloud
|
||||
|
||||
@@ -567,7 +567,7 @@ you do not require them.
|
||||
Q_ML2_PLUGIN_MECHANISM_DRIVERS=macvtap
|
||||
Q_USE_PROVIDER_NETWORKING=True
|
||||
|
||||
enable_plugin neutron git://git.openstack.org/openstack/neutron
|
||||
enable_plugin neutron https://git.openstack.org/openstack/neutron
|
||||
|
||||
## MacVTap agent options
|
||||
Q_AGENT=macvtap
|
||||
@@ -622,7 +622,7 @@ For the MacVTap compute node, use this local.conf:
|
||||
|
||||
# Services that a compute node runs
|
||||
disable_all_services
|
||||
enable_plugin neutron git://git.openstack.org/openstack/neutron
|
||||
enable_plugin neutron https://git.openstack.org/openstack/neutron
|
||||
ENABLED_SERVICES+=n-cpu,q-agt
|
||||
|
||||
## MacVTap agent options
|
||||
|
||||
+163
-163
@@ -24,169 +24,169 @@ official OpenStack projects.
|
||||
====================================== ===
|
||||
Plugin Name URL
|
||||
====================================== ===
|
||||
almanach `git://git.openstack.org/openstack/almanach <https://git.openstack.org/cgit/openstack/almanach>`__
|
||||
aodh `git://git.openstack.org/openstack/aodh <https://git.openstack.org/cgit/openstack/aodh>`__
|
||||
astara `git://git.openstack.org/openstack/astara <https://git.openstack.org/cgit/openstack/astara>`__
|
||||
barbican `git://git.openstack.org/openstack/barbican <https://git.openstack.org/cgit/openstack/barbican>`__
|
||||
bilean `git://git.openstack.org/openstack/bilean <https://git.openstack.org/cgit/openstack/bilean>`__
|
||||
blazar `git://git.openstack.org/openstack/blazar <https://git.openstack.org/cgit/openstack/blazar>`__
|
||||
broadview-collector `git://git.openstack.org/openstack/broadview-collector <https://git.openstack.org/cgit/openstack/broadview-collector>`__
|
||||
ceilometer `git://git.openstack.org/openstack/ceilometer <https://git.openstack.org/cgit/openstack/ceilometer>`__
|
||||
ceilometer-powervm `git://git.openstack.org/openstack/ceilometer-powervm <https://git.openstack.org/cgit/openstack/ceilometer-powervm>`__
|
||||
cloudkitty `git://git.openstack.org/openstack/cloudkitty <https://git.openstack.org/cgit/openstack/cloudkitty>`__
|
||||
collectd-ceilometer-plugin `git://git.openstack.org/openstack/collectd-ceilometer-plugin <https://git.openstack.org/cgit/openstack/collectd-ceilometer-plugin>`__
|
||||
congress `git://git.openstack.org/openstack/congress <https://git.openstack.org/cgit/openstack/congress>`__
|
||||
cue `git://git.openstack.org/openstack/cue <https://git.openstack.org/cgit/openstack/cue>`__
|
||||
cyborg `git://git.openstack.org/openstack/cyborg <https://git.openstack.org/cgit/openstack/cyborg>`__
|
||||
designate `git://git.openstack.org/openstack/designate <https://git.openstack.org/cgit/openstack/designate>`__
|
||||
devstack-plugin-additional-pkg-repos `git://git.openstack.org/openstack/devstack-plugin-additional-pkg-repos <https://git.openstack.org/cgit/openstack/devstack-plugin-additional-pkg-repos>`__
|
||||
devstack-plugin-amqp1 `git://git.openstack.org/openstack/devstack-plugin-amqp1 <https://git.openstack.org/cgit/openstack/devstack-plugin-amqp1>`__
|
||||
devstack-plugin-bdd `git://git.openstack.org/openstack/devstack-plugin-bdd <https://git.openstack.org/cgit/openstack/devstack-plugin-bdd>`__
|
||||
devstack-plugin-ceph `git://git.openstack.org/openstack/devstack-plugin-ceph <https://git.openstack.org/cgit/openstack/devstack-plugin-ceph>`__
|
||||
devstack-plugin-container `git://git.openstack.org/openstack/devstack-plugin-container <https://git.openstack.org/cgit/openstack/devstack-plugin-container>`__
|
||||
devstack-plugin-glusterfs `git://git.openstack.org/openstack/devstack-plugin-glusterfs <https://git.openstack.org/cgit/openstack/devstack-plugin-glusterfs>`__
|
||||
devstack-plugin-hdfs `git://git.openstack.org/openstack/devstack-plugin-hdfs <https://git.openstack.org/cgit/openstack/devstack-plugin-hdfs>`__
|
||||
devstack-plugin-kafka `git://git.openstack.org/openstack/devstack-plugin-kafka <https://git.openstack.org/cgit/openstack/devstack-plugin-kafka>`__
|
||||
devstack-plugin-libvirt-qemu `git://git.openstack.org/openstack/devstack-plugin-libvirt-qemu <https://git.openstack.org/cgit/openstack/devstack-plugin-libvirt-qemu>`__
|
||||
devstack-plugin-mariadb `git://git.openstack.org/openstack/devstack-plugin-mariadb <https://git.openstack.org/cgit/openstack/devstack-plugin-mariadb>`__
|
||||
devstack-plugin-nfs `git://git.openstack.org/openstack/devstack-plugin-nfs <https://git.openstack.org/cgit/openstack/devstack-plugin-nfs>`__
|
||||
devstack-plugin-pika `git://git.openstack.org/openstack/devstack-plugin-pika <https://git.openstack.org/cgit/openstack/devstack-plugin-pika>`__
|
||||
devstack-plugin-sheepdog `git://git.openstack.org/openstack/devstack-plugin-sheepdog <https://git.openstack.org/cgit/openstack/devstack-plugin-sheepdog>`__
|
||||
devstack-plugin-vmax `git://git.openstack.org/openstack/devstack-plugin-vmax <https://git.openstack.org/cgit/openstack/devstack-plugin-vmax>`__
|
||||
devstack-plugin-zmq `git://git.openstack.org/openstack/devstack-plugin-zmq <https://git.openstack.org/cgit/openstack/devstack-plugin-zmq>`__
|
||||
dragonflow `git://git.openstack.org/openstack/dragonflow <https://git.openstack.org/cgit/openstack/dragonflow>`__
|
||||
drbd-devstack `git://git.openstack.org/openstack/drbd-devstack <https://git.openstack.org/cgit/openstack/drbd-devstack>`__
|
||||
ec2-api `git://git.openstack.org/openstack/ec2-api <https://git.openstack.org/cgit/openstack/ec2-api>`__
|
||||
freezer `git://git.openstack.org/openstack/freezer <https://git.openstack.org/cgit/openstack/freezer>`__
|
||||
freezer-api `git://git.openstack.org/openstack/freezer-api <https://git.openstack.org/cgit/openstack/freezer-api>`__
|
||||
freezer-web-ui `git://git.openstack.org/openstack/freezer-web-ui <https://git.openstack.org/cgit/openstack/freezer-web-ui>`__
|
||||
fuxi `git://git.openstack.org/openstack/fuxi <https://git.openstack.org/cgit/openstack/fuxi>`__
|
||||
gce-api `git://git.openstack.org/openstack/gce-api <https://git.openstack.org/cgit/openstack/gce-api>`__
|
||||
glare `git://git.openstack.org/openstack/glare <https://git.openstack.org/cgit/openstack/glare>`__
|
||||
group-based-policy `git://git.openstack.org/openstack/group-based-policy <https://git.openstack.org/cgit/openstack/group-based-policy>`__
|
||||
heat `git://git.openstack.org/openstack/heat <https://git.openstack.org/cgit/openstack/heat>`__
|
||||
heat-dashboard `git://git.openstack.org/openstack/heat-dashboard <https://git.openstack.org/cgit/openstack/heat-dashboard>`__
|
||||
horizon-mellanox `git://git.openstack.org/openstack/horizon-mellanox <https://git.openstack.org/cgit/openstack/horizon-mellanox>`__
|
||||
ironic `git://git.openstack.org/openstack/ironic <https://git.openstack.org/cgit/openstack/ironic>`__
|
||||
ironic-inspector `git://git.openstack.org/openstack/ironic-inspector <https://git.openstack.org/cgit/openstack/ironic-inspector>`__
|
||||
ironic-staging-drivers `git://git.openstack.org/openstack/ironic-staging-drivers <https://git.openstack.org/cgit/openstack/ironic-staging-drivers>`__
|
||||
ironic-ui `git://git.openstack.org/openstack/ironic-ui <https://git.openstack.org/cgit/openstack/ironic-ui>`__
|
||||
k8s-cloud-provider `git://git.openstack.org/openstack/k8s-cloud-provider <https://git.openstack.org/cgit/openstack/k8s-cloud-provider>`__
|
||||
karbor `git://git.openstack.org/openstack/karbor <https://git.openstack.org/cgit/openstack/karbor>`__
|
||||
karbor-dashboard `git://git.openstack.org/openstack/karbor-dashboard <https://git.openstack.org/cgit/openstack/karbor-dashboard>`__
|
||||
keystone `git://git.openstack.org/openstack/keystone <https://git.openstack.org/cgit/openstack/keystone>`__
|
||||
kingbird `git://git.openstack.org/openstack/kingbird <https://git.openstack.org/cgit/openstack/kingbird>`__
|
||||
kuryr-kubernetes `git://git.openstack.org/openstack/kuryr-kubernetes <https://git.openstack.org/cgit/openstack/kuryr-kubernetes>`__
|
||||
kuryr-libnetwork `git://git.openstack.org/openstack/kuryr-libnetwork <https://git.openstack.org/cgit/openstack/kuryr-libnetwork>`__
|
||||
kuryr-tempest-plugin `git://git.openstack.org/openstack/kuryr-tempest-plugin <https://git.openstack.org/cgit/openstack/kuryr-tempest-plugin>`__
|
||||
magnum `git://git.openstack.org/openstack/magnum <https://git.openstack.org/cgit/openstack/magnum>`__
|
||||
magnum-ui `git://git.openstack.org/openstack/magnum-ui <https://git.openstack.org/cgit/openstack/magnum-ui>`__
|
||||
manila `git://git.openstack.org/openstack/manila <https://git.openstack.org/cgit/openstack/manila>`__
|
||||
manila-ui `git://git.openstack.org/openstack/manila-ui <https://git.openstack.org/cgit/openstack/manila-ui>`__
|
||||
masakari `git://git.openstack.org/openstack/masakari <https://git.openstack.org/cgit/openstack/masakari>`__
|
||||
meteos `git://git.openstack.org/openstack/meteos <https://git.openstack.org/cgit/openstack/meteos>`__
|
||||
meteos-ui `git://git.openstack.org/openstack/meteos-ui <https://git.openstack.org/cgit/openstack/meteos-ui>`__
|
||||
mistral `git://git.openstack.org/openstack/mistral <https://git.openstack.org/cgit/openstack/mistral>`__
|
||||
mixmatch `git://git.openstack.org/openstack/mixmatch <https://git.openstack.org/cgit/openstack/mixmatch>`__
|
||||
mogan `git://git.openstack.org/openstack/mogan <https://git.openstack.org/cgit/openstack/mogan>`__
|
||||
mogan-ui `git://git.openstack.org/openstack/mogan-ui <https://git.openstack.org/cgit/openstack/mogan-ui>`__
|
||||
monasca-analytics `git://git.openstack.org/openstack/monasca-analytics <https://git.openstack.org/cgit/openstack/monasca-analytics>`__
|
||||
monasca-api `git://git.openstack.org/openstack/monasca-api <https://git.openstack.org/cgit/openstack/monasca-api>`__
|
||||
monasca-ceilometer `git://git.openstack.org/openstack/monasca-ceilometer <https://git.openstack.org/cgit/openstack/monasca-ceilometer>`__
|
||||
monasca-events-api `git://git.openstack.org/openstack/monasca-events-api <https://git.openstack.org/cgit/openstack/monasca-events-api>`__
|
||||
monasca-log-api `git://git.openstack.org/openstack/monasca-log-api <https://git.openstack.org/cgit/openstack/monasca-log-api>`__
|
||||
monasca-tempest-plugin `git://git.openstack.org/openstack/monasca-tempest-plugin <https://git.openstack.org/cgit/openstack/monasca-tempest-plugin>`__
|
||||
monasca-transform `git://git.openstack.org/openstack/monasca-transform <https://git.openstack.org/cgit/openstack/monasca-transform>`__
|
||||
murano `git://git.openstack.org/openstack/murano <https://git.openstack.org/cgit/openstack/murano>`__
|
||||
networking-6wind `git://git.openstack.org/openstack/networking-6wind <https://git.openstack.org/cgit/openstack/networking-6wind>`__
|
||||
networking-arista `git://git.openstack.org/openstack/networking-arista <https://git.openstack.org/cgit/openstack/networking-arista>`__
|
||||
networking-bagpipe `git://git.openstack.org/openstack/networking-bagpipe <https://git.openstack.org/cgit/openstack/networking-bagpipe>`__
|
||||
networking-baremetal `git://git.openstack.org/openstack/networking-baremetal <https://git.openstack.org/cgit/openstack/networking-baremetal>`__
|
||||
networking-bgpvpn `git://git.openstack.org/openstack/networking-bgpvpn <https://git.openstack.org/cgit/openstack/networking-bgpvpn>`__
|
||||
networking-brocade `git://git.openstack.org/openstack/networking-brocade <https://git.openstack.org/cgit/openstack/networking-brocade>`__
|
||||
networking-calico `git://git.openstack.org/openstack/networking-calico <https://git.openstack.org/cgit/openstack/networking-calico>`__
|
||||
networking-cisco `git://git.openstack.org/openstack/networking-cisco <https://git.openstack.org/cgit/openstack/networking-cisco>`__
|
||||
networking-cumulus `git://git.openstack.org/openstack/networking-cumulus <https://git.openstack.org/cgit/openstack/networking-cumulus>`__
|
||||
networking-dpm `git://git.openstack.org/openstack/networking-dpm <https://git.openstack.org/cgit/openstack/networking-dpm>`__
|
||||
networking-fortinet `git://git.openstack.org/openstack/networking-fortinet <https://git.openstack.org/cgit/openstack/networking-fortinet>`__
|
||||
networking-generic-switch `git://git.openstack.org/openstack/networking-generic-switch <https://git.openstack.org/cgit/openstack/networking-generic-switch>`__
|
||||
networking-hpe `git://git.openstack.org/openstack/networking-hpe <https://git.openstack.org/cgit/openstack/networking-hpe>`__
|
||||
networking-huawei `git://git.openstack.org/openstack/networking-huawei <https://git.openstack.org/cgit/openstack/networking-huawei>`__
|
||||
networking-hyperv `git://git.openstack.org/openstack/networking-hyperv <https://git.openstack.org/cgit/openstack/networking-hyperv>`__
|
||||
networking-infoblox `git://git.openstack.org/openstack/networking-infoblox <https://git.openstack.org/cgit/openstack/networking-infoblox>`__
|
||||
networking-l2gw `git://git.openstack.org/openstack/networking-l2gw <https://git.openstack.org/cgit/openstack/networking-l2gw>`__
|
||||
networking-lagopus `git://git.openstack.org/openstack/networking-lagopus <https://git.openstack.org/cgit/openstack/networking-lagopus>`__
|
||||
networking-midonet `git://git.openstack.org/openstack/networking-midonet <https://git.openstack.org/cgit/openstack/networking-midonet>`__
|
||||
networking-mlnx `git://git.openstack.org/openstack/networking-mlnx <https://git.openstack.org/cgit/openstack/networking-mlnx>`__
|
||||
networking-nec `git://git.openstack.org/openstack/networking-nec <https://git.openstack.org/cgit/openstack/networking-nec>`__
|
||||
networking-odl `git://git.openstack.org/openstack/networking-odl <https://git.openstack.org/cgit/openstack/networking-odl>`__
|
||||
networking-onos `git://git.openstack.org/openstack/networking-onos <https://git.openstack.org/cgit/openstack/networking-onos>`__
|
||||
networking-opencontrail `git://git.openstack.org/openstack/networking-opencontrail <https://git.openstack.org/cgit/openstack/networking-opencontrail>`__
|
||||
networking-ovn `git://git.openstack.org/openstack/networking-ovn <https://git.openstack.org/cgit/openstack/networking-ovn>`__
|
||||
networking-ovs-dpdk `git://git.openstack.org/openstack/networking-ovs-dpdk <https://git.openstack.org/cgit/openstack/networking-ovs-dpdk>`__
|
||||
networking-plumgrid `git://git.openstack.org/openstack/networking-plumgrid <https://git.openstack.org/cgit/openstack/networking-plumgrid>`__
|
||||
networking-powervm `git://git.openstack.org/openstack/networking-powervm <https://git.openstack.org/cgit/openstack/networking-powervm>`__
|
||||
networking-sfc `git://git.openstack.org/openstack/networking-sfc <https://git.openstack.org/cgit/openstack/networking-sfc>`__
|
||||
networking-spp `git://git.openstack.org/openstack/networking-spp <https://git.openstack.org/cgit/openstack/networking-spp>`__
|
||||
networking-vpp `git://git.openstack.org/openstack/networking-vpp <https://git.openstack.org/cgit/openstack/networking-vpp>`__
|
||||
networking-vsphere `git://git.openstack.org/openstack/networking-vsphere <https://git.openstack.org/cgit/openstack/networking-vsphere>`__
|
||||
neutron `git://git.openstack.org/openstack/neutron <https://git.openstack.org/cgit/openstack/neutron>`__
|
||||
neutron-classifier `git://git.openstack.org/openstack/neutron-classifier <https://git.openstack.org/cgit/openstack/neutron-classifier>`__
|
||||
neutron-dynamic-routing `git://git.openstack.org/openstack/neutron-dynamic-routing <https://git.openstack.org/cgit/openstack/neutron-dynamic-routing>`__
|
||||
neutron-fwaas `git://git.openstack.org/openstack/neutron-fwaas <https://git.openstack.org/cgit/openstack/neutron-fwaas>`__
|
||||
neutron-fwaas-dashboard `git://git.openstack.org/openstack/neutron-fwaas-dashboard <https://git.openstack.org/cgit/openstack/neutron-fwaas-dashboard>`__
|
||||
neutron-lbaas `git://git.openstack.org/openstack/neutron-lbaas <https://git.openstack.org/cgit/openstack/neutron-lbaas>`__
|
||||
neutron-lbaas-dashboard `git://git.openstack.org/openstack/neutron-lbaas-dashboard <https://git.openstack.org/cgit/openstack/neutron-lbaas-dashboard>`__
|
||||
neutron-tempest-plugin `git://git.openstack.org/openstack/neutron-tempest-plugin <https://git.openstack.org/cgit/openstack/neutron-tempest-plugin>`__
|
||||
neutron-vpnaas `git://git.openstack.org/openstack/neutron-vpnaas <https://git.openstack.org/cgit/openstack/neutron-vpnaas>`__
|
||||
neutron-vpnaas-dashboard `git://git.openstack.org/openstack/neutron-vpnaas-dashboard <https://git.openstack.org/cgit/openstack/neutron-vpnaas-dashboard>`__
|
||||
nova-dpm `git://git.openstack.org/openstack/nova-dpm <https://git.openstack.org/cgit/openstack/nova-dpm>`__
|
||||
nova-lxd `git://git.openstack.org/openstack/nova-lxd <https://git.openstack.org/cgit/openstack/nova-lxd>`__
|
||||
nova-mksproxy `git://git.openstack.org/openstack/nova-mksproxy <https://git.openstack.org/cgit/openstack/nova-mksproxy>`__
|
||||
nova-powervm `git://git.openstack.org/openstack/nova-powervm <https://git.openstack.org/cgit/openstack/nova-powervm>`__
|
||||
oaktree `git://git.openstack.org/openstack/oaktree <https://git.openstack.org/cgit/openstack/oaktree>`__
|
||||
octavia `git://git.openstack.org/openstack/octavia <https://git.openstack.org/cgit/openstack/octavia>`__
|
||||
octavia-dashboard `git://git.openstack.org/openstack/octavia-dashboard <https://git.openstack.org/cgit/openstack/octavia-dashboard>`__
|
||||
omni `git://git.openstack.org/openstack/omni <https://git.openstack.org/cgit/openstack/omni>`__
|
||||
os-xenapi `git://git.openstack.org/openstack/os-xenapi <https://git.openstack.org/cgit/openstack/os-xenapi>`__
|
||||
osprofiler `git://git.openstack.org/openstack/osprofiler <https://git.openstack.org/cgit/openstack/osprofiler>`__
|
||||
oswin-tempest-plugin `git://git.openstack.org/openstack/oswin-tempest-plugin <https://git.openstack.org/cgit/openstack/oswin-tempest-plugin>`__
|
||||
panko `git://git.openstack.org/openstack/panko <https://git.openstack.org/cgit/openstack/panko>`__
|
||||
patrole `git://git.openstack.org/openstack/patrole <https://git.openstack.org/cgit/openstack/patrole>`__
|
||||
picasso `git://git.openstack.org/openstack/picasso <https://git.openstack.org/cgit/openstack/picasso>`__
|
||||
python-openstacksdk `git://git.openstack.org/openstack/python-openstacksdk <https://git.openstack.org/cgit/openstack/python-openstacksdk>`__
|
||||
qinling `git://git.openstack.org/openstack/qinling <https://git.openstack.org/cgit/openstack/qinling>`__
|
||||
rally `git://git.openstack.org/openstack/rally <https://git.openstack.org/cgit/openstack/rally>`__
|
||||
sahara `git://git.openstack.org/openstack/sahara <https://git.openstack.org/cgit/openstack/sahara>`__
|
||||
sahara-dashboard `git://git.openstack.org/openstack/sahara-dashboard <https://git.openstack.org/cgit/openstack/sahara-dashboard>`__
|
||||
scalpels `git://git.openstack.org/openstack/scalpels <https://git.openstack.org/cgit/openstack/scalpels>`__
|
||||
searchlight `git://git.openstack.org/openstack/searchlight <https://git.openstack.org/cgit/openstack/searchlight>`__
|
||||
searchlight-ui `git://git.openstack.org/openstack/searchlight-ui <https://git.openstack.org/cgit/openstack/searchlight-ui>`__
|
||||
senlin `git://git.openstack.org/openstack/senlin <https://git.openstack.org/cgit/openstack/senlin>`__
|
||||
solum `git://git.openstack.org/openstack/solum <https://git.openstack.org/cgit/openstack/solum>`__
|
||||
stackube `git://git.openstack.org/openstack/stackube <https://git.openstack.org/cgit/openstack/stackube>`__
|
||||
storlets `git://git.openstack.org/openstack/storlets <https://git.openstack.org/cgit/openstack/storlets>`__
|
||||
tacker `git://git.openstack.org/openstack/tacker <https://git.openstack.org/cgit/openstack/tacker>`__
|
||||
tap-as-a-service `git://git.openstack.org/openstack/tap-as-a-service <https://git.openstack.org/cgit/openstack/tap-as-a-service>`__
|
||||
tap-as-a-service-dashboard `git://git.openstack.org/openstack/tap-as-a-service-dashboard <https://git.openstack.org/cgit/openstack/tap-as-a-service-dashboard>`__
|
||||
tatu `git://git.openstack.org/openstack/tatu <https://git.openstack.org/cgit/openstack/tatu>`__
|
||||
telemetry-tempest-plugin `git://git.openstack.org/openstack/telemetry-tempest-plugin <https://git.openstack.org/cgit/openstack/telemetry-tempest-plugin>`__
|
||||
tricircle `git://git.openstack.org/openstack/tricircle <https://git.openstack.org/cgit/openstack/tricircle>`__
|
||||
trio2o `git://git.openstack.org/openstack/trio2o <https://git.openstack.org/cgit/openstack/trio2o>`__
|
||||
trove `git://git.openstack.org/openstack/trove <https://git.openstack.org/cgit/openstack/trove>`__
|
||||
trove-dashboard `git://git.openstack.org/openstack/trove-dashboard <https://git.openstack.org/cgit/openstack/trove-dashboard>`__
|
||||
valet `git://git.openstack.org/openstack/valet <https://git.openstack.org/cgit/openstack/valet>`__
|
||||
vitrage `git://git.openstack.org/openstack/vitrage <https://git.openstack.org/cgit/openstack/vitrage>`__
|
||||
vitrage-dashboard `git://git.openstack.org/openstack/vitrage-dashboard <https://git.openstack.org/cgit/openstack/vitrage-dashboard>`__
|
||||
vitrage-tempest-plugin `git://git.openstack.org/openstack/vitrage-tempest-plugin <https://git.openstack.org/cgit/openstack/vitrage-tempest-plugin>`__
|
||||
vmware-nsx `git://git.openstack.org/openstack/vmware-nsx <https://git.openstack.org/cgit/openstack/vmware-nsx>`__
|
||||
vmware-vspc `git://git.openstack.org/openstack/vmware-vspc <https://git.openstack.org/cgit/openstack/vmware-vspc>`__
|
||||
watcher `git://git.openstack.org/openstack/watcher <https://git.openstack.org/cgit/openstack/watcher>`__
|
||||
watcher-dashboard `git://git.openstack.org/openstack/watcher-dashboard <https://git.openstack.org/cgit/openstack/watcher-dashboard>`__
|
||||
zaqar `git://git.openstack.org/openstack/zaqar <https://git.openstack.org/cgit/openstack/zaqar>`__
|
||||
zaqar-ui `git://git.openstack.org/openstack/zaqar-ui <https://git.openstack.org/cgit/openstack/zaqar-ui>`__
|
||||
zun `git://git.openstack.org/openstack/zun <https://git.openstack.org/cgit/openstack/zun>`__
|
||||
zun-ui `git://git.openstack.org/openstack/zun-ui <https://git.openstack.org/cgit/openstack/zun-ui>`__
|
||||
almanach `https://git.openstack.org/openstack/almanach <https://git.openstack.org/cgit/openstack/almanach>`__
|
||||
aodh `https://git.openstack.org/openstack/aodh <https://git.openstack.org/cgit/openstack/aodh>`__
|
||||
astara `https://git.openstack.org/openstack/astara <https://git.openstack.org/cgit/openstack/astara>`__
|
||||
barbican `https://git.openstack.org/openstack/barbican <https://git.openstack.org/cgit/openstack/barbican>`__
|
||||
bilean `https://git.openstack.org/openstack/bilean <https://git.openstack.org/cgit/openstack/bilean>`__
|
||||
blazar `https://git.openstack.org/openstack/blazar <https://git.openstack.org/cgit/openstack/blazar>`__
|
||||
broadview-collector `https://git.openstack.org/openstack/broadview-collector <https://git.openstack.org/cgit/openstack/broadview-collector>`__
|
||||
ceilometer `https://git.openstack.org/openstack/ceilometer <https://git.openstack.org/cgit/openstack/ceilometer>`__
|
||||
ceilometer-powervm `https://git.openstack.org/openstack/ceilometer-powervm <https://git.openstack.org/cgit/openstack/ceilometer-powervm>`__
|
||||
cloudkitty `https://git.openstack.org/openstack/cloudkitty <https://git.openstack.org/cgit/openstack/cloudkitty>`__
|
||||
collectd-ceilometer-plugin `https://git.openstack.org/openstack/collectd-ceilometer-plugin <https://git.openstack.org/cgit/openstack/collectd-ceilometer-plugin>`__
|
||||
congress `https://git.openstack.org/openstack/congress <https://git.openstack.org/cgit/openstack/congress>`__
|
||||
cue `https://git.openstack.org/openstack/cue <https://git.openstack.org/cgit/openstack/cue>`__
|
||||
cyborg `https://git.openstack.org/openstack/cyborg <https://git.openstack.org/cgit/openstack/cyborg>`__
|
||||
designate `https://git.openstack.org/openstack/designate <https://git.openstack.org/cgit/openstack/designate>`__
|
||||
devstack-plugin-additional-pkg-repos `https://git.openstack.org/openstack/devstack-plugin-additional-pkg-repos <https://git.openstack.org/cgit/openstack/devstack-plugin-additional-pkg-repos>`__
|
||||
devstack-plugin-amqp1 `https://git.openstack.org/openstack/devstack-plugin-amqp1 <https://git.openstack.org/cgit/openstack/devstack-plugin-amqp1>`__
|
||||
devstack-plugin-bdd `https://git.openstack.org/openstack/devstack-plugin-bdd <https://git.openstack.org/cgit/openstack/devstack-plugin-bdd>`__
|
||||
devstack-plugin-ceph `https://git.openstack.org/openstack/devstack-plugin-ceph <https://git.openstack.org/cgit/openstack/devstack-plugin-ceph>`__
|
||||
devstack-plugin-container `https://git.openstack.org/openstack/devstack-plugin-container <https://git.openstack.org/cgit/openstack/devstack-plugin-container>`__
|
||||
devstack-plugin-glusterfs `https://git.openstack.org/openstack/devstack-plugin-glusterfs <https://git.openstack.org/cgit/openstack/devstack-plugin-glusterfs>`__
|
||||
devstack-plugin-hdfs `https://git.openstack.org/openstack/devstack-plugin-hdfs <https://git.openstack.org/cgit/openstack/devstack-plugin-hdfs>`__
|
||||
devstack-plugin-kafka `https://git.openstack.org/openstack/devstack-plugin-kafka <https://git.openstack.org/cgit/openstack/devstack-plugin-kafka>`__
|
||||
devstack-plugin-libvirt-qemu `https://git.openstack.org/openstack/devstack-plugin-libvirt-qemu <https://git.openstack.org/cgit/openstack/devstack-plugin-libvirt-qemu>`__
|
||||
devstack-plugin-mariadb `https://git.openstack.org/openstack/devstack-plugin-mariadb <https://git.openstack.org/cgit/openstack/devstack-plugin-mariadb>`__
|
||||
devstack-plugin-nfs `https://git.openstack.org/openstack/devstack-plugin-nfs <https://git.openstack.org/cgit/openstack/devstack-plugin-nfs>`__
|
||||
devstack-plugin-pika `https://git.openstack.org/openstack/devstack-plugin-pika <https://git.openstack.org/cgit/openstack/devstack-plugin-pika>`__
|
||||
devstack-plugin-sheepdog `https://git.openstack.org/openstack/devstack-plugin-sheepdog <https://git.openstack.org/cgit/openstack/devstack-plugin-sheepdog>`__
|
||||
devstack-plugin-vmax `https://git.openstack.org/openstack/devstack-plugin-vmax <https://git.openstack.org/cgit/openstack/devstack-plugin-vmax>`__
|
||||
devstack-plugin-zmq `https://git.openstack.org/openstack/devstack-plugin-zmq <https://git.openstack.org/cgit/openstack/devstack-plugin-zmq>`__
|
||||
dragonflow `https://git.openstack.org/openstack/dragonflow <https://git.openstack.org/cgit/openstack/dragonflow>`__
|
||||
drbd-devstack `https://git.openstack.org/openstack/drbd-devstack <https://git.openstack.org/cgit/openstack/drbd-devstack>`__
|
||||
ec2-api `https://git.openstack.org/openstack/ec2-api <https://git.openstack.org/cgit/openstack/ec2-api>`__
|
||||
freezer `https://git.openstack.org/openstack/freezer <https://git.openstack.org/cgit/openstack/freezer>`__
|
||||
freezer-api `https://git.openstack.org/openstack/freezer-api <https://git.openstack.org/cgit/openstack/freezer-api>`__
|
||||
freezer-web-ui `https://git.openstack.org/openstack/freezer-web-ui <https://git.openstack.org/cgit/openstack/freezer-web-ui>`__
|
||||
fuxi `https://git.openstack.org/openstack/fuxi <https://git.openstack.org/cgit/openstack/fuxi>`__
|
||||
gce-api `https://git.openstack.org/openstack/gce-api <https://git.openstack.org/cgit/openstack/gce-api>`__
|
||||
glare `https://git.openstack.org/openstack/glare <https://git.openstack.org/cgit/openstack/glare>`__
|
||||
group-based-policy `https://git.openstack.org/openstack/group-based-policy <https://git.openstack.org/cgit/openstack/group-based-policy>`__
|
||||
heat `https://git.openstack.org/openstack/heat <https://git.openstack.org/cgit/openstack/heat>`__
|
||||
heat-dashboard `https://git.openstack.org/openstack/heat-dashboard <https://git.openstack.org/cgit/openstack/heat-dashboard>`__
|
||||
horizon-mellanox `https://git.openstack.org/openstack/horizon-mellanox <https://git.openstack.org/cgit/openstack/horizon-mellanox>`__
|
||||
ironic `https://git.openstack.org/openstack/ironic <https://git.openstack.org/cgit/openstack/ironic>`__
|
||||
ironic-inspector `https://git.openstack.org/openstack/ironic-inspector <https://git.openstack.org/cgit/openstack/ironic-inspector>`__
|
||||
ironic-staging-drivers `https://git.openstack.org/openstack/ironic-staging-drivers <https://git.openstack.org/cgit/openstack/ironic-staging-drivers>`__
|
||||
ironic-ui `https://git.openstack.org/openstack/ironic-ui <https://git.openstack.org/cgit/openstack/ironic-ui>`__
|
||||
k8s-cloud-provider `https://git.openstack.org/openstack/k8s-cloud-provider <https://git.openstack.org/cgit/openstack/k8s-cloud-provider>`__
|
||||
karbor `https://git.openstack.org/openstack/karbor <https://git.openstack.org/cgit/openstack/karbor>`__
|
||||
karbor-dashboard `https://git.openstack.org/openstack/karbor-dashboard <https://git.openstack.org/cgit/openstack/karbor-dashboard>`__
|
||||
keystone `https://git.openstack.org/openstack/keystone <https://git.openstack.org/cgit/openstack/keystone>`__
|
||||
kingbird `https://git.openstack.org/openstack/kingbird <https://git.openstack.org/cgit/openstack/kingbird>`__
|
||||
kuryr-kubernetes `https://git.openstack.org/openstack/kuryr-kubernetes <https://git.openstack.org/cgit/openstack/kuryr-kubernetes>`__
|
||||
kuryr-libnetwork `https://git.openstack.org/openstack/kuryr-libnetwork <https://git.openstack.org/cgit/openstack/kuryr-libnetwork>`__
|
||||
kuryr-tempest-plugin `https://git.openstack.org/openstack/kuryr-tempest-plugin <https://git.openstack.org/cgit/openstack/kuryr-tempest-plugin>`__
|
||||
magnum `https://git.openstack.org/openstack/magnum <https://git.openstack.org/cgit/openstack/magnum>`__
|
||||
magnum-ui `https://git.openstack.org/openstack/magnum-ui <https://git.openstack.org/cgit/openstack/magnum-ui>`__
|
||||
manila `https://git.openstack.org/openstack/manila <https://git.openstack.org/cgit/openstack/manila>`__
|
||||
manila-ui `https://git.openstack.org/openstack/manila-ui <https://git.openstack.org/cgit/openstack/manila-ui>`__
|
||||
masakari `https://git.openstack.org/openstack/masakari <https://git.openstack.org/cgit/openstack/masakari>`__
|
||||
meteos `https://git.openstack.org/openstack/meteos <https://git.openstack.org/cgit/openstack/meteos>`__
|
||||
meteos-ui `https://git.openstack.org/openstack/meteos-ui <https://git.openstack.org/cgit/openstack/meteos-ui>`__
|
||||
mistral `https://git.openstack.org/openstack/mistral <https://git.openstack.org/cgit/openstack/mistral>`__
|
||||
mixmatch `https://git.openstack.org/openstack/mixmatch <https://git.openstack.org/cgit/openstack/mixmatch>`__
|
||||
mogan `https://git.openstack.org/openstack/mogan <https://git.openstack.org/cgit/openstack/mogan>`__
|
||||
mogan-ui `https://git.openstack.org/openstack/mogan-ui <https://git.openstack.org/cgit/openstack/mogan-ui>`__
|
||||
monasca-analytics `https://git.openstack.org/openstack/monasca-analytics <https://git.openstack.org/cgit/openstack/monasca-analytics>`__
|
||||
monasca-api `https://git.openstack.org/openstack/monasca-api <https://git.openstack.org/cgit/openstack/monasca-api>`__
|
||||
monasca-ceilometer `https://git.openstack.org/openstack/monasca-ceilometer <https://git.openstack.org/cgit/openstack/monasca-ceilometer>`__
|
||||
monasca-events-api `https://git.openstack.org/openstack/monasca-events-api <https://git.openstack.org/cgit/openstack/monasca-events-api>`__
|
||||
monasca-log-api `https://git.openstack.org/openstack/monasca-log-api <https://git.openstack.org/cgit/openstack/monasca-log-api>`__
|
||||
monasca-tempest-plugin `https://git.openstack.org/openstack/monasca-tempest-plugin <https://git.openstack.org/cgit/openstack/monasca-tempest-plugin>`__
|
||||
monasca-transform `https://git.openstack.org/openstack/monasca-transform <https://git.openstack.org/cgit/openstack/monasca-transform>`__
|
||||
murano `https://git.openstack.org/openstack/murano <https://git.openstack.org/cgit/openstack/murano>`__
|
||||
networking-6wind `https://git.openstack.org/openstack/networking-6wind <https://git.openstack.org/cgit/openstack/networking-6wind>`__
|
||||
networking-arista `https://git.openstack.org/openstack/networking-arista <https://git.openstack.org/cgit/openstack/networking-arista>`__
|
||||
networking-bagpipe `https://git.openstack.org/openstack/networking-bagpipe <https://git.openstack.org/cgit/openstack/networking-bagpipe>`__
|
||||
networking-baremetal `https://git.openstack.org/openstack/networking-baremetal <https://git.openstack.org/cgit/openstack/networking-baremetal>`__
|
||||
networking-bgpvpn `https://git.openstack.org/openstack/networking-bgpvpn <https://git.openstack.org/cgit/openstack/networking-bgpvpn>`__
|
||||
networking-brocade `https://git.openstack.org/openstack/networking-brocade <https://git.openstack.org/cgit/openstack/networking-brocade>`__
|
||||
networking-calico `https://git.openstack.org/openstack/networking-calico <https://git.openstack.org/cgit/openstack/networking-calico>`__
|
||||
networking-cisco `https://git.openstack.org/openstack/networking-cisco <https://git.openstack.org/cgit/openstack/networking-cisco>`__
|
||||
networking-cumulus `https://git.openstack.org/openstack/networking-cumulus <https://git.openstack.org/cgit/openstack/networking-cumulus>`__
|
||||
networking-dpm `https://git.openstack.org/openstack/networking-dpm <https://git.openstack.org/cgit/openstack/networking-dpm>`__
|
||||
networking-fortinet `https://git.openstack.org/openstack/networking-fortinet <https://git.openstack.org/cgit/openstack/networking-fortinet>`__
|
||||
networking-generic-switch `https://git.openstack.org/openstack/networking-generic-switch <https://git.openstack.org/cgit/openstack/networking-generic-switch>`__
|
||||
networking-hpe `https://git.openstack.org/openstack/networking-hpe <https://git.openstack.org/cgit/openstack/networking-hpe>`__
|
||||
networking-huawei `https://git.openstack.org/openstack/networking-huawei <https://git.openstack.org/cgit/openstack/networking-huawei>`__
|
||||
networking-hyperv `https://git.openstack.org/openstack/networking-hyperv <https://git.openstack.org/cgit/openstack/networking-hyperv>`__
|
||||
networking-infoblox `https://git.openstack.org/openstack/networking-infoblox <https://git.openstack.org/cgit/openstack/networking-infoblox>`__
|
||||
networking-l2gw `https://git.openstack.org/openstack/networking-l2gw <https://git.openstack.org/cgit/openstack/networking-l2gw>`__
|
||||
networking-lagopus `https://git.openstack.org/openstack/networking-lagopus <https://git.openstack.org/cgit/openstack/networking-lagopus>`__
|
||||
networking-midonet `https://git.openstack.org/openstack/networking-midonet <https://git.openstack.org/cgit/openstack/networking-midonet>`__
|
||||
networking-mlnx `https://git.openstack.org/openstack/networking-mlnx <https://git.openstack.org/cgit/openstack/networking-mlnx>`__
|
||||
networking-nec `https://git.openstack.org/openstack/networking-nec <https://git.openstack.org/cgit/openstack/networking-nec>`__
|
||||
networking-odl `https://git.openstack.org/openstack/networking-odl <https://git.openstack.org/cgit/openstack/networking-odl>`__
|
||||
networking-onos `https://git.openstack.org/openstack/networking-onos <https://git.openstack.org/cgit/openstack/networking-onos>`__
|
||||
networking-opencontrail `https://git.openstack.org/openstack/networking-opencontrail <https://git.openstack.org/cgit/openstack/networking-opencontrail>`__
|
||||
networking-ovn `https://git.openstack.org/openstack/networking-ovn <https://git.openstack.org/cgit/openstack/networking-ovn>`__
|
||||
networking-ovs-dpdk `https://git.openstack.org/openstack/networking-ovs-dpdk <https://git.openstack.org/cgit/openstack/networking-ovs-dpdk>`__
|
||||
networking-plumgrid `https://git.openstack.org/openstack/networking-plumgrid <https://git.openstack.org/cgit/openstack/networking-plumgrid>`__
|
||||
networking-powervm `https://git.openstack.org/openstack/networking-powervm <https://git.openstack.org/cgit/openstack/networking-powervm>`__
|
||||
networking-sfc `https://git.openstack.org/openstack/networking-sfc <https://git.openstack.org/cgit/openstack/networking-sfc>`__
|
||||
networking-spp `https://git.openstack.org/openstack/networking-spp <https://git.openstack.org/cgit/openstack/networking-spp>`__
|
||||
networking-vpp `https://git.openstack.org/openstack/networking-vpp <https://git.openstack.org/cgit/openstack/networking-vpp>`__
|
||||
networking-vsphere `https://git.openstack.org/openstack/networking-vsphere <https://git.openstack.org/cgit/openstack/networking-vsphere>`__
|
||||
neutron `https://git.openstack.org/openstack/neutron <https://git.openstack.org/cgit/openstack/neutron>`__
|
||||
neutron-classifier `https://git.openstack.org/openstack/neutron-classifier <https://git.openstack.org/cgit/openstack/neutron-classifier>`__
|
||||
neutron-dynamic-routing `https://git.openstack.org/openstack/neutron-dynamic-routing <https://git.openstack.org/cgit/openstack/neutron-dynamic-routing>`__
|
||||
neutron-fwaas `https://git.openstack.org/openstack/neutron-fwaas <https://git.openstack.org/cgit/openstack/neutron-fwaas>`__
|
||||
neutron-fwaas-dashboard `https://git.openstack.org/openstack/neutron-fwaas-dashboard <https://git.openstack.org/cgit/openstack/neutron-fwaas-dashboard>`__
|
||||
neutron-lbaas `https://git.openstack.org/openstack/neutron-lbaas <https://git.openstack.org/cgit/openstack/neutron-lbaas>`__
|
||||
neutron-lbaas-dashboard `https://git.openstack.org/openstack/neutron-lbaas-dashboard <https://git.openstack.org/cgit/openstack/neutron-lbaas-dashboard>`__
|
||||
neutron-tempest-plugin `https://git.openstack.org/openstack/neutron-tempest-plugin <https://git.openstack.org/cgit/openstack/neutron-tempest-plugin>`__
|
||||
neutron-vpnaas `https://git.openstack.org/openstack/neutron-vpnaas <https://git.openstack.org/cgit/openstack/neutron-vpnaas>`__
|
||||
neutron-vpnaas-dashboard `https://git.openstack.org/openstack/neutron-vpnaas-dashboard <https://git.openstack.org/cgit/openstack/neutron-vpnaas-dashboard>`__
|
||||
nova-dpm `https://git.openstack.org/openstack/nova-dpm <https://git.openstack.org/cgit/openstack/nova-dpm>`__
|
||||
nova-lxd `https://git.openstack.org/openstack/nova-lxd <https://git.openstack.org/cgit/openstack/nova-lxd>`__
|
||||
nova-mksproxy `https://git.openstack.org/openstack/nova-mksproxy <https://git.openstack.org/cgit/openstack/nova-mksproxy>`__
|
||||
nova-powervm `https://git.openstack.org/openstack/nova-powervm <https://git.openstack.org/cgit/openstack/nova-powervm>`__
|
||||
oaktree `https://git.openstack.org/openstack/oaktree <https://git.openstack.org/cgit/openstack/oaktree>`__
|
||||
octavia `https://git.openstack.org/openstack/octavia <https://git.openstack.org/cgit/openstack/octavia>`__
|
||||
octavia-dashboard `https://git.openstack.org/openstack/octavia-dashboard <https://git.openstack.org/cgit/openstack/octavia-dashboard>`__
|
||||
omni `https://git.openstack.org/openstack/omni <https://git.openstack.org/cgit/openstack/omni>`__
|
||||
os-xenapi `https://git.openstack.org/openstack/os-xenapi <https://git.openstack.org/cgit/openstack/os-xenapi>`__
|
||||
osprofiler `https://git.openstack.org/openstack/osprofiler <https://git.openstack.org/cgit/openstack/osprofiler>`__
|
||||
oswin-tempest-plugin `https://git.openstack.org/openstack/oswin-tempest-plugin <https://git.openstack.org/cgit/openstack/oswin-tempest-plugin>`__
|
||||
panko `https://git.openstack.org/openstack/panko <https://git.openstack.org/cgit/openstack/panko>`__
|
||||
patrole `https://git.openstack.org/openstack/patrole <https://git.openstack.org/cgit/openstack/patrole>`__
|
||||
picasso `https://git.openstack.org/openstack/picasso <https://git.openstack.org/cgit/openstack/picasso>`__
|
||||
python-openstacksdk `https://git.openstack.org/openstack/python-openstacksdk <https://git.openstack.org/cgit/openstack/python-openstacksdk>`__
|
||||
qinling `https://git.openstack.org/openstack/qinling <https://git.openstack.org/cgit/openstack/qinling>`__
|
||||
rally `https://git.openstack.org/openstack/rally <https://git.openstack.org/cgit/openstack/rally>`__
|
||||
sahara `https://git.openstack.org/openstack/sahara <https://git.openstack.org/cgit/openstack/sahara>`__
|
||||
sahara-dashboard `https://git.openstack.org/openstack/sahara-dashboard <https://git.openstack.org/cgit/openstack/sahara-dashboard>`__
|
||||
scalpels `https://git.openstack.org/openstack/scalpels <https://git.openstack.org/cgit/openstack/scalpels>`__
|
||||
searchlight `https://git.openstack.org/openstack/searchlight <https://git.openstack.org/cgit/openstack/searchlight>`__
|
||||
searchlight-ui `https://git.openstack.org/openstack/searchlight-ui <https://git.openstack.org/cgit/openstack/searchlight-ui>`__
|
||||
senlin `https://git.openstack.org/openstack/senlin <https://git.openstack.org/cgit/openstack/senlin>`__
|
||||
solum `https://git.openstack.org/openstack/solum <https://git.openstack.org/cgit/openstack/solum>`__
|
||||
stackube `https://git.openstack.org/openstack/stackube <https://git.openstack.org/cgit/openstack/stackube>`__
|
||||
storlets `https://git.openstack.org/openstack/storlets <https://git.openstack.org/cgit/openstack/storlets>`__
|
||||
tacker `https://git.openstack.org/openstack/tacker <https://git.openstack.org/cgit/openstack/tacker>`__
|
||||
tap-as-a-service `https://git.openstack.org/openstack/tap-as-a-service <https://git.openstack.org/cgit/openstack/tap-as-a-service>`__
|
||||
tap-as-a-service-dashboard `https://git.openstack.org/openstack/tap-as-a-service-dashboard <https://git.openstack.org/cgit/openstack/tap-as-a-service-dashboard>`__
|
||||
tatu `https://git.openstack.org/openstack/tatu <https://git.openstack.org/cgit/openstack/tatu>`__
|
||||
telemetry-tempest-plugin `https://git.openstack.org/openstack/telemetry-tempest-plugin <https://git.openstack.org/cgit/openstack/telemetry-tempest-plugin>`__
|
||||
tricircle `https://git.openstack.org/openstack/tricircle <https://git.openstack.org/cgit/openstack/tricircle>`__
|
||||
trio2o `https://git.openstack.org/openstack/trio2o <https://git.openstack.org/cgit/openstack/trio2o>`__
|
||||
trove `https://git.openstack.org/openstack/trove <https://git.openstack.org/cgit/openstack/trove>`__
|
||||
trove-dashboard `https://git.openstack.org/openstack/trove-dashboard <https://git.openstack.org/cgit/openstack/trove-dashboard>`__
|
||||
valet `https://git.openstack.org/openstack/valet <https://git.openstack.org/cgit/openstack/valet>`__
|
||||
vitrage `https://git.openstack.org/openstack/vitrage <https://git.openstack.org/cgit/openstack/vitrage>`__
|
||||
vitrage-dashboard `https://git.openstack.org/openstack/vitrage-dashboard <https://git.openstack.org/cgit/openstack/vitrage-dashboard>`__
|
||||
vitrage-tempest-plugin `https://git.openstack.org/openstack/vitrage-tempest-plugin <https://git.openstack.org/cgit/openstack/vitrage-tempest-plugin>`__
|
||||
vmware-nsx `https://git.openstack.org/openstack/vmware-nsx <https://git.openstack.org/cgit/openstack/vmware-nsx>`__
|
||||
vmware-vspc `https://git.openstack.org/openstack/vmware-vspc <https://git.openstack.org/cgit/openstack/vmware-vspc>`__
|
||||
watcher `https://git.openstack.org/openstack/watcher <https://git.openstack.org/cgit/openstack/watcher>`__
|
||||
watcher-dashboard `https://git.openstack.org/openstack/watcher-dashboard <https://git.openstack.org/cgit/openstack/watcher-dashboard>`__
|
||||
zaqar `https://git.openstack.org/openstack/zaqar <https://git.openstack.org/cgit/openstack/zaqar>`__
|
||||
zaqar-ui `https://git.openstack.org/openstack/zaqar-ui <https://git.openstack.org/cgit/openstack/zaqar-ui>`__
|
||||
zun `https://git.openstack.org/openstack/zun <https://git.openstack.org/cgit/openstack/zun>`__
|
||||
zun-ui `https://git.openstack.org/openstack/zun-ui <https://git.openstack.org/cgit/openstack/zun-ui>`__
|
||||
====================================== ===
|
||||
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ They are added in the following format::
|
||||
|
||||
An example would be as follows::
|
||||
|
||||
enable_plugin ec2-api git://git.openstack.org/openstack/ec2-api
|
||||
enable_plugin ec2-api https://git.openstack.org/openstack/ec2-api
|
||||
|
||||
plugin.sh contract
|
||||
==================
|
||||
@@ -277,7 +277,7 @@ be needed in your ``jenkins/jobs/<project>.yaml`` definition in
|
||||
# note the actual url here is somewhat irrelevant because it
|
||||
# caches in nodepool, however make it a valid url for
|
||||
# documentation purposes.
|
||||
export DEVSTACK_LOCAL_CONFIG="enable_plugin ec2-api git://git.openstack.org/openstack/ec2-api"
|
||||
export DEVSTACK_LOCAL_CONFIG="enable_plugin ec2-api https://git.openstack.org/openstack/ec2-api"
|
||||
|
||||
See Also
|
||||
========
|
||||
|
||||
@@ -557,6 +557,18 @@ function git_clone {
|
||||
fi
|
||||
fi
|
||||
|
||||
# NOTE(ianw) 2022-04-13 : commit [1] has broken many assumptions
|
||||
# about how we clone and work with repos. Mark them safe globally
|
||||
# as a work-around.
|
||||
#
|
||||
# NOTE(danms): On bionic (and likely others) git-config may write
|
||||
# ~stackuser/.gitconfig if not run with sudo -H. Using --system
|
||||
# writes these changes to /etc/gitconfig which is more
|
||||
# discoverable anyway.
|
||||
#
|
||||
# [1] https://github.com/git/git/commit/8959555cee7ec045958f9b6dd62e541affb7e7d9
|
||||
sudo git config --system --add safe.directory ${git_dest}
|
||||
|
||||
# print out the results so we know what change was used in the logs
|
||||
cd $git_dest
|
||||
git show --oneline | head -1
|
||||
|
||||
+1
-1
@@ -200,7 +200,7 @@ $option = $value
|
||||
local sep
|
||||
sep=$(echo -ne "\x01")
|
||||
# Replace it
|
||||
$sudo sed -i -e '/^\['${section}'\]/,/^\[.*\]/ s'${sep}'^\('${option}'[ \t]*=[ \t]*\).*$'${sep}'\1'"${value}"${sep} "$file"
|
||||
$sudo sed -i -e '/^\['${section}'\]/,/^\[.*\]/ s'${sep}'^\('"${option}"'[ \t]*=[ \t]*\).*$'${sep}'\1'"${value}"${sep} "$file"
|
||||
fi
|
||||
$xtrace
|
||||
}
|
||||
|
||||
+10
-24
@@ -345,13 +345,6 @@ function pip_install {
|
||||
|
||||
$xtrace
|
||||
|
||||
# Also install test requirements
|
||||
local install_test_reqs=""
|
||||
local test_req="${package_dir}/test-requirements.txt"
|
||||
if [[ -e "$test_req" ]]; then
|
||||
install_test_reqs="-r $test_req"
|
||||
fi
|
||||
|
||||
# adding SETUPTOOLS_SYS_PATH_TECHNIQUE is a workaround to keep
|
||||
# the same behaviour of setuptools before version 25.0.0.
|
||||
# related issue: https://github.com/pypa/pip/issues/3874
|
||||
@@ -361,7 +354,7 @@ function pip_install {
|
||||
no_proxy="${no_proxy:-}" \
|
||||
PIP_FIND_LINKS=$PIP_FIND_LINKS \
|
||||
SETUPTOOLS_SYS_PATH_TECHNIQUE=rewrite \
|
||||
$cmd_pip $upgrade $install_test_reqs \
|
||||
$cmd_pip $upgrade \
|
||||
$@
|
||||
result=$?
|
||||
|
||||
@@ -435,22 +428,6 @@ function lib_installed_from_git {
|
||||
[[ -n $(pip list --format=columns 2>/dev/null | awk "/^$safe_name/ {print \$3}") ]]
|
||||
}
|
||||
|
||||
# check that everything that's in LIBS_FROM_GIT was actually installed
|
||||
# correctly, this helps double check issues with library fat fingering.
|
||||
function check_libs_from_git {
|
||||
local lib=""
|
||||
local not_installed=""
|
||||
for lib in $(echo ${LIBS_FROM_GIT} | tr "," " "); do
|
||||
if ! lib_installed_from_git "$lib"; then
|
||||
not_installed+=" $lib"
|
||||
fi
|
||||
done
|
||||
# if anything is not installed, say what it is.
|
||||
if [[ -n "$not_installed" ]]; then
|
||||
die $LINENO "The following LIBS_FROM_GIT were not installed correct: $not_installed"
|
||||
fi
|
||||
}
|
||||
|
||||
# setup a library by name. If we are trying to use the library from
|
||||
# git, we'll do a git based install, otherwise we'll punt and the
|
||||
# library should be installed by a requirements pull from another
|
||||
@@ -561,6 +538,13 @@ function _setup_package_with_constraints_edit {
|
||||
|
||||
setup_package $project_dir "$flags" $extras
|
||||
|
||||
# If this project is in LIBS_FROM_GIT, verify it was actually installed
|
||||
# correctly. This helps catch errors caused by constraints mismatches.
|
||||
if use_library_from_git "$project_dir"; then
|
||||
if ! lib_installed_from_git "$project_dir"; then
|
||||
die $LINENO "The following LIBS_FROM_GIT was not installed correctly: $project_dir"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# ``pip install -e`` the package, which processes the dependencies
|
||||
@@ -619,6 +603,8 @@ function install_devstack_tools {
|
||||
# intentionally old to ensure devstack-gate has control
|
||||
local dstools_version=${DSTOOLS_VERSION:-0.1.2}
|
||||
install_python3
|
||||
# note(elod.illes): preinstall pbr to avoid SNI issue
|
||||
sudo pip3 install pbr==3.1.1
|
||||
sudo pip3 install -U devstack-tools==${dstools_version}
|
||||
}
|
||||
|
||||
|
||||
+77
-26
@@ -73,35 +73,86 @@ function enable_apache_mod {
|
||||
fi
|
||||
}
|
||||
|
||||
function download_and_compile_uwsgi {
|
||||
local build_dir
|
||||
build_dir="$(mktemp -d)"
|
||||
pip_install uwsgi
|
||||
|
||||
# We need to download uwsgi from pip. Since we don't know the full name
|
||||
# of its tar file we will download it to an empty dir. After download
|
||||
# there should be single tar file.
|
||||
local uwsgidir="$build_dir/uwsgidir"
|
||||
mkdir -p "$uwsgidir"
|
||||
pip download uwsgi -c $REQUIREMENTS_DIR/upper-constraints.txt -d "$uwsgidir"
|
||||
|
||||
local downloaded_files
|
||||
downloaded_files=( $(find $uwsgidir/* ) )
|
||||
if [[ "${#downloaded_files[@]}" != "1" ]] ; then
|
||||
echo "Expected single uwsgi tar file. Got: '${downloaded_files[@]}'"
|
||||
sudo rm -rf $build_dir
|
||||
exit 1
|
||||
fi
|
||||
local uwsgitar="${downloaded_files[@]}"
|
||||
|
||||
# Now we can unwrap it somewhere else.
|
||||
local uwsgiout="$build_dir/uwsgiout"
|
||||
mkdir -p $uwsgiout
|
||||
tar xf $uwsgitar -C "$uwsgiout"
|
||||
|
||||
# Unwrapped uwsgi can be wrapped with additional directory so
|
||||
# we need to resolve a path to it.
|
||||
local extracted_files
|
||||
extracted_files=( $(ls $uwsgiout ) )
|
||||
if [[ "${#extracted_files[@]}" == "1" ]] ; then
|
||||
local uwsgipath="$uwsgiout/${extracted_files[0]}"
|
||||
else
|
||||
local uwsgipath="$uwsgiout"
|
||||
fi
|
||||
|
||||
if is_fedora; then
|
||||
sudo apxs -i -c $uwsgipath/apache2/mod_proxy_uwsgi.c
|
||||
else
|
||||
sudo apxs2 -i -c $uwsgipath/apache2/mod_proxy_uwsgi.c
|
||||
fi
|
||||
|
||||
sudo rm -rf $build_dir
|
||||
}
|
||||
|
||||
# NOTE(sdague): Install uwsgi including apache module, we need to get
|
||||
# to 2.0.6+ to get a working mod_proxy_uwsgi. We can probably build a
|
||||
# check for that and do it differently for different platforms.
|
||||
function install_apache_uwsgi {
|
||||
local apxs="apxs2"
|
||||
if is_fedora; then
|
||||
apxs="apxs"
|
||||
# This varies based on packaged/installed. If we've
|
||||
# pip_installed, then the pip setup will only build a "python"
|
||||
# module that will be either python2 or python3 depending on what
|
||||
# it was built with.
|
||||
#
|
||||
# For package installs, the distro ships both plugins and you need
|
||||
# to select the right one ... it will not be autodetected.
|
||||
if python3_enabled; then
|
||||
UWSGI_PYTHON_PLUGIN=python3
|
||||
else
|
||||
UWSGI_PYTHON_PLUGIN=python
|
||||
fi
|
||||
|
||||
# Ubuntu xenial is back level on uwsgi so the proxy doesn't
|
||||
# actually work. Hence we have to build from source for now.
|
||||
#
|
||||
# Centos 7 actually has the module in epel, but there was a big
|
||||
# push to disable epel by default. As such, compile from source
|
||||
# there as well.
|
||||
|
||||
local dir
|
||||
dir=$(mktemp -d)
|
||||
pushd $dir
|
||||
pip_install uwsgi
|
||||
pip download uwsgi -c $REQUIREMENTS_DIR/upper-constraints.txt
|
||||
local uwsgi
|
||||
uwsgi=$(ls uwsgi*)
|
||||
tar xvf $uwsgi
|
||||
cd uwsgi*/apache2
|
||||
sudo $apxs -i -c mod_proxy_uwsgi.c
|
||||
popd
|
||||
# delete the temp directory
|
||||
sudo rm -rf $dir
|
||||
if is_ubuntu; then
|
||||
install_package uwsgi \
|
||||
uwsgi-plugin-python \
|
||||
uwsgi-plugin-python3 \
|
||||
libapache2-mod-proxy-uwsgi
|
||||
elif [[ $os_VENDOR == "Fedora" ]]; then
|
||||
# Note httpd comes with mod_proxy_uwsgi and it is loaded by
|
||||
# default; the mod_proxy_uwsgi package actually conflicts now.
|
||||
# See:
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1574335
|
||||
#
|
||||
# Thus there is nothing else to do after this install
|
||||
install_package uwsgi \
|
||||
uwsgi-plugin-python3
|
||||
else
|
||||
download_and_compile_uwsgi
|
||||
UWSGI_PYTHON_PLUGIN=python
|
||||
fi
|
||||
|
||||
if is_ubuntu || is_suse ; then
|
||||
# we've got to enable proxy and proxy_uwsgi for this to work
|
||||
@@ -189,7 +240,7 @@ function enable_apache_site {
|
||||
sudo a2ensite ${site}
|
||||
elif is_fedora || is_suse; then
|
||||
local enabled_site_file="$APACHE_CONF_DIR/${site}.conf"
|
||||
# Do nothing if site already enabled or no site config exists
|
||||
# Do nothing if site already enabled or no site config exists.
|
||||
if [[ -f ${enabled_site_file}.disabled ]] && [[ ! -f ${enabled_site_file} ]]; then
|
||||
sudo mv ${enabled_site_file}.disabled ${enabled_site_file}
|
||||
fi
|
||||
@@ -265,7 +316,7 @@ function write_uwsgi_config {
|
||||
# configured after graceful shutdown
|
||||
iniset "$file" uwsgi worker-reload-mercy $WORKER_TIMEOUT
|
||||
iniset "$file" uwsgi enable-threads true
|
||||
iniset "$file" uwsgi plugins python
|
||||
iniset "$file" uwsgi plugins http,${UWSGI_PYTHON_PLUGIN}
|
||||
# uwsgi recommends this to prevent thundering herd on accept.
|
||||
iniset "$file" uwsgi thunder-lock true
|
||||
# Set hook to trigger graceful shutdown on SIGTERM
|
||||
@@ -318,7 +369,7 @@ function write_local_uwsgi_http_config {
|
||||
iniset "$file" uwsgi die-on-term true
|
||||
iniset "$file" uwsgi exit-on-reload false
|
||||
iniset "$file" uwsgi enable-threads true
|
||||
iniset "$file" uwsgi plugins python
|
||||
iniset "$file" uwsgi plugins http,${UWSGI_PYTHON_PLUGIN}
|
||||
# uwsgi recommends this to prevent thundering herd on accept.
|
||||
iniset "$file" uwsgi thunder-lock true
|
||||
# Set hook to trigger graceful shutdown on SIGTERM
|
||||
|
||||
+3
-3
@@ -350,7 +350,7 @@ function create_cinder_accounts {
|
||||
get_or_create_endpoint \
|
||||
"block-storage" \
|
||||
"$REGION_NAME" \
|
||||
"$CINDER_SERVICE_PROTOCOL://$CINDER_SERVICE_HOST:$CINDER_SERVICE_PORT/"
|
||||
"$CINDER_SERVICE_PROTOCOL://$CINDER_SERVICE_HOST:$CINDER_SERVICE_PORT/v3/\$(project_id)s"
|
||||
|
||||
get_or_create_endpoint \
|
||||
"volume" \
|
||||
@@ -372,7 +372,7 @@ function create_cinder_accounts {
|
||||
get_or_create_endpoint \
|
||||
"block-storage" \
|
||||
"$REGION_NAME" \
|
||||
"$CINDER_SERVICE_PROTOCOL://$CINDER_SERVICE_HOST/"
|
||||
"$CINDER_SERVICE_PROTOCOL://$CINDER_SERVICE_HOST/volume/v3/\$(project_id)s"
|
||||
|
||||
get_or_create_endpoint \
|
||||
"volume" \
|
||||
@@ -507,7 +507,7 @@ function start_cinder {
|
||||
start_tls_proxy cinder '*' $CINDER_SERVICE_PORT $CINDER_SERVICE_HOST $CINDER_SERVICE_PORT_INT
|
||||
fi
|
||||
else
|
||||
run_process "c-api" "$CINDER_BIN_DIR/uwsgi --procname-prefix cinder-api --ini $CINDER_UWSGI_CONF"
|
||||
run_process "c-api" "$(which uwsgi) --procname-prefix cinder-api --ini $CINDER_UWSGI_CONF"
|
||||
cinder_url=$service_protocol://$SERVICE_HOST/volume/v3
|
||||
fi
|
||||
fi
|
||||
|
||||
+1
-1
@@ -354,7 +354,7 @@ function start_glance {
|
||||
|
||||
run_process g-reg "$GLANCE_BIN_DIR/glance-registry --config-file=$GLANCE_CONF_DIR/glance-registry.conf"
|
||||
if [[ "$WSGI_MODE" == "uwsgi" ]]; then
|
||||
run_process g-api "$GLANCE_BIN_DIR/uwsgi --procname-prefix glance-api --ini $GLANCE_UWSGI_CONF"
|
||||
run_process g-api "$(which uwsgi) --procname-prefix glance-api --ini $GLANCE_UWSGI_CONF"
|
||||
else
|
||||
run_process g-api "$GLANCE_BIN_DIR/glance-api --config-file=$GLANCE_CONF_DIR/glance-api.conf"
|
||||
fi
|
||||
|
||||
+1
-1
@@ -550,7 +550,7 @@ function start_keystone {
|
||||
enable_apache_site keystone
|
||||
restart_apache_server
|
||||
else # uwsgi
|
||||
run_process keystone "$KEYSTONE_BIN_DIR/uwsgi --procname-prefix keystone --ini $KEYSTONE_PUBLIC_UWSGI_CONF" ""
|
||||
run_process keystone "$(which uwsgi) --procname-prefix keystone --ini $KEYSTONE_PUBLIC_UWSGI_CONF" ""
|
||||
fi
|
||||
|
||||
echo "Waiting for keystone to start..."
|
||||
|
||||
+2
-2
@@ -42,6 +42,7 @@ NEUTRON_META_CONF=$NEUTRON_CONF_DIR/metadata_agent.ini
|
||||
NEUTRON_DHCP_CONF=$NEUTRON_CONF_DIR/dhcp_agent.ini
|
||||
NEUTRON_L3_CONF=$NEUTRON_CONF_DIR/l3_agent.ini
|
||||
NEUTRON_AGENT_CONF=$NEUTRON_CONF_DIR/
|
||||
NEUTRON_CREATE_INITIAL_NETWORKS=${NEUTRON_CREATE_INITIAL_NETWORKS:-True}
|
||||
|
||||
NEUTRON_STATE_PATH=${NEUTRON_STATE_PATH:=$DATA_DIR/neutron}
|
||||
NEUTRON_AUTH_CACHE_DIR=${NEUTRON_AUTH_CACHE_DIR:-/var/cache/neutron}
|
||||
@@ -306,7 +307,6 @@ function configure_neutron_nova_new {
|
||||
iniset $NOVA_CONF neutron project_domain_name "Default"
|
||||
iniset $NOVA_CONF neutron auth_strategy $NEUTRON_AUTH_STRATEGY
|
||||
iniset $NOVA_CONF neutron region_name "$REGION_NAME"
|
||||
iniset $NOVA_CONF neutron url $NEUTRON_SERVICE_PROTOCOL://$NEUTRON_SERVICE_HOST:$NEUTRON_SERVICE_PORT
|
||||
|
||||
iniset $NOVA_CONF DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver
|
||||
|
||||
@@ -438,7 +438,7 @@ function start_neutron_new {
|
||||
if is_service_enabled neutron-l3; then
|
||||
run_process neutron-l3 "$NEUTRON_BIN_DIR/$NEUTRON_L3_BINARY --config-file $NEUTRON_CONF --config-file $NEUTRON_L3_CONF"
|
||||
fi
|
||||
if is_service_enabled neutron-api; then
|
||||
if is_service_enabled neutron-api && [[ "$NEUTRON_CREATE_INITIAL_NETWORKS" == "True" ]]; then
|
||||
# XXX(sc68cal) - Here's where plugins can wire up their own networks instead
|
||||
# of the code in lib/neutron_plugins/services/l3
|
||||
if type -p neutron_plugin_create_initial_networks > /dev/null; then
|
||||
|
||||
@@ -376,7 +376,6 @@ function create_nova_conf_neutron {
|
||||
iniset $NOVA_CONF neutron project_domain_name "$SERVICE_DOMAIN_NAME"
|
||||
iniset $NOVA_CONF neutron auth_strategy "$Q_AUTH_STRATEGY"
|
||||
iniset $NOVA_CONF neutron region_name "$REGION_NAME"
|
||||
iniset $NOVA_CONF neutron url "${Q_PROTOCOL}://$Q_HOST:$Q_PORT"
|
||||
|
||||
if [[ "$Q_USE_SECGROUP" == "True" ]]; then
|
||||
LIBVIRT_FIREWALL_DRIVER=nova.virt.firewall.NoopFirewallDriver
|
||||
|
||||
@@ -39,9 +39,9 @@ Q_PUBLIC_VETH_INT=${Q_PUBLIC_VETH_INT:-veth-pub-int}
|
||||
Q_L3_ROUTER_PER_TENANT=${Q_L3_ROUTER_PER_TENANT:-True}
|
||||
|
||||
|
||||
# Use flat providernet for public network
|
||||
# Use providernet for public network
|
||||
#
|
||||
# If Q_USE_PROVIDERNET_FOR_PUBLIC=True, use a flat provider network
|
||||
# If Q_USE_PROVIDERNET_FOR_PUBLIC=True, use a 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 ofagent, you should add the
|
||||
@@ -59,6 +59,10 @@ Q_L3_ROUTER_PER_TENANT=${Q_L3_ROUTER_PER_TENANT:-True}
|
||||
# Q_USE_PROVIDERNET_FOR_PUBLIC=True
|
||||
# PUBLIC_PHYSICAL_NETWORK=public
|
||||
# OVS_BRIDGE_MAPPINGS=public:br-ex
|
||||
#
|
||||
# The provider-network-type defaults to flat, however, the values
|
||||
# PUBLIC_PROVIDERNET_TYPE and PUBLIC_PROVIDERNET_SEGMENTATION_ID could
|
||||
# be set to specify the parameters for an alternate network type.
|
||||
Q_USE_PROVIDERNET_FOR_PUBLIC=${Q_USE_PROVIDERNET_FOR_PUBLIC:-True}
|
||||
PUBLIC_PHYSICAL_NETWORK=${PUBLIC_PHYSICAL_NETWORK:-public}
|
||||
|
||||
@@ -240,7 +244,7 @@ function create_neutron_initial_network {
|
||||
fi
|
||||
# Create an external network, and a subnet. Configure the external network as router gw
|
||||
if [ "$Q_USE_PROVIDERNET_FOR_PUBLIC" = "True" ]; then
|
||||
EXT_NET_ID=$(openstack --os-cloud devstack-admin --os-region "$REGION_NAME" network create "$PUBLIC_NETWORK_NAME" $EXTERNAL_NETWORK_FLAGS --provider-network-type flat --provider-physical-network ${PUBLIC_PHYSICAL_NETWORK} | grep ' id ' | get_field 2)
|
||||
EXT_NET_ID=$(openstack --os-cloud devstack-admin --os-region "$REGION_NAME" network create "$PUBLIC_NETWORK_NAME" $EXTERNAL_NETWORK_FLAGS --provider-network-type ${PUBLIC_PROVIDERNET_TYPE:-flat} ${PUBLIC_PROVIDERNET_SEGMENTATION_ID:+--provider-segment $PUBLIC_PROVIDERNET_SEGMENTATION_ID} --provider-physical-network ${PUBLIC_PHYSICAL_NETWORK} | grep ' id ' | get_field 2)
|
||||
else
|
||||
EXT_NET_ID=$(openstack --os-cloud devstack-admin --os-region "$REGION_NAME" network create "$PUBLIC_NETWORK_NAME" $EXTERNAL_NETWORK_FLAGS | grep ' id ' | get_field 2)
|
||||
fi
|
||||
|
||||
@@ -82,6 +82,10 @@ if is_service_enabled tls-proxy; then
|
||||
NOVA_SERVICE_PROTOCOL="https"
|
||||
fi
|
||||
|
||||
# Whether to use TLS for comms between the VNC/SPICE/serial proxy
|
||||
# services and the compute node
|
||||
NOVA_CONSOLE_PROXY_COMPUTE_TLS=${NOVA_CONSOLE_PROXY_COMPUTE_TLS:-False}
|
||||
|
||||
# Public facing bits
|
||||
NOVA_SERVICE_HOST=${NOVA_SERVICE_HOST:-$SERVICE_HOST}
|
||||
NOVA_SERVICE_PORT=${NOVA_SERVICE_PORT:-8774}
|
||||
@@ -197,6 +201,13 @@ function is_n-cell_enabled {
|
||||
return 1
|
||||
}
|
||||
|
||||
# is_nova_console_proxy_compute_tls_enabled() - Test if the Nova Console Proxy
|
||||
# service has TLS enabled
|
||||
function is_nova_console_proxy_compute_tls_enabled {
|
||||
[[ ${NOVA_CONSOLE_PROXY_COMPUTE_TLS} = "True" ]] && return 0
|
||||
return 1
|
||||
}
|
||||
|
||||
# Helper to clean iptables rules
|
||||
function clean_iptables {
|
||||
# Delete rules
|
||||
@@ -524,6 +535,17 @@ function create_nova_conf {
|
||||
iniset $NOVA_CONF vnc server_proxyclient_address "$VNCSERVER_PROXYCLIENT_ADDRESS"
|
||||
iniset $NOVA_CONF vnc novncproxy_host "$NOVA_SERVICE_LISTEN_ADDRESS"
|
||||
iniset $NOVA_CONF vnc xvpvncproxy_host "$NOVA_SERVICE_LISTEN_ADDRESS"
|
||||
|
||||
if is_nova_console_proxy_compute_tls_enabled ; then
|
||||
iniset $NOVA_CONF vnc auth_schemes "vencrypt"
|
||||
iniset $NOVA_CONF vnc vencrypt_client_key "/etc/pki/nova-novnc/client-key.pem"
|
||||
iniset $NOVA_CONF vnc vencrypt_client_cert "/etc/pki/nova-novnc/client-cert.pem"
|
||||
iniset $NOVA_CONF vnc vencrypt_ca_certs "/etc/pki/nova-novnc/ca-cert.pem"
|
||||
|
||||
sudo mkdir -p /etc/pki/nova-novnc
|
||||
deploy_int_CA /etc/pki/nova-novnc/ca-cert.pem
|
||||
deploy_int_cert /etc/pki/nova-novnc/client-cert.pem /etc/pki/nova-novnc/client-key.pem
|
||||
fi
|
||||
else
|
||||
iniset $NOVA_CONF vnc enabled false
|
||||
fi
|
||||
@@ -811,7 +833,7 @@ function start_nova_api {
|
||||
start_tls_proxy nova '*' $NOVA_SERVICE_PORT $NOVA_SERVICE_HOST $NOVA_SERVICE_PORT_INT
|
||||
fi
|
||||
else
|
||||
run_process "n-api" "$NOVA_BIN_DIR/uwsgi --procname-prefix nova-api --ini $NOVA_UWSGI_CONF"
|
||||
run_process "n-api" "$(which uwsgi) --procname-prefix nova-api --ini $NOVA_UWSGI_CONF"
|
||||
nova_url=$service_protocol://$SERVICE_HOST/compute/v2.1/
|
||||
fi
|
||||
|
||||
@@ -845,14 +867,14 @@ function start_nova_compute {
|
||||
local compute_cell_conf=$NOVA_CONF
|
||||
fi
|
||||
|
||||
cp $compute_cell_conf $NOVA_CPU_CONF
|
||||
|
||||
if [[ "${CELLSV2_SETUP}" == "singleconductor" ]]; then
|
||||
# NOTE(danms): Grenade doesn't setup multi-cell rabbit, so
|
||||
# skip these bits and use the normal config.
|
||||
NOVA_CPU_CONF=$compute_cell_conf
|
||||
echo "Skipping multi-cell conductor fleet setup"
|
||||
else
|
||||
# "${CELLSV2_SETUP}" is "superconductor"
|
||||
cp $compute_cell_conf $NOVA_CPU_CONF
|
||||
# FIXME(danms): Should this be configurable?
|
||||
iniset $NOVA_CPU_CONF workarounds disable_group_policy_check_upcall True
|
||||
# Since the nova-compute service cannot reach nova-scheduler over
|
||||
@@ -861,6 +883,10 @@ function start_nova_compute {
|
||||
iniset_rpc_backend nova $NOVA_CPU_CONF DEFAULT "nova_cell${NOVA_CPU_CELL}"
|
||||
fi
|
||||
|
||||
# Make sure we nuke any database config
|
||||
inidelete $NOVA_CPU_CONF database connection
|
||||
inidelete $NOVA_CPU_CONF api_database connection
|
||||
|
||||
if [[ "$VIRT_DRIVER" = 'libvirt' ]]; then
|
||||
# The group **$LIBVIRT_GROUP** is added to the current user in this script.
|
||||
# ``sg`` is used in run_process to execute nova-compute as a member of the
|
||||
@@ -918,7 +944,7 @@ function start_nova_rest {
|
||||
if [ "$NOVA_USE_MOD_WSGI" == "False" ]; then
|
||||
run_process n-api-meta "$NOVA_BIN_DIR/nova-api-metadata --config-file $compute_cell_conf"
|
||||
else
|
||||
run_process n-api-meta "$NOVA_BIN_DIR/uwsgi --procname-prefix nova-api-meta --ini $NOVA_METADATA_UWSGI_CONF"
|
||||
run_process n-api-meta "$(which uwsgi) --procname-prefix nova-api-meta --ini $NOVA_METADATA_UWSGI_CONF"
|
||||
fi
|
||||
|
||||
run_process n-novnc "$NOVA_BIN_DIR/nova-novncproxy --config-file $api_cell_conf --web $NOVNC_WEB_DIR"
|
||||
@@ -978,7 +1004,7 @@ function is_nova_ready {
|
||||
# because of the dom0/domU split. Just ignore for now.
|
||||
return
|
||||
fi
|
||||
wait_for_compute 60
|
||||
wait_for_compute $NOVA_READY_TIMEOUT
|
||||
}
|
||||
|
||||
function start_nova {
|
||||
|
||||
@@ -149,6 +149,18 @@ EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
if is_nova_console_proxy_compute_tls_enabled ; then
|
||||
if is_service_enabled n-novnc ; then
|
||||
echo "vnc_tls = 1" | sudo tee -a $QEMU_CONF
|
||||
echo "vnc_tls_x509_verify = 1" | sudo tee -a $QEMU_CONF
|
||||
|
||||
sudo mkdir -p /etc/pki/libvirt-vnc
|
||||
sudo chown libvirt-qemu:libvirt-qemu /etc/pki/libvirt-vnc
|
||||
deploy_int_CA /etc/pki/libvirt-vnc/ca-cert.pem
|
||||
deploy_int_cert /etc/pki/libvirt-vnc/server-cert.pem /etc/pki/libvirt-vnc/server-key.pem
|
||||
fi
|
||||
fi
|
||||
|
||||
# Service needs to be started on redhat/fedora -- do a restart for
|
||||
# sanity after fiddling the config.
|
||||
restart_service $LIBVIRT_DAEMON
|
||||
|
||||
@@ -58,6 +58,9 @@ function configure_nova_hypervisor {
|
||||
iniset $NOVA_CONF ironic project_domain_id default
|
||||
iniset $NOVA_CONF ironic user_domain_id default
|
||||
iniset $NOVA_CONF ironic project_name demo
|
||||
|
||||
iniset $NOVA_CONF ironic api_max_retries 300
|
||||
iniset $NOVA_CONF ironic api_retry_interval 5
|
||||
}
|
||||
|
||||
# install_nova_hypervisor() - Install external components
|
||||
|
||||
+1
-1
@@ -170,7 +170,7 @@ function install_placement {
|
||||
# start_placement_api() - Start the API processes ahead of other things
|
||||
function start_placement_api {
|
||||
if [[ "$WSGI_MODE" == "uwsgi" ]]; then
|
||||
run_process "placement-api" "$PLACEMENT_BIN_DIR/uwsgi --procname-prefix placement --ini $PLACEMENT_UWSGI_CONF"
|
||||
run_process "placement-api" "$(which uwsgi) --procname-prefix placement --ini $PLACEMENT_UWSGI_CONF"
|
||||
else
|
||||
enable_apache_site placement-api
|
||||
restart_apache_server
|
||||
|
||||
@@ -753,7 +753,9 @@ function init_swift {
|
||||
|
||||
function install_swift {
|
||||
git_clone $SWIFT_REPO $SWIFT_DIR $SWIFT_BRANCH
|
||||
setup_develop $SWIFT_DIR
|
||||
# keystonemiddleware needs to be installed via keystone extras as defined
|
||||
# in setup.cfg, see bug #1909018 for more details.
|
||||
setup_develop $SWIFT_DIR keystone
|
||||
if [ "$SWIFT_USE_MOD_WSGI" == "True" ]; then
|
||||
install_apache_wsgi
|
||||
fi
|
||||
|
||||
+56
-9
@@ -57,7 +57,7 @@ BUILD_TIMEOUT=${BUILD_TIMEOUT:-196}
|
||||
# This must be False on stable branches, as master tempest
|
||||
# deps do not match stable branch deps. Set this to True to
|
||||
# have tempest installed in DevStack by default.
|
||||
INSTALL_TEMPEST=${INSTALL_TEMPEST:-"True"}
|
||||
INSTALL_TEMPEST=${INSTALL_TEMPEST:-"False"}
|
||||
|
||||
# This variable is passed directly to pip install inside the common tox venv
|
||||
# that is created
|
||||
@@ -279,8 +279,8 @@ function configure_tempest {
|
||||
iniset $TEMPEST_CONFIG identity-feature-enabled api_v2 False
|
||||
fi
|
||||
iniset $TEMPEST_CONFIG identity auth_version ${TEMPEST_AUTH_VERSION:-v3}
|
||||
if [[ "$TEMPEST_AUTH_VERSION" != "v2.0" ]]; then
|
||||
# we're going to disable v2 admin unless we're using v2.0 by default.
|
||||
if [[ "$TEMPEST_AUTH_VERSION" != "v2" ]]; then
|
||||
# we're going to disable v2 admin unless we're using v2 by default.
|
||||
iniset $TEMPEST_CONFIG identity-feature-enabled api_v2_admin False
|
||||
fi
|
||||
|
||||
@@ -299,6 +299,10 @@ function configure_tempest {
|
||||
iniset $TEMPEST_CONFIG identity-feature-enabled domain_specific_drivers True
|
||||
fi
|
||||
|
||||
# TODO(felipemonteiro): Remove this once Tempest no longer supports Pike
|
||||
# as this is supported in Queens and beyond.
|
||||
iniset $TEMPEST_CONFIG identity-feature-enabled project_tags True
|
||||
|
||||
# Image
|
||||
# We want to be able to override this variable in the gate to avoid
|
||||
# doing an external HTTP fetch for this test.
|
||||
@@ -339,7 +343,7 @@ function configure_tempest {
|
||||
# NOTE- To avoid microversion tests failure on stable branch, we need to change "tempest_compute_max_microversion"
|
||||
# for stable branch on each release which should be changed from "latest" to max supported version of that release.
|
||||
local tempest_compute_min_microversion=${TEMPEST_COMPUTE_MIN_MICROVERSION:-None}
|
||||
local tempest_compute_max_microversion=${TEMPEST_COMPUTE_MAX_MICROVERSION:-"latest"}
|
||||
local tempest_compute_max_microversion=${TEMPEST_COMPUTE_MAX_MICROVERSION:-"2.60"}
|
||||
# Reset microversions to None where v2.0 is running which does not support microversion.
|
||||
# Both "None" means no microversion testing.
|
||||
if [[ "$TEMPEST_COMPUTE_TYPE" == "compute_legacy" ]]; then
|
||||
@@ -445,7 +449,7 @@ function configure_tempest {
|
||||
iniset $TEMPEST_CONFIG volume-feature-enabled api_v3 True
|
||||
iniset $TEMPEST_CONFIG volume-feature-enabled api_v1 $(trueorfalse False TEMPEST_VOLUME_API_V1)
|
||||
local tempest_volume_min_microversion=${TEMPEST_VOLUME_MIN_MICROVERSION:-None}
|
||||
local tempest_volume_max_microversion=${TEMPEST_VOLUME_MAX_MICROVERSION:-"latest"}
|
||||
local tempest_volume_max_microversion=${TEMPEST_VOLUME_MAX_MICROVERSION:-"3.50"}
|
||||
if [ "$tempest_volume_min_microversion" == "None" ]; then
|
||||
inicomment $TEMPEST_CONFIG volume min_microversion
|
||||
else
|
||||
@@ -554,6 +558,8 @@ function configure_tempest {
|
||||
if [[ "$OFFLINE" != "True" ]]; then
|
||||
tox -revenv-tempest --notest
|
||||
fi
|
||||
|
||||
# NOTE(gmann): Use branch constraint because Tempest is pinned to the branch release instead of using master.
|
||||
tox -evenv-tempest -- pip install -c $REQUIREMENTS_DIR/upper-constraints.txt -r requirements.txt
|
||||
|
||||
# Auth:
|
||||
@@ -590,16 +596,32 @@ function configure_tempest {
|
||||
DISABLE_NETWORK_API_EXTENSIONS+=", l3_agent_scheduler"
|
||||
fi
|
||||
|
||||
local network_api_extensions=${NETWORK_API_EXTENSIONS:-"all"}
|
||||
DEFAULT_NET_EXT="address-scope,agent,allowed-address-pairs,auto-allocated-topology"
|
||||
DEFAULT_NET_EXT+=",availability_zone,binding,default-subnetpools,dhcp_agent_scheduler"
|
||||
DEFAULT_NET_EXT+=",dvr,ext-gw-mode,external-net,extra_dhcp_opt,extraroute,flavors"
|
||||
DEFAULT_NET_EXT+=",l3-flavors,l3-ha,l3_agent_scheduler,multi-provider,net-mtu"
|
||||
DEFAULT_NET_EXT+=",network-ip-availability,network_availability_zone,pagination"
|
||||
DEFAULT_NET_EXT+=",port-security,project-id,provider,quotas,quota_details,rbac-policies"
|
||||
DEFAULT_NET_EXT+=",revision-if-match,router,router_availability_zone,security-group,service-type,sorting"
|
||||
DEFAULT_NET_EXT+=",standard-attr-description,standard-attr-revisions,standard-attr-tag,standard-attr-timestamp"
|
||||
DEFAULT_NET_EXT+=",subnet-service-types,subnet_allocation,net-mtu-writable,ip-substring-filtering"
|
||||
local network_api_extensions=${NETWORK_API_EXTENSIONS:-$DEFAULT_NET_EXT}
|
||||
|
||||
if [[ ! -z "$DISABLE_NETWORK_API_EXTENSIONS" ]]; then
|
||||
# Enabled extensions are either the ones explicitly specified or those available on the API endpoint
|
||||
network_api_extensions=${NETWORK_API_EXTENSIONS:-$(iniget $tmp_cfg_file network-feature-enabled api_extensions | tr -d " ")}
|
||||
# Remove disabled extensions
|
||||
network_api_extensions=$(remove_disabled_extensions $network_api_extensions $DISABLE_NETWORK_API_EXTENSIONS)
|
||||
fi
|
||||
if [[ -n "$ADDITIONAL_NETWORK_API_EXTENSIONS" ]] && [[ "$network_api_extensions" != "all" ]]; then
|
||||
network_api_extensions+=",$ADDITIONAL_NETWORK_API_EXTENSIONS"
|
||||
fi
|
||||
iniset $TEMPEST_CONFIG network-feature-enabled api_extensions $network_api_extensions
|
||||
# Swift API Extensions
|
||||
local object_storage_api_extensions=${OBJECT_STORAGE_API_EXTENSIONS:-"all"}
|
||||
DEFAULT_SWIFT_OPT="account_quotas,bulk_delete,bulk_upload,container_quotas"
|
||||
DEFAULT_SWIFT_OPT+=",container_sync,crossdomain,formpost,ratelimit,slo"
|
||||
DEFAULT_SWIFT_OPT+=",staticweb,tempauth,tempurl,versioned_writes"
|
||||
local object_storage_api_extensions=${OBJECT_STORAGE_API_EXTENSIONS:-$DEFAULT_SWIFT_OPT}
|
||||
if [[ ! -z "$DISABLE_OBJECT_STORAGE_API_EXTENSIONS" ]]; then
|
||||
# Enabled extensions are either the ones explicitly specified or those available on the API endpoint
|
||||
object_storage_api_extensions=${OBJECT_STORAGE_API_EXTENSIONS:-$(iniget $tmp_cfg_file object-storage-feature-enabled discoverable_apis | tr -d " ")}
|
||||
@@ -608,7 +630,19 @@ function configure_tempest {
|
||||
fi
|
||||
iniset $TEMPEST_CONFIG object-storage-feature-enabled discoverable_apis $object_storage_api_extensions
|
||||
# Cinder API Extensions
|
||||
local volume_api_extensions=${VOLUME_API_EXTENSIONS:-"all"}
|
||||
DEFAULT_VOL_EXT="OS-SCH-HNT,backups,capabilities,cgsnapshots,consistencygroups"
|
||||
DEFAULT_VOL_EXT+=",encryption,os-admin-actions,os-availability-zone"
|
||||
DEFAULT_VOL_EXT+=",os-extended-services,os-extended-snapshot-attributes"
|
||||
DEFAULT_VOL_EXT+=",os-hosts,os-image-create,os-quota-class-sets,os-quota-sets"
|
||||
DEFAULT_VOL_EXT+=",os-services,os-snapshot-actions,os-snapshot-manage"
|
||||
DEFAULT_VOL_EXT+=",os-snapshot-unmanage,os-types-extra-specs,os-types-manage"
|
||||
DEFAULT_VOL_EXT+=",os-used-limits,os-vol-host-attr,os-vol-image-meta"
|
||||
DEFAULT_VOL_EXT+=",os-vol-mig-status-attr,os-vol-tenant-attr,os-volume-actions"
|
||||
DEFAULT_VOL_EXT+=",os-volume-encryption-metadata,os-volume-manage"
|
||||
DEFAULT_VOL_EXT+=",os-volume-transfer,os-volume-type-access"
|
||||
DEFAULT_VOL_EXT+=",os-volume-unmanage,qos-specs,scheduler-stats"
|
||||
local volume_api_extensions=${VOLUME_API_EXTENSIONS:-$DEFAULT_VOL_EXT}
|
||||
|
||||
if [[ ! -z "$DISABLE_VOLUME_API_EXTENSIONS" ]]; then
|
||||
# Enabled extensions are either the ones explicitly specified or those available on the API endpoint
|
||||
volume_api_extensions=${VOLUME_API_EXTENSIONS:-$(iniget $tmp_cfg_file volume-feature-enabled api_extensions | tr -d " ")}
|
||||
@@ -626,6 +660,17 @@ function install_tempest {
|
||||
git_clone $TEMPEST_REPO $TEMPEST_DIR $TEMPEST_BRANCH
|
||||
pip_install 'tox!=2.8.0'
|
||||
pushd $TEMPEST_DIR
|
||||
# NOTE(gmann): checkout the TEMPEST_BRANCH in case TEMPEST_BRANCH
|
||||
# is tag name not master. git_clone would not checkout tag because
|
||||
# TEMPEST_DIR already exist until RECLONE is true.
|
||||
git checkout $TEMPEST_BRANCH
|
||||
|
||||
# NOTE(gmann): Use branch constraint because Tempest is pinned to the branch release
|
||||
# instead of using master. We need to export it via env var UPPER_CONSTRAINTS_FILE
|
||||
# so that initial creation of tempest tox use stable branch constraint
|
||||
# instead of master constraint as defined in tempest/tox.ini
|
||||
export UPPER_CONSTRAINTS_FILE=$REQUIREMENTS_DIR/upper-constraints.txt
|
||||
|
||||
tox -r --notest -efull
|
||||
# NOTE(mtreinish) Respect constraints in the tempest full venv, things that
|
||||
# are using a tox job other than full will not be respecting constraints but
|
||||
@@ -639,7 +684,9 @@ function install_tempest {
|
||||
function install_tempest_plugins {
|
||||
pushd $TEMPEST_DIR
|
||||
if [[ $TEMPEST_PLUGINS != 0 ]] ; then
|
||||
tox -evenv-tempest -- pip install $TEMPEST_PLUGINS
|
||||
# NOTE(gmann): Use branch constraint because Tempest is pinned to the branch release
|
||||
# instead of using master.
|
||||
tox -evenv-tempest -- pip install -c $REQUIREMENTS_DIR/upper-constraints.txt $TEMPEST_PLUGINS
|
||||
echo "Checking installed Tempest plugins:"
|
||||
tox -evenv-tempest -- tempest list-plugins
|
||||
fi
|
||||
|
||||
@@ -340,6 +340,24 @@ function make_root_CA {
|
||||
fi
|
||||
}
|
||||
|
||||
# Deploy the service cert & key to a service specific
|
||||
# location
|
||||
function deploy_int_cert {
|
||||
local cert_target_file=$1
|
||||
local key_target_file=$2
|
||||
|
||||
sudo cp "$INT_CA_DIR/$DEVSTACK_CERT_NAME.crt" "$cert_target_file"
|
||||
sudo cp "$INT_CA_DIR/private/$DEVSTACK_CERT_NAME.key" "$key_target_file"
|
||||
}
|
||||
|
||||
# Deploy the intermediate CA cert bundle file to a service
|
||||
# specific location
|
||||
function deploy_int_CA {
|
||||
local ca_target_file=$1
|
||||
|
||||
sudo cp "$INT_CA_DIR/ca-chain.pem" "$ca_target_file"
|
||||
}
|
||||
|
||||
# If a non-system python-requests is installed then it will use the
|
||||
# built-in CA certificate store rather than the distro-specific
|
||||
# CA certificate store. Detect this and symlink to the correct
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
- hosts: all
|
||||
# This is the default strategy, however since orchestrate-devstack requires
|
||||
# "linear", it is safer to enforce it in case this is running in an
|
||||
# environment configured with a different default strategy.
|
||||
strategy: linear
|
||||
roles:
|
||||
- run-devstack
|
||||
- orchestrate-devstack
|
||||
|
||||
+21
-10
@@ -1,15 +1,25 @@
|
||||
- hosts: controller
|
||||
roles:
|
||||
- role: test-matrix
|
||||
test_matrix_role: primary
|
||||
|
||||
- hosts: subnode
|
||||
roles:
|
||||
- role: test-matrix
|
||||
test_matrix_role: subnode
|
||||
|
||||
- hosts: all
|
||||
pre_tasks:
|
||||
- name: Gather minimum local MTU
|
||||
set_fact:
|
||||
local_mtu: >
|
||||
{% set mtus = [] -%}
|
||||
{% for interface in ansible_interfaces -%}
|
||||
{% set interface_variable = 'ansible_' + interface -%}
|
||||
{% if interface_variable in hostvars[inventory_hostname] -%}
|
||||
{% set _ = mtus.append(hostvars[inventory_hostname][interface_variable]['mtu']|int) -%}
|
||||
{% endif -%}
|
||||
{% endfor -%}
|
||||
{{- mtus|min -}}
|
||||
- name: Calculate external_bridge_mtu
|
||||
# 50 bytes is overhead for vxlan (which is greater than GRE
|
||||
# allowing us to use either overlay option with this MTU.
|
||||
# TODO(andreaf) This should work, but it may have to be reconcilied with
|
||||
# the MTU setting used by the multinode setup roles in multinode pre.yaml
|
||||
set_fact:
|
||||
external_bridge_mtu: "{{ local_mtu | int - 50 }}"
|
||||
roles:
|
||||
- test-matrix
|
||||
- configure-swap
|
||||
- setup-stack-user
|
||||
- setup-tempest-user
|
||||
@@ -18,3 +28,4 @@
|
||||
- setup-devstack-cache
|
||||
- start-fresh-logging
|
||||
- write-devstack-local-conf
|
||||
- ensure-pip
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
- hosts: all
|
||||
|
||||
tasks:
|
||||
|
||||
- name: Install prerequisites
|
||||
shell:
|
||||
chdir: '{{ zuul.project.src_dir }}'
|
||||
executable: /bin/bash
|
||||
cmd: |
|
||||
set -e
|
||||
set -x
|
||||
echo "IPV4_ADDRS_SAFE_TO_USE=10.1.0.0/20" >> localrc
|
||||
./tools/install_prereqs.sh
|
||||
@@ -0,0 +1,12 @@
|
||||
- hosts: all
|
||||
|
||||
tasks:
|
||||
|
||||
- name: Run run_tests.sh
|
||||
shell:
|
||||
chdir: '{{ zuul.project.src_dir }}'
|
||||
executable: /bin/bash
|
||||
cmd: |
|
||||
set -e
|
||||
set -x
|
||||
./run_tests.sh
|
||||
@@ -45,7 +45,7 @@
|
||||
with_items: "{{ redhat_apache_deref_logs.results }}"
|
||||
when:
|
||||
- item.stat.isreg or item.stat.islnk
|
||||
when: ansible_os_family == 'Redhat'
|
||||
when: ansible_os_family == 'RedHat'
|
||||
|
||||
- name: Ensure {{ stage_dir }}/apache_config apache_config exists
|
||||
file:
|
||||
@@ -57,7 +57,7 @@
|
||||
apache_config_paths:
|
||||
'Debian': '/etc/apache2/sites-enabled/'
|
||||
'Suse': '/etc/apache2/conf.d/'
|
||||
'Redhat': '/etc/httpd/conf.d/'
|
||||
'RedHat': '/etc/httpd/conf.d/'
|
||||
|
||||
- name: Discover configurations
|
||||
find:
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
name=""
|
||||
for u in `systemctl list-unit-files | grep devstack | awk '{print $1}'`; do
|
||||
name=$(echo $u | sed 's/devstack@/screen-/' | sed 's/\.service//')
|
||||
journalctl -o short-precise --unit $u | gzip - > {{ stage_dir }}/logs/$name.txt.gz
|
||||
journalctl -o short-precise --unit $u > {{ stage_dir }}/logs/$name.txt
|
||||
done
|
||||
|
||||
# Export the journal in export format to make it downloadable
|
||||
@@ -34,4 +34,4 @@
|
||||
-t sudo \
|
||||
--no-pager \
|
||||
--since="$(cat {{ devstack_base_dir }}/log-start-timestamp.txt)" \
|
||||
| gzip - > {{ stage_dir }}/logs/syslog.txt.gz
|
||||
> {{ stage_dir }}/logs/syslog.txt
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
Orchestrate a devstack
|
||||
|
||||
Runs devstack in a multinode scenario, with one controller node
|
||||
and a group of subnodes.
|
||||
|
||||
The reason for this role is so that jobs in other repository may
|
||||
run devstack in their plays with no need for re-implementing the
|
||||
orchestration logic.
|
||||
|
||||
The "run-devstack" role is available to run devstack with no
|
||||
orchestration.
|
||||
|
||||
This role sets up the controller and CA first, it then pushes CA
|
||||
data to sub-nodes and run devstack there. The only requirement for
|
||||
this role is for the controller inventory_hostname to be "controller"
|
||||
and for all sub-nodes to be defined in a group called "subnode".
|
||||
|
||||
This role needs to be invoked from a playbook that uses a "linear" strategy.
|
||||
|
||||
**Role Variables**
|
||||
|
||||
.. zuul:rolevar:: devstack_base_dir
|
||||
:default: /opt/stack
|
||||
|
||||
The devstack base directory.
|
||||
@@ -0,0 +1 @@
|
||||
devstack_base_dir: /opt/stack
|
||||
@@ -0,0 +1,44 @@
|
||||
- name: Run devstack on the controller
|
||||
include_role:
|
||||
name: run-devstack
|
||||
when: inventory_hostname == 'controller'
|
||||
|
||||
- name: Setup devstack on sub-nodes
|
||||
block:
|
||||
|
||||
- name: Distribute the build sshkey for the user "stack"
|
||||
include_role:
|
||||
name: copy-build-sshkey
|
||||
vars:
|
||||
copy_sshkey_target_user: 'stack'
|
||||
|
||||
- name: Sync CA data to subnodes (when any)
|
||||
# Only do this if the tls-proxy service is defined and enabled
|
||||
include_role:
|
||||
name: sync-devstack-data
|
||||
when: devstack_services['tls-proxy']|default(false)
|
||||
|
||||
- name: Run devstack on the sub-nodes
|
||||
include_role:
|
||||
name: run-devstack
|
||||
when: inventory_hostname in groups['subnode']
|
||||
|
||||
- name: Discover hosts
|
||||
# Discovers compute nodes (subnodes) and maps them to cells. Only run
|
||||
# on the controller node.
|
||||
# NOTE(mriedem): We want to remove this if/when nova supports
|
||||
# auto-registration of computes with cells, but that's not happening in
|
||||
# Ocata.
|
||||
# NOTE(andreaf) This is taken (NOTE included) from the discover_hosts
|
||||
# function in devstack gate. Since this is now in devstack, which is
|
||||
# branched, we know that the discover_hosts tool exists.
|
||||
become: true
|
||||
become_user: stack
|
||||
shell: ./tools/discover_hosts.sh
|
||||
args:
|
||||
chdir: "{{ devstack_base_dir }}/devstack"
|
||||
when: inventory_hostname == 'controller'
|
||||
|
||||
when:
|
||||
- '"controller" in hostvars'
|
||||
- '"subnode" in groups'
|
||||
@@ -0,0 +1,22 @@
|
||||
Generate stackviz report.
|
||||
|
||||
Generate stackviz report using subunit and dstat data, using
|
||||
the stackviz archive embedded in test images.
|
||||
|
||||
**Role Variables**
|
||||
|
||||
.. zuul:rolevar:: devstack_base_dir
|
||||
:default: /opt/stack
|
||||
|
||||
The devstack base directory.
|
||||
|
||||
.. zuul:rolevar:: stage_dir
|
||||
:default: "{{ ansible_user_dir }}"
|
||||
|
||||
The stage directory where the input data can be found and
|
||||
the output will be produced.
|
||||
|
||||
.. zuul:rolevar:: zuul_work_dir
|
||||
:default: {{ devstack_base_dir }}/tempest
|
||||
|
||||
Directory to work in. It has to be a fully qualified path.
|
||||
@@ -0,0 +1,3 @@
|
||||
devstack_base_dir: /opt/stack
|
||||
stage_dir: "{{ ansible_user_dir }}"
|
||||
zuul_work_dir: "{{ devstack_base_dir }}/tempest"
|
||||
@@ -0,0 +1,73 @@
|
||||
- name: Process Stackviz
|
||||
block:
|
||||
|
||||
- name: Devstack checks if stackviz archive exists
|
||||
stat:
|
||||
path: "/opt/cache/files/stackviz-latest.tar.gz"
|
||||
register: stackviz_archive
|
||||
|
||||
- debug:
|
||||
msg: "Stackviz archive could not be found in /opt/cache/files/stackviz-latest.tar.gz"
|
||||
when: not stackviz_archive.stat.exists
|
||||
|
||||
- name: Check if subunit data exists
|
||||
stat:
|
||||
path: "{{ zuul_work_dir }}/testrepository.subunit"
|
||||
register: subunit_input
|
||||
|
||||
- debug:
|
||||
msg: "Subunit file could not be found at {{ zuul_work_dir }}/testrepository.subunit"
|
||||
when: not subunit_input.stat.exists
|
||||
|
||||
- name: Install stackviz
|
||||
when:
|
||||
- stackviz_archive.stat.exists
|
||||
- subunit_input.stat.exists
|
||||
block:
|
||||
- include_role:
|
||||
name: ensure-pip
|
||||
|
||||
- pip:
|
||||
name: "file://{{ stackviz_archive.stat.path }}"
|
||||
virtualenv: /tmp/stackviz
|
||||
virtualenv_command: '{{ ensure_pip_virtualenv_command }}'
|
||||
extra_args: -U
|
||||
|
||||
- name: Deploy stackviz static html+js
|
||||
command: cp -pR /tmp/stackviz/share/stackviz-html {{ stage_dir }}/stackviz
|
||||
when:
|
||||
- stackviz_archive.stat.exists
|
||||
- subunit_input.stat.exists
|
||||
|
||||
- name: Check if dstat data exists
|
||||
stat:
|
||||
path: "{{ devstack_base_dir }}/logs/dstat-csv.log"
|
||||
register: dstat_input
|
||||
when:
|
||||
- stackviz_archive.stat.exists
|
||||
- subunit_input.stat.exists
|
||||
|
||||
- name: Run stackviz with dstat
|
||||
shell: |
|
||||
cat {{ subunit_input.stat.path }} | \
|
||||
/tmp/stackviz/bin/stackviz-export \
|
||||
--dstat "{{ devstack_base_dir }}/logs/dstat-csv.log" \
|
||||
--env --stdin \
|
||||
{{ stage_dir }}/stackviz/data
|
||||
when:
|
||||
- stackviz_archive.stat.exists
|
||||
- subunit_input.stat.exists
|
||||
- dstat_input.stat.exists
|
||||
|
||||
- name: Run stackviz without dstat
|
||||
shell: |
|
||||
cat {{ subunit_input.stat.path }} | \
|
||||
/tmp/stackviz/bin/stackviz-export \
|
||||
--env --stdin \
|
||||
{{ stage_dir }}/stackviz/data
|
||||
when:
|
||||
- stackviz_archive.stat.exists
|
||||
- subunit_input.stat.exists
|
||||
- not dstat_input.stat.exists
|
||||
|
||||
ignore_errors: yes
|
||||
@@ -1,9 +1,13 @@
|
||||
- name: Find all source repos used by this job
|
||||
find:
|
||||
paths:
|
||||
- src/git.openstack.org/openstack
|
||||
- src/git.openstack.org/openstack-dev
|
||||
- src/git.openstack.org/openstack-infra
|
||||
- src/opendev.org/opendev
|
||||
- src/opendev.org/openstack
|
||||
- src/opendev.org/openstack-dev
|
||||
- src/opendev.org/openstack-infra
|
||||
- src/opendev.org/starlingx
|
||||
- src/opendev.org/x
|
||||
- src/opendev.org/zuul
|
||||
file_type: directory
|
||||
register: found_repos
|
||||
|
||||
|
||||
@@ -21,10 +21,12 @@
|
||||
group: stack
|
||||
become: yes
|
||||
|
||||
- name: Set stack user home directory permissions
|
||||
- name: Set stack user home directory permissions and ownership
|
||||
file:
|
||||
path: '{{ devstack_stack_home_dir }}'
|
||||
mode: 0755
|
||||
owner: stack
|
||||
group: stack
|
||||
become: yes
|
||||
|
||||
- name: Copy 50_stack_sh file to /etc/sudoers.d
|
||||
@@ -36,7 +38,7 @@
|
||||
group: root
|
||||
become: yes
|
||||
|
||||
- name: Create new/.cache folder within BASE
|
||||
- name: Create .cache folder within BASE
|
||||
file:
|
||||
path: '{{ devstack_stack_home_dir }}/.cache'
|
||||
state: directory
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
Sync devstack data for multinode configurations
|
||||
|
||||
Sync any data files which include certificates to be used if TLS is enabled.
|
||||
This role must be executed on the controller and it pushes data to all
|
||||
subnodes.
|
||||
|
||||
**Role Variables**
|
||||
|
||||
.. zuul:rolevar:: devstack_base_dir
|
||||
:default: /opt/stack
|
||||
|
||||
The devstack base directory.
|
||||
@@ -0,0 +1 @@
|
||||
devstack_base_dir: /opt/stack
|
||||
@@ -0,0 +1,48 @@
|
||||
- name: Ensure the data folder exists
|
||||
become: true
|
||||
file:
|
||||
path: "{{ devstack_base_dir }}/data"
|
||||
state: directory
|
||||
owner: stack
|
||||
group: stack
|
||||
mode: 0755
|
||||
when: 'inventory_hostname in groups["subnode"]|default([])'
|
||||
|
||||
- name: Ensure the CA folder exists
|
||||
become: true
|
||||
file:
|
||||
path: "{{ devstack_base_dir }}/data/CA"
|
||||
state: directory
|
||||
owner: stack
|
||||
group: stack
|
||||
mode: 0755
|
||||
when: 'inventory_hostname in groups["subnode"]|default([])'
|
||||
|
||||
- name: Pull the CA certificate and folder
|
||||
become: true
|
||||
synchronize:
|
||||
src: "{{ item }}"
|
||||
dest: "{{ zuul.executor.work_root }}/{{ item | basename }}"
|
||||
mode: pull
|
||||
with_items:
|
||||
- "{{ devstack_base_dir }}/data/ca-bundle.pem"
|
||||
- "{{ devstack_base_dir }}/data/CA"
|
||||
when: inventory_hostname == 'controller'
|
||||
|
||||
- name: Push the CA certificate
|
||||
become: true
|
||||
become_user: stack
|
||||
synchronize:
|
||||
src: "{{ zuul.executor.work_root }}/ca-bundle.pem"
|
||||
dest: "{{ devstack_base_dir }}/data/ca-bundle.pem"
|
||||
mode: push
|
||||
when: 'inventory_hostname in groups["subnode"]|default([])'
|
||||
|
||||
- name: Push the CA folder
|
||||
become: true
|
||||
become_user: stack
|
||||
synchronize:
|
||||
src: "{{ zuul.executor.work_root }}/CA/"
|
||||
dest: "{{ devstack_base_dir }}/data/"
|
||||
mode: push
|
||||
when: 'inventory_hostname in groups["subnode"]|default([])'
|
||||
@@ -20,6 +20,15 @@ Write the local.conf file for use by devstack
|
||||
bash shell variables, and will be ordered so that variables used by
|
||||
later entries appear first.
|
||||
|
||||
As a special case, the variable ``LIBS_FROM_GIT`` will be
|
||||
constructed automatically from the projects which appear in the
|
||||
``required-projects`` list defined by the job plus the project of
|
||||
the change under test. To instruct devstack to install a library
|
||||
from source rather than pypi, simply add that library to the job's
|
||||
``required-projects`` list. To override the
|
||||
automatically-generated value, set ``LIBS_FROM_GIT`` in
|
||||
``devstack_localrc`` to the desired value.
|
||||
|
||||
.. zuul:rolevar:: devstack_local_conf
|
||||
:type: dict
|
||||
|
||||
@@ -75,3 +84,16 @@ Write the local.conf file for use by devstack
|
||||
A dictionary mapping a plugin name to a git repo location. If the
|
||||
location is a non-empty string, then an ``enable_plugin`` line will
|
||||
be emmitted for the plugin name.
|
||||
|
||||
If a plugin declares a dependency on another plugin (via
|
||||
``plugin_requires`` in the plugin's settings file), this role will
|
||||
automatically emit ``enable_plugin`` lines in the correct order.
|
||||
|
||||
.. zuul:rolevar:: tempest_plugins
|
||||
:type: list
|
||||
|
||||
A list of tempest plugins which are installed alongside tempest.
|
||||
|
||||
The list of values will be combined with the base devstack directory
|
||||
and used to populate the ``TEMPEST_PLUGINS`` variable. If the variable
|
||||
already exists, its value is *not* changed.
|
||||
|
||||
@@ -14,16 +14,69 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
|
||||
class VarGraph(object):
|
||||
class DependencyGraph(object):
|
||||
# This is based on the JobGraph from Zuul.
|
||||
|
||||
def __init__(self):
|
||||
self._names = set()
|
||||
self._dependencies = {} # dependent_name -> set(parent_names)
|
||||
|
||||
def add(self, name, dependencies):
|
||||
# Append the dependency information
|
||||
self._dependencies.setdefault(name, set())
|
||||
try:
|
||||
for dependency in dependencies:
|
||||
# Make sure a circular dependency is never created
|
||||
ancestors = self._getParentNamesRecursively(
|
||||
dependency, soft=True)
|
||||
ancestors.add(dependency)
|
||||
if name in ancestors:
|
||||
raise Exception("Dependency cycle detected in {}".
|
||||
format(name))
|
||||
self._dependencies[name].add(dependency)
|
||||
except Exception:
|
||||
del self._dependencies[name]
|
||||
raise
|
||||
|
||||
def getDependenciesRecursively(self, parent):
|
||||
dependencies = []
|
||||
|
||||
current_dependencies = self._dependencies[parent]
|
||||
for current in current_dependencies:
|
||||
if current not in dependencies:
|
||||
dependencies.append(current)
|
||||
for dep in self.getDependenciesRecursively(current):
|
||||
if dep not in dependencies:
|
||||
dependencies.append(dep)
|
||||
return dependencies
|
||||
|
||||
def _getParentNamesRecursively(self, dependent, soft=False):
|
||||
all_parent_items = set()
|
||||
items_to_iterate = set([dependent])
|
||||
while len(items_to_iterate) > 0:
|
||||
current_item = items_to_iterate.pop()
|
||||
current_parent_items = self._dependencies.get(current_item)
|
||||
if current_parent_items is None:
|
||||
if soft:
|
||||
current_parent_items = set()
|
||||
else:
|
||||
raise Exception("Dependent item {} not found: ".format(
|
||||
dependent))
|
||||
new_parent_items = current_parent_items - all_parent_items
|
||||
items_to_iterate |= new_parent_items
|
||||
all_parent_items |= new_parent_items
|
||||
return all_parent_items
|
||||
|
||||
|
||||
class VarGraph(DependencyGraph):
|
||||
def __init__(self, vars):
|
||||
super(VarGraph, self).__init__()
|
||||
self.vars = {}
|
||||
self._varnames = set()
|
||||
self._dependencies = {} # dependent_var_name -> set(parent_var_names)
|
||||
for k, v in vars.items():
|
||||
self._varnames.add(k)
|
||||
for k, v in vars.items():
|
||||
@@ -38,28 +91,21 @@ class VarGraph(object):
|
||||
raise Exception("Variable {} already added".format(key))
|
||||
self.vars[key] = value
|
||||
# Append the dependency information
|
||||
self._dependencies.setdefault(key, set())
|
||||
dependencies = set()
|
||||
for dependency in self.getDependencies(value):
|
||||
if dependency == key:
|
||||
# A variable is allowed to reference itself; no
|
||||
# dependency link needed in that case.
|
||||
continue
|
||||
if dependency not in self._varnames:
|
||||
# It's not necessary to create a link for an
|
||||
# external variable.
|
||||
continue
|
||||
dependencies.add(dependency)
|
||||
try:
|
||||
for dependency in self.getDependencies(value):
|
||||
if dependency == key:
|
||||
# A variable is allowed to reference itself; no
|
||||
# dependency link needed in that case.
|
||||
continue
|
||||
if dependency not in self._varnames:
|
||||
# It's not necessary to create a link for an
|
||||
# external variable.
|
||||
continue
|
||||
# Make sure a circular dependency is never created
|
||||
ancestor_vars = self._getParentVarNamesRecursively(
|
||||
dependency, soft=True)
|
||||
ancestor_vars.add(dependency)
|
||||
if any((key == anc_var) for anc_var in ancestor_vars):
|
||||
raise Exception("Dependency cycle detected in var {}".
|
||||
format(key))
|
||||
self._dependencies[key].add(dependency)
|
||||
self.add(key, dependencies)
|
||||
except Exception:
|
||||
del self.vars[key]
|
||||
del self._dependencies[key]
|
||||
raise
|
||||
|
||||
def getVars(self):
|
||||
@@ -67,59 +113,123 @@ class VarGraph(object):
|
||||
keys = sorted(self.vars.keys())
|
||||
seen = set()
|
||||
for key in keys:
|
||||
dependencies = self.getDependentVarsRecursively(key)
|
||||
dependencies = self.getDependenciesRecursively(key)
|
||||
for var in dependencies + [key]:
|
||||
if var not in seen:
|
||||
ret.append((var, self.vars[var]))
|
||||
seen.add(var)
|
||||
return ret
|
||||
|
||||
def getDependentVarsRecursively(self, parent_var):
|
||||
dependent_vars = []
|
||||
|
||||
current_dependent_vars = self._dependencies[parent_var]
|
||||
for current_var in current_dependent_vars:
|
||||
if current_var not in dependent_vars:
|
||||
dependent_vars.append(current_var)
|
||||
for dep in self.getDependentVarsRecursively(current_var):
|
||||
if dep not in dependent_vars:
|
||||
dependent_vars.append(dep)
|
||||
return dependent_vars
|
||||
class PluginGraph(DependencyGraph):
|
||||
def __init__(self, base_dir, plugins):
|
||||
super(PluginGraph, self).__init__()
|
||||
# The dependency trees expressed by all the plugins we found
|
||||
# (which may be more than those the job is using).
|
||||
self._plugin_dependencies = {}
|
||||
self.loadPluginNames(base_dir)
|
||||
|
||||
def _getParentVarNamesRecursively(self, dependent_var, soft=False):
|
||||
all_parent_vars = set()
|
||||
vars_to_iterate = set([dependent_var])
|
||||
while len(vars_to_iterate) > 0:
|
||||
current_var = vars_to_iterate.pop()
|
||||
current_parent_vars = self._dependencies.get(current_var)
|
||||
if current_parent_vars is None:
|
||||
if soft:
|
||||
current_parent_vars = set()
|
||||
else:
|
||||
raise Exception("Dependent var {} not found: ".format(
|
||||
dependent_var))
|
||||
new_parent_vars = current_parent_vars - all_parent_vars
|
||||
vars_to_iterate |= new_parent_vars
|
||||
all_parent_vars |= new_parent_vars
|
||||
return all_parent_vars
|
||||
self.plugins = {}
|
||||
self._pluginnames = set()
|
||||
for k, v in plugins.items():
|
||||
self._pluginnames.add(k)
|
||||
for k, v in plugins.items():
|
||||
self._addPlugin(k, str(v))
|
||||
|
||||
def loadPluginNames(self, base_dir):
|
||||
if base_dir is None:
|
||||
return
|
||||
git_roots = []
|
||||
for root, dirs, files in os.walk(base_dir):
|
||||
if '.git' not in dirs:
|
||||
continue
|
||||
# Don't go deeper than git roots
|
||||
dirs[:] = []
|
||||
git_roots.append(root)
|
||||
for root in git_roots:
|
||||
devstack = os.path.join(root, 'devstack')
|
||||
if not (os.path.exists(devstack) and os.path.isdir(devstack)):
|
||||
continue
|
||||
settings = os.path.join(devstack, 'settings')
|
||||
if not (os.path.exists(settings) and os.path.isfile(settings)):
|
||||
continue
|
||||
self.loadDevstackPluginInfo(settings)
|
||||
|
||||
define_re = re.compile(r'^define_plugin\s+(\S+).*')
|
||||
require_re = re.compile(r'^plugin_requires\s+(\S+)\s+(\S+).*')
|
||||
def loadDevstackPluginInfo(self, fn):
|
||||
name = None
|
||||
reqs = set()
|
||||
with open(fn) as f:
|
||||
for line in f:
|
||||
m = self.define_re.match(line)
|
||||
if m:
|
||||
name = m.group(1)
|
||||
m = self.require_re.match(line)
|
||||
if m:
|
||||
if name == m.group(1):
|
||||
reqs.add(m.group(2))
|
||||
if name and reqs:
|
||||
self._plugin_dependencies[name] = reqs
|
||||
|
||||
def getDependencies(self, value):
|
||||
return self._plugin_dependencies.get(value, [])
|
||||
|
||||
def _addPlugin(self, key, value):
|
||||
if key in self.plugins:
|
||||
raise Exception("Plugin {} already added".format(key))
|
||||
self.plugins[key] = value
|
||||
# Append the dependency information
|
||||
dependencies = set()
|
||||
for dependency in self.getDependencies(key):
|
||||
if dependency == key:
|
||||
continue
|
||||
dependencies.add(dependency)
|
||||
try:
|
||||
self.add(key, dependencies)
|
||||
except Exception:
|
||||
del self.plugins[key]
|
||||
raise
|
||||
|
||||
def getPlugins(self):
|
||||
ret = []
|
||||
keys = sorted(self.plugins.keys())
|
||||
seen = set()
|
||||
for key in keys:
|
||||
dependencies = self.getDependenciesRecursively(key)
|
||||
for plugin in dependencies + [key]:
|
||||
if plugin not in seen:
|
||||
ret.append((plugin, self.plugins[plugin]))
|
||||
seen.add(plugin)
|
||||
return ret
|
||||
|
||||
|
||||
class LocalConf(object):
|
||||
|
||||
def __init__(self, localrc, localconf, base_services, services, plugins):
|
||||
def __init__(self, localrc, localconf, base_services, services, plugins,
|
||||
base_dir, projects, project, tempest_plugins):
|
||||
self.localrc = []
|
||||
self.warnings = []
|
||||
self.meta_sections = {}
|
||||
if plugins:
|
||||
self.handle_plugins(plugins)
|
||||
self.plugin_deps = {}
|
||||
self.base_dir = base_dir
|
||||
self.projects = projects
|
||||
self.project = project
|
||||
self.tempest_plugins = tempest_plugins
|
||||
if services or base_services:
|
||||
self.handle_services(base_services, services or {})
|
||||
if localrc:
|
||||
self.handle_localrc(localrc)
|
||||
self.handle_localrc(localrc)
|
||||
# Plugins must be the last items in localrc, otherwise
|
||||
# the configuration lines which follows them in the file are
|
||||
# not applied to the plugins (for example, the value of DEST.)
|
||||
if plugins:
|
||||
self.handle_plugins(plugins)
|
||||
if localconf:
|
||||
self.handle_localconf(localconf)
|
||||
|
||||
def handle_plugins(self, plugins):
|
||||
for k, v in plugins.items():
|
||||
pg = PluginGraph(self.base_dir, plugins)
|
||||
for k, v in pg.getPlugins():
|
||||
if v:
|
||||
self.localrc.append('enable_plugin {} {}'.format(k, v))
|
||||
|
||||
@@ -137,9 +247,46 @@ class LocalConf(object):
|
||||
self.localrc.append('enable_service {}'.format(k))
|
||||
|
||||
def handle_localrc(self, localrc):
|
||||
vg = VarGraph(localrc)
|
||||
for k, v in vg.getVars():
|
||||
self.localrc.append('{}={}'.format(k, v))
|
||||
lfg = False
|
||||
tp = False
|
||||
if localrc:
|
||||
vg = VarGraph(localrc)
|
||||
for k, v in vg.getVars():
|
||||
# Avoid double quoting
|
||||
if len(v) and v[0]=='"':
|
||||
self.localrc.append('{}={}'.format(k, v))
|
||||
else:
|
||||
self.localrc.append('{}="{}"'.format(k, v))
|
||||
if k == 'LIBS_FROM_GIT':
|
||||
lfg = True
|
||||
elif k == 'TEMPEST_PLUGINS':
|
||||
tp = True
|
||||
|
||||
if not lfg and (self.projects or self.project):
|
||||
required_projects = []
|
||||
if self.projects:
|
||||
for project_name, project_info in self.projects.items():
|
||||
if project_info.get('required'):
|
||||
required_projects.append(project_info['short_name'])
|
||||
if self.project:
|
||||
if self.project['short_name'] not in required_projects:
|
||||
required_projects.append(self.project['short_name'])
|
||||
if required_projects:
|
||||
self.localrc.append('LIBS_FROM_GIT={}'.format(
|
||||
','.join(required_projects)))
|
||||
|
||||
if self.tempest_plugins:
|
||||
if not tp:
|
||||
tp_dirs = []
|
||||
for tempest_plugin in self.tempest_plugins:
|
||||
tp_dirs.append(os.path.join(self.base_dir, tempest_plugin))
|
||||
self.localrc.append('TEMPEST_PLUGINS="{}"'.format(
|
||||
' '.join(tp_dirs)))
|
||||
else:
|
||||
self.warnings.append('TEMPEST_PLUGINS already defined ({}),'
|
||||
'requested value {} ignored'.format(
|
||||
tp, self.tempest_plugins))
|
||||
|
||||
|
||||
def handle_localconf(self, localconf):
|
||||
for phase, phase_data in localconf.items():
|
||||
@@ -171,7 +318,11 @@ def main():
|
||||
services=dict(type='dict'),
|
||||
localrc=dict(type='dict'),
|
||||
local_conf=dict(type='dict'),
|
||||
base_dir=dict(type='path'),
|
||||
path=dict(type='str'),
|
||||
projects=dict(type='dict'),
|
||||
project=dict(type='dict'),
|
||||
tempest_plugins=dict(type='list'),
|
||||
)
|
||||
)
|
||||
|
||||
@@ -180,14 +331,21 @@ def main():
|
||||
p.get('local_conf'),
|
||||
p.get('base_services'),
|
||||
p.get('services'),
|
||||
p.get('plugins'))
|
||||
p.get('plugins'),
|
||||
p.get('base_dir'),
|
||||
p.get('projects'),
|
||||
p.get('project'),
|
||||
p.get('tempest_plugins'))
|
||||
lc.write(p['path'])
|
||||
|
||||
module.exit_json()
|
||||
module.exit_json(warnings=lc.warnings)
|
||||
|
||||
|
||||
from ansible.module_utils.basic import * # noqa
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
try:
|
||||
from ansible.module_utils.basic import * # noqa
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
@@ -0,0 +1,291 @@
|
||||
# Copyright (C) 2017 Red Hat, Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
#
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from devstack_local_conf import LocalConf
|
||||
from collections import OrderedDict
|
||||
|
||||
class TestDevstackLocalConf(unittest.TestCase):
|
||||
|
||||
@staticmethod
|
||||
def _init_localconf(p):
|
||||
lc = LocalConf(p.get('localrc'),
|
||||
p.get('local_conf'),
|
||||
p.get('base_services'),
|
||||
p.get('services'),
|
||||
p.get('plugins'),
|
||||
p.get('base_dir'),
|
||||
p.get('projects'),
|
||||
p.get('project'),
|
||||
p.get('tempest_plugins'))
|
||||
return lc
|
||||
|
||||
def setUp(self):
|
||||
self.tmpdir = tempfile.mkdtemp()
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.tmpdir)
|
||||
|
||||
def test_plugins(self):
|
||||
"Test that plugins without dependencies work"
|
||||
localrc = {'test_localrc': '1'}
|
||||
local_conf = {'install':
|
||||
{'nova.conf':
|
||||
{'main':
|
||||
{'test_conf': '2'}}}}
|
||||
services = {'cinder': True}
|
||||
# We use ordereddict here to make sure the plugins are in the
|
||||
# *wrong* order for testing.
|
||||
plugins = OrderedDict([
|
||||
('bar', 'https://git.openstack.org/openstack/bar-plugin'),
|
||||
('foo', 'https://git.openstack.org/openstack/foo-plugin'),
|
||||
('baz', 'https://git.openstack.org/openstack/baz-plugin'),
|
||||
])
|
||||
p = dict(localrc=localrc,
|
||||
local_conf=local_conf,
|
||||
base_services=[],
|
||||
services=services,
|
||||
plugins=plugins,
|
||||
base_dir='./test',
|
||||
path=os.path.join(self.tmpdir, 'test.local.conf'))
|
||||
lc = self._init_localconf(p)
|
||||
lc.write(p['path'])
|
||||
|
||||
plugins = []
|
||||
with open(p['path']) as f:
|
||||
for line in f:
|
||||
if line.startswith('enable_plugin'):
|
||||
plugins.append(line.split()[1])
|
||||
self.assertEqual(['bar', 'baz', 'foo'], plugins)
|
||||
|
||||
|
||||
def test_plugin_deps(self):
|
||||
"Test that plugins with dependencies work"
|
||||
os.makedirs(os.path.join(self.tmpdir, 'foo-plugin', 'devstack'))
|
||||
os.makedirs(os.path.join(self.tmpdir, 'foo-plugin', '.git'))
|
||||
os.makedirs(os.path.join(self.tmpdir, 'bar-plugin', 'devstack'))
|
||||
os.makedirs(os.path.join(self.tmpdir, 'bar-plugin', '.git'))
|
||||
with open(os.path.join(
|
||||
self.tmpdir,
|
||||
'foo-plugin', 'devstack', 'settings'), 'w') as f:
|
||||
f.write('define_plugin foo-plugin\n')
|
||||
with open(os.path.join(
|
||||
self.tmpdir,
|
||||
'bar-plugin', 'devstack', 'settings'), 'w') as f:
|
||||
f.write('define_plugin bar-plugin\n')
|
||||
f.write('plugin_requires bar-plugin foo-plugin\n')
|
||||
|
||||
localrc = {'test_localrc': '1'}
|
||||
local_conf = {'install':
|
||||
{'nova.conf':
|
||||
{'main':
|
||||
{'test_conf': '2'}}}}
|
||||
services = {'cinder': True}
|
||||
# We use ordereddict here to make sure the plugins are in the
|
||||
# *wrong* order for testing.
|
||||
plugins = OrderedDict([
|
||||
('bar-plugin', 'https://git.openstack.org/openstack/bar-plugin'),
|
||||
('foo-plugin', 'https://git.openstack.org/openstack/foo-plugin'),
|
||||
])
|
||||
p = dict(localrc=localrc,
|
||||
local_conf=local_conf,
|
||||
base_services=[],
|
||||
services=services,
|
||||
plugins=plugins,
|
||||
base_dir=self.tmpdir,
|
||||
path=os.path.join(self.tmpdir, 'test.local.conf'))
|
||||
lc = self._init_localconf(p)
|
||||
lc.write(p['path'])
|
||||
|
||||
plugins = []
|
||||
with open(p['path']) as f:
|
||||
for line in f:
|
||||
if line.startswith('enable_plugin'):
|
||||
plugins.append(line.split()[1])
|
||||
self.assertEqual(['foo-plugin', 'bar-plugin'], plugins)
|
||||
|
||||
def test_libs_from_git(self):
|
||||
"Test that LIBS_FROM_GIT is auto-generated"
|
||||
projects = {
|
||||
'git.openstack.org/openstack/nova': {
|
||||
'required': True,
|
||||
'short_name': 'nova',
|
||||
},
|
||||
'git.openstack.org/openstack/oslo.messaging': {
|
||||
'required': True,
|
||||
'short_name': 'oslo.messaging',
|
||||
},
|
||||
'git.openstack.org/openstack/devstack-plugin': {
|
||||
'required': False,
|
||||
'short_name': 'devstack-plugin',
|
||||
},
|
||||
}
|
||||
project = {
|
||||
'short_name': 'glance',
|
||||
}
|
||||
p = dict(base_services=[],
|
||||
base_dir='./test',
|
||||
path=os.path.join(self.tmpdir, 'test.local.conf'),
|
||||
projects=projects,
|
||||
project=project)
|
||||
lc = self._init_localconf(p)
|
||||
lc.write(p['path'])
|
||||
|
||||
lfg = None
|
||||
with open(p['path']) as f:
|
||||
for line in f:
|
||||
if line.startswith('LIBS_FROM_GIT'):
|
||||
lfg = line.strip().split('=')[1]
|
||||
self.assertEqual('nova,oslo.messaging,glance', lfg)
|
||||
|
||||
def test_overridelibs_from_git(self):
|
||||
"Test that LIBS_FROM_GIT can be overridden"
|
||||
localrc = {'LIBS_FROM_GIT': 'oslo.db'}
|
||||
projects = {
|
||||
'git.openstack.org/openstack/nova': {
|
||||
'required': True,
|
||||
'short_name': 'nova',
|
||||
},
|
||||
'git.openstack.org/openstack/oslo.messaging': {
|
||||
'required': True,
|
||||
'short_name': 'oslo.messaging',
|
||||
},
|
||||
'git.openstack.org/openstack/devstack-plugin': {
|
||||
'required': False,
|
||||
'short_name': 'devstack-plugin',
|
||||
},
|
||||
}
|
||||
p = dict(localrc=localrc,
|
||||
base_services=[],
|
||||
base_dir='./test',
|
||||
path=os.path.join(self.tmpdir, 'test.local.conf'),
|
||||
projects=projects)
|
||||
lc = self._init_localconf(p)
|
||||
lc.write(p['path'])
|
||||
|
||||
lfg = None
|
||||
with open(p['path']) as f:
|
||||
for line in f:
|
||||
if line.startswith('LIBS_FROM_GIT'):
|
||||
lfg = line.strip().split('=')[1]
|
||||
self.assertEqual('"oslo.db"', lfg)
|
||||
|
||||
def test_avoid_double_quote(self):
|
||||
"Test that there a no duplicated quotes"
|
||||
localrc = {'TESTVAR': '"quoted value"'}
|
||||
p = dict(localrc=localrc,
|
||||
base_services=[],
|
||||
base_dir='./test',
|
||||
path=os.path.join(self.tmpdir, 'test.local.conf'),
|
||||
projects={})
|
||||
lc = self._init_localconf(p)
|
||||
lc.write(p['path'])
|
||||
|
||||
testvar = None
|
||||
with open(p['path']) as f:
|
||||
for line in f:
|
||||
if line.startswith('TESTVAR'):
|
||||
testvar = line.strip().split('=')[1]
|
||||
self.assertEqual('"quoted value"', testvar)
|
||||
|
||||
def test_plugin_circular_deps(self):
|
||||
"Test that plugins with circular dependencies fail"
|
||||
os.makedirs(os.path.join(self.tmpdir, 'foo-plugin', 'devstack'))
|
||||
os.makedirs(os.path.join(self.tmpdir, 'foo-plugin', '.git'))
|
||||
os.makedirs(os.path.join(self.tmpdir, 'bar-plugin', 'devstack'))
|
||||
os.makedirs(os.path.join(self.tmpdir, 'bar-plugin', '.git'))
|
||||
with open(os.path.join(
|
||||
self.tmpdir,
|
||||
'foo-plugin', 'devstack', 'settings'), 'w') as f:
|
||||
f.write('define_plugin foo\n')
|
||||
f.write('plugin_requires foo bar\n')
|
||||
with open(os.path.join(
|
||||
self.tmpdir,
|
||||
'bar-plugin', 'devstack', 'settings'), 'w') as f:
|
||||
f.write('define_plugin bar\n')
|
||||
f.write('plugin_requires bar foo\n')
|
||||
|
||||
localrc = {'test_localrc': '1'}
|
||||
local_conf = {'install':
|
||||
{'nova.conf':
|
||||
{'main':
|
||||
{'test_conf': '2'}}}}
|
||||
services = {'cinder': True}
|
||||
# We use ordereddict here to make sure the plugins are in the
|
||||
# *wrong* order for testing.
|
||||
plugins = OrderedDict([
|
||||
('bar', 'https://git.openstack.org/openstack/bar-plugin'),
|
||||
('foo', 'https://git.openstack.org/openstack/foo-plugin'),
|
||||
])
|
||||
p = dict(localrc=localrc,
|
||||
local_conf=local_conf,
|
||||
base_services=[],
|
||||
services=services,
|
||||
plugins=plugins,
|
||||
base_dir=self.tmpdir,
|
||||
path=os.path.join(self.tmpdir, 'test.local.conf'))
|
||||
with self.assertRaises(Exception):
|
||||
lc = self._init_localconf(p)
|
||||
lc.write(p['path'])
|
||||
|
||||
def _find_tempest_plugins_value(self, file_path):
|
||||
tp = None
|
||||
with open(file_path) as f:
|
||||
for line in f:
|
||||
if line.startswith('TEMPEST_PLUGINS'):
|
||||
found = line.strip().split('=')[1]
|
||||
self.assertIsNone(tp,
|
||||
"TEMPEST_PLUGIN ({}) found again ({})".format(
|
||||
tp, found))
|
||||
tp = found
|
||||
return tp
|
||||
|
||||
def test_tempest_plugins(self):
|
||||
"Test that TEMPEST_PLUGINS is correctly populated."
|
||||
p = dict(base_services=[],
|
||||
base_dir='./test',
|
||||
path=os.path.join(self.tmpdir, 'test.local.conf'),
|
||||
tempest_plugins=['heat-tempest-plugin', 'sahara-tests'])
|
||||
lc = self._init_localconf(p)
|
||||
lc.write(p['path'])
|
||||
|
||||
tp = self._find_tempest_plugins_value(p['path'])
|
||||
self.assertEqual('"./test/heat-tempest-plugin ./test/sahara-tests"', tp)
|
||||
self.assertEqual(len(lc.warnings), 0)
|
||||
|
||||
def test_tempest_plugins_not_overridden(self):
|
||||
"""Test that the existing value of TEMPEST_PLUGINS is not overridden
|
||||
by the user-provided value, but a warning is emitted."""
|
||||
localrc = {'TEMPEST_PLUGINS': 'someplugin'}
|
||||
p = dict(localrc=localrc,
|
||||
base_services=[],
|
||||
base_dir='./test',
|
||||
path=os.path.join(self.tmpdir, 'test.local.conf'),
|
||||
tempest_plugins=['heat-tempest-plugin', 'sahara-tests'])
|
||||
lc = self._init_localconf(p)
|
||||
lc.write(p['path'])
|
||||
|
||||
tp = self._find_tempest_plugins_value(p['path'])
|
||||
self.assertEqual('"someplugin"', tp)
|
||||
self.assertEqual(len(lc.warnings), 1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
@@ -8,3 +8,7 @@
|
||||
services: "{{ devstack_services|default(omit) }}"
|
||||
localrc: "{{ devstack_localrc|default(omit) }}"
|
||||
local_conf: "{{ devstack_local_conf|default(omit) }}"
|
||||
base_dir: "{{ devstack_base_dir|default(omit) }}"
|
||||
projects: "{{ zuul.projects }}"
|
||||
project: "{{ zuul.project }}"
|
||||
tempest_plugins: "{{ tempest_plugins|default(omit) }}"
|
||||
|
||||
@@ -221,7 +221,7 @@ write_devstack_version
|
||||
|
||||
# Warn users who aren't on an explicitly supported distro, but allow them to
|
||||
# override check and attempt installation with ``FORCE=yes ./stack``
|
||||
if [[ ! ${DISTRO} =~ (xenial|zesty|artful|stretch|jessie|f25|f26|f27|opensuse-42.2|opensuse-42.3|rhel7) ]]; then
|
||||
if [[ ! ${DISTRO} =~ (xenial|zesty|artful|stretch|jessie|f25|f26|f27|f28|opensuse-42.2|opensuse-42.3|rhel7) ]]; then
|
||||
echo "WARNING: this script has not been tested on $DISTRO"
|
||||
if [[ "$FORCE" != "yes" ]]; then
|
||||
die $LINENO "If you wish to run this script anyway run with FORCE=yes"
|
||||
@@ -328,7 +328,13 @@ function _install_rdo {
|
||||
# Per the point above, it's a bunch of repos so starts getting a
|
||||
# little messy...
|
||||
if ! is_package_installed rdo-release ; then
|
||||
yum_install https://rdoproject.org/repos/rdo-release.rpm
|
||||
if [[ "$TARGET_BRANCH" == "master" ]]; then
|
||||
yum_install https://rdoproject.org/repos/rdo-release.rpm
|
||||
else
|
||||
# Get latest rdo-release-$rdo_release RPM package version
|
||||
rdo_release=$(echo $TARGET_BRANCH | sed "s|stable/||g")
|
||||
yum_install https://rdoproject.org/repos/openstack-$rdo_release/rdo-release-$rdo_release.rpm
|
||||
fi
|
||||
fi
|
||||
|
||||
# Also enable optional for RHEL7 proper. Note this is a silent
|
||||
@@ -773,6 +779,7 @@ fi
|
||||
|
||||
# Do the ugly hacks for broken packages and distros
|
||||
source $TOP_DIR/tools/fixup_stuff.sh
|
||||
fixup_all
|
||||
|
||||
if [[ "$USE_SYSTEMD" == "True" ]]; then
|
||||
pip_install_gr systemd-python
|
||||
@@ -1402,11 +1409,6 @@ fi
|
||||
# Check the status of running services
|
||||
service_check
|
||||
|
||||
# ensure that all the libraries we think we installed from git,
|
||||
# actually were.
|
||||
check_libs_from_git
|
||||
|
||||
|
||||
# Configure nova cellsv2
|
||||
# ----------------------
|
||||
|
||||
|
||||
@@ -13,6 +13,22 @@ RC_DIR=$(cd $(dirname "${BASH_SOURCE:-$0}") && pwd)
|
||||
# Source required DevStack functions and globals
|
||||
source $RC_DIR/functions
|
||||
|
||||
# Set the target branch. This is used so that stable branching
|
||||
# does not need to update each repo below.
|
||||
TARGET_BRANCH=stable/queens
|
||||
|
||||
# In cases where the TARGET_BRANCH does not exist anymore, the
|
||||
# $series-eol tag should be used
|
||||
EOL_TAG=refs/tags/queens-eol
|
||||
|
||||
# Cycle trailing projects need to branch later than the others.
|
||||
TRAILING_TARGET_BRANCH=master
|
||||
|
||||
# And some repos do not create stable branches, so this is used
|
||||
# to make it explicit and avoid accidentally setting to a stable
|
||||
# branch.
|
||||
BRANCHLESS_TARGET_BRANCH=master
|
||||
|
||||
# Destination path for installation
|
||||
DEST=/opt/stack
|
||||
|
||||
@@ -225,7 +241,7 @@ WSGI_MODE=${WSGI_MODE:-"uwsgi"}
|
||||
|
||||
# Base GIT Repo URL
|
||||
# Another option is https://git.openstack.org
|
||||
GIT_BASE=${GIT_BASE:-git://git.openstack.org}
|
||||
GIT_BASE=${GIT_BASE:-https://git.openstack.org}
|
||||
|
||||
# The location of REQUIREMENTS once cloned
|
||||
REQUIREMENTS_DIR=$DEST/requirements
|
||||
@@ -256,35 +272,35 @@ DEVSTACK_SERIES="queens"
|
||||
|
||||
# block storage service
|
||||
CINDER_REPO=${CINDER_REPO:-${GIT_BASE}/openstack/cinder.git}
|
||||
CINDER_BRANCH=${CINDER_BRANCH:-master}
|
||||
CINDER_BRANCH=${CINDER_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# image catalog service
|
||||
GLANCE_REPO=${GLANCE_REPO:-${GIT_BASE}/openstack/glance.git}
|
||||
GLANCE_BRANCH=${GLANCE_BRANCH:-master}
|
||||
GLANCE_BRANCH=${GLANCE_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# django powered web control panel for openstack
|
||||
HORIZON_REPO=${HORIZON_REPO:-${GIT_BASE}/openstack/horizon.git}
|
||||
HORIZON_BRANCH=${HORIZON_BRANCH:-master}
|
||||
HORIZON_BRANCH=${HORIZON_BRANCH:-$EOL_TAG}
|
||||
|
||||
# unified auth system (manages accounts/tokens)
|
||||
KEYSTONE_REPO=${KEYSTONE_REPO:-${GIT_BASE}/openstack/keystone.git}
|
||||
KEYSTONE_BRANCH=${KEYSTONE_BRANCH:-master}
|
||||
KEYSTONE_BRANCH=${KEYSTONE_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# neutron service
|
||||
NEUTRON_REPO=${NEUTRON_REPO:-${GIT_BASE}/openstack/neutron.git}
|
||||
NEUTRON_BRANCH=${NEUTRON_BRANCH:-master}
|
||||
NEUTRON_BRANCH=${NEUTRON_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# neutron fwaas service
|
||||
NEUTRON_FWAAS_REPO=${NEUTRON_FWAAS_REPO:-${GIT_BASE}/openstack/neutron-fwaas.git}
|
||||
NEUTRON_FWAAS_BRANCH=${NEUTRON_FWAAS_BRANCH:-master}
|
||||
NEUTRON_FWAAS_BRANCH=${NEUTRON_FWAAS_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# compute service
|
||||
NOVA_REPO=${NOVA_REPO:-${GIT_BASE}/openstack/nova.git}
|
||||
NOVA_BRANCH=${NOVA_BRANCH:-master}
|
||||
NOVA_BRANCH=${NOVA_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# object storage service
|
||||
SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git}
|
||||
SWIFT_BRANCH=${SWIFT_BRANCH:-master}
|
||||
SWIFT_BRANCH=${SWIFT_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
##############
|
||||
#
|
||||
@@ -294,11 +310,13 @@ SWIFT_BRANCH=${SWIFT_BRANCH:-master}
|
||||
|
||||
# consolidated openstack requirements
|
||||
REQUIREMENTS_REPO=${REQUIREMENTS_REPO:-${GIT_BASE}/openstack/requirements.git}
|
||||
REQUIREMENTS_BRANCH=${REQUIREMENTS_BRANCH:-master}
|
||||
REQUIREMENTS_BRANCH=${REQUIREMENTS_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# Tempest test suite
|
||||
TEMPEST_REPO=${TEMPEST_REPO:-${GIT_BASE}/openstack/tempest.git}
|
||||
TEMPEST_BRANCH=${TEMPEST_BRANCH:-master}
|
||||
# Use Tempest tag 21.0.0 which is Queens supported version.
|
||||
# https://docs.openstack.org/releasenotes/tempest/v21.0.0.html
|
||||
TEMPEST_BRANCH=${TEMPEST_BRANCH:-21.0.0}
|
||||
|
||||
|
||||
##############
|
||||
@@ -310,56 +328,56 @@ TEMPEST_BRANCH=${TEMPEST_BRANCH:-master}
|
||||
|
||||
# volume client
|
||||
GITREPO["python-cinderclient"]=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git}
|
||||
GITBRANCH["python-cinderclient"]=${CINDERCLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-cinderclient"]=${CINDERCLIENT_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# os-brick client for local volume attachement
|
||||
GITREPO["python-brick-cinderclient-ext"]=${BRICK_CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-brick-cinderclient-ext.git}
|
||||
GITBRANCH["python-brick-cinderclient-ext"]=${BRICK_CINDERCLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-brick-cinderclient-ext"]=${BRICK_CINDERCLIENT_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# python barbican client library
|
||||
GITREPO["python-barbicanclient"]=${BARBICANCLIENT_REPO:-${GIT_BASE}/openstack/python-barbicanclient.git}
|
||||
GITBRANCH["python-barbicanclient"]=${BARBICANCLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-barbicanclient"]=${BARBICANCLIENT_BRANCH:-$TARGET_BRANCH}
|
||||
GITDIR["python-barbicanclient"]=$DEST/python-barbicanclient
|
||||
|
||||
# python glance client library
|
||||
GITREPO["python-glanceclient"]=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git}
|
||||
GITBRANCH["python-glanceclient"]=${GLANCECLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-glanceclient"]=${GLANCECLIENT_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# ironic client
|
||||
GITREPO["python-ironicclient"]=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git}
|
||||
GITBRANCH["python-ironicclient"]=${IRONICCLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-ironicclient"]=${IRONICCLIENT_BRANCH:-$TARGET_BRANCH}
|
||||
# ironic plugin is out of tree, but nova uses it. set GITDIR here.
|
||||
GITDIR["python-ironicclient"]=$DEST/python-ironicclient
|
||||
|
||||
# the base authentication plugins that clients use to authenticate
|
||||
GITREPO["keystoneauth"]=${KEYSTONEAUTH_REPO:-${GIT_BASE}/openstack/keystoneauth.git}
|
||||
GITBRANCH["keystoneauth"]=${KEYSTONEAUTH_BRANCH:-master}
|
||||
GITBRANCH["keystoneauth"]=${KEYSTONEAUTH_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# python keystone client library to nova that horizon uses
|
||||
GITREPO["python-keystoneclient"]=${KEYSTONECLIENT_REPO:-${GIT_BASE}/openstack/python-keystoneclient.git}
|
||||
GITBRANCH["python-keystoneclient"]=${KEYSTONECLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-keystoneclient"]=${KEYSTONECLIENT_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# neutron client
|
||||
GITREPO["python-neutronclient"]=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git}
|
||||
GITBRANCH["python-neutronclient"]=${NEUTRONCLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-neutronclient"]=${NEUTRONCLIENT_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# python client library to nova that horizon (and others) use
|
||||
GITREPO["python-novaclient"]=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git}
|
||||
GITBRANCH["python-novaclient"]=${NOVACLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-novaclient"]=${NOVACLIENT_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# python swift client library
|
||||
GITREPO["python-swiftclient"]=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git}
|
||||
GITBRANCH["python-swiftclient"]=${SWIFTCLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-swiftclient"]=${SWIFTCLIENT_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# consolidated openstack python client
|
||||
GITREPO["python-openstackclient"]=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git}
|
||||
GITBRANCH["python-openstackclient"]=${OPENSTACKCLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-openstackclient"]=${OPENSTACKCLIENT_BRANCH:-$TARGET_BRANCH}
|
||||
# this doesn't exist in a lib file, so set it here
|
||||
GITDIR["python-openstackclient"]=$DEST/python-openstackclient
|
||||
|
||||
# placement-api CLI
|
||||
GITREPO["osc-placement"]=${OSC_PLACEMENT_REPO:-${GIT_BASE}/openstack/osc-placement.git}
|
||||
GITBRANCH["osc-placement"]=${OSC_PLACEMENT_BRANCH:-master}
|
||||
GITBRANCH["osc-placement"]=${OSC_PLACEMENT_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
|
||||
###################
|
||||
@@ -371,119 +389,119 @@ GITBRANCH["osc-placement"]=${OSC_PLACEMENT_BRANCH:-master}
|
||||
|
||||
# castellan key manager interface
|
||||
GITREPO["castellan"]=${CASTELLAN_REPO:-${GIT_BASE}/openstack/castellan.git}
|
||||
GITBRANCH["castellan"]=${CASTELLAN_BRANCH:-master}
|
||||
GITBRANCH["castellan"]=${CASTELLAN_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# cliff command line framework
|
||||
GITREPO["cliff"]=${CLIFF_REPO:-${GIT_BASE}/openstack/cliff.git}
|
||||
GITBRANCH["cliff"]=${CLIFF_BRANCH:-master}
|
||||
GITBRANCH["cliff"]=${CLIFF_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# async framework/helpers
|
||||
GITREPO["futurist"]=${FUTURIST_REPO:-${GIT_BASE}/openstack/futurist.git}
|
||||
GITBRANCH["futurist"]=${FUTURIST_BRANCH:-master}
|
||||
GITBRANCH["futurist"]=${FUTURIST_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# debtcollector deprecation framework/helpers
|
||||
GITREPO["debtcollector"]=${DEBTCOLLECTOR_REPO:-${GIT_BASE}/openstack/debtcollector.git}
|
||||
GITBRANCH["debtcollector"]=${DEBTCOLLECTOR_BRANCH:-master}
|
||||
GITBRANCH["debtcollector"]=${DEBTCOLLECTOR_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# helpful state machines
|
||||
GITREPO["automaton"]=${AUTOMATON_REPO:-${GIT_BASE}/openstack/automaton.git}
|
||||
GITBRANCH["automaton"]=${AUTOMATON_BRANCH:-master}
|
||||
GITBRANCH["automaton"]=${AUTOMATON_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.cache
|
||||
GITREPO["oslo.cache"]=${OSLOCACHE_REPO:-${GIT_BASE}/openstack/oslo.cache.git}
|
||||
GITBRANCH["oslo.cache"]=${OSLOCACHE_BRANCH:-master}
|
||||
GITBRANCH["oslo.cache"]=${OSLOCACHE_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.concurrency
|
||||
GITREPO["oslo.concurrency"]=${OSLOCON_REPO:-${GIT_BASE}/openstack/oslo.concurrency.git}
|
||||
GITBRANCH["oslo.concurrency"]=${OSLOCON_BRANCH:-master}
|
||||
GITBRANCH["oslo.concurrency"]=${OSLOCON_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.config
|
||||
GITREPO["oslo.config"]=${OSLOCFG_REPO:-${GIT_BASE}/openstack/oslo.config.git}
|
||||
GITBRANCH["oslo.config"]=${OSLOCFG_BRANCH:-master}
|
||||
GITBRANCH["oslo.config"]=${OSLOCFG_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.context
|
||||
GITREPO["oslo.context"]=${OSLOCTX_REPO:-${GIT_BASE}/openstack/oslo.context.git}
|
||||
GITBRANCH["oslo.context"]=${OSLOCTX_BRANCH:-master}
|
||||
GITBRANCH["oslo.context"]=${OSLOCTX_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.db
|
||||
GITREPO["oslo.db"]=${OSLODB_REPO:-${GIT_BASE}/openstack/oslo.db.git}
|
||||
GITBRANCH["oslo.db"]=${OSLODB_BRANCH:-master}
|
||||
GITBRANCH["oslo.db"]=${OSLODB_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.i18n
|
||||
GITREPO["oslo.i18n"]=${OSLOI18N_REPO:-${GIT_BASE}/openstack/oslo.i18n.git}
|
||||
GITBRANCH["oslo.i18n"]=${OSLOI18N_BRANCH:-master}
|
||||
GITBRANCH["oslo.i18n"]=${OSLOI18N_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.log
|
||||
GITREPO["oslo.log"]=${OSLOLOG_REPO:-${GIT_BASE}/openstack/oslo.log.git}
|
||||
GITBRANCH["oslo.log"]=${OSLOLOG_BRANCH:-master}
|
||||
GITBRANCH["oslo.log"]=${OSLOLOG_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.messaging
|
||||
GITREPO["oslo.messaging"]=${OSLOMSG_REPO:-${GIT_BASE}/openstack/oslo.messaging.git}
|
||||
GITBRANCH["oslo.messaging"]=${OSLOMSG_BRANCH:-master}
|
||||
GITBRANCH["oslo.messaging"]=${OSLOMSG_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.middleware
|
||||
GITREPO["oslo.middleware"]=${OSLOMID_REPO:-${GIT_BASE}/openstack/oslo.middleware.git}
|
||||
GITBRANCH["oslo.middleware"]=${OSLOMID_BRANCH:-master}
|
||||
GITBRANCH["oslo.middleware"]=${OSLOMID_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.policy
|
||||
GITREPO["oslo.policy"]=${OSLOPOLICY_REPO:-${GIT_BASE}/openstack/oslo.policy.git}
|
||||
GITBRANCH["oslo.policy"]=${OSLOPOLICY_BRANCH:-master}
|
||||
GITBRANCH["oslo.policy"]=${OSLOPOLICY_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.privsep
|
||||
GITREPO["oslo.privsep"]=${OSLOPRIVSEP_REPO:-${GIT_BASE}/openstack/oslo.privsep.git}
|
||||
GITBRANCH["oslo.privsep"]=${OSLOPRIVSEP_BRANCH:-master}
|
||||
GITBRANCH["oslo.privsep"]=${OSLOPRIVSEP_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.reports
|
||||
GITREPO["oslo.reports"]=${OSLOREPORTS_REPO:-${GIT_BASE}/openstack/oslo.reports.git}
|
||||
GITBRANCH["oslo.reports"]=${OSLOREPORTS_BRANCH:-master}
|
||||
GITBRANCH["oslo.reports"]=${OSLOREPORTS_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.rootwrap
|
||||
GITREPO["oslo.rootwrap"]=${OSLORWRAP_REPO:-${GIT_BASE}/openstack/oslo.rootwrap.git}
|
||||
GITBRANCH["oslo.rootwrap"]=${OSLORWRAP_BRANCH:-master}
|
||||
GITBRANCH["oslo.rootwrap"]=${OSLORWRAP_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.serialization
|
||||
GITREPO["oslo.serialization"]=${OSLOSERIALIZATION_REPO:-${GIT_BASE}/openstack/oslo.serialization.git}
|
||||
GITBRANCH["oslo.serialization"]=${OSLOSERIALIZATION_BRANCH:-master}
|
||||
GITBRANCH["oslo.serialization"]=${OSLOSERIALIZATION_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.service
|
||||
GITREPO["oslo.service"]=${OSLOSERVICE_REPO:-${GIT_BASE}/openstack/oslo.service.git}
|
||||
GITBRANCH["oslo.service"]=${OSLOSERVICE_BRANCH:-master}
|
||||
GITBRANCH["oslo.service"]=${OSLOSERVICE_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.utils
|
||||
GITREPO["oslo.utils"]=${OSLOUTILS_REPO:-${GIT_BASE}/openstack/oslo.utils.git}
|
||||
GITBRANCH["oslo.utils"]=${OSLOUTILS_BRANCH:-master}
|
||||
GITBRANCH["oslo.utils"]=${OSLOUTILS_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.versionedobjects
|
||||
GITREPO["oslo.versionedobjects"]=${OSLOVERSIONEDOBJECTS_REPO:-${GIT_BASE}/openstack/oslo.versionedobjects.git}
|
||||
GITBRANCH["oslo.versionedobjects"]=${OSLOVERSIONEDOBJECTS_BRANCH:-master}
|
||||
GITBRANCH["oslo.versionedobjects"]=${OSLOVERSIONEDOBJECTS_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# oslo.vmware
|
||||
GITREPO["oslo.vmware"]=${OSLOVMWARE_REPO:-${GIT_BASE}/openstack/oslo.vmware.git}
|
||||
GITBRANCH["oslo.vmware"]=${OSLOVMWARE_BRANCH:-master}
|
||||
GITBRANCH["oslo.vmware"]=${OSLOVMWARE_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# osprofiler
|
||||
GITREPO["osprofiler"]=${OSPROFILER_REPO:-${GIT_BASE}/openstack/osprofiler.git}
|
||||
GITBRANCH["osprofiler"]=${OSPROFILER_BRANCH:-master}
|
||||
GITBRANCH["osprofiler"]=${OSPROFILER_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# pycadf auditing library
|
||||
GITREPO["pycadf"]=${PYCADF_REPO:-${GIT_BASE}/openstack/pycadf.git}
|
||||
GITBRANCH["pycadf"]=${PYCADF_BRANCH:-master}
|
||||
GITBRANCH["pycadf"]=${PYCADF_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# stevedore plugin manager
|
||||
GITREPO["stevedore"]=${STEVEDORE_REPO:-${GIT_BASE}/openstack/stevedore.git}
|
||||
GITBRANCH["stevedore"]=${STEVEDORE_BRANCH:-master}
|
||||
GITBRANCH["stevedore"]=${STEVEDORE_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# taskflow plugin manager
|
||||
GITREPO["taskflow"]=${TASKFLOW_REPO:-${GIT_BASE}/openstack/taskflow.git}
|
||||
GITBRANCH["taskflow"]=${TASKFLOW_BRANCH:-master}
|
||||
GITBRANCH["taskflow"]=${TASKFLOW_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# tooz plugin manager
|
||||
GITREPO["tooz"]=${TOOZ_REPO:-${GIT_BASE}/openstack/tooz.git}
|
||||
GITBRANCH["tooz"]=${TOOZ_BRANCH:-master}
|
||||
GITBRANCH["tooz"]=${TOOZ_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# pbr drives the setuptools configs
|
||||
GITREPO["pbr"]=${PBR_REPO:-${GIT_BASE}/openstack-dev/pbr.git}
|
||||
GITBRANCH["pbr"]=${PBR_BRANCH:-master}
|
||||
GITBRANCH["pbr"]=${PBR_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
|
||||
##################
|
||||
@@ -494,65 +512,65 @@ GITBRANCH["pbr"]=${PBR_BRANCH:-master}
|
||||
|
||||
# cursive library
|
||||
GITREPO["cursive"]=${CURSIVE_REPO:-${GIT_BASE}/openstack/cursive.git}
|
||||
GITBRANCH["cursive"]=${CURSIVE_BRANCH:-master}
|
||||
GITBRANCH["cursive"]=${CURSIVE_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# glance store library
|
||||
GITREPO["glance_store"]=${GLANCE_STORE_REPO:-${GIT_BASE}/openstack/glance_store.git}
|
||||
GITBRANCH["glance_store"]=${GLANCE_STORE_BRANCH:-master}
|
||||
GITBRANCH["glance_store"]=${GLANCE_STORE_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# keystone middleware
|
||||
GITREPO["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_REPO:-${GIT_BASE}/openstack/keystonemiddleware.git}
|
||||
GITBRANCH["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_BRANCH:-master}
|
||||
GITBRANCH["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# s3 support for swift
|
||||
SWIFT3_REPO=${SWIFT3_REPO:-${GIT_BASE}/openstack/swift3.git}
|
||||
SWIFT3_BRANCH=${SWIFT3_BRANCH:-master}
|
||||
SWIFT3_BRANCH=${SWIFT3_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# ceilometer middleware
|
||||
GITREPO["ceilometermiddleware"]=${CEILOMETERMIDDLEWARE_REPO:-${GIT_BASE}/openstack/ceilometermiddleware.git}
|
||||
GITBRANCH["ceilometermiddleware"]=${CEILOMETERMIDDLEWARE_BRANCH:-master}
|
||||
GITBRANCH["ceilometermiddleware"]=${CEILOMETERMIDDLEWARE_BRANCH:-$TARGET_BRANCH}
|
||||
GITDIR["ceilometermiddleware"]=$DEST/ceilometermiddleware
|
||||
|
||||
# os-brick library to manage local volume attaches
|
||||
GITREPO["os-brick"]=${OS_BRICK_REPO:-${GIT_BASE}/openstack/os-brick.git}
|
||||
GITBRANCH["os-brick"]=${OS_BRICK_BRANCH:-master}
|
||||
GITBRANCH["os-brick"]=${OS_BRICK_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# os-client-config to manage clouds.yaml and friends
|
||||
GITREPO["os-client-config"]=${OS_CLIENT_CONFIG_REPO:-${GIT_BASE}/openstack/os-client-config.git}
|
||||
GITBRANCH["os-client-config"]=${OS_CLIENT_CONFIG_BRANCH:-master}
|
||||
GITBRANCH["os-client-config"]=${OS_CLIENT_CONFIG_BRANCH:-$TARGET_BRANCH}
|
||||
GITDIR["os-client-config"]=$DEST/os-client-config
|
||||
|
||||
# os-vif library to communicate between Neutron to Nova
|
||||
GITREPO["os-vif"]=${OS_VIF_REPO:-${GIT_BASE}/openstack/os-vif.git}
|
||||
GITBRANCH["os-vif"]=${OS_VIF_BRANCH:-master}
|
||||
GITBRANCH["os-vif"]=${OS_VIF_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# osc-lib OpenStackClient common lib
|
||||
GITREPO["osc-lib"]=${OSC_LIB_REPO:-${GIT_BASE}/openstack/osc-lib.git}
|
||||
GITBRANCH["osc-lib"]=${OSC_LIB_BRANCH:-master}
|
||||
GITBRANCH["osc-lib"]=${OSC_LIB_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# python-openstacksdk OpenStack Python SDK
|
||||
GITREPO["python-openstacksdk"]=${OPENSTACKSDK_REPO:-${GIT_BASE}/openstack/python-openstacksdk.git}
|
||||
GITBRANCH["python-openstacksdk"]=${OPENSTACKSDK_BRANCH:-master}
|
||||
GITBRANCH["python-openstacksdk"]=${OPENSTACKSDK_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# ironic common lib
|
||||
GITREPO["ironic-lib"]=${IRONIC_LIB_REPO:-${GIT_BASE}/openstack/ironic-lib.git}
|
||||
GITBRANCH["ironic-lib"]=${IRONIC_LIB_BRANCH:-master}
|
||||
GITBRANCH["ironic-lib"]=${IRONIC_LIB_BRANCH:-$TARGET_BRANCH}
|
||||
# this doesn't exist in a lib file, so set it here
|
||||
GITDIR["ironic-lib"]=$DEST/ironic-lib
|
||||
|
||||
# diskimage-builder tool
|
||||
GITREPO["diskimage-builder"]=${DIB_REPO:-${GIT_BASE}/openstack/diskimage-builder.git}
|
||||
GITBRANCH["diskimage-builder"]=${DIB_BRANCH:-master}
|
||||
GITBRANCH["diskimage-builder"]=${DIB_BRANCH:-$TARGET_BRANCH}
|
||||
GITDIR["diskimage-builder"]=$DEST/diskimage-builder
|
||||
|
||||
# neutron-lib library containing neutron stable non-REST interfaces
|
||||
GITREPO["neutron-lib"]=${NEUTRON_LIB_REPO:-${GIT_BASE}/openstack/neutron-lib.git}
|
||||
GITBRANCH["neutron-lib"]=${NEUTRON_LIB_BRANCH:-master}
|
||||
GITBRANCH["neutron-lib"]=${NEUTRON_LIB_BRANCH:-$TARGET_BRANCH}
|
||||
GITDIR["neutron-lib"]=$DEST/neutron-lib
|
||||
|
||||
# os-traits library for resource provider traits in the placement service
|
||||
GITREPO["os-traits"]=${OS_TRAITS_REPO:-${GIT_BASE}/openstack/os-traits.git}
|
||||
GITBRANCH["os-traits"]=${OS_TRAITS_BRANCH:-master}
|
||||
GITBRANCH["os-traits"]=${OS_TRAITS_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
##################
|
||||
#
|
||||
@@ -562,19 +580,19 @@ GITBRANCH["os-traits"]=${OS_TRAITS_BRANCH:-master}
|
||||
|
||||
# run-parts script required by os-refresh-config
|
||||
DIB_UTILS_REPO=${DIB_UTILS_REPO:-${GIT_BASE}/openstack/dib-utils.git}
|
||||
DIB_UTILS_BRANCH=${DIB_UTILS_BRANCH:-master}
|
||||
DIB_UTILS_BRANCH=${DIB_UTILS_BRANCH:-$BRANCHLESS_TARGET_BRANCH}
|
||||
|
||||
# os-apply-config configuration template tool
|
||||
OAC_REPO=${OAC_REPO:-${GIT_BASE}/openstack/os-apply-config.git}
|
||||
OAC_BRANCH=${OAC_BRANCH:-master}
|
||||
OAC_BRANCH=${OAC_BRANCH:-$TRAILING_TARGET_BRANCH}
|
||||
|
||||
# os-collect-config configuration agent
|
||||
OCC_REPO=${OCC_REPO:-${GIT_BASE}/openstack/os-collect-config.git}
|
||||
OCC_BRANCH=${OCC_BRANCH:-master}
|
||||
OCC_BRANCH=${OCC_BRANCH:-$TRAILING_TARGET_BRANCH}
|
||||
|
||||
# os-refresh-config configuration run-parts tool
|
||||
ORC_REPO=${ORC_REPO:-${GIT_BASE}/openstack/os-refresh-config.git}
|
||||
ORC_BRANCH=${ORC_BRANCH:-master}
|
||||
ORC_BRANCH=${ORC_BRANCH:-$TRAILING_TARGET_BRANCH}
|
||||
|
||||
|
||||
#################
|
||||
@@ -587,7 +605,7 @@ ORC_BRANCH=${ORC_BRANCH:-master}
|
||||
|
||||
# ironic python agent
|
||||
IRONIC_PYTHON_AGENT_REPO=${IRONIC_PYTHON_AGENT_REPO:-${GIT_BASE}/openstack/ironic-python-agent.git}
|
||||
IRONIC_PYTHON_AGENT_BRANCH=${IRONIC_PYTHON_AGENT_BRANCH:-master}
|
||||
IRONIC_PYTHON_AGENT_BRANCH=${IRONIC_PYTHON_AGENT_BRANCH:-$TARGET_BRANCH}
|
||||
|
||||
# a websockets/html5 or flash powered VNC console for vm instances
|
||||
NOVNC_REPO=${NOVNC_REPO:-https://github.com/novnc/noVNC.git}
|
||||
@@ -595,7 +613,7 @@ NOVNC_BRANCH=${NOVNC_BRANCH:-stable/v0.6}
|
||||
|
||||
# a websockets/html5 or flash powered SPICE console for vm instances
|
||||
SPICE_REPO=${SPICE_REPO:-http://anongit.freedesktop.org/git/spice/spice-html5.git}
|
||||
SPICE_BRANCH=${SPICE_BRANCH:-master}
|
||||
SPICE_BRANCH=${SPICE_BRANCH:-$BRANCHLESS_TARGET_BRANCH}
|
||||
|
||||
# Global flag used to configure Tempest and potentially other services if
|
||||
# volume multiattach is supported. In Queens, only the libvirt compute driver
|
||||
@@ -759,7 +777,12 @@ ETCD_NAME=etcd-$ETCD_VERSION-linux-$ETCD_ARCH
|
||||
ETCD_DOWNLOAD_FILE=$ETCD_NAME.tar.gz
|
||||
ETCD_DOWNLOAD_LOCATION=$ETCD_DOWNLOAD_URL/$ETCD_VERSION/$ETCD_DOWNLOAD_FILE
|
||||
# etcd is always required, so place it into list of pre-cached downloads
|
||||
EXTRA_CACHE_URLS+=",$ETCD_DOWNLOAD_LOCATION"
|
||||
if is_arch "x86_64"; then
|
||||
# NOTE(pabelanger): Only v3.2.x of ETCD has support for multiarch. This
|
||||
# means on stable branches our version is too old to try and cache and will
|
||||
# 404 DIBs for nodpeool.
|
||||
EXTRA_CACHE_URLS+=",$ETCD_DOWNLOAD_LOCATION"
|
||||
fi
|
||||
|
||||
# Detect duplicate values in IMAGE_URLS
|
||||
for image_url in ${IMAGE_URLS//,/ }; do
|
||||
@@ -801,17 +824,23 @@ fi
|
||||
# Service startup timeout
|
||||
SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60}
|
||||
|
||||
# Timeout for compute node registration in Nova
|
||||
NOVA_READY_TIMEOUT=${NOVA_READY_TIMEOUT:-$SERVICE_TIMEOUT}
|
||||
|
||||
# Service graceful shutdown timeout
|
||||
SERVICE_GRACEFUL_SHUTDOWN_TIMEOUT=${SERVICE_GRACEFUL_SHUTDOWN_TIMEOUT:-5}
|
||||
|
||||
# Service graceful shutdown timeout
|
||||
WORKER_TIMEOUT=${WORKER_TIMEOUT:-90}
|
||||
|
||||
# Support alternative yum -- in future Fedora 'dnf' will become the
|
||||
# only supported installer, but for now 'yum' and 'dnf' are both
|
||||
# available in parallel with compatible CLIs. Allow manual switching
|
||||
# till we get to the point we need to handle this automatically
|
||||
YUM=${YUM:-yum}
|
||||
# Choose DNF on RedHat/Fedora platforms with it, or otherwise default
|
||||
# to YUM. Can remove this when only dnf is supported (i.e. centos7
|
||||
# disappears)
|
||||
if [[ -e /usr/bin/dnf ]]; then
|
||||
YUM=${YUM:-dnf}
|
||||
else
|
||||
YUM=${YUM:-yum}
|
||||
fi
|
||||
|
||||
# Common Configuration
|
||||
# --------------------
|
||||
|
||||
@@ -272,7 +272,7 @@ function test_export_proxy_variables {
|
||||
|
||||
export_proxy_variables
|
||||
expected=$(echo -e "http_proxy=$http_proxy\nhttps_proxy=$https_proxy\nno_proxy=$no_proxy")
|
||||
results=$(env | egrep '(http(s)?|no)_proxy=')
|
||||
results=$(env | egrep '(http(s)?|no)_proxy=' | sort)
|
||||
if [[ $expected = $results ]]; then
|
||||
passed "OK: Proxy variables are exported when proxy variables are set"
|
||||
else
|
||||
|
||||
@@ -44,6 +44,9 @@ empty =
|
||||
multi = foo1
|
||||
multi = foo2
|
||||
|
||||
[key_with_spaces]
|
||||
rgw special key = something
|
||||
|
||||
# inidelete(a)
|
||||
[del_separate_options]
|
||||
a=b
|
||||
@@ -82,8 +85,9 @@ fi
|
||||
|
||||
# test iniget_sections
|
||||
VAL=$(iniget_sections "${TEST_INI}")
|
||||
assert_equal "$VAL" "default aaa bbb ccc ddd eee del_separate_options \
|
||||
del_same_option del_missing_option del_missing_option_multi del_no_options"
|
||||
assert_equal "$VAL" "default aaa bbb ccc ddd eee key_with_spaces \
|
||||
del_separate_options del_same_option del_missing_option \
|
||||
del_missing_option_multi del_no_options"
|
||||
|
||||
# Test with missing arguments
|
||||
BEFORE=$(cat ${TEST_INI})
|
||||
@@ -209,6 +213,20 @@ iniset $SUDO_ARG ${INI_TMP_ETC_DIR}/test.new.ini test foo bar
|
||||
VAL=$(iniget ${INI_TMP_ETC_DIR}/test.new.ini test foo)
|
||||
assert_equal "$VAL" "bar" "iniset created file"
|
||||
|
||||
# test creation of keys with spaces
|
||||
iniset ${SUDO_ARG} ${TEST_INI} key_with_spaces "rgw another key" somethingelse
|
||||
VAL=$(iniget ${TEST_INI} key_with_spaces "rgw another key")
|
||||
assert_equal "$VAL" "somethingelse" "iniset created a key with spaces"
|
||||
|
||||
# test update of keys with spaces
|
||||
iniset ${SUDO_ARG} ${TEST_INI} key_with_spaces "rgw special key" newvalue
|
||||
VAL=$(iniget ${TEST_INI} key_with_spaces "rgw special key")
|
||||
assert_equal "$VAL" "newvalue" "iniset updated a key with spaces"
|
||||
|
||||
inidelete ${SUDO_ARG} ${TEST_INI} key_with_spaces "rgw another key"
|
||||
VAL=$(iniget ${TEST_INI} key_with_spaces "rgw another key")
|
||||
assert_empty VAL "inidelete removed a key with spaces"
|
||||
|
||||
$SUDO rm -rf ${INI_TMP_DIR}
|
||||
|
||||
report_results
|
||||
|
||||
@@ -95,19 +95,7 @@ function test_libs_exist {
|
||||
echo "test_libs_exist PASSED"
|
||||
}
|
||||
|
||||
function test_branch_master {
|
||||
for lib in $ALL_LIBS; do
|
||||
if [[ ${GITBRANCH[$lib]} != "master" ]]; then
|
||||
echo "GITBRANCH for $lib not master (${GITBRANCH[$lib]})"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo "test_branch_master PASSED"
|
||||
}
|
||||
|
||||
set -o errexit
|
||||
|
||||
test_libs_exist
|
||||
test_branch_master
|
||||
test_all_libs_upto_date
|
||||
|
||||
+2
-2
@@ -15,10 +15,10 @@
|
||||
|
||||
echo "Ensuring we don't have crazy refs"
|
||||
|
||||
REFS=`grep BRANCH stackrc | grep -v -- '-master' | grep -v 'NOVNC_BRANCH'`
|
||||
REFS=`grep BRANCH stackrc | grep -v 'TARGET_BRANCH' | grep -v 'NOVNC_BRANCH' | grep -v 'EOL_TAG' | grep -v TEMPEST_BRANCH`
|
||||
rc=$?
|
||||
if [[ $rc -eq 0 ]]; then
|
||||
echo "Branch defaults must be master. Found:"
|
||||
echo "Branch defaults must be one of the *TARGET_BRANCH values. Found:"
|
||||
echo $REFS
|
||||
exit 1
|
||||
fi
|
||||
|
||||
Executable
+9
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
TOP=$(cd $(dirname "$0")/.. && pwd)
|
||||
|
||||
# Import common functions
|
||||
source $TOP/functions
|
||||
source $TOP/tests/unittest.sh
|
||||
|
||||
python ./roles/write-devstack-local-conf/library/test.py
|
||||
+1
-1
@@ -1 +1 @@
|
||||
pip!=8
|
||||
pip!=8,<10
|
||||
|
||||
+69
-45
@@ -45,27 +45,29 @@ fi
|
||||
# where Keystone will try and bind to the port and the port will already be
|
||||
# in use as an ephemeral port by another process. This places an explicit
|
||||
# exception into the Kernel for the Keystone AUTH ports.
|
||||
keystone_ports=${KEYSTONE_AUTH_PORT:-35357},${KEYSTONE_AUTH_PORT_INT:-35358}
|
||||
function fixup_keystone {
|
||||
keystone_ports=${KEYSTONE_AUTH_PORT:-35357},${KEYSTONE_AUTH_PORT_INT:-35358}
|
||||
|
||||
# Only do the reserved ports when available, on some system (like containers)
|
||||
# where it's not exposed we are almost pretty sure these ports would be
|
||||
# exclusive for our DevStack.
|
||||
if sysctl net.ipv4.ip_local_reserved_ports >/dev/null 2>&1; then
|
||||
# Get any currently reserved ports, strip off leading whitespace
|
||||
reserved_ports=$(sysctl net.ipv4.ip_local_reserved_ports | awk -F'=' '{print $2;}' | sed 's/^ //')
|
||||
# Only do the reserved ports when available, on some system (like containers)
|
||||
# where it's not exposed we are almost pretty sure these ports would be
|
||||
# exclusive for our DevStack.
|
||||
if sysctl net.ipv4.ip_local_reserved_ports >/dev/null 2>&1; then
|
||||
# Get any currently reserved ports, strip off leading whitespace
|
||||
reserved_ports=$(sysctl net.ipv4.ip_local_reserved_ports | awk -F'=' '{print $2;}' | sed 's/^ //')
|
||||
|
||||
if [[ -z "${reserved_ports}" ]]; then
|
||||
# If there are no currently reserved ports, reserve the keystone ports
|
||||
sudo sysctl -w net.ipv4.ip_local_reserved_ports=${keystone_ports}
|
||||
if [[ -z "${reserved_ports}" ]]; then
|
||||
# If there are no currently reserved ports, reserve the keystone ports
|
||||
sudo sysctl -w net.ipv4.ip_local_reserved_ports=${keystone_ports}
|
||||
else
|
||||
# If there are currently reserved ports, keep those and also reserve the
|
||||
# Keystone specific ports. Duplicate reservations are merged into a single
|
||||
# reservation (or range) automatically by the kernel.
|
||||
sudo sysctl -w net.ipv4.ip_local_reserved_ports=${keystone_ports},${reserved_ports}
|
||||
fi
|
||||
else
|
||||
# If there are currently reserved ports, keep those and also reserve the
|
||||
# Keystone specific ports. Duplicate reservations are merged into a single
|
||||
# reservation (or range) automatically by the kernel.
|
||||
sudo sysctl -w net.ipv4.ip_local_reserved_ports=${keystone_ports},${reserved_ports}
|
||||
echo_summary "WARNING: unable to reserve keystone ports"
|
||||
fi
|
||||
else
|
||||
echo_summary "WARNING: unable to reserve keystone ports"
|
||||
fi
|
||||
}
|
||||
|
||||
# Ubuntu Cloud Archive
|
||||
#---------------------
|
||||
@@ -79,8 +81,12 @@ fi
|
||||
# ENABLE_VOLUME_MULTIATTACH is True, we can't use the Pike UCA
|
||||
# because multiattach won't work with those package versions.
|
||||
# We can remove this check when the UCA has libvirt>=3.10.
|
||||
if [[ "${ENABLE_UBUNTU_CLOUD_ARCHIVE}" == "True" && "$DISTRO" = "xenial" && \
|
||||
"${ENABLE_VOLUME_MULTIATTACH}" == "False" ]]; then
|
||||
function fixup_uca {
|
||||
if [[ "${ENABLE_UBUNTU_CLOUD_ARCHIVE}" == "False" || "$DISTRO" != "xenial" || \
|
||||
"${ENABLE_VOLUME_MULTIATTACH}" == "True" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
# This pulls in apt-add-repository
|
||||
install_package "software-properties-common"
|
||||
# Use UCA for newer libvirt. Should give us libvirt 2.5.0.
|
||||
@@ -104,8 +110,7 @@ if [[ "${ENABLE_UBUNTU_CLOUD_ARCHIVE}" == "True" && "$DISTRO" = "xenial" && \
|
||||
# Force update our APT repos, since we added UCA above.
|
||||
REPOS_UPDATED=False
|
||||
apt_get_update
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
# Python Packages
|
||||
# ---------------
|
||||
@@ -120,27 +125,32 @@ function get_package_path {
|
||||
# Pre-install affected packages so we can fix the permissions
|
||||
# These can go away once we are confident that pip 1.4.1+ is available everywhere
|
||||
|
||||
# Fix prettytable 0.7.2 permissions
|
||||
# Don't specify --upgrade so we use the existing package if present
|
||||
pip_install 'prettytable>=0.7'
|
||||
PACKAGE_DIR=$(get_package_path prettytable)
|
||||
# Only fix version 0.7.2
|
||||
dir=$(echo $PACKAGE_DIR/prettytable-0.7.2*)
|
||||
if [[ -d $dir ]]; then
|
||||
sudo chmod +r $dir/*
|
||||
fi
|
||||
function fixup_python_packages {
|
||||
# Fix prettytable 0.7.2 permissions
|
||||
# Don't specify --upgrade so we use the existing package if present
|
||||
pip_install 'prettytable>=0.7'
|
||||
PACKAGE_DIR=$(get_package_path prettytable)
|
||||
# Only fix version 0.7.2
|
||||
dir=$(echo $PACKAGE_DIR/prettytable-0.7.2*)
|
||||
if [[ -d $dir ]]; then
|
||||
sudo chmod +r $dir/*
|
||||
fi
|
||||
|
||||
# Fix httplib2 0.8 permissions
|
||||
# Don't specify --upgrade so we use the existing package if present
|
||||
pip_install httplib2
|
||||
PACKAGE_DIR=$(get_package_path httplib2)
|
||||
# Only fix version 0.8
|
||||
dir=$(echo $PACKAGE_DIR-0.8*)
|
||||
if [[ -d $dir ]]; then
|
||||
sudo chmod +r $dir/*
|
||||
fi
|
||||
# Fix httplib2 0.8 permissions
|
||||
# Don't specify --upgrade so we use the existing package if present
|
||||
pip_install httplib2
|
||||
PACKAGE_DIR=$(get_package_path httplib2)
|
||||
# Only fix version 0.8
|
||||
dir=$(echo $PACKAGE_DIR-0.8*)
|
||||
if [[ -d $dir ]]; then
|
||||
sudo chmod +r $dir/*
|
||||
fi
|
||||
}
|
||||
|
||||
if is_fedora; then
|
||||
function fixup_fedora {
|
||||
if ! is_fedora; then
|
||||
return
|
||||
fi
|
||||
# Disable selinux to avoid configuring to allow Apache access
|
||||
# to Horizon files (LP#1175444)
|
||||
if selinuxenabled; then
|
||||
@@ -198,7 +208,7 @@ if is_fedora; then
|
||||
pip_install --upgrade --force-reinstall requests
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# The version of pip(1.5.4) supported by python-virtualenv(1.11.4) has
|
||||
# connection issues under proxy so re-install the latest version using
|
||||
@@ -222,7 +232,21 @@ fi
|
||||
# install.d/pip-and-virtualenv-source-install/04-install-pip
|
||||
# [2] https://bugzilla.redhat.com/show_bug.cgi?id=1477823
|
||||
|
||||
if [[ ! -f /etc/ci/mirror_info.sh ]]; then
|
||||
install_package python-virtualenv
|
||||
pip_install -U --force-reinstall virtualenv
|
||||
fi
|
||||
# TODO(jh): virtualenv 20.0.1 is breaking things in a yet unknown way.
|
||||
# Install previous virtualenv over what infra preinstalls as a hotfix.
|
||||
function fixup_virtualenv {
|
||||
if [[ ! -f /etc/ci/mirror_info.sh ]]; then
|
||||
install_package python-virtualenv
|
||||
pip_install -U --force-reinstall 'virtualenv<20'
|
||||
else
|
||||
pip_install -U --force-reinstall 'virtualenv<20'
|
||||
fi
|
||||
}
|
||||
|
||||
function fixup_all {
|
||||
fixup_keystone
|
||||
fixup_uca
|
||||
fixup_python_packages
|
||||
fixup_fedora
|
||||
fixup_virtualenv
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ printf "%-${name_col_len}s %s\n" "Plugin Name" "URL"
|
||||
title_underline ${name_col_len}
|
||||
|
||||
for plugin in ${sorted_plugins}; do
|
||||
giturl="git://git.openstack.org/openstack/${plugin}"
|
||||
giturl="https://git.openstack.org/openstack/${plugin}"
|
||||
gitlink="https://git.openstack.org/cgit/openstack/${plugin}"
|
||||
printf "%-${name_col_len}s %s\n" "${plugin}" "\`${giturl} <${gitlink}>\`__"
|
||||
done
|
||||
|
||||
+25
-14
@@ -37,8 +37,10 @@ FILES=$TOP_DIR/files
|
||||
# unreliable in CI situations.
|
||||
# [1] http://git.openstack.org/cgit/openstack-infra/project-config/tree/nodepool/elements/cache-devstack/source-repository-pip
|
||||
|
||||
PIP_GET_PIP_URL=${PIP_GET_PIP_URL:-"https://bootstrap.pypa.io/get-pip.py"}
|
||||
LOCAL_PIP="$FILES/$(basename $PIP_GET_PIP_URL)"
|
||||
PIP_GET_PIP_URL=${PIP_GET_PIP_URL:-"https://bootstrap.pypa.io/pip/3.5/get-pip.py"}
|
||||
PIP_GET_PIP_PY27_URL=${PIP_GET_PIP_PY27_URL:-"https://bootstrap.pypa.io/pip/2.7/get-pip.py"}
|
||||
LOCAL_PIP="$FILES/$(basename $PIP_GET_PIP_URL).old"
|
||||
LOCAL_PIP_PY27="${LOCAL_PIP}-py27"
|
||||
|
||||
GetDistro
|
||||
echo "Distro: $DISTRO"
|
||||
@@ -56,13 +58,17 @@ function get_versions {
|
||||
}
|
||||
|
||||
|
||||
function install_get_pip {
|
||||
function _install_get_pip {
|
||||
local interpreter=$1
|
||||
local pip_get_pip_url=$2
|
||||
local local_pip=$3
|
||||
|
||||
# If get-pip.py isn't python, delete it. This was probably an
|
||||
# outage on the server.
|
||||
if [[ -r $LOCAL_PIP ]]; then
|
||||
if ! head -1 $LOCAL_PIP | grep -q '#!/usr/bin/env python'; then
|
||||
echo "WARNING: Corrupt $LOCAL_PIP found removing"
|
||||
rm $LOCAL_PIP
|
||||
if [[ -r $local_pip ]]; then
|
||||
if ! head -1 $local_pip | grep -q '#!/usr/bin/env python'; then
|
||||
echo "WARNING: Corrupt $local_pip found removing"
|
||||
rm $local_pip
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -76,22 +82,27 @@ function install_get_pip {
|
||||
# Thus we use curl's "-z" feature to always check the modified
|
||||
# since and only download if a new version is out -- but only if
|
||||
# it seems we downloaded the file originally.
|
||||
if [[ ! -r $LOCAL_PIP || -r $LOCAL_PIP.downloaded ]]; then
|
||||
if [[ ! -r $local_pip || -r $local_pip.downloaded ]]; then
|
||||
# only test freshness if LOCAL_PIP is actually there,
|
||||
# otherwise we generate a scary warning.
|
||||
local timecond=""
|
||||
if [[ -r $LOCAL_PIP ]]; then
|
||||
timecond="-z $LOCAL_PIP"
|
||||
if [[ -r $local_pip ]]; then
|
||||
timecond="-z $local_pip"
|
||||
fi
|
||||
|
||||
curl -f --retry 6 --retry-delay 5 \
|
||||
$timecond -o $LOCAL_PIP $PIP_GET_PIP_URL || \
|
||||
$timecond -o $local_pip $pip_get_pip_url || \
|
||||
die $LINENO "Download of get-pip.py failed"
|
||||
touch $LOCAL_PIP.downloaded
|
||||
touch $local_pip.downloaded
|
||||
fi
|
||||
sudo -H -E python $LOCAL_PIP -c $TOOLS_DIR/cap-pip.txt
|
||||
sudo -H -E $interpreter $local_pip -c $TOOLS_DIR/cap-pip.txt
|
||||
}
|
||||
|
||||
|
||||
function install_get_pip {
|
||||
_install_get_pip python $PIP_GET_PIP_PY27_URL $LOCAL_PIP_PY27
|
||||
if python3_enabled; then
|
||||
sudo -H -E python${PYTHON3_VERSION} $LOCAL_PIP -c $TOOLS_DIR/cap-pip.txt
|
||||
_install_get_pip python${PYTHON3_VERSION} $PIP_GET_PIP_URL $LOCAL_PIP
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@@ -181,3 +181,9 @@ if is_service_enabled cinder && is_package_installed lvm2; then
|
||||
clean_lvm_volume_group $DEFAULT_VOLUME_GROUP_NAME || /bin/true
|
||||
clean_lvm_filter
|
||||
fi
|
||||
|
||||
|
||||
# Clean any safe.directory items we wrote into the global
|
||||
# gitconfig. We can identify the relevant ones by checking that they
|
||||
# point to somewhere in our $DEST directory.
|
||||
sudo sed -i "/directory=${DEST}/ d" /etc/gitconfig
|
||||
|
||||
Reference in New Issue
Block a user