Add train template and train functional tests
A train template is added which pulls in sectional placement config from charm-layer-openstack. This requires adding identity-credentials as a required interface for train and above. This patch also updates the smoke test to run train. Closes-Bug: 1850691 Depends-On: https://review.opendev.org/#/c/692426/ Change-Id: Ib3937915c5195b5e031d5056959932849012fc23 Signed-off-by: Sahid Orentino Ferdjaoui <sahid.ferdjaoui@canonical.com>
This commit is contained in:
parent
b5eab37317
commit
1625884690
@ -4,6 +4,7 @@ includes:
|
||||
- interface:rabbitmq
|
||||
- interface:nova-compute
|
||||
- interface:nova-cell
|
||||
- interface:keystone-credentials
|
||||
options:
|
||||
basic:
|
||||
use_venv: True
|
||||
|
@ -64,6 +64,8 @@ class NovaCellControllerCharm(charms_openstack.charm.HAOpenStackCharm):
|
||||
('16', 'pike'),
|
||||
('17', 'queens'),
|
||||
('18', 'rocky'),
|
||||
('19', 'stein'),
|
||||
('20', 'train'),
|
||||
]),
|
||||
}
|
||||
|
||||
@ -108,3 +110,14 @@ class NovaCellControllerCharm(charms_openstack.charm.HAOpenStackCharm):
|
||||
required_relations = self.required_relations
|
||||
return super(NovaCellControllerCharm, self).states_to_check(
|
||||
required_relations=required_relations)
|
||||
|
||||
|
||||
class NovaCellControllerCharmTrain(NovaCellControllerCharm):
|
||||
"""From train onwards, identity-credentials is a required relation.
|
||||
As of train, the nova.conf template uses section-placement which
|
||||
renders config values from identity-credentials."""
|
||||
|
||||
# This charms support Train and onward
|
||||
release = 'train'
|
||||
|
||||
required_relations = ['shared-db', 'amqp', 'identity-credentials']
|
||||
|
@ -43,6 +43,8 @@ requires:
|
||||
interface: nova-compute
|
||||
nova-cell-compute:
|
||||
interface: nova-cell
|
||||
identity-credentials:
|
||||
interface: keystone-credentials
|
||||
peers:
|
||||
cluster:
|
||||
interface: nova-ha
|
||||
|
@ -17,6 +17,7 @@ from __future__ import absolute_import
|
||||
|
||||
import charms.reactive as reactive
|
||||
import charmhelpers.core.hookenv as hookenv
|
||||
import charmhelpers.contrib.openstack.utils as os_utils
|
||||
|
||||
import charms_openstack.charm as charm
|
||||
|
||||
@ -43,6 +44,15 @@ charm.use_defaults(
|
||||
'update-status')
|
||||
|
||||
|
||||
@reactive.when('identity-credentials.connected')
|
||||
def request_credentials():
|
||||
keystone_relation = endpoint_from_flag(
|
||||
'identity-credentials.connected')
|
||||
keystone_relation.request_credentials(
|
||||
'nova-cell-controller',
|
||||
project='services')
|
||||
|
||||
|
||||
# Note that because of the way reactive.when works, (which is to 'find' the
|
||||
# __code__ segment of the decorated function, it's very, very difficult to add
|
||||
# other kinds of decorators here. This rules out adding other things into the
|
||||
@ -56,9 +66,20 @@ def render_stuff(*args):
|
||||
"""
|
||||
hookenv.log("about to call the render_configs with {}".format(args))
|
||||
with charm.provide_charm_instance() as nova_cell_controller_charm:
|
||||
nova_cell_controller_charm.render_with_interfaces(args)
|
||||
nova_cell_controller_charm.assess_status()
|
||||
set_flag('config.rendered')
|
||||
source_config_key = nova_cell_controller_charm.source_config_key
|
||||
release = os_utils.get_os_codename_install_source(
|
||||
nova_cell_controller_charm.config[source_config_key])
|
||||
auth_endpoint = (
|
||||
endpoint_from_flag('identity-credentials.available.auth'))
|
||||
if ((os_utils.OPENSTACK_RELEASES.index(release) <
|
||||
os_utils.OPENSTACK_RELEASES.index('train')) or
|
||||
auth_endpoint):
|
||||
interfaces = args
|
||||
if auth_endpoint:
|
||||
interfaces = (*args, auth_endpoint)
|
||||
nova_cell_controller_charm.render_with_interfaces(interfaces)
|
||||
nova_cell_controller_charm.assess_status()
|
||||
set_flag('config.rendered')
|
||||
|
||||
|
||||
@reactive.when_not('shared-db.synced')
|
||||
|
22
src/templates/train/nova.conf
Normal file
22
src/templates/train/nova.conf
Normal file
@ -0,0 +1,22 @@
|
||||
# train
|
||||
###############################################################################
|
||||
# [ WARNING ]
|
||||
# Configuration file maintained by Juju. Local changes may be overwritten.
|
||||
###############################################################################
|
||||
[DEFAULT]
|
||||
verbose={{ options.verbose }}
|
||||
debug={{ options.debug }}
|
||||
logdir=/var/log/nova
|
||||
state_path=/var/lib/nova
|
||||
root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf
|
||||
|
||||
{% include "parts/section-transport-url" %}
|
||||
|
||||
{% include "parts/database" %}
|
||||
|
||||
[conductor]
|
||||
workers = {{ options.workers }}
|
||||
|
||||
{% include "parts/section-oslo-messaging-rabbit" %}
|
||||
|
||||
{% include "parts/section-placement" %}
|
161
src/tests/bundles/bionic-train.yaml
Normal file
161
src/tests/bundles/bionic-train.yaml
Normal file
@ -0,0 +1,161 @@
|
||||
series: bionic
|
||||
relations:
|
||||
- - nova-cloud-controller:nova-cell-api
|
||||
- nova-cell-controller-cell2:nova-cell-compute
|
||||
- - nova-cloud-controller:shared-db-cell
|
||||
- mysql-cell2:shared-db
|
||||
- - nova-cloud-controller:amqp-cell
|
||||
- rabbitmq-server-nova-cell2:amqp
|
||||
- - nova-compute-cell2:amqp
|
||||
- rabbitmq-server-nova-cell2:amqp
|
||||
- - neutron-gateway:amqp
|
||||
- rabbitmq-server-neutron:amqp
|
||||
- - neutron-gateway:amqp-nova
|
||||
- rabbitmq-server-nova:amqp
|
||||
- - keystone:shared-db
|
||||
- mysql:shared-db
|
||||
- - nova-cloud-controller:identity-service
|
||||
- keystone:identity-service
|
||||
- - glance:identity-service
|
||||
- keystone:identity-service
|
||||
- - neutron-api:identity-service
|
||||
- keystone:identity-service
|
||||
- - neutron-openvswitch:neutron-plugin-api
|
||||
- neutron-api:neutron-plugin-api
|
||||
- - neutron-api:shared-db
|
||||
- mysql:shared-db
|
||||
- - neutron-api:amqp
|
||||
- rabbitmq-server-neutron:amqp
|
||||
- - neutron-gateway:neutron-plugin-api
|
||||
- neutron-api:neutron-plugin-api
|
||||
- - glance:shared-db
|
||||
- mysql:shared-db
|
||||
- - glance:amqp
|
||||
- rabbitmq-server-neutron:amqp
|
||||
- - nova-cloud-controller:image-service
|
||||
- glance:image-service
|
||||
- - nova-compute-cell2:image-service
|
||||
- glance:image-service
|
||||
- - nova-cell-controller-cell2:cloud-compute
|
||||
- nova-compute-cell2:cloud-compute
|
||||
- - nova-cell-controller-cell2:identity-credentials
|
||||
- keystone:identity-credentials
|
||||
- - nova-cloud-controller:amqp
|
||||
- rabbitmq-server-nova:amqp
|
||||
- - nova-cell-controller-cell2:amqp
|
||||
- rabbitmq-server-nova-cell2:amqp
|
||||
- - nova-cloud-controller:quantum-network-service
|
||||
- neutron-gateway:quantum-network-service
|
||||
- - nova-compute-cell2:neutron-plugin
|
||||
- neutron-openvswitch:neutron-plugin
|
||||
- - neutron-openvswitch:amqp
|
||||
- rabbitmq-server-neutron:amqp
|
||||
- - nova-cloud-controller:shared-db
|
||||
- mysql:shared-db
|
||||
- - nova-cell-controller-cell2:shared-db
|
||||
- mysql-cell2:shared-db
|
||||
- - nova-cloud-controller:neutron-api
|
||||
- neutron-api:neutron-api
|
||||
- - nova-compute-cell2:cloud-credentials
|
||||
- keystone:identity-credentials
|
||||
- - ntp:juju-info
|
||||
- nova-compute-cell2:juju-info
|
||||
- - ntp:juju-info
|
||||
- neutron-gateway:juju-info
|
||||
- - placement:identity-service
|
||||
- keystone:identity-service
|
||||
- - placement:shared-db
|
||||
- mysql:shared-db
|
||||
- - nova-cloud-controller:placement
|
||||
- placement:placement
|
||||
applications:
|
||||
glance:
|
||||
charm: cs:~openstack-charmers-next/glance
|
||||
num_units: 1
|
||||
options:
|
||||
openstack-origin: cloud:bionic-train
|
||||
worker-multiplier: 0.25
|
||||
keystone:
|
||||
charm: cs:~openstack-charmers-next/keystone
|
||||
num_units: 1
|
||||
options:
|
||||
admin-password: openstack
|
||||
openstack-origin: cloud:bionic-train
|
||||
worker-multiplier: 0.25
|
||||
mysql:
|
||||
charm: cs:~openstack-charmers-next/percona-cluster
|
||||
num_units: 1
|
||||
options:
|
||||
innodb-buffer-pool-size: 256M
|
||||
max-connections: 1000
|
||||
mysql-cell2:
|
||||
charm: cs:~openstack-charmers-next/percona-cluster
|
||||
num_units: 1
|
||||
options:
|
||||
innodb-buffer-pool-size: 256M
|
||||
max-connections: 1000
|
||||
neutron-api:
|
||||
charm: cs:~openstack-charmers-next/neutron-api
|
||||
num_units: 1
|
||||
options:
|
||||
flat-network-providers: physnet1
|
||||
neutron-security-groups: true
|
||||
openstack-origin: cloud:bionic-train
|
||||
worker-multiplier: 0.25
|
||||
neutron-gateway:
|
||||
charm: cs:~openstack-charmers-next/neutron-gateway
|
||||
num_units: 1
|
||||
options:
|
||||
bridge-mappings: physnet1:br-ex
|
||||
openstack-origin: cloud:bionic-train
|
||||
worker-multiplier: 0.25
|
||||
neutron-openvswitch:
|
||||
charm: cs:~openstack-charmers-next/neutron-openvswitch
|
||||
num_units: 0
|
||||
nova-cloud-controller:
|
||||
charm: cs:~openstack-charmers-next/nova-cloud-controller
|
||||
num_units: 1
|
||||
options:
|
||||
network-manager: Neutron
|
||||
openstack-origin: cloud:bionic-train
|
||||
worker-multiplier: 0.25
|
||||
debug: true
|
||||
nova-cell-controller-cell2:
|
||||
charm: nova-cell-controller
|
||||
series: bionic
|
||||
num_units: 1
|
||||
options:
|
||||
openstack-origin: cloud:bionic-train
|
||||
worker-multiplier: 0.25
|
||||
debug: true
|
||||
cell-name: "cell2"
|
||||
nova-compute-cell2:
|
||||
charm: cs:~openstack-charmers-next/nova-compute
|
||||
num_units: 1
|
||||
constraints: mem=4G
|
||||
options:
|
||||
config-flags: default_ephemeral_format=ext4
|
||||
enable-live-migration: true
|
||||
enable-resize: true
|
||||
migration-auth-type: ssh
|
||||
openstack-origin: cloud:bionic-train
|
||||
debug: true
|
||||
ntp:
|
||||
charm: cs:ntp-24
|
||||
num_units: 0
|
||||
rabbitmq-server-nova:
|
||||
charm: cs:~openstack-charmers-next/rabbitmq-server
|
||||
num_units: 1
|
||||
rabbitmq-server-nova-cell2:
|
||||
charm: cs:~openstack-charmers-next/rabbitmq-server
|
||||
num_units: 1
|
||||
rabbitmq-server-neutron:
|
||||
charm: cs:~openstack-charmers-next/rabbitmq-server
|
||||
num_units: 1
|
||||
placement:
|
||||
charm: cs:~openstack-charmers-next/placement
|
||||
num_units: 1
|
||||
constraints: mem=1G
|
||||
options:
|
||||
openstack-origin: cloud:bionic-train
|
||||
debug: true
|
@ -8,8 +8,9 @@ configure:
|
||||
- zaza.openstack.charm_tests.nova.setup.create_flavors
|
||||
- zaza.openstack.charm_tests.nova.setup.manage_ssh_key
|
||||
gate_bundles:
|
||||
- bionic-train
|
||||
- disco-stein
|
||||
- bionic-stein
|
||||
- bionic-rocky
|
||||
smoke_bundles:
|
||||
- bionic-stein
|
||||
- bionic-train
|
||||
|
@ -43,7 +43,9 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks):
|
||||
'send_cell_data': (
|
||||
'shared-db.available',
|
||||
'endpoint.nova-cell-compute.joined',
|
||||
'amqp.available',)},
|
||||
'amqp.available',),
|
||||
'request_credentials': (
|
||||
'identity-credentials.connected',)},
|
||||
'when_not': {
|
||||
'db_setup': ('shared-db.synced',)}
|
||||
}
|
||||
@ -54,7 +56,7 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks):
|
||||
|
||||
class TestRenderStuff(test_utils.PatchHelper):
|
||||
|
||||
def bob(self):
|
||||
def bob(self, release='mitaka'):
|
||||
self.ncc_charm = mock.MagicMock()
|
||||
self.patch_object(handlers.charm, 'provide_charm_instance',
|
||||
new=mock.MagicMock())
|
||||
@ -63,9 +65,14 @@ class TestRenderStuff(test_utils.PatchHelper):
|
||||
|
||||
self.patch_object(handlers, 'set_flag')
|
||||
self.patch_object(handlers.hookenv, 'config')
|
||||
self.patch_object(handlers.os_utils, 'get_os_codename_install_source')
|
||||
self.mock_nc_ep = mock.MagicMock()
|
||||
self.mock_ncc_ep = mock.MagicMock()
|
||||
self.mock_amqp_ep = mock.MagicMock()
|
||||
self.mock_cred_conn_ep = mock.MagicMock()
|
||||
self.mock_cred_avail_ep = None
|
||||
if release == 'train':
|
||||
self.mock_cred_avail_ep = 'arg3'
|
||||
self.mock_db_ep = mock.MagicMock()
|
||||
|
||||
def _endpoint_from_flag(ep):
|
||||
@ -74,19 +81,37 @@ class TestRenderStuff(test_utils.PatchHelper):
|
||||
'endpoint.nova-cell-compute.joined': self.mock_ncc_ep,
|
||||
'endpoint.nova-cell-compute.changed': self.mock_ncc_ep,
|
||||
'amqp.available': self.mock_amqp_ep,
|
||||
'identity-credentials.connected': self.mock_cred_conn_ep,
|
||||
'identity-credentials.available.auth': self.mock_cred_avail_ep,
|
||||
'shared-db.available': self.mock_db_ep}
|
||||
return mocks[ep]
|
||||
self.patch_object(handlers, 'endpoint_from_flag',
|
||||
side_effect=_endpoint_from_flag)
|
||||
|
||||
def test_render_stuff(self):
|
||||
def test_request_credentials(self):
|
||||
self.bob()
|
||||
handlers.request_credentials()
|
||||
self.mock_cred_conn_ep.request_credentials.assert_called_with(
|
||||
'nova-cell-controller',
|
||||
project='services')
|
||||
|
||||
def test_render_stuff(self):
|
||||
self.bob(release='stein')
|
||||
self.get_os_codename_install_source.return_value = 'stein'
|
||||
handlers.render_stuff('arg1', 'arg2')
|
||||
self.ncc_charm.render_with_interfaces.assert_called_once_with(
|
||||
('arg1', 'arg2'))
|
||||
self.ncc_charm.assess_status.assert_called_once_with()
|
||||
self.set_flag.assert_called_once_with('config.rendered')
|
||||
|
||||
self.bob(release='train')
|
||||
self.get_os_codename_install_source.return_value = 'train'
|
||||
handlers.render_stuff('arg1', 'arg2')
|
||||
self.ncc_charm.render_with_interfaces.assert_called_once_with(
|
||||
('arg1', 'arg2', 'arg3'))
|
||||
self.ncc_charm.assess_status.assert_called_once_with()
|
||||
self.set_flag.assert_called_once_with('config.rendered')
|
||||
|
||||
def test_db_setup(self):
|
||||
self.bob()
|
||||
handlers.db_setup('arg1')
|
||||
|
Loading…
Reference in New Issue
Block a user