Compare commits
107 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a0fab742f1 | |||
| e116f365f6 | |||
| bf1000397d | |||
| 36f2b98092 | |||
| 0b6d78247e | |||
| ff788ad9c7 | |||
| 167f132dd8 | |||
| 739745418e | |||
| e963dc2fd4 | |||
| 8e8a46f0a2 | |||
| 79b6124264 | |||
| e263e32bdb | |||
| fb95552b1a | |||
| c537b64aee | |||
| ced35a5ead | |||
| e8f8e3cdcf | |||
| 9c85d5c3d6 | |||
| 62a893e095 | |||
| c1d4f9de8b | |||
| 5a7fdf32de | |||
| 70bc4f40eb | |||
| 5a16a376a5 | |||
| 38edaa3ba6 | |||
| ab661a25f1 | |||
| a069e49602 | |||
| 1a99135f00 | |||
| 1b674f9a8c | |||
| 0b4351efdb | |||
| c2f6f5bf7a | |||
| 7ddec614b5 | |||
| 5a8409b743 | |||
| ad02686bec | |||
| bbd445934b | |||
| 08da17db0d | |||
| 525a5246cd | |||
| dc92190397 | |||
| 57bc6a5fc0 | |||
| e7ee9bffaf | |||
| 2b50e3b83f | |||
| 193c36bdd9 | |||
| 5d5fbcaed2 | |||
| 9e94807de1 | |||
| 56f5a5d6d9 | |||
| a434963d5c | |||
| beef8e1880 | |||
| 19337acada | |||
| ba9fc47876 | |||
| 87efaf3cc0 | |||
| 856abcc665 | |||
| 76c24fd1dc | |||
| 4379b273bd | |||
| 0e80624191 | |||
| 4a4a8c57d9 | |||
| 73d8487721 | |||
| 7a5b72bc5f | |||
| 94fc910bf5 | |||
| 9c49346b42 | |||
| 6616052bad | |||
| fdbe9132ad | |||
| 22b69fb3fa | |||
| 91d6d0f932 | |||
| 8da4061966 | |||
| ea3609968e | |||
| 13d7c81983 | |||
| 6f377c88f7 | |||
| f298d3f638 | |||
| 0c26bcb364 | |||
| 68251a66cd | |||
| 1ff70fd807 | |||
| 15574b4ea7 | |||
| ed7321a17d | |||
| f8a4f3a20f | |||
| b711396805 | |||
| 058700039b | |||
| b92e7b83e2 | |||
| e4cbc5baae | |||
| fe7034571b | |||
| 114a3f692a | |||
| 8c4492a848 | |||
| 2895563c82 | |||
| a3b62a26ae | |||
| 8565ea8578 | |||
| 68fbb912bd | |||
| 5d9239cf6f | |||
| 8367685752 | |||
| 9884f60ea4 | |||
| ebffaf67c3 | |||
| 7b08653535 | |||
| 4a85d5d6e0 | |||
| 458c60bb6e | |||
| e720c3c051 | |||
| a5c77a91b9 | |||
| 4358418d7d | |||
| b50217fa58 | |||
| 8ee2e34efb | |||
| cfe0077981 | |||
| 0ba247385c | |||
| 99c6a66507 | |||
| 5b6b04cdd3 | |||
| 1781c1ac88 | |||
| bd2f6a860f | |||
| e996ed2abc | |||
| 6d8b26b382 | |||
| c2bb1020ac | |||
| e9f92355eb | |||
| 2af41b3ca5 | |||
| 8bd5e127fb |
@@ -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/pike
|
||||
|
||||
+450
@@ -0,0 +1,450 @@
|
||||
- nodeset:
|
||||
name: openstack-single-node
|
||||
nodes:
|
||||
- name: controller
|
||||
label: ubuntu-xenial
|
||||
groups:
|
||||
- name: tempest
|
||||
nodes:
|
||||
- controller
|
||||
|
||||
- nodeset:
|
||||
name: openstack-two-node
|
||||
nodes:
|
||||
- name: controller
|
||||
label: ubuntu-xenial
|
||||
- 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-base
|
||||
parent: multinode
|
||||
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:
|
||||
- opendev.org/openstack/devstack
|
||||
roles:
|
||||
- zuul: opendev.org/openstack/devstack-gate
|
||||
- zuul: opendev.org/openstack/openstack-zuul-jobs
|
||||
vars:
|
||||
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
|
||||
NOVNC_FROM_PACKAGE: true
|
||||
ERROR_ON_CLONE: true
|
||||
# Gate jobs can't deal with nested virt. Disable it.
|
||||
LIBVIRT_TYPE: qemu
|
||||
# NOTE(dims): etcd 3.x is not available in debian/ubuntu
|
||||
# etc. As a stop gap measure, devstack uses wget to download
|
||||
# from the location below for all the CI jobs.
|
||||
ETCD_DOWNLOAD_URL: http://tarballs.openstack.org/etcd/
|
||||
devstack_services:
|
||||
# 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 }}/.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
|
||||
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
|
||||
irrelevant-files:
|
||||
# Documentation related
|
||||
- ^.*\.rst$
|
||||
- ^api-ref/.*$
|
||||
- ^doc/.*$
|
||||
- ^releasenotes/.*$
|
||||
# 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/requirements
|
||||
- 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
|
||||
nodeset: openstack-two-node
|
||||
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
|
||||
parent: devstack
|
||||
description: |
|
||||
Base job for devstack-based functional tests that use tox.
|
||||
|
||||
This job is not intended to be run directly. It's just here
|
||||
for organizational purposes for devstack-tox-functional and
|
||||
devstack-tox-functional-consumer.
|
||||
post-run: playbooks/tox/post.yaml
|
||||
vars:
|
||||
tox_envlist: functional
|
||||
tox_install_siblings: false
|
||||
|
||||
- job:
|
||||
name: devstack-tox-functional
|
||||
parent: devstack-tox-base
|
||||
description: |
|
||||
Base job for devstack-based functional tests that use tox.
|
||||
|
||||
Runs devstack, then runs the tox ``functional`` environment,
|
||||
then collects tox/testr build output like normal tox jobs.
|
||||
|
||||
Turns off tox sibling installation. Projects may be involved
|
||||
in the devstack deployment and so may be in the required-projects
|
||||
list, but may not want to test against master of the other
|
||||
projects in their tox env. Child jobs can set tox_install_siblings
|
||||
to True to re-enable sibling processing.
|
||||
run: playbooks/tox/run-both.yaml
|
||||
|
||||
- job:
|
||||
name: devstack-tox-functional-consumer
|
||||
parent: devstack
|
||||
description: |
|
||||
Base job for devstack-based functional tests for projects that
|
||||
consume the devstack cloud.
|
||||
|
||||
This base job should only be used by projects that are not involved
|
||||
in the devstack deployment step, but are instead projects that are using
|
||||
devstack to get a cloud against which they can test things.
|
||||
|
||||
Runs devstack in pre-run, then runs the tox ``functional`` environment,
|
||||
then collects tox/testr build output like normal tox jobs.
|
||||
|
||||
Turns off tox sibling installation. Projects may be involved
|
||||
in the devstack deployment and so may be in the required-projects
|
||||
list, but may not want to test against master of the other
|
||||
projects in their tox env. Child jobs can set tox_install_siblings
|
||||
to True to re-enable sibling processing.
|
||||
pre-run:
|
||||
- playbooks/devstack.yaml
|
||||
- playbooks/tox/pre.yaml
|
||||
run: playbooks/tox/run.yaml
|
||||
|
||||
- job:
|
||||
name: devstack-tox-base
|
||||
parent: devstack
|
||||
description: |
|
||||
Base job for devstack-based functional tests that use tox.
|
||||
|
||||
This job is not intended to be run directly. It's just here
|
||||
for organizational purposes for devstack-tox-functional and
|
||||
devstack-tox-functional-consumer.
|
||||
post-run: playbooks/tox/post.yaml
|
||||
vars:
|
||||
tox_envlist: functional
|
||||
tox_install_siblings: false
|
||||
|
||||
- job:
|
||||
name: devstack-tox-functional
|
||||
parent: devstack-tox-base
|
||||
description: |
|
||||
Base job for devstack-based functional tests that use tox.
|
||||
|
||||
Runs devstack, then runs the tox ``functional`` environment,
|
||||
then collects tox/testr build output like normal tox jobs.
|
||||
|
||||
Turns off tox sibling installation. Projects may be involved
|
||||
in the devstack deployment and so may be in the required-projects
|
||||
list, but may not want to test against master of the other
|
||||
projects in their tox env. Child jobs can set tox_install_siblings
|
||||
to True to re-enable sibling processing.
|
||||
run: playbooks/tox/run-both.yaml
|
||||
|
||||
- job:
|
||||
name: devstack-tox-functional-consumer
|
||||
parent: devstack
|
||||
description: |
|
||||
Base job for devstack-based functional tests for projects that
|
||||
consume the devstack cloud.
|
||||
|
||||
This base job should only be used by projects that are not involved
|
||||
in the devstack deployment step, but are instead projects that are using
|
||||
devstack to get a cloud against which they can test things.
|
||||
|
||||
Runs devstack in pre-run, then runs the tox ``functional`` environment,
|
||||
then collects tox/testr build output like normal tox jobs.
|
||||
|
||||
Turns off tox sibling installation. Projects may be involved
|
||||
in the devstack deployment and so may be in the required-projects
|
||||
list, but may not want to test against master of the other
|
||||
projects in their tox env. Child jobs can set tox_install_siblings
|
||||
to True to re-enable sibling processing.
|
||||
pre-run:
|
||||
- playbooks/devstack.yaml
|
||||
- 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-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-tempest-linuxbridge:
|
||||
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
@@ -37,7 +37,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
|
||||
|
||||
@@ -88,6 +88,7 @@ cleanup_cinder || /bin/true
|
||||
cleanup_glance
|
||||
cleanup_keystone
|
||||
cleanup_nova
|
||||
cleanup_placement
|
||||
cleanup_neutron
|
||||
cleanup_swift
|
||||
cleanup_horizon
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
pbr>=2.0.0,!=2.1.0
|
||||
|
||||
Pygments
|
||||
docutils
|
||||
sphinx>=1.6.2
|
||||
openstackdocstheme>=1.11.0
|
||||
nwdiag
|
||||
blockdiag
|
||||
sphinxcontrib-blockdiag
|
||||
sphinxcontrib-nwdiag
|
||||
@@ -667,7 +667,7 @@ with ``VOLUME_BACKING_FILE_SIZE``.
|
||||
|
||||
VOLUME_GROUP_NAME="stack-volumes"
|
||||
VOLUME_NAME_PREFIX="volume-"
|
||||
VOLUME_BACKING_FILE_SIZE=10250M
|
||||
VOLUME_BACKING_FILE_SIZE=24G
|
||||
|
||||
|
||||
Keystone
|
||||
|
||||
@@ -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
|
||||
|
||||
+146
-146
@@ -24,152 +24,152 @@ 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>`__
|
||||
app-catalog-ui `git://git.openstack.org/openstack/app-catalog-ui <https://git.openstack.org/cgit/openstack/app-catalog-ui>`__
|
||||
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>`__
|
||||
cerberus `git://git.openstack.org/openstack/cerberus <https://git.openstack.org/cgit/openstack/cerberus>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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-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-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-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-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-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-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-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-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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
app-catalog-ui `https://git.openstack.org/openstack/app-catalog-ui <https://git.openstack.org/cgit/openstack/app-catalog-ui>`__
|
||||
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>`__
|
||||
cerberus `https://git.openstack.org/openstack/cerberus <https://git.openstack.org/cgit/openstack/cerberus>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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-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-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-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-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-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-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-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-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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
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>`__
|
||||
====================================== ===
|
||||
|
||||
|
||||
|
||||
@@ -65,7 +65,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
|
||||
==================
|
||||
@@ -243,7 +243,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
|
||||
========
|
||||
|
||||
@@ -407,6 +407,26 @@ EOF
|
||||
return $rval
|
||||
}
|
||||
|
||||
function wait_for_compute {
|
||||
local timeout=$1
|
||||
local rval=0
|
||||
time_start "wait_for_service"
|
||||
timeout $timeout bash -x <<EOF || rval=$?
|
||||
ID=""
|
||||
while [[ "\$ID" == "" ]]; do
|
||||
sleep 1
|
||||
ID=\$(openstack --os-cloud devstack-admin --os-region "$REGION_NAME" compute service list --host `hostname` --service nova-compute -c ID -f value)
|
||||
done
|
||||
EOF
|
||||
time_stop "wait_for_service"
|
||||
# Figure out what's happening on platforms where this doesn't work
|
||||
if [[ "$rval" != 0 ]]; then
|
||||
echo "Didn't find service registered by hostname after $timeout seconds"
|
||||
openstack --os-cloud devstack-admin --os-region "$REGION_NAME" compute service list
|
||||
fi
|
||||
return $rval
|
||||
}
|
||||
|
||||
|
||||
# ping check
|
||||
# Uses globals ``ENABLED_SERVICES``, ``TOP_DIR``, ``MULTI_HOST``, ``PRIVATE_NETWORK``
|
||||
|
||||
@@ -561,6 +561,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
|
||||
}
|
||||
|
||||
+47
-28
@@ -219,7 +219,8 @@ function disable_python3_package {
|
||||
# Wrapper for ``pip install`` to set cache and proxy environment variables
|
||||
# Uses globals ``OFFLINE``, ``PIP_VIRTUAL_ENV``,
|
||||
# ``PIP_UPGRADE``, ``TRACK_DEPENDS``, ``*_proxy``,
|
||||
# pip_install package [package ...]
|
||||
# Usage:
|
||||
# pip_install pip_arguments
|
||||
function pip_install {
|
||||
local xtrace result
|
||||
xtrace=$(set +o | grep xtrace)
|
||||
@@ -241,6 +242,26 @@ function pip_install {
|
||||
if [[ -z "$os_PACKAGE" ]]; then
|
||||
GetOSVersion
|
||||
fi
|
||||
|
||||
# Try to extract the path of the package we are installing into
|
||||
# package_dir. We need this to check for test-requirements.txt,
|
||||
# at least.
|
||||
#
|
||||
# ${!#} expands to the last positional argument to this function.
|
||||
# With "extras" syntax included, our arguments might be something
|
||||
# like:
|
||||
# -e /path/to/fooproject[extra]
|
||||
# Thus this magic line grabs just the path without extras
|
||||
#
|
||||
# Note that this makes no sense if this is a pypi (rather than
|
||||
# local path) install; ergo you must check this path exists before
|
||||
# use. Also, if we had multiple or mixed installs, we would also
|
||||
# likely break. But for historical reasons, it's basically only
|
||||
# the other wrapper functions in here calling this to install
|
||||
# local packages, and they do so with single call per install. So
|
||||
# this works (for now...)
|
||||
local package_dir=${!#%\[*\]}
|
||||
|
||||
if [[ $TRACK_DEPENDS = True && ! "$@" =~ virtualenv ]]; then
|
||||
# TRACK_DEPENDS=True installation creates a circular dependency when
|
||||
# we attempt to install virtualenv into a virtualenv, so we must global
|
||||
@@ -261,7 +282,6 @@ function pip_install {
|
||||
# versions supported, and if we find the version of
|
||||
# python3 we've been told to use, use that instead of the
|
||||
# default pip
|
||||
local package_dir=${!#}
|
||||
local python_versions
|
||||
|
||||
# Special case some services that have experimental
|
||||
@@ -313,7 +333,7 @@ function pip_install {
|
||||
# packages like setuptools?
|
||||
local pip_version
|
||||
pip_version=$(python -c "import pip; \
|
||||
print(pip.__version__.strip('.')[0])")
|
||||
print(pip.__version__.split('.')[0])")
|
||||
if (( pip_version<6 )); then
|
||||
die $LINENO "Currently installed pip version ${pip_version} does not" \
|
||||
"meet minimum requirements (>=6)."
|
||||
@@ -321,13 +341,6 @@ function pip_install {
|
||||
|
||||
$xtrace
|
||||
|
||||
# Also install test requirements
|
||||
local install_test_reqs=""
|
||||
local test_req="${!#}/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
|
||||
@@ -337,7 +350,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=$?
|
||||
|
||||
@@ -383,23 +396,20 @@ function use_library_from_git {
|
||||
# determine if a package was installed from git
|
||||
function lib_installed_from_git {
|
||||
local name=$1
|
||||
pip freeze 2>/dev/null | grep -- "$name" | grep -q -- '-e git'
|
||||
}
|
||||
|
||||
# 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
|
||||
# Note "pip freeze" doesn't always work here, because it tries to
|
||||
# be smart about finding the remote of the git repo the package
|
||||
# was installed from. This doesn't work with zuul which clones
|
||||
# repos with no remote.
|
||||
#
|
||||
# The best option seems to be to use "pip list" which will tell
|
||||
# you the path an editable install was installed from; for example
|
||||
# in response to something like
|
||||
# pip install -e 'git+http://git.openstack.org/openstack-dev/bashate#egg=bashate'
|
||||
# pip list shows
|
||||
# bashate (0.5.2.dev19, /tmp/env/src/bashate)
|
||||
# Thus we look for "path after a comma" to indicate we were
|
||||
# installed from some local place
|
||||
pip list 2>/dev/null | grep -- "$name" | grep -q -- ', .*)$'
|
||||
}
|
||||
|
||||
# setup a library by name. If we are trying to use the library from
|
||||
@@ -512,6 +522,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
|
||||
@@ -570,6 +587,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}
|
||||
}
|
||||
|
||||
|
||||
+46
-20
@@ -82,26 +82,52 @@ function install_apache_uwsgi {
|
||||
apxs="apxs"
|
||||
fi
|
||||
|
||||
# Ubuntu xenial is back level on uwsgi so the proxy doesn't
|
||||
# actually work. Hence we have to build from source for now.
|
||||
# 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.
|
||||
#
|
||||
# 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.
|
||||
# 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
|
||||
|
||||
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
|
||||
# Centos actually has the module in epel, but there was a big
|
||||
# push to disable epel by default. As such, compile from source
|
||||
# there.
|
||||
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
|
||||
UWSGI_PYTHON_PLUGIN=python
|
||||
fi
|
||||
|
||||
if is_ubuntu || is_suse ; then
|
||||
# we've got to enable proxy and proxy_uwsgi for this to work
|
||||
@@ -261,7 +287,7 @@ function write_uwsgi_config {
|
||||
iniset "$file" uwsgi die-on-term true
|
||||
iniset "$file" uwsgi exit-on-reload true
|
||||
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
|
||||
# Override the default size for headers from the 4k default.
|
||||
@@ -313,7 +339,7 @@ function write_local_uwsgi_http_config {
|
||||
iniset "$file" uwsgi die-on-term true
|
||||
iniset "$file" uwsgi exit-on-reload true
|
||||
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
|
||||
# Override the default size for headers from the 4k default.
|
||||
|
||||
+1
-1
@@ -511,7 +511,7 @@ function start_cinder {
|
||||
start_tls_proxy cinder '*' $CINDER_SERVICE_PORT $CINDER_SERVICE_HOST $CINDER_SERVICE_POR_INT
|
||||
fi
|
||||
else
|
||||
run_process "c-api" "$CINDER_BIN_DIR/uwsgi --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
@@ -345,7 +345,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 --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
|
||||
|
||||
+13
-14
@@ -148,16 +148,18 @@ function is_keystone_enabled {
|
||||
# cleanup_keystone() - Remove residual data files, anything left over from previous
|
||||
# runs that a clean run would need to clean up
|
||||
function cleanup_keystone {
|
||||
# TODO: remove admin at pike-2
|
||||
# These files will be created if we are running WSGI_MODE="uwsgi"
|
||||
remove_uwsgi_config "$KEYSTONE_PUBLIC_UWSGI_CONF" "$KEYSTONE_PUBLIC_UWSGI"
|
||||
remove_uwsgi_config "$KEYSTONE_ADMIN_UWSGI_CONF" "$KEYSTONE_ADMIN_UWSGI"
|
||||
sudo rm -f $(apache_site_config_for keystone-wsgi-public)
|
||||
sudo rm -f $(apache_site_config_for keystone-wsgi-admin)
|
||||
|
||||
# These files will be created if we are running WSGI_MODE="mod_wsgi"
|
||||
disable_apache_site keystone
|
||||
sudo rm -f $(apache_site_config_for keystone)
|
||||
if [ "$KEYSTONE_DEPLOY" == "mod_wsgi" ]; then
|
||||
# These files will be created if we are running WSGI_MODE="mod_wsgi"
|
||||
disable_apache_site keystone
|
||||
sudo rm -f $(apache_site_config_for keystone)
|
||||
else
|
||||
stop_process "keystone"
|
||||
# TODO: remove admin at pike-2
|
||||
remove_uwsgi_config "$KEYSTONE_PUBLIC_UWSGI_CONF" "$KEYSTONE_PUBLIC_UWSGI"
|
||||
remove_uwsgi_config "$KEYSTONE_ADMIN_UWSGI_CONF" "$KEYSTONE_ADMIN_UWSGI"
|
||||
sudo rm -f $(apache_site_config_for keystone-wsgi-public)
|
||||
sudo rm -f $(apache_site_config_for keystone-wsgi-admin)
|
||||
fi
|
||||
}
|
||||
|
||||
# _config_keystone_apache_wsgi() - Set WSGI config files of Keystone
|
||||
@@ -550,7 +552,7 @@ function start_keystone {
|
||||
tail_log key /var/log/$APACHE_NAME/keystone.log
|
||||
tail_log key-access /var/log/$APACHE_NAME/keystone_access.log
|
||||
else # uwsgi
|
||||
run_process keystone "$KEYSTONE_BIN_DIR/uwsgi --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..."
|
||||
@@ -582,9 +584,6 @@ function stop_keystone {
|
||||
restart_apache_server
|
||||
else
|
||||
stop_process keystone
|
||||
remove_uwsgi_config "$KEYSTONE_PUBLIC_UWSGI_CONF" "$KEYSTONE_PUBLIC_UWSGI"
|
||||
# TODO(remove in at pike-2)
|
||||
remove_uwsgi_config "$KEYSTONE_ADMIN_UWSGI_CONF" "$KEYSTONE_ADMIN_UWSGI"
|
||||
fi
|
||||
# Kill the Keystone screen window
|
||||
stop_process key
|
||||
|
||||
+2
-1
@@ -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}
|
||||
@@ -425,7 +426,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
|
||||
|
||||
+1
-1
@@ -168,7 +168,7 @@ fi
|
||||
#
|
||||
Q_DVR_MODE=${Q_DVR_MODE:-legacy}
|
||||
if [[ "$Q_DVR_MODE" != "legacy" ]]; then
|
||||
Q_ML2_PLUGIN_MECHANISM_DRIVERS=openvswitch,linuxbridge,l2population
|
||||
Q_ML2_PLUGIN_MECHANISM_DRIVERS=openvswitch,l2population
|
||||
fi
|
||||
|
||||
# Provider Network Configurations
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -239,7 +243,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
|
||||
|
||||
@@ -799,7 +799,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 --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
|
||||
|
||||
@@ -903,7 +903,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 --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"
|
||||
@@ -944,6 +944,28 @@ function start_nova_conductor {
|
||||
done
|
||||
}
|
||||
|
||||
function is_nova_ready {
|
||||
# NOTE(sdague): with cells v2 all the compute services must be up
|
||||
# and checked into the database before discover_hosts is run. This
|
||||
# happens in all in one installs by accident, because > 30 seconds
|
||||
# happen between here and the script ending. However, in multinode
|
||||
# tests this can very often not be the case. So ensure that the
|
||||
# compute is up before we move on.
|
||||
if is_service_enabled n-cell; then
|
||||
# cells v1 can't complete the check below because it munges
|
||||
# hostnames with cell information (grumble grumble).
|
||||
return
|
||||
fi
|
||||
# TODO(sdague): honestly, this probably should be a plug point for
|
||||
# an external system.
|
||||
if [[ "$VIRT_DRIVER" == 'xenserver' ]]; then
|
||||
# xenserver encodes information in the hostname of the compute
|
||||
# because of the dom0/domU split. Just ignore for now.
|
||||
return
|
||||
fi
|
||||
wait_for_compute $NOVA_READY_TIMEOUT
|
||||
}
|
||||
|
||||
function start_nova {
|
||||
# this catches the cells v1 case early
|
||||
_set_singleconductor
|
||||
@@ -979,6 +1001,11 @@ function stop_nova_rest {
|
||||
}
|
||||
|
||||
function stop_nova_conductor {
|
||||
if [[ "${CELLSV2_SETUP}" == "singleconductor" ]]; then
|
||||
stop_process n-cond
|
||||
return
|
||||
fi
|
||||
|
||||
enable_nova_fleet
|
||||
for srv in n-super-cond $(seq -f n-cond-cell%0.f 1 $NOVA_NUM_CELLS); do
|
||||
if is_service_enabled $srv; then
|
||||
|
||||
@@ -41,12 +41,14 @@ function configure_nova_hypervisor {
|
||||
|
||||
iniset $NOVA_CONF DEFAULT compute_driver ironic.IronicDriver
|
||||
iniset $NOVA_CONF DEFAULT firewall_driver $LIBVIRT_FIREWALL_DRIVER
|
||||
iniset $NOVA_CONF DEFAULT scheduler_host_manager ironic_host_manager
|
||||
|
||||
if [[ "$IRONIC_USE_RESOURCE_CLASSES" == "False" ]]; then
|
||||
iniset $NOVA_CONF DEFAULT scheduler_host_manager ironic_host_manager
|
||||
iniset $NOVA_CONF filter_scheduler use_baremetal_filters True
|
||||
fi
|
||||
|
||||
iniset $NOVA_CONF filter_scheduler host_subset_size 999
|
||||
|
||||
iniset $NOVA_CONF DEFAULT ram_allocation_ratio 1.0
|
||||
iniset $NOVA_CONF DEFAULT reserved_host_memory_mb 0
|
||||
# ironic section
|
||||
@@ -57,6 +59,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
|
||||
|
||||
+2
-2
@@ -71,6 +71,7 @@ function is_placement_enabled {
|
||||
function cleanup_placement {
|
||||
sudo rm -f $(apache_site_config_for nova-placement-api)
|
||||
sudo rm -f $(apache_site_config_for placement-api)
|
||||
remove_uwsgi_config "$PLACEMENT_UWSGI_CONF" "$PLACEMENT_UWSGI"
|
||||
}
|
||||
|
||||
# _config_placement_apache_wsgi() - Set WSGI config files
|
||||
@@ -164,7 +165,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 --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
|
||||
@@ -185,7 +186,6 @@ function start_placement {
|
||||
function stop_placement {
|
||||
if [[ "$WSGI_MODE" == "uwsgi" ]]; then
|
||||
stop_process "placement-api"
|
||||
remove_uwsgi_config "$PLACEMENT_UWSGI_CONF" "$PLACEMENT_UWSGI"
|
||||
else
|
||||
disable_apache_site placement-api
|
||||
restart_apache_server
|
||||
|
||||
+47
-10
@@ -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
|
||||
|
||||
@@ -308,7 +308,6 @@ function configure_tempest {
|
||||
fi
|
||||
|
||||
# Image Features
|
||||
iniset $TEMPEST_CONFIG image-feature-enabled deactivate_image True
|
||||
if [ "$GLANCE_V1_ENABLED" != "True" ]; then
|
||||
iniset $TEMPEST_CONFIG image-feature-enabled api_v1 False
|
||||
fi
|
||||
@@ -338,7 +337,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.53"}
|
||||
# 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
|
||||
@@ -434,7 +433,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.43"}
|
||||
if [ "$tempest_volume_min_microversion" == "None" ]; then
|
||||
inicomment $TEMPEST_CONFIG volume min_microversion
|
||||
else
|
||||
@@ -543,6 +542,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:
|
||||
@@ -574,7 +575,16 @@ function configure_tempest {
|
||||
DISABLE_NETWORK_API_EXTENSIONS+=", metering"
|
||||
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,tag,tag-ext"
|
||||
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 " ")}
|
||||
@@ -583,7 +593,10 @@ function configure_tempest {
|
||||
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 " ")}
|
||||
@@ -592,7 +605,18 @@ 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 " ")}
|
||||
@@ -610,6 +634,17 @@ function install_tempest {
|
||||
git_clone $TEMPEST_REPO $TEMPEST_DIR $TEMPEST_BRANCH
|
||||
pip_install tox
|
||||
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
|
||||
@@ -623,7 +658,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
|
||||
|
||||
@@ -563,6 +563,20 @@ function follow_tls_proxy {
|
||||
# using tls configuration are down.
|
||||
function stop_tls_proxy {
|
||||
stop_apache_server
|
||||
|
||||
# NOTE(jh): Removing all tls-proxy configs is a bit of a hack, but
|
||||
# necessary so that we can restart after an unstack. A better
|
||||
# solution would be to ensure that each service calling
|
||||
# start_tls_proxy will call stop_tls_proxy with the same
|
||||
# parameters on shutdown so we can use the disable_apache_site
|
||||
# function and remove individual files there.
|
||||
if is_ubuntu; then
|
||||
sudo rm -f /etc/apache2/sites-enabled/*-tls-proxy.conf
|
||||
else
|
||||
for i in $APACHE_CONF_DIR/*-tls-proxy.conf; do
|
||||
sudo mv $i $i.disabled
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
# Clean up the CA files
|
||||
|
||||
@@ -29,6 +29,7 @@ source $RC_DIR/stackrc
|
||||
# Load the last env variables if available
|
||||
if [[ -r $RC_DIR/.stackenv ]]; then
|
||||
source $RC_DIR/.stackenv
|
||||
export OS_CACERT
|
||||
fi
|
||||
|
||||
# Get some necessary configuration
|
||||
|
||||
@@ -0,0 +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:
|
||||
- orchestrate-devstack
|
||||
@@ -0,0 +1,32 @@
|
||||
- hosts: all
|
||||
become: True
|
||||
vars:
|
||||
devstack_log_dir: "{{ devstack_base_dir|default('/opt/stack') }}/logs/"
|
||||
devstack_conf_dir: "{{ devstack_base_dir|default('/opt/stack') }}/devstack/"
|
||||
devstack_full_log: "{{ devstack_early_log|default('/opt/stack/logs/devstack-early.txt') }}"
|
||||
tasks:
|
||||
# NOTE(andreaf) If the tempest service is enabled, a tempest.log is
|
||||
# generated as part of lib/tempest, as a result of verify_tempest_config
|
||||
- name: Check if a tempest log exits
|
||||
stat:
|
||||
path: "{{ devstack_conf_dir }}/tempest.log"
|
||||
register: tempest_log
|
||||
- name: Link post-devstack tempest.log
|
||||
file:
|
||||
src: "{{ devstack_conf_dir }}/tempest.log"
|
||||
dest: "{{ stage_dir }}/verify_tempest_conf.log"
|
||||
state: hard
|
||||
when: tempest_log.stat.exists
|
||||
roles:
|
||||
- export-devstack-journal
|
||||
- apache-logs-conf
|
||||
- devstack-project-conf
|
||||
# capture-system-logs should be the last role before stage-output
|
||||
- capture-system-logs
|
||||
- role: stage-output
|
||||
# NOTE(andreaf) We need fetch-devstack-log-dir only as long as the base job
|
||||
# starts pulling logs for us from {{ ansible_user_dir }}/logs.
|
||||
# Meanwhile we already store things in ansible_user_dir and use
|
||||
# fetch-devstack-log-dir setting devstack_base_dir
|
||||
- role: fetch-devstack-log-dir
|
||||
devstack_base_dir: "{{ ansible_user_dir }}"
|
||||
@@ -0,0 +1,31 @@
|
||||
- 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
|
||||
- setup-devstack-source-dirs
|
||||
- setup-devstack-log-dir
|
||||
- setup-devstack-cache
|
||||
- start-fresh-logging
|
||||
- write-devstack-local-conf
|
||||
- ensure-pip
|
||||
@@ -0,0 +1,4 @@
|
||||
- hosts: all
|
||||
roles:
|
||||
- fetch-tox-output
|
||||
- fetch-subunit-output
|
||||
@@ -0,0 +1,8 @@
|
||||
- hosts: all
|
||||
roles:
|
||||
# Run bindep and test-setup after devstack so that they won't interfere
|
||||
- role: bindep
|
||||
bindep_profile: test
|
||||
bindep_dir: "{{ zuul_work_dir }}"
|
||||
- test-setup
|
||||
- ensure-tox
|
||||
@@ -0,0 +1,10 @@
|
||||
- hosts: all
|
||||
roles:
|
||||
- run-devstack
|
||||
# Run bindep and test-setup after devstack so that they won't interfere
|
||||
- role: bindep
|
||||
bindep_profile: test
|
||||
bindep_dir: "{{ zuul_work_dir }}"
|
||||
- test-setup
|
||||
- ensure-tox
|
||||
- tox
|
||||
@@ -0,0 +1,3 @@
|
||||
- hosts: all
|
||||
roles:
|
||||
- tox
|
||||
@@ -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
|
||||
@@ -0,0 +1,12 @@
|
||||
Prepare apache configs and logs for staging
|
||||
|
||||
Make sure apache config files and log files are available in a linux flavor
|
||||
independent location. Note that this relies on hard links, to the staging
|
||||
directory must be in the same partition where the logs and configs are.
|
||||
|
||||
**Role Variables**
|
||||
|
||||
.. zuul:rolevar:: stage_dir
|
||||
:default: {{ ansible_user_dir }}
|
||||
|
||||
The base stage directory.
|
||||
@@ -0,0 +1,2 @@
|
||||
devstack_base_dir: /opt/stack
|
||||
stage_dir: "{{ ansible_user_dir }}"
|
||||
@@ -0,0 +1,83 @@
|
||||
- name: Ensure {{ stage_dir }}/apache exists
|
||||
file:
|
||||
path: "{{ stage_dir }}/apache"
|
||||
state: directory
|
||||
|
||||
- name: Link apache logs on Debian/SuSE
|
||||
block:
|
||||
- name: Find logs
|
||||
find:
|
||||
path: "/var/log/apache2"
|
||||
file_type: any
|
||||
register: debian_suse_apache_logs
|
||||
- name: Dereference files
|
||||
stat:
|
||||
path: "{{ item.path }}"
|
||||
with_items: "{{ debian_suse_apache_logs.files }}"
|
||||
register: debian_suse_apache_deref_logs
|
||||
- name: Create hard links
|
||||
file:
|
||||
src: "{{ item.stat.lnk_source | default(item.stat.path) }}"
|
||||
dest: "{{ stage_dir }}/apache/{{ item.stat.path | basename }}"
|
||||
state: hard
|
||||
with_items: "{{ debian_suse_apache_deref_logs.results }}"
|
||||
when:
|
||||
- item.stat.isreg or item.stat.islnk
|
||||
when: ansible_os_family in ('Debian', 'Suse')
|
||||
|
||||
- name: Link apache logs on RedHat
|
||||
block:
|
||||
- name: Find logs
|
||||
find:
|
||||
path: "/var/log/httpd"
|
||||
file_type: any
|
||||
register: redhat_apache_logs
|
||||
- name: Dereference files
|
||||
stat:
|
||||
path: "{{ item.path }}"
|
||||
with_items: "{{ redhat_apache_logs.files }}"
|
||||
register: redhat_apache_deref_logs
|
||||
- name: Create hard links
|
||||
file:
|
||||
src: "{{ item.stat.lnk_source | default(item.stat.path) }}"
|
||||
dest: "{{ stage_dir }}/apache/{{ item.stat.path | basename }}"
|
||||
state: hard
|
||||
with_items: "{{ redhat_apache_deref_logs.results }}"
|
||||
when:
|
||||
- item.stat.isreg or item.stat.islnk
|
||||
when: ansible_os_family == 'Redhat'
|
||||
|
||||
- name: Ensure {{ stage_dir }}/apache_config apache_config exists
|
||||
file:
|
||||
path: "{{ stage_dir }}/apache_config"
|
||||
state: directory
|
||||
|
||||
- name: Define config paths
|
||||
set_fact:
|
||||
apache_config_paths:
|
||||
'Debian': '/etc/apache2/sites-enabled/'
|
||||
'Suse': '/etc/apache2/conf.d/'
|
||||
'Redhat': '/etc/httpd/conf.d/'
|
||||
|
||||
- name: Discover configurations
|
||||
find:
|
||||
path: "{{ apache_config_paths[ansible_os_family] }}"
|
||||
file_type: any
|
||||
register: apache_configs
|
||||
no_log: true
|
||||
|
||||
- name: Dereference configurations
|
||||
stat:
|
||||
path: "{{ item.path }}"
|
||||
with_items: "{{ apache_configs.files }}"
|
||||
register: apache_configs_deref
|
||||
no_log: true
|
||||
|
||||
- name: Link configurations
|
||||
file:
|
||||
src: "{{ item.stat.lnk_source | default(item.stat.path) }}"
|
||||
dest: "{{ stage_dir }}/apache_config/{{ item.stat.path | basename }}"
|
||||
state: hard
|
||||
with_items: "{{ apache_configs_deref.results }}"
|
||||
when: item.stat.isreg or item.stat.islnk
|
||||
no_log: true
|
||||
@@ -0,0 +1,20 @@
|
||||
Stage a number of system type logs
|
||||
|
||||
Stage a number of different logs / reports:
|
||||
- snapshot of iptables
|
||||
- disk space available
|
||||
- pip[2|3] freeze
|
||||
- installed packages (dpkg/rpm)
|
||||
- ceph, openswitch, gluster
|
||||
- coredumps
|
||||
- dns resolver
|
||||
- listen53
|
||||
- unbound.log
|
||||
- deprecation messages
|
||||
|
||||
**Role Variables**
|
||||
|
||||
.. zuul:rolevar:: stage_dir
|
||||
:default: {{ ansible_user_dir }}
|
||||
|
||||
The base stage directory.
|
||||
@@ -0,0 +1 @@
|
||||
devstack_base_dir: /opt/stack
|
||||
@@ -0,0 +1,38 @@
|
||||
# TODO(andreaf) Make this into proper Ansible
|
||||
- name: Stage various logs and reports
|
||||
shell:
|
||||
cmd: |
|
||||
sudo iptables-save > {{ stage_dir }}/iptables.txt
|
||||
df -h > {{ stage_dir }}/df.txt
|
||||
|
||||
for py_ver in 2 3; do
|
||||
if [[ `which python${py_ver}` ]]; then
|
||||
python${py_ver} -m pip freeze > {{ stage_dir }}/pip${py_ver}-freeze.txt
|
||||
fi
|
||||
done
|
||||
|
||||
if [ `command -v dpkg` ]; then
|
||||
dpkg -l> {{ stage_dir }}/dpkg-l.txt
|
||||
fi
|
||||
if [ `command -v rpm` ]; then
|
||||
rpm -qa | sort > {{ stage_dir }}/rpm-qa.txt
|
||||
fi
|
||||
|
||||
# gzip and save any coredumps in /var/core
|
||||
if [ -d /var/core ]; then
|
||||
sudo gzip -r /var/core
|
||||
sudo cp -r /var/core {{ stage_dir }}/
|
||||
fi
|
||||
|
||||
sudo ss -lntup | grep ':53' > {{ stage_dir }}/listen53.txt
|
||||
|
||||
# NOTE(andreaf) Service logs are already in logs/ thanks for the
|
||||
# export-devstack-journal log. Apache logs are under apache/ thans to the
|
||||
# apache-logs-conf role.
|
||||
grep -i deprecat {{ stage_dir }}/logs/*.txt {{ stage_dir }}/apache/*.log | \
|
||||
sed -r 's/[0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\.[0-9]{1,3}/ /g' | \
|
||||
sed -r 's/[0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}/ /g' | \
|
||||
sed -r 's/[0-9]{1,4}-[0-9]{1,2}-[0-9]{1,4}/ /g' |
|
||||
sed -r 's/\[.*\]/ /g' | \
|
||||
sed -r 's/\s[0-9]+\s/ /g' | \
|
||||
awk '{if ($0 in seen) {seen[$0]++} else {out[++n]=$0;seen[$0]=1}} END { for (i=1; i<=n; i++) print seen[out[i]]" :: " out[i] }' > {{ stage_dir }}/deprecations.log
|
||||
@@ -0,0 +1,11 @@
|
||||
Prepare OpenStack project configurations for staging
|
||||
|
||||
Prepare all relevant config files for staging.
|
||||
This is helpful to avoid staging the entire /etc.
|
||||
|
||||
**Role Variables**
|
||||
|
||||
.. zuul:rolevar:: stage_dir
|
||||
:default: {{ ansible_user_dir }}
|
||||
|
||||
The base stage directory.
|
||||
@@ -0,0 +1 @@
|
||||
stage_dir: "{{ ansible_user_dir }}"
|
||||
@@ -0,0 +1,24 @@
|
||||
- name: Ensure {{ stage_dir }}/etc exists
|
||||
file:
|
||||
path: "{{ stage_dir }}/etc"
|
||||
state: directory
|
||||
|
||||
- name: Check which projects have a config folder
|
||||
stat:
|
||||
path: "/etc/{{ item.value.short_name }}"
|
||||
with_dict: "{{ zuul.projects }}"
|
||||
register: project_configs
|
||||
|
||||
- name: Copy configuration files
|
||||
command: cp -pRL {{ item.stat.path }} {{ stage_dir }}/etc/{{ item.item.value.short_name }}
|
||||
when: item.stat.exists
|
||||
with_items: "{{ project_configs.results }}"
|
||||
|
||||
- name: Check if openstack has a config folder
|
||||
stat:
|
||||
path: "/etc/openstack"
|
||||
register: openstack_configs
|
||||
|
||||
- name: Copy configuration files
|
||||
command: cp -pRL /etc/openstack {{ stage_dir }}/etc/
|
||||
when: openstack_configs.stat.exists
|
||||
@@ -0,0 +1,21 @@
|
||||
Export journal files from devstack services
|
||||
|
||||
Export the systemd journal for every devstack service in native
|
||||
journal format as well as text. Also, export a syslog-style file with
|
||||
kernal and sudo messages.
|
||||
|
||||
Writes the output to the ``logs/`` subdirectory of
|
||||
``stage_dir``.
|
||||
|
||||
**Role Variables**
|
||||
|
||||
.. zuul:rolevar:: devstack_base_dir
|
||||
:default: /opt/stack
|
||||
|
||||
The devstack base directory. This is used to obtain the
|
||||
``log-start-timestamp.txt``, used to filter the systemd journal.
|
||||
|
||||
.. zuul:rolevar:: stage_dir
|
||||
:default: {{ ansible_user_dir }}
|
||||
|
||||
The base stage directory.
|
||||
@@ -0,0 +1,2 @@
|
||||
devstack_base_dir: /opt/stack
|
||||
stage_dir: "{{ ansible_user_dir }}"
|
||||
@@ -0,0 +1,37 @@
|
||||
# NOTE(andreaf) This bypasses the stage-output role
|
||||
- name: Ensure {{ stage_dir }}/logs exists
|
||||
become: true
|
||||
file:
|
||||
path: "{{ stage_dir }}/logs"
|
||||
state: directory
|
||||
owner: "{{ ansible_user }}"
|
||||
|
||||
# TODO: convert this to ansible
|
||||
- name: Export journal files
|
||||
become: true
|
||||
shell:
|
||||
cmd: |
|
||||
u=""
|
||||
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 > {{ stage_dir }}/logs/$name.txt
|
||||
done
|
||||
|
||||
# Export the journal in export format to make it downloadable
|
||||
# for later searching. It can then be rewritten to a journal native
|
||||
# format locally using systemd-journal-remote. This makes a class of
|
||||
# debugging much easier. We don't do the native conversion here as
|
||||
# some distros do not package that tooling.
|
||||
journalctl -u 'devstack@*' -o export | \
|
||||
xz --threads=0 - > {{ stage_dir }}/logs/devstack.journal.xz
|
||||
|
||||
# The journal contains everything running under systemd, we'll
|
||||
# build an old school version of the syslog with just the
|
||||
# kernel and sudo messages.
|
||||
journalctl \
|
||||
-t kernel \
|
||||
-t sudo \
|
||||
--no-pager \
|
||||
--since="$(cat {{ devstack_base_dir }}/log-start-timestamp.txt)" \
|
||||
> {{ stage_dir }}/logs/syslog.txt
|
||||
@@ -0,0 +1,10 @@
|
||||
Fetch content from the devstack log directory
|
||||
|
||||
Copy logs from every host back to the zuul executor.
|
||||
|
||||
**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,5 @@
|
||||
- name: Collect devstack logs
|
||||
synchronize:
|
||||
dest: "{{ zuul.executor.log_root }}/{{ inventory_hostname }}"
|
||||
mode: pull
|
||||
src: "{{ devstack_base_dir }}/logs"
|
||||
@@ -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
|
||||
@@ -0,0 +1,8 @@
|
||||
Run devstack
|
||||
|
||||
**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,6 @@
|
||||
- name: Run devstack
|
||||
shell: ./stack.sh 2>&1
|
||||
args:
|
||||
chdir: "{{devstack_base_dir}}/devstack"
|
||||
become: true
|
||||
become_user: stack
|
||||
@@ -0,0 +1,15 @@
|
||||
Set up the devstack cache directory
|
||||
|
||||
If the node has a cache of devstack image files, copy it into place.
|
||||
|
||||
**Role Variables**
|
||||
|
||||
.. zuul:rolevar:: devstack_base_dir
|
||||
:default: /opt/stack
|
||||
|
||||
The devstack base directory.
|
||||
|
||||
.. zuul:rolevar:: devstack_cache_dir
|
||||
:default: /opt/cache
|
||||
|
||||
The directory with the cached files.
|
||||
@@ -0,0 +1,2 @@
|
||||
devstack_base_dir: /opt/stack
|
||||
devstack_cache_dir: /opt/cache
|
||||
@@ -0,0 +1,14 @@
|
||||
- name: Copy cached devstack files
|
||||
# This uses hard links to avoid using extra space.
|
||||
command: "find {{ devstack_cache_dir }}/files -mindepth 1 -maxdepth 1 -exec cp -l {} {{ devstack_base_dir }}/devstack/files/ ;"
|
||||
become: true
|
||||
|
||||
- name: Set ownership of cached files
|
||||
file:
|
||||
path: '{{ devstack_base_dir }}/devstack/files'
|
||||
state: directory
|
||||
recurse: true
|
||||
owner: stack
|
||||
group: stack
|
||||
mode: a+r
|
||||
become: yes
|
||||
@@ -0,0 +1,11 @@
|
||||
Set up the devstack log directory
|
||||
|
||||
Create a log directory on the ephemeral disk partition to save space
|
||||
on the root device.
|
||||
|
||||
**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,5 @@
|
||||
- name: Create logs directory
|
||||
file:
|
||||
path: '{{ devstack_base_dir }}/logs'
|
||||
state: directory
|
||||
become: yes
|
||||
@@ -0,0 +1,11 @@
|
||||
Set up the devstack source directories
|
||||
|
||||
Ensure that the base directory exists, and then move the source repos
|
||||
into it.
|
||||
|
||||
**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,26 @@
|
||||
- name: Find all source repos used by this job
|
||||
find:
|
||||
paths:
|
||||
- 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
|
||||
|
||||
- name: Copy Zuul repos into devstack working directory
|
||||
command: rsync -a {{ item.path }} {{ devstack_base_dir }}
|
||||
with_items: '{{ found_repos.files }}'
|
||||
become: yes
|
||||
|
||||
- name: Set ownership of repos
|
||||
file:
|
||||
path: '{{ devstack_base_dir }}'
|
||||
state: directory
|
||||
recurse: true
|
||||
owner: stack
|
||||
group: stack
|
||||
become: yes
|
||||
@@ -0,0 +1,16 @@
|
||||
Set up the `stack` user
|
||||
|
||||
Create the stack user, set up its home directory, and allow it to
|
||||
sudo.
|
||||
|
||||
**Role Variables**
|
||||
|
||||
.. zuul:rolevar:: devstack_base_dir
|
||||
:default: /opt/stack
|
||||
|
||||
The devstack base directory.
|
||||
|
||||
.. zuul:rolevar:: devstack_stack_home_dir
|
||||
:default: {{ devstack_base_dir }}
|
||||
|
||||
The home directory for the stack user.
|
||||
@@ -0,0 +1,2 @@
|
||||
devstack_base_dir: /opt/stack
|
||||
devstack_stack_home_dir: '{{ devstack_base_dir }}'
|
||||
@@ -0,0 +1 @@
|
||||
stack ALL=(root) NOPASSWD:ALL
|
||||
@@ -0,0 +1,47 @@
|
||||
- name: Create stack group
|
||||
group:
|
||||
name: stack
|
||||
become: yes
|
||||
|
||||
# NOTE(andreaf) Create a user home_dir is not safe via
|
||||
# the user module since it will fail if the containing
|
||||
# folder does not exists. If the folder does exists and
|
||||
# it's empty, the skeleton is setup and ownership set.
|
||||
- name: Create the stack user home folder
|
||||
file:
|
||||
path: '{{ devstack_stack_home_dir }}'
|
||||
state: directory
|
||||
become: yes
|
||||
|
||||
- name: Create stack user
|
||||
user:
|
||||
name: stack
|
||||
shell: /bin/bash
|
||||
home: '{{ devstack_stack_home_dir }}'
|
||||
group: stack
|
||||
become: yes
|
||||
|
||||
- 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
|
||||
copy:
|
||||
src: 50_stack_sh
|
||||
dest: /etc/sudoers.d
|
||||
mode: 0440
|
||||
owner: root
|
||||
group: root
|
||||
become: yes
|
||||
|
||||
- name: Create .cache folder within BASE
|
||||
file:
|
||||
path: '{{ devstack_stack_home_dir }}/.cache'
|
||||
state: directory
|
||||
owner: stack
|
||||
group: stack
|
||||
become: yes
|
||||
@@ -0,0 +1,10 @@
|
||||
Set up the `tempest` user
|
||||
|
||||
Create the tempest user and allow it to sudo.
|
||||
|
||||
**Role Variables**
|
||||
|
||||
.. zuul:rolevar:: devstack_base_dir
|
||||
:default: /opt/stack
|
||||
|
||||
The devstack base directory.
|
||||
@@ -0,0 +1,3 @@
|
||||
tempest ALL=(root) NOPASSWD:/sbin/ip
|
||||
tempest ALL=(root) NOPASSWD:/sbin/iptables
|
||||
tempest ALL=(root) NOPASSWD:/usr/bin/ovsdb-client
|
||||
@@ -0,0 +1,20 @@
|
||||
- name: Create tempest group
|
||||
group:
|
||||
name: tempest
|
||||
become: yes
|
||||
|
||||
- name: Create tempest user
|
||||
user:
|
||||
name: tempest
|
||||
shell: /bin/bash
|
||||
group: tempest
|
||||
become: yes
|
||||
|
||||
- name: Copy 51_tempest_sh to /etc/sudoers.d
|
||||
copy:
|
||||
src: 51_tempest_sh
|
||||
dest: /etc/sudoers.d
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0440
|
||||
become: yes
|
||||
@@ -0,0 +1,11 @@
|
||||
Restart logging on all hosts
|
||||
|
||||
Restart syslog so that the system logs only include output from the
|
||||
job.
|
||||
|
||||
**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,56 @@
|
||||
- name: Check for /bin/journalctl file
|
||||
command: which journalctl
|
||||
changed_when: False
|
||||
failed_when: False
|
||||
register: which_out
|
||||
|
||||
- block:
|
||||
- name: Get current date
|
||||
command: date +"%Y-%m-%d %H:%M:%S"
|
||||
register: date_out
|
||||
|
||||
- name: Copy current date to log-start-timestamp.txt
|
||||
copy:
|
||||
dest: "{{ devstack_base_dir }}/log-start-timestamp.txt"
|
||||
content: "{{ date_out.stdout }}"
|
||||
when: which_out.rc == 0
|
||||
become: yes
|
||||
|
||||
- block:
|
||||
- name: Stop rsyslog
|
||||
service: name=rsyslog state=stopped
|
||||
|
||||
- name: Save syslog file prior to devstack run
|
||||
command: mv /var/log/syslog /var/log/syslog-pre-devstack
|
||||
|
||||
- name: Save kern.log file prior to devstack run
|
||||
command: mv /var/log/kern.log /var/log/kern_log-pre-devstack
|
||||
|
||||
- name: Recreate syslog file
|
||||
file: name=/var/log/syslog state=touch
|
||||
|
||||
- name: Recreate syslog file owner and group
|
||||
command: chown /var/log/syslog --ref /var/log/syslog-pre-devstack
|
||||
|
||||
- name: Recreate syslog file permissions
|
||||
command: chmod /var/log/syslog --ref /var/log/syslog-pre-devstack
|
||||
|
||||
- name: Add read permissions to all on syslog file
|
||||
file: name=/var/log/syslog mode=a+r
|
||||
|
||||
- name: Recreate kern.log file
|
||||
file: name=/var/log/kern.log state=touch
|
||||
|
||||
- name: Recreate kern.log file owner and group
|
||||
command: chown /var/log/kern.log --ref /var/log/kern_log-pre-devstack
|
||||
|
||||
- name: Recreate kern.log file permissions
|
||||
command: chmod /var/log/kern.log --ref /var/log/kern_log-pre-devstack
|
||||
|
||||
- name: Add read permissions to all on kern.log file
|
||||
file: name=/var/log/kern.log mode=a+r
|
||||
|
||||
- name: Start rsyslog
|
||||
service: name=rsyslog state=started
|
||||
when: which_out.rc == 1
|
||||
become: yes
|
||||
@@ -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([])'
|
||||
@@ -0,0 +1,99 @@
|
||||
Write the local.conf file for use by devstack
|
||||
|
||||
**Role Variables**
|
||||
|
||||
.. zuul:rolevar:: devstack_base_dir
|
||||
:default: /opt/stack
|
||||
|
||||
The devstack base directory.
|
||||
|
||||
.. zuul:rolevar:: devstack_local_conf_path
|
||||
:default: {{ devstack_base_dir }}/devstack/local.conf
|
||||
|
||||
The path of the local.conf file.
|
||||
|
||||
.. zuul:rolevar:: devstack_localrc
|
||||
:type: dict
|
||||
|
||||
A dictionary of variables that should be written to the localrc
|
||||
section of local.conf. The values (which are strings) may contain
|
||||
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
|
||||
|
||||
A complex argument consisting of nested dictionaries which combine
|
||||
to form the meta-sections of the local_conf file. The top level is
|
||||
a dictionary of phases, followed by dictionaries of filenames, then
|
||||
sections, which finally contain key-value pairs for the INI file
|
||||
entries in those sections.
|
||||
|
||||
The keys in this dictionary are the devstack phases.
|
||||
|
||||
.. zuul:rolevar:: [phase]
|
||||
:type: dict
|
||||
|
||||
The keys in this dictionary are the filenames for this phase.
|
||||
|
||||
.. zuul:rolevar:: [filename]
|
||||
:type: dict
|
||||
|
||||
The keys in this dictionary are the INI sections in this file.
|
||||
|
||||
.. zuul:rolevar:: [section]
|
||||
:type: dict
|
||||
|
||||
This is a dictionary of key-value pairs which comprise
|
||||
this section of the INI file.
|
||||
|
||||
.. zuul:rolevar:: devstack_base_services
|
||||
:type: list
|
||||
:default: {{ base_services | default(omit) }}
|
||||
|
||||
A list of base services which are enabled. Services can be added or removed
|
||||
from this list via the ``devstack_services`` variable. This is ignored if
|
||||
``base`` is set to ``False`` in ``devstack_services``.
|
||||
|
||||
.. zuul:rolevar:: devstack_services
|
||||
:type: dict
|
||||
|
||||
A dictionary mapping service names to boolean values. If the
|
||||
boolean value is ``false``, a ``disable_service`` line will be
|
||||
emitted for the service name. If it is ``true``, then
|
||||
``enable_service`` will be emitted. All other values are ignored.
|
||||
|
||||
The special key ``base`` can be used to enable or disable the base set of
|
||||
services enabled by default. If ``base`` is found, it will processed before
|
||||
all other keys. If its value is ``False`` a ``disable_all_services`` will be
|
||||
emitted; if its value is ``True`` services from ``devstack_base_services``
|
||||
will be emitted via ``ENABLED_SERVICES``.
|
||||
|
||||
.. zuul:rolevar:: devstack_plugins
|
||||
:type: dict
|
||||
|
||||
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.
|
||||
@@ -0,0 +1,3 @@
|
||||
devstack_base_dir: /opt/stack
|
||||
devstack_local_conf_path: "{{ devstack_base_dir }}/devstack/local.conf"
|
||||
devstack_base_services: "{{ enabled_services | default(omit) }}"
|
||||
@@ -0,0 +1,351 @@
|
||||
# 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 re
|
||||
|
||||
|
||||
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()
|
||||
for k, v in vars.items():
|
||||
self._varnames.add(k)
|
||||
for k, v in vars.items():
|
||||
self._addVar(k, str(v))
|
||||
|
||||
bash_var_re = re.compile(r'\$\{?(\w+)')
|
||||
def getDependencies(self, value):
|
||||
return self.bash_var_re.findall(value)
|
||||
|
||||
def _addVar(self, key, value):
|
||||
if key in self.vars:
|
||||
raise Exception("Variable {} already added".format(key))
|
||||
self.vars[key] = value
|
||||
# Append the dependency information
|
||||
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:
|
||||
self.add(key, dependencies)
|
||||
except Exception:
|
||||
del self.vars[key]
|
||||
raise
|
||||
|
||||
def getVars(self):
|
||||
ret = []
|
||||
keys = sorted(self.vars.keys())
|
||||
seen = set()
|
||||
for key in keys:
|
||||
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
|
||||
|
||||
|
||||
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)
|
||||
|
||||
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,
|
||||
base_dir, projects, project, tempest_plugins):
|
||||
self.localrc = []
|
||||
self.warnings = []
|
||||
self.meta_sections = {}
|
||||
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 {})
|
||||
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):
|
||||
pg = PluginGraph(self.base_dir, plugins)
|
||||
for k, v in pg.getPlugins():
|
||||
if v:
|
||||
self.localrc.append('enable_plugin {} {}'.format(k, v))
|
||||
|
||||
def handle_services(self, base_services, services):
|
||||
enable_base_services = services.pop('base', True)
|
||||
if enable_base_services and base_services:
|
||||
self.localrc.append('ENABLED_SERVICES={}'.format(
|
||||
",".join(base_services)))
|
||||
else:
|
||||
self.localrc.append('disable_all_services')
|
||||
for k, v in services.items():
|
||||
if v is False:
|
||||
self.localrc.append('disable_service {}'.format(k))
|
||||
elif v is True:
|
||||
self.localrc.append('enable_service {}'.format(k))
|
||||
|
||||
def handle_localrc(self, localrc):
|
||||
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():
|
||||
for fn, fn_data in phase_data.items():
|
||||
ms_name = '[[{}|{}]]'.format(phase, fn)
|
||||
ms_data = []
|
||||
for section, section_data in fn_data.items():
|
||||
ms_data.append('[{}]'.format(section))
|
||||
for k, v in section_data.items():
|
||||
ms_data.append('{} = {}'.format(k, v))
|
||||
ms_data.append('')
|
||||
self.meta_sections[ms_name] = ms_data
|
||||
|
||||
def write(self, path):
|
||||
with open(path, 'w') as f:
|
||||
f.write('[[local|localrc]]\n')
|
||||
f.write('\n'.join(self.localrc))
|
||||
f.write('\n\n')
|
||||
for section, lines in self.meta_sections.items():
|
||||
f.write('{}\n'.format(section))
|
||||
f.write('\n'.join(lines))
|
||||
|
||||
|
||||
def main():
|
||||
module = AnsibleModule(
|
||||
argument_spec=dict(
|
||||
plugins=dict(type='dict'),
|
||||
base_services=dict(type='list'),
|
||||
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'),
|
||||
)
|
||||
)
|
||||
|
||||
p = module.params
|
||||
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'))
|
||||
lc.write(p['path'])
|
||||
|
||||
module.exit_json(warnings=lc.warnings)
|
||||
|
||||
|
||||
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', 'git://git.openstack.org/openstack/bar-plugin'),
|
||||
('foo', 'git://git.openstack.org/openstack/foo-plugin'),
|
||||
('baz', 'git://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', 'git://git.openstack.org/openstack/bar-plugin'),
|
||||
('foo-plugin', 'git://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', 'git://git.openstack.org/openstack/bar-plugin'),
|
||||
('foo', 'git://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()
|
||||
@@ -0,0 +1,14 @@
|
||||
- name: Write a job-specific local_conf file
|
||||
become: true
|
||||
become_user: stack
|
||||
devstack_local_conf:
|
||||
path: "{{ devstack_local_conf_path }}"
|
||||
plugins: "{{ devstack_plugins|default(omit) }}"
|
||||
base_services: "{{ devstack_base_services|default(omit) }}"
|
||||
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) }}"
|
||||
@@ -537,14 +537,20 @@ function exit_trap {
|
||||
|
||||
if [[ $r -ne 0 ]]; then
|
||||
echo "Error on exit"
|
||||
generate-subunit $DEVSTACK_START_TIME $SECONDS 'fail' >> ${SUBUNIT_OUTPUT}
|
||||
# If we error before we've installed os-testr, this will fail.
|
||||
if type -p generate-subunit > /dev/null; then
|
||||
generate-subunit $DEVSTACK_START_TIME $SECONDS 'fail' >> ${SUBUNIT_OUTPUT}
|
||||
fi
|
||||
if [[ -z $LOGDIR ]]; then
|
||||
$TOP_DIR/tools/worlddump.py
|
||||
else
|
||||
$TOP_DIR/tools/worlddump.py -d $LOGDIR
|
||||
fi
|
||||
else
|
||||
generate-subunit $DEVSTACK_START_TIME $SECONDS >> ${SUBUNIT_OUTPUT}
|
||||
# If we error before we've installed os-testr, this will fail.
|
||||
if type -p generate-subunit > /dev/null; then
|
||||
generate-subunit $DEVSTACK_START_TIME $SECONDS >> ${SUBUNIT_OUTPUT}
|
||||
fi
|
||||
fi
|
||||
|
||||
exit $r
|
||||
@@ -896,14 +902,12 @@ fi
|
||||
if is_service_enabled nova; then
|
||||
# Compute service
|
||||
stack_install_service nova
|
||||
cleanup_nova
|
||||
configure_nova
|
||||
fi
|
||||
|
||||
if is_service_enabled placement; then
|
||||
# placement api
|
||||
stack_install_service placement
|
||||
cleanup_placement
|
||||
configure_placement
|
||||
fi
|
||||
|
||||
@@ -1433,14 +1437,16 @@ fi
|
||||
# Sanity checks
|
||||
# =============
|
||||
|
||||
# Check that computes are all ready
|
||||
#
|
||||
# TODO(sdague): there should be some generic phase here.
|
||||
if is_service_enabled n-cpu; then
|
||||
is_nova_ready
|
||||
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
|
||||
# ----------------------
|
||||
|
||||
|
||||
@@ -259,7 +259,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
|
||||
@@ -290,35 +290,35 @@ DEVSTACK_SERIES="pike"
|
||||
|
||||
# block storage service
|
||||
CINDER_REPO=${CINDER_REPO:-${GIT_BASE}/openstack/cinder.git}
|
||||
CINDER_BRANCH=${CINDER_BRANCH:-master}
|
||||
CINDER_BRANCH=${CINDER_BRANCH:-refs/tags/pike-eol}
|
||||
|
||||
# image catalog service
|
||||
GLANCE_REPO=${GLANCE_REPO:-${GIT_BASE}/openstack/glance.git}
|
||||
GLANCE_BRANCH=${GLANCE_BRANCH:-master}
|
||||
GLANCE_BRANCH=${GLANCE_BRANCH:-stable/pike}
|
||||
|
||||
# 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:-refs/tags/pike-eol}
|
||||
|
||||
# unified auth system (manages accounts/tokens)
|
||||
KEYSTONE_REPO=${KEYSTONE_REPO:-${GIT_BASE}/openstack/keystone.git}
|
||||
KEYSTONE_BRANCH=${KEYSTONE_BRANCH:-master}
|
||||
KEYSTONE_BRANCH=${KEYSTONE_BRANCH:-stable/pike}
|
||||
|
||||
# neutron service
|
||||
NEUTRON_REPO=${NEUTRON_REPO:-${GIT_BASE}/openstack/neutron.git}
|
||||
NEUTRON_BRANCH=${NEUTRON_BRANCH:-master}
|
||||
NEUTRON_BRANCH=${NEUTRON_BRANCH:-stable/pike}
|
||||
|
||||
# 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:-stable/pike}
|
||||
|
||||
# compute service
|
||||
NOVA_REPO=${NOVA_REPO:-${GIT_BASE}/openstack/nova.git}
|
||||
NOVA_BRANCH=${NOVA_BRANCH:-master}
|
||||
NOVA_BRANCH=${NOVA_BRANCH:-stable/pike}
|
||||
|
||||
# object storage service
|
||||
SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git}
|
||||
SWIFT_BRANCH=${SWIFT_BRANCH:-master}
|
||||
SWIFT_BRANCH=${SWIFT_BRANCH:-stable/pike}
|
||||
|
||||
##############
|
||||
#
|
||||
@@ -328,11 +328,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:-stable/pike}
|
||||
|
||||
# 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 Pike supported version.
|
||||
# https://docs.openstack.org/releasenotes/tempest/v21.0.0.html
|
||||
TEMPEST_BRANCH=${TEMPEST_BRANCH:-21.0.0}
|
||||
|
||||
|
||||
##############
|
||||
@@ -344,50 +346,50 @@ 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:-refs/tags/pike-eol}
|
||||
|
||||
# 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:-refs/tags/pike-eol}
|
||||
|
||||
# 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:-stable/pike}
|
||||
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:-stable/pike}
|
||||
|
||||
# ironic client
|
||||
GITREPO["python-ironicclient"]=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git}
|
||||
GITBRANCH["python-ironicclient"]=${IRONICCLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-ironicclient"]=${IRONICCLIENT_BRANCH:-stable/pike}
|
||||
# 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:-stable/pike}
|
||||
|
||||
# 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:-stable/pike}
|
||||
|
||||
# neutron client
|
||||
GITREPO["python-neutronclient"]=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git}
|
||||
GITBRANCH["python-neutronclient"]=${NEUTRONCLIENT_BRANCH:-master}
|
||||
GITBRANCH["python-neutronclient"]=${NEUTRONCLIENT_BRANCH:-stable/pike}
|
||||
|
||||
# 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:-stable/pike}
|
||||
|
||||
# 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:-stable/pike}
|
||||
|
||||
# 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:-stable/pike}
|
||||
# this doesn't exist in a lib file, so set it here
|
||||
GITDIR["python-openstackclient"]=$DEST/python-openstackclient
|
||||
|
||||
@@ -401,115 +403,115 @@ GITDIR["python-openstackclient"]=$DEST/python-openstackclient
|
||||
|
||||
# castellan key manager interface
|
||||
GITREPO["castellan"]=${CASTELLAN_REPO:-${GIT_BASE}/openstack/castellan.git}
|
||||
GITBRANCH["castellan"]=${CASTELLAN_BRANCH:-master}
|
||||
GITBRANCH["castellan"]=${CASTELLAN_BRANCH:-stable/pike}
|
||||
|
||||
# cliff command line framework
|
||||
GITREPO["cliff"]=${CLIFF_REPO:-${GIT_BASE}/openstack/cliff.git}
|
||||
GITBRANCH["cliff"]=${CLIFF_BRANCH:-master}
|
||||
GITBRANCH["cliff"]=${CLIFF_BRANCH:-stable/pike}
|
||||
|
||||
# async framework/helpers
|
||||
GITREPO["futurist"]=${FUTURIST_REPO:-${GIT_BASE}/openstack/futurist.git}
|
||||
GITBRANCH["futurist"]=${FUTURIST_BRANCH:-master}
|
||||
GITBRANCH["futurist"]=${FUTURIST_BRANCH:-stable/pike}
|
||||
|
||||
# debtcollector deprecation framework/helpers
|
||||
GITREPO["debtcollector"]=${DEBTCOLLECTOR_REPO:-${GIT_BASE}/openstack/debtcollector.git}
|
||||
GITBRANCH["debtcollector"]=${DEBTCOLLECTOR_BRANCH:-master}
|
||||
GITBRANCH["debtcollector"]=${DEBTCOLLECTOR_BRANCH:-stable/pike}
|
||||
|
||||
# helpful state machines
|
||||
GITREPO["automaton"]=${AUTOMATON_REPO:-${GIT_BASE}/openstack/automaton.git}
|
||||
GITBRANCH["automaton"]=${AUTOMATON_BRANCH:-master}
|
||||
GITBRANCH["automaton"]=${AUTOMATON_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.cache
|
||||
GITREPO["oslo.cache"]=${OSLOCACHE_REPO:-${GIT_BASE}/openstack/oslo.cache.git}
|
||||
GITBRANCH["oslo.cache"]=${OSLOCACHE_BRANCH:-master}
|
||||
GITBRANCH["oslo.cache"]=${OSLOCACHE_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.concurrency
|
||||
GITREPO["oslo.concurrency"]=${OSLOCON_REPO:-${GIT_BASE}/openstack/oslo.concurrency.git}
|
||||
GITBRANCH["oslo.concurrency"]=${OSLOCON_BRANCH:-master}
|
||||
GITBRANCH["oslo.concurrency"]=${OSLOCON_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.config
|
||||
GITREPO["oslo.config"]=${OSLOCFG_REPO:-${GIT_BASE}/openstack/oslo.config.git}
|
||||
GITBRANCH["oslo.config"]=${OSLOCFG_BRANCH:-master}
|
||||
GITBRANCH["oslo.config"]=${OSLOCFG_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.context
|
||||
GITREPO["oslo.context"]=${OSLOCTX_REPO:-${GIT_BASE}/openstack/oslo.context.git}
|
||||
GITBRANCH["oslo.context"]=${OSLOCTX_BRANCH:-master}
|
||||
GITBRANCH["oslo.context"]=${OSLOCTX_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.db
|
||||
GITREPO["oslo.db"]=${OSLODB_REPO:-${GIT_BASE}/openstack/oslo.db.git}
|
||||
GITBRANCH["oslo.db"]=${OSLODB_BRANCH:-master}
|
||||
GITBRANCH["oslo.db"]=${OSLODB_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.i18n
|
||||
GITREPO["oslo.i18n"]=${OSLOI18N_REPO:-${GIT_BASE}/openstack/oslo.i18n.git}
|
||||
GITBRANCH["oslo.i18n"]=${OSLOI18N_BRANCH:-master}
|
||||
GITBRANCH["oslo.i18n"]=${OSLOI18N_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.log
|
||||
GITREPO["oslo.log"]=${OSLOLOG_REPO:-${GIT_BASE}/openstack/oslo.log.git}
|
||||
GITBRANCH["oslo.log"]=${OSLOLOG_BRANCH:-master}
|
||||
GITBRANCH["oslo.log"]=${OSLOLOG_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.messaging
|
||||
GITREPO["oslo.messaging"]=${OSLOMSG_REPO:-${GIT_BASE}/openstack/oslo.messaging.git}
|
||||
GITBRANCH["oslo.messaging"]=${OSLOMSG_BRANCH:-master}
|
||||
GITBRANCH["oslo.messaging"]=${OSLOMSG_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.middleware
|
||||
GITREPO["oslo.middleware"]=${OSLOMID_REPO:-${GIT_BASE}/openstack/oslo.middleware.git}
|
||||
GITBRANCH["oslo.middleware"]=${OSLOMID_BRANCH:-master}
|
||||
GITBRANCH["oslo.middleware"]=${OSLOMID_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.policy
|
||||
GITREPO["oslo.policy"]=${OSLOPOLICY_REPO:-${GIT_BASE}/openstack/oslo.policy.git}
|
||||
GITBRANCH["oslo.policy"]=${OSLOPOLICY_BRANCH:-master}
|
||||
GITBRANCH["oslo.policy"]=${OSLOPOLICY_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.privsep
|
||||
GITREPO["oslo.privsep"]=${OSLOPRIVSEP_REPO:-${GIT_BASE}/openstack/oslo.privsep.git}
|
||||
GITBRANCH["oslo.privsep"]=${OSLOPRIVSEP_BRANCH:-master}
|
||||
GITBRANCH["oslo.privsep"]=${OSLOPRIVSEP_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.reports
|
||||
GITREPO["oslo.reports"]=${OSLOREPORTS_REPO:-${GIT_BASE}/openstack/oslo.reports.git}
|
||||
GITBRANCH["oslo.reports"]=${OSLOREPORTS_BRANCH:-master}
|
||||
GITBRANCH["oslo.reports"]=${OSLOREPORTS_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.rootwrap
|
||||
GITREPO["oslo.rootwrap"]=${OSLORWRAP_REPO:-${GIT_BASE}/openstack/oslo.rootwrap.git}
|
||||
GITBRANCH["oslo.rootwrap"]=${OSLORWRAP_BRANCH:-master}
|
||||
GITBRANCH["oslo.rootwrap"]=${OSLORWRAP_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.serialization
|
||||
GITREPO["oslo.serialization"]=${OSLOSERIALIZATION_REPO:-${GIT_BASE}/openstack/oslo.serialization.git}
|
||||
GITBRANCH["oslo.serialization"]=${OSLOSERIALIZATION_BRANCH:-master}
|
||||
GITBRANCH["oslo.serialization"]=${OSLOSERIALIZATION_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.service
|
||||
GITREPO["oslo.service"]=${OSLOSERVICE_REPO:-${GIT_BASE}/openstack/oslo.service.git}
|
||||
GITBRANCH["oslo.service"]=${OSLOSERVICE_BRANCH:-master}
|
||||
GITBRANCH["oslo.service"]=${OSLOSERVICE_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.utils
|
||||
GITREPO["oslo.utils"]=${OSLOUTILS_REPO:-${GIT_BASE}/openstack/oslo.utils.git}
|
||||
GITBRANCH["oslo.utils"]=${OSLOUTILS_BRANCH:-master}
|
||||
GITBRANCH["oslo.utils"]=${OSLOUTILS_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.versionedobjects
|
||||
GITREPO["oslo.versionedobjects"]=${OSLOVERSIONEDOBJECTS_REPO:-${GIT_BASE}/openstack/oslo.versionedobjects.git}
|
||||
GITBRANCH["oslo.versionedobjects"]=${OSLOVERSIONEDOBJECTS_BRANCH:-master}
|
||||
GITBRANCH["oslo.versionedobjects"]=${OSLOVERSIONEDOBJECTS_BRANCH:-stable/pike}
|
||||
|
||||
# oslo.vmware
|
||||
GITREPO["oslo.vmware"]=${OSLOVMWARE_REPO:-${GIT_BASE}/openstack/oslo.vmware.git}
|
||||
GITBRANCH["oslo.vmware"]=${OSLOVMWARE_BRANCH:-master}
|
||||
GITBRANCH["oslo.vmware"]=${OSLOVMWARE_BRANCH:-stable/pike}
|
||||
|
||||
# osprofiler
|
||||
GITREPO["osprofiler"]=${OSPROFILER_REPO:-${GIT_BASE}/openstack/osprofiler.git}
|
||||
GITBRANCH["osprofiler"]=${OSPROFILER_BRANCH:-master}
|
||||
GITBRANCH["osprofiler"]=${OSPROFILER_BRANCH:-stable/pike}
|
||||
|
||||
# pycadf auditing library
|
||||
GITREPO["pycadf"]=${PYCADF_REPO:-${GIT_BASE}/openstack/pycadf.git}
|
||||
GITBRANCH["pycadf"]=${PYCADF_BRANCH:-master}
|
||||
GITBRANCH["pycadf"]=${PYCADF_BRANCH:-stable/pike}
|
||||
|
||||
# stevedore plugin manager
|
||||
GITREPO["stevedore"]=${STEVEDORE_REPO:-${GIT_BASE}/openstack/stevedore.git}
|
||||
GITBRANCH["stevedore"]=${STEVEDORE_BRANCH:-master}
|
||||
GITBRANCH["stevedore"]=${STEVEDORE_BRANCH:-stable/pike}
|
||||
|
||||
# taskflow plugin manager
|
||||
GITREPO["taskflow"]=${TASKFLOW_REPO:-${GIT_BASE}/openstack/taskflow.git}
|
||||
GITBRANCH["taskflow"]=${TASKFLOW_BRANCH:-master}
|
||||
GITBRANCH["taskflow"]=${TASKFLOW_BRANCH:-stable/pike}
|
||||
|
||||
# tooz plugin manager
|
||||
GITREPO["tooz"]=${TOOZ_REPO:-${GIT_BASE}/openstack/tooz.git}
|
||||
GITBRANCH["tooz"]=${TOOZ_BRANCH:-master}
|
||||
GITBRANCH["tooz"]=${TOOZ_BRANCH:-stable/pike}
|
||||
|
||||
# pbr drives the setuptools configs
|
||||
GITREPO["pbr"]=${PBR_REPO:-${GIT_BASE}/openstack-dev/pbr.git}
|
||||
@@ -524,53 +526,53 @@ 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:-stable/pike}
|
||||
|
||||
# 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:-stable/pike}
|
||||
|
||||
# django openstack_auth library
|
||||
GITREPO["django_openstack_auth"]=${HORIZONAUTH_REPO:-${GIT_BASE}/openstack/django_openstack_auth.git}
|
||||
GITBRANCH["django_openstack_auth"]=${HORIZONAUTH_BRANCH:-master}
|
||||
GITBRANCH["django_openstack_auth"]=${HORIZONAUTH_BRANCH:-stable/pike}
|
||||
|
||||
# keystone middleware
|
||||
GITREPO["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_REPO:-${GIT_BASE}/openstack/keystonemiddleware.git}
|
||||
GITBRANCH["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_BRANCH:-master}
|
||||
GITBRANCH["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_BRANCH:-stable/pike}
|
||||
|
||||
# s3 support for swift
|
||||
SWIFT3_REPO=${SWIFT3_REPO:-${GIT_BASE}/openstack/swift3.git}
|
||||
SWIFT3_BRANCH=${SWIFT3_BRANCH:-master}
|
||||
SWIFT3_BRANCH=${SWIFT3_BRANCH:-stable/pike}
|
||||
|
||||
# ceilometer middleware
|
||||
GITREPO["ceilometermiddleware"]=${CEILOMETERMIDDLEWARE_REPO:-${GIT_BASE}/openstack/ceilometermiddleware.git}
|
||||
GITBRANCH["ceilometermiddleware"]=${CEILOMETERMIDDLEWARE_BRANCH:-master}
|
||||
GITBRANCH["ceilometermiddleware"]=${CEILOMETERMIDDLEWARE_BRANCH:-stable/pike}
|
||||
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:-refs/tags/pike-eol}
|
||||
|
||||
# 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:-stable/pike}
|
||||
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:-stable/pike}
|
||||
|
||||
# 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:-stable/pike}
|
||||
|
||||
# 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:-stable/pike}
|
||||
|
||||
# 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:-stable/pike}
|
||||
# this doesn't exist in a lib file, so set it here
|
||||
GITDIR["ironic-lib"]=$DEST/ironic-lib
|
||||
|
||||
@@ -581,12 +583,12 @@ 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:-stable/pike}
|
||||
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:-stable/pike}
|
||||
|
||||
##################
|
||||
#
|
||||
@@ -742,8 +744,8 @@ for image_url in ${IMAGE_URLS//,/ }; do
|
||||
fi
|
||||
done
|
||||
|
||||
# 10Gb default volume backing file size
|
||||
VOLUME_BACKING_FILE_SIZE=${VOLUME_BACKING_FILE_SIZE:-10250M}
|
||||
# 24Gb default volume backing file size
|
||||
VOLUME_BACKING_FILE_SIZE=${VOLUME_BACKING_FILE_SIZE:-24G}
|
||||
|
||||
# Prefixes for volume and instance names
|
||||
VOLUME_NAME_PREFIX=${VOLUME_NAME_PREFIX:-volume-}
|
||||
@@ -778,6 +780,11 @@ fi
|
||||
# Service startup timeout
|
||||
SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60}
|
||||
|
||||
# Timeout for compute node registration in Nova
|
||||
# NOTE(mnaser): This timeout is bumped to double SERVICE_TIMEOUT in Pike and
|
||||
# before because of slow libvirt 2.5.0 boot-up.
|
||||
NOVA_READY_TIMEOUT=${NOVA_READY_TIMEOUT:-120}
|
||||
|
||||
# Service graceful shutdown timeout
|
||||
SERVICE_GRACEFUL_SHUTDOWN_TIMEOUT=${SERVICE_GRACEFUL_SHUTDOWN_TIMEOUT:-5}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -94,19 +94,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
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
|
||||
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 -- '-master' | grep -v -- '-stable/pike' | grep -v -- '-refs/tags/pike-eol' | grep -v 'NOVNC_BRANCH' | grep -v TEMPEST_BRANCH`
|
||||
rc=$?
|
||||
if [[ $rc -eq 0 ]]; then
|
||||
echo "Branch defaults must be master. Found:"
|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
+23
-12
@@ -38,7 +38,9 @@ FILES=$TOP_DIR/files
|
||||
# [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"}
|
||||
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)"
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -88,15 +88,6 @@ else
|
||||
export PYTHON=$(which python 2>/dev/null)
|
||||
fi
|
||||
|
||||
if is_suse; then
|
||||
# now reinstall cryptography from source, in order to rebuilt it against the
|
||||
# system libssl rather than the bundled openSSL 1.1, which segfaults when combined
|
||||
# with a system provided openSSL 1.0
|
||||
# see https://github.com/pyca/cryptography/issues/3804 and followup issues
|
||||
sudo pip install cryptography --no-binary :all:
|
||||
fi
|
||||
|
||||
|
||||
# Mark end of run
|
||||
# ---------------
|
||||
|
||||
|
||||
@@ -34,16 +34,7 @@ commands = bash -c "find {toxinidir} \
|
||||
-print0 | xargs -0 bashate -v -iE006 -eE005,E042"
|
||||
|
||||
[testenv:docs]
|
||||
deps =
|
||||
Pygments
|
||||
docutils
|
||||
sphinx>=1.6.2
|
||||
pbr>=2.0.0,!=2.1.0
|
||||
openstackdocstheme>=1.11.0
|
||||
nwdiag
|
||||
blockdiag
|
||||
sphinxcontrib-blockdiag
|
||||
sphinxcontrib-nwdiag
|
||||
deps = -r{toxinidir}/doc/requirements.txt
|
||||
whitelist_externals = bash
|
||||
setenv =
|
||||
TOP_DIR={toxinidir}
|
||||
@@ -51,11 +42,5 @@ commands =
|
||||
python setup.py build_sphinx
|
||||
|
||||
[testenv:venv]
|
||||
deps =
|
||||
pbr>=2.0.0,!=2.1.0
|
||||
sphinx>=1.6.2
|
||||
openstackdocstheme>=1.11.0
|
||||
blockdiag
|
||||
sphinxcontrib-blockdiag
|
||||
sphinxcontrib-nwdiag
|
||||
deps = -r{toxinidir}/doc/requirements.txt
|
||||
commands = {posargs}
|
||||
|
||||
@@ -190,3 +190,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