Use the test-matrix role from devstack-gate to define a base set of
services to be enabled for the controller and compute nodes.
Extend the local conf module to handle the base set of services.
Since the test-matrix defines services for primary and subnode nodes, we
need a multinode job to test that this works. Add a new host group
called subnode that includes the non-controller hosts. Add a new job
that runs devstack on a two nodes environment.
Using service from the test matrix enables swift in the gate, so we need
to set SWIFT_HASH for devstack to work.
Depends-on: Ie36ba0cd7cfcd450b75000a76a64d856f2a83eba
Depends-on: Id9ad3be4be25e699f77d6b5a252f046ce8234f45
Change-Id: I379abf482c89122533324e64fefbff3d5a618a89
| ... | ... |
@@ -23,6 +23,9 @@ |
| 23 | 23 |
nodes: |
| 24 | 24 |
- controller |
| 25 | 25 |
- compute1 |
| 26 |
+ - name: subnode |
|
| 27 |
+ nodes: |
|
| 28 |
+ - compute1 |
|
| 26 | 29 |
|
| 27 | 30 |
- job: |
| 28 | 31 |
name: devstack |
| ... | ... |
@@ -39,9 +42,11 @@ |
| 39 | 39 |
- openstack/requirements |
| 40 | 40 |
- openstack/swift |
| 41 | 41 |
roles: |
| 42 |
+ - zuul: openstack-infra/devstack-gate |
|
| 42 | 43 |
- zuul: openstack-infra/openstack-zuul-jobs |
| 43 | 44 |
timeout: 7200 |
| 44 | 45 |
vars: |
| 46 |
+ test_matrix_configs: ['neutron', 'tlsproxy'] |
|
| 45 | 47 |
devstack_localrc: |
| 46 | 48 |
DATABASE_PASSWORD: secretdatabase |
| 47 | 49 |
RABBIT_PASSWORD: secretrabbit |
| ... | ... |
@@ -57,6 +62,7 @@ |
| 57 | 57 |
FLOATING_HOST_MASK: 23 |
| 58 | 58 |
SWIFT_REPLICAS: 1 |
| 59 | 59 |
SWIFT_START_ALL_SERVICES: false |
| 60 |
+ SWIFT_HASH: 1234123412341234 |
|
| 60 | 61 |
LOGFILE: /opt/stack/logs/devstacklog.txt |
| 61 | 62 |
LOG_COLOR: false |
| 62 | 63 |
VERBOSE: true |
| ... | ... |
@@ -75,9 +81,19 @@ |
| 75 | 75 |
run: playbooks/devstack.yaml |
| 76 | 76 |
post-run: playbooks/post.yaml |
| 77 | 77 |
|
| 78 |
+- job: |
|
| 79 |
+ name: devstack-multinode |
|
| 80 |
+ parent: devstack |
|
| 81 |
+ description: Base devstack multinode job |
|
| 82 |
+ nodeset: openstack-two-node |
|
| 83 |
+ # NOTE(andreaf) The multinode job is useful to see the setup of different |
|
| 84 |
+ # services on different nodes, however the subnode configuration is not |
|
| 85 |
+ # ready yet. Until then this job should stay non-voting. |
|
| 86 |
+ voting: false |
|
| 78 | 87 |
|
| 79 | 88 |
- project: |
| 80 | 89 |
name: openstack-dev/devstack |
| 81 | 90 |
check: |
| 82 | 91 |
jobs: |
| 83 | 92 |
- devstack |
| 93 |
+ - devstack-multinode |
| ... | ... |
@@ -1,3 +1,13 @@ |
| 1 |
+- hosts: controller |
|
| 2 |
+ roles: |
|
| 3 |
+ - role: test-matrix |
|
| 4 |
+ test_matrix_role: primary |
|
| 5 |
+ |
|
| 6 |
+- hosts: subnode |
|
| 7 |
+ roles: |
|
| 8 |
+ - role: test-matrix |
|
| 9 |
+ test_matrix_role: subnode |
|
| 10 |
+ |
|
| 1 | 11 |
- hosts: all |
| 2 | 12 |
roles: |
| 3 | 13 |
- configure-swap |
| ... | ... |
@@ -8,7 +18,7 @@ |
| 8 | 8 |
- setup-devstack-cache |
| 9 | 9 |
- start-fresh-logging |
| 10 | 10 |
- write-devstack-local-conf |
| 11 |
- # TODO(jeblair): remove when configure-mirrors is fixed |
|
| 11 |
+ # TODO(jeblair): remove when configure-mirrors is fixed |
|
| 12 | 12 |
tasks: |
| 13 | 13 |
- name: Hack mirror_info |
| 14 | 14 |
shell: |
| ... | ... |
@@ -47,6 +47,14 @@ Write the local.conf file for use by devstack |
| 47 | 47 |
This is a dictionary of key-value pairs which comprise |
| 48 | 48 |
this section of the INI file. |
| 49 | 49 |
|
| 50 |
+.. zuul:rolevar:: devstack_base_services |
|
| 51 |
+ :type: list |
|
| 52 |
+ :default: {{ base_services | default(omit) }}
|
|
| 53 |
+ |
|
| 54 |
+ A list of base services which are enabled. Services can be added or removed |
|
| 55 |
+ from this list via the ``devstack_services`` variable. This is ignored if |
|
| 56 |
+ ``base`` is set to ``False`` in ``devstack_services``. |
|
| 57 |
+ |
|
| 50 | 58 |
.. zuul:rolevar:: devstack_services |
| 51 | 59 |
:type: dict |
| 52 | 60 |
|
| ... | ... |
@@ -54,11 +62,12 @@ Write the local.conf file for use by devstack |
| 54 | 54 |
boolean value is ``false``, a ``disable_service`` line will be |
| 55 | 55 |
emitted for the service name. If it is ``true``, then |
| 56 | 56 |
``enable_service`` will be emitted. All other values are ignored. |
| 57 |
+ |
|
| 57 | 58 |
The special key ``base`` can be used to enable or disable the base set of |
| 58 | 59 |
services enabled by default. If ``base`` is found, it will processed before |
| 59 | 60 |
all other keys. If its value is ``False`` a ``disable_all_services`` will be |
| 60 |
- emitted; if its value is ``True`` nothing will be emitted since base |
|
| 61 |
- services are enabled by default. |
|
| 61 |
+ emitted; if its value is ``True`` services from ``devstack_base_services`` |
|
| 62 |
+ will be emitted via ``ENABLED_SERVICES``. |
|
| 62 | 63 |
|
| 63 | 64 |
.. zuul:rolevar:: devstack_plugins |
| 64 | 65 |
:type: dict |
| ... | ... |
@@ -106,13 +106,13 @@ class VarGraph(object): |
| 106 | 106 |
|
| 107 | 107 |
class LocalConf(object): |
| 108 | 108 |
|
| 109 |
- def __init__(self, localrc, localconf, services, plugins): |
|
| 109 |
+ def __init__(self, localrc, localconf, base_services, services, plugins): |
|
| 110 | 110 |
self.localrc = [] |
| 111 | 111 |
self.meta_sections = {}
|
| 112 | 112 |
if plugins: |
| 113 | 113 |
self.handle_plugins(plugins) |
| 114 |
- if services: |
|
| 115 |
- self.handle_services(services) |
|
| 114 |
+ if services or base_services: |
|
| 115 |
+ self.handle_services(base_services, services or {})
|
|
| 116 | 116 |
if localrc: |
| 117 | 117 |
self.handle_localrc(localrc) |
| 118 | 118 |
if localconf: |
| ... | ... |
@@ -123,9 +123,12 @@ class LocalConf(object): |
| 123 | 123 |
if v: |
| 124 | 124 |
self.localrc.append('enable_plugin {} {}'.format(k, v))
|
| 125 | 125 |
|
| 126 |
- def handle_services(self, services): |
|
| 127 |
- base_services = services.pop('base', True)
|
|
| 128 |
- if not base_services: |
|
| 126 |
+ def handle_services(self, base_services, services): |
|
| 127 |
+ enable_base_services = services.pop('base', True)
|
|
| 128 |
+ if enable_base_services and base_services: |
|
| 129 |
+ self.localrc.append('ENABLED_SERVICES={}'.format(
|
|
| 130 |
+ ",".join(base_services))) |
|
| 131 |
+ else: |
|
| 129 | 132 |
self.localrc.append('disable_all_services')
|
| 130 | 133 |
for k, v in services.items(): |
| 131 | 134 |
if v is False: |
| ... | ... |
@@ -164,6 +167,7 @@ def main(): |
| 164 | 164 |
module = AnsibleModule( |
| 165 | 165 |
argument_spec=dict( |
| 166 | 166 |
plugins=dict(type='dict'), |
| 167 |
+ base_services=dict(type='list'), |
|
| 167 | 168 |
services=dict(type='dict'), |
| 168 | 169 |
localrc=dict(type='dict'), |
| 169 | 170 |
local_conf=dict(type='dict'), |
| ... | ... |
@@ -174,6 +178,7 @@ def main(): |
| 174 | 174 |
p = module.params |
| 175 | 175 |
lc = LocalConf(p.get('localrc'),
|
| 176 | 176 |
p.get('local_conf'),
|
| 177 |
+ p.get('base_services'),
|
|
| 177 | 178 |
p.get('services'),
|
| 178 | 179 |
p.get('plugins'))
|
| 179 | 180 |
lc.write(p['path']) |
| ... | ... |
@@ -4,6 +4,7 @@ |
| 4 | 4 |
devstack_local_conf: |
| 5 | 5 |
path: "{{ devstack_local_conf_path }}"
|
| 6 | 6 |
plugins: "{{ devstack_plugins|default(omit) }}"
|
| 7 |
+ base_services: "{{ devstack_base_services|default(omit) }}"
|
|
| 7 | 8 |
services: "{{ devstack_services|default(omit) }}"
|
| 8 | 9 |
localrc: "{{ devstack_localrc|default(omit) }}"
|
| 9 | 10 |
local_conf: "{{ devstack_local_conf|default(omit) }}"
|