Migrate charm-manila to use Zaza

Additionally, this change corrects a template to ensure
that Manila can run on slightly older releases

Change-Id: Ie7eb9613f6b264ce4a681b89f68d1034a1c61f11
Closes-Bug: #1828424
func-test-pr: https://github.com/openstack-charmers/zaza-openstack-tests/pull/182
This commit is contained in:
Chris MacNaughton 2019-11-15 15:59:10 +01:00 committed by Chris MacNaughton
parent e97fdc09d4
commit b7b55b3a34
22 changed files with 699 additions and 658 deletions

View File

@ -15,7 +15,7 @@ enabled_share_protocols = {{ options.computed_share_protocols }}
#default_share_type = default_share_type
default_share_type = {{ options.default_share_type }}
state_path = /var/local/manila
state_path = /var/lib/manila
osapi_share_extension = manila.api.contrib.standard_extenstions
rootwrap_config = /etc/manila/rootwrap.conf
api_paste_config = /etc/manila/api-paste.ini

View File

@ -15,7 +15,7 @@ enabled_share_protocols = {{ options.computed_share_protocols }}
#default_share_type = default_share_type
default_share_type = {{ options.default_share_type }}
state_path = /var/local/manila
state_path = /var/lib/manila
osapi_share_extension = manila.api.contrib.standard_extenstions
rootwrap_config = /etc/manila/rootwrap.conf
api_paste_config = /etc/manila/api-paste.ini

View File

@ -1,33 +1,9 @@
# This file is managed centrally. If you find the need to modify this as a
# one-off, please don't. Intead, consult #openstack-charms and ask about
# requirements management in charms via bot-control. Thank you.
charm-tools>=2.4.4
coverage>=3.6
mock>=1.2
flake8>=2.2.4,<=2.4.1
stestr>=2.2.0
requests>=2.18.4
# BEGIN: Amulet OpenStack Charm Helper Requirements
# Liberty client lower constraints
amulet>=1.14.3,<2.0;python_version=='2.7'
bundletester>=0.6.1,<1.0;python_version=='2.7'
aodhclient>=0.1.0
gnocchiclient>=3.1.0,<3.2.0
python-barbicanclient>=4.0.1
python-ceilometerclient>=1.5.0
python-cinderclient>=1.4.0,<5.0.0
python-designateclient>=1.5
python-glanceclient>=1.1.0
python-heatclient>=0.8.0
python-keystoneclient>=1.7.1
python-manilaclient>=1.8.1
python-neutronclient>=3.1.0
python-novaclient>=2.30.1
python-openstackclient>=1.7.0
python-swiftclient>=2.6.0
pika>=0.10.0,<1.0
distro-info
git+https://github.com/juju/charm-helpers.git#egg=charmhelpers
# END: Amulet OpenStack Charm Helper Requirements
pytz # workaround for 14.04 pip/tox
pyudev # for ceph-* charm unit tests (not mocked?)
git+https://github.com/openstack-charmers/zaza.git#egg=zaza
git+https://github.com/openstack-charmers/zaza-openstack-tests.git#egg=zaza.openstack

View File

@ -1,512 +0,0 @@
import amulet
import keystoneclient.exceptions
from manilaclient.v1 import client as manila_client
from charmhelpers.contrib.openstack.amulet.deployment import (
OpenStackAmuletDeployment
)
from charmhelpers.contrib.openstack.amulet.utils import (
OpenStackAmuletUtils,
DEBUG,
)
# Use DEBUG to turn on debug logging
u = OpenStackAmuletUtils(DEBUG)
class ManilaBasicDeployment(OpenStackAmuletDeployment):
"""Amulet tests on a basic Manila deployment.
Note that these tests don't attempt to do a functional test on Manila,
merely to demonstrate that the relations work and that they transfer the
correct information across them.
A functional test will be performed by a mojo or tempest test.
"""
def __init__(self, series, openstack=None, source=None, stable=False):
"""Deploy the entire test environment.
"""
super(ManilaBasicDeployment, self).__init__(
series, openstack, source, stable)
if self._get_openstack_release() >= self.xenial_queens:
self._keystone_version = '3'
else:
self._keystone_version = '2'
self._add_services()
self._add_relations()
self._configure_services()
self._deploy()
u.log.info('Waiting on extended status checks...')
exclude_services = []
self._auto_wait_for_status(exclude_services=exclude_services)
self._initialize_tests()
def _add_services(self):
"""Add services
Add the services that we're testing, where manila is local,
and the rest of the service are from lp branches that are
compatible with the local charm (e.g. stable or next).
"""
this_service = {'name': 'manila'}
other_services = [
{'name': 'percona-cluster',
'constraints': {'mem': '3072M'}},
{'name': 'rabbitmq-server'},
{'name': 'keystone'},
{'name': 'manila-generic'}
]
super(ManilaBasicDeployment, self)._add_services(
this_service, other_services)
def _add_relations(self):
"""Add all of the relations for the services."""
relations = {
'manila:shared-db': 'percona-cluster:shared-db',
'manila:amqp': 'rabbitmq-server:amqp',
'manila:identity-service': 'keystone:identity-service',
'manila:manila-plugin': 'manila-generic:manila-plugin',
'keystone:shared-db': 'percona-cluster:shared-db',
}
super(ManilaBasicDeployment, self)._add_relations(relations)
def _configure_services(self):
"""Configure all of the services."""
keystone_config = {
'admin-password': 'openstack',
'admin-token': 'ubuntutesting',
}
manila_config = {
'default-share-backend': 'generic',
}
manila_generic_config = {
'driver-handles-share-servers': False,
}
configs = {
'keystone': keystone_config,
'manila': manila_config,
'manila-generic': manila_generic_config,
}
super(ManilaBasicDeployment, self)._configure_services(configs)
def _initialize_tests(self):
"""Perform final initialization before tests get run."""
# Access the sentries for inspecting service units
self.manila_sentry = self.d.sentry['manila'][0]
self.percona_cluster_sentry = self.d.sentry['percona-cluster'][0]
self.keystone_sentry = self.d.sentry['keystone'][0]
self.rabbitmq_sentry = self.d.sentry['rabbitmq-server'][0]
u.log.debug('openstack release val: {}'.format(
self._get_openstack_release()))
u.log.debug('openstack release str: {}'.format(
self._get_openstack_release_string()))
# Authenticate admin with keystone
self.keystone_session, self.keystone = u.get_default_keystone_session(
self.keystone_sentry,
openstack_release=self._get_openstack_release())
self.manila_svcs = [
'manila-api',
'manila-scheduler',
'manila-share',
'manila-data',
]
def test_100_services(self):
"""Verify the expected services are running on the corresponding
service units."""
u.log.debug('Checking system services on units...')
service_names = {
self.manila_sentry: self.manila_svcs,
}
ret = u.validate_services_by_name(service_names)
if ret:
amulet.raise_status(amulet.FAIL, msg=ret)
u.log.debug('OK')
def test_110_service_catalog(self):
"""Verify that the service catalog endpoint data is valid."""
u.log.debug('Checking keystone service catalog data...')
actual = self.keystone.service_catalog.get_endpoints()
if self._keystone_version == '2':
endpoint_check = [{
'adminURL': u.valid_url,
'id': u.not_null,
'region': 'RegionOne',
'publicURL': u.valid_url,
'internalURL': u.valid_url,
}]
validate_catalog = u.validate_svc_catalog_endpoint_data
else:
# v3 endpoint check
endpoint_check = [
{
'id': u.not_null,
'interface': interface,
'region': 'RegionOne',
'region_id': 'RegionOne',
'url': u.valid_url,
}
for interface in ('admin', 'public', 'internal')]
validate_catalog = u.validate_v3_svc_catalog_endpoint_data
expected = {
'sharev2': endpoint_check,
}
ret = validate_catalog(expected, actual)
if ret:
amulet.raise_status(amulet.FAIL, msg=ret)
u.log.debug('OK')
def test_114_manila_api_endpoint(self):
"""Verify the manila api endpoint data."""
u.log.debug('Checking manila api endpoint data...')
endpoints = self.keystone.endpoints.list()
u.log.debug(endpoints)
expected_num_eps = 3
admin_port = '8786'
internal_port = public_port = admin_port
if self._keystone_version == '2':
expected = {'id': u.not_null,
'region': 'RegionOne',
'adminurl': u.valid_url,
'internalurl': u.valid_url,
'publicurl': u.valid_url,
'service_id': u.not_null}
ret = u.validate_endpoint_data(
endpoints, admin_port, internal_port, public_port, expected)
elif self._keystone_version == '3':
if self._get_openstack_release() >= self.xenial_queens:
expected_num_eps = 6
# For keystone v3 it's slightly different.
expected = {'id': u.not_null,
'region': 'RegionOne',
'region_id': 'RegionOne',
'url': u.valid_url,
'interface': u.not_null, # we match this in the test
'service_id': u.not_null}
ret = u.validate_v3_endpoint_data(
endpoints, admin_port, internal_port, public_port, expected,
expected_num_eps=expected_num_eps)
else:
raise RuntimeError("Unexpected self._keystone_version: {}"
.format(self._keystone_version))
if ret:
message = 'manila endpoint: {}'.format(ret)
amulet.raise_status(amulet.FAIL, msg=message)
u.log.debug('OK')
def test_200_manila_identity_relation(self):
"""Verify the manila to keystone identity-service relation data"""
u.log.debug('Checking manila to keystone identity-service '
'relation data...')
unit = self.manila_sentry
relation = ['identity-service', 'keystone:identity-service']
manila_ip = unit.relation(*relation)['private-address']
manila_v1_endpoint = ("http://{}:8786/v1/%(tenant_id)s"
.format(manila_ip))
manila_v2_endpoint = ("http://{}:8786/v2/%(tenant_id)s"
.format(manila_ip))
expected = {
'private-address': manila_ip,
'v1_region': 'RegionOne',
'v1_admin_url': manila_v1_endpoint,
'v1_internal_url': manila_v1_endpoint,
'v1_public_url': manila_v1_endpoint,
'v1_service': 'manila',
'v2_region': 'RegionOne',
'v2_admin_url': manila_v2_endpoint,
'v2_internal_url': manila_v2_endpoint,
'v2_public_url': manila_v2_endpoint,
'v2_service': 'manilav2',
}
ret = u.validate_relation_data(unit, relation, expected)
if ret:
message = u.relation_error('manila identity-service', ret)
amulet.raise_status(amulet.FAIL, msg=message)
u.log.debug('OK')
def test_201_keystone_manila_identity_relation(self):
"""Verify the keystone to manila identity-service relation data"""
u.log.debug('Checking keystone:manila identity relation data...')
unit = self.keystone_sentry
relation = ['identity-service', 'manila:identity-service']
id_relation = unit.relation(*relation)
id_ip = id_relation['private-address']
expected = {
'admin_token': 'ubuntutesting',
'auth_host': id_ip,
'auth_port': "35357",
'auth_protocol': 'http',
'private-address': id_ip,
'service_host': id_ip,
'service_password': u.not_null,
'service_port': "5000",
'service_protocol': 'http',
'service_tenant': 'services',
'service_tenant_id': u.not_null,
'service_username': 'manila_manilav2', # oddness, but registers 2
}
ret = u.validate_relation_data(unit, relation, expected)
if ret:
message = u.relation_error('keystone identity-service', ret)
amulet.raise_status(amulet.FAIL, msg=message)
u.log.debug('OK')
def test_203_manila_amqp_relation(self):
"""Verify the manila to rabbitmq-server amqp relation data"""
u.log.debug('Checking manila:rabbitmq amqp relation data...')
unit = self.manila_sentry
relation = ['amqp', 'rabbitmq-server:amqp']
expected = {
'username': 'manila',
'private-address': u.valid_ip,
'vhost': 'openstack'
}
ret = u.validate_relation_data(unit, relation, expected)
if ret:
message = u.relation_error('manila amqp', ret)
amulet.raise_status(amulet.FAIL, msg=message)
u.log.debug('OK')
def test_204_manila_amqp_relation(self):
"""Verify the rabbitmq-server to manila amqp relation data"""
u.log.debug('Checking rabbitmq:manila manila relation data...')
unit = self.rabbitmq_sentry
relation = ['amqp', 'manila:amqp']
expected = {
'hostname': u.valid_ip,
'private-address': u.valid_ip,
'password': u.not_null,
}
ret = u.validate_relation_data(unit, relation, expected)
if ret:
message = u.relation_error('rabbitmq manila', ret)
amulet.raise_status(amulet.FAIL, msg=message)
u.log.debug('OK')
@staticmethod
def _find_or_create(items, key, create):
"""Find or create the thing in the items
:param items: the items to search using the key
:param key: a function that key(item) -> boolean if found.
:param create: a function to call if the key() never was true.
:returns: the item that was either found or created.
"""
for i in items:
if key(i):
return i
return create()
def test_400_api_connection(self):
"""Simple api calls to check service is up and responding"""
u.log.debug('Checking api functionality...')
# This handles both keystone v2 and v3.
# For keystone v2 we need a user:
# - 'demo' user
# - has a project 'demo'
# - in the 'demo' project
# - with an 'admin' role
# For keystone v3 we need a user:
# - 'default' domain
# - 'demo' user
# - 'demo' project
# - 'admin' role -- to be able to delete.
# manila requires a user with creator or admin role on the project
# when creating a secret (which this test does). Therefore, we create
# a demo user, demo project, and then get a demo manila client and do
# the secret. ensure that the default domain is created.
keystone_ip = self.keystone_sentry.info['public-address']
if self._keystone_version == '2':
# find or create the 'demo' tenant (project)
tenant = self._find_or_create(
items=self.keystone.tenants.list(),
key=lambda t: t.name == 'demo',
create=lambda: self.keystone.tenants.create(
tenant_name="demo",
description="Demo for testing manila",
enabled=True))
# find or create the demo user
demo_user = self._find_or_create(
items=self.keystone.users.list(),
key=lambda u: u.name == 'demo',
create=lambda: self.keystone.users.create(
name='demo',
password='pass',
tenant_id=tenant.id))
# find the admin role
# already be created - if not, then this will fail later.
admin_role = self._find_or_create(
items=self.keystone.roles.list(),
key=lambda r: r.name.lower() == 'admin',
create=lambda: None)
# grant the role if it isn't already created.
# now grant the creator role to the demo user.
self._find_or_create(
items=self.keystone.roles.roles_for_user(
demo_user, tenant=tenant),
key=lambda r: r.name.lower() == admin_role.name.lower(),
create=lambda: self.keystone.roles.add_user_role(
demo_user, admin_role, tenant=tenant))
# Authenticate demo user with keystone
self.demo_user_session, _ = u.get_keystone_session(
keystone_ip,
'demo',
'pass',
api_version=2,
project_name='demo',
)
else:
# find or create the 'default' domain
domain = self._find_or_create(
items=self.keystone.domains.list(),
key=lambda u: u.name == 'default',
create=lambda: self.keystone.domains.create(
"default",
description="domain for manila testing",
enabled=True))
# find or create the 'demo' user
demo_user = self._find_or_create(
items=self.keystone.users.list(domain=domain.id),
key=lambda u: u.name == 'demo',
create=lambda: self.keystone.users.create(
'demo',
domain=domain.id,
description="Demo user for manila tests",
enabled=True,
email="demo@example.com",
password="pass"))
# find or create the 'demo' project
demo_project = self._find_or_create(
items=self.keystone.projects.list(domain=domain.id),
key=lambda x: x.name == 'demo',
create=lambda: self.keystone.projects.create(
'demo',
domain=domain.id,
description='manila testing project',
enabled=True))
# create the role for the user - needs to be admin so that the
# secret can be deleted - note there is only one admin role, and it
# should already be created - if not, then this will fail later.
admin_role = self._find_or_create(
items=self.keystone.roles.list(),
key=lambda r: r.name.lower() == 'admin',
create=lambda: None)
# now grant the creator role to the demo user.
try:
self.keystone.roles.check(
role=admin_role,
user=demo_user,
project=demo_project)
except keystoneclient.exceptions.NotFound:
# create it if it isn't found
self.keystone.roles.grant(
role=admin_role,
user=demo_user,
project=demo_project)
self.demo_user_session, _ = u.get_keystone_session(
keystone_ip,
'demo',
'pass',
api_version=3,
project_name='demo',
user_domain_name='default',
project_domain_name='default',
)
# Authenticate admin with manila endpoint
manila_ep = self.keystone.service_catalog.url_for(
service_type='share', interface='publicURL')
manila = manila_client.Client(session=self.demo_user_session,
endpoint=manila_ep)
# now just try a list the shares
# NOTE(AJK) the 'search_opts={}' is to work around Bug#1707303
manila.shares.list(search_opts={})
u.log.debug('OK')
def test_900_restart_on_config_change(self):
"""Verify that the specified services are restarted when the config
is changed.
"""
sentry = self.manila_sentry
juju_service = 'manila'
# Expected default and alternate values
set_default = {'debug': 'False'}
set_alternate = {'debug': 'True'}
# Services which are expected to restart upon config change,
# and corresponding config files affected by the change
conf_file = '/etc/manila/manila.conf'
services = {
'manila-api': conf_file,
}
# Make config change, check for service restarts
u.log.debug('Making config change on {}...'.format(juju_service))
mtime = u.get_sentry_time(sentry)
self.d.configure(juju_service, set_alternate)
sleep_time = 40
for s, conf_file in services.iteritems():
u.log.debug("Checking that service restarted: {}".format(s))
if not u.validate_service_config_changed(sentry, mtime, s,
conf_file,
retry_count=4,
retry_sleep_time=20,
sleep_time=sleep_time):
self.d.configure(juju_service, set_default)
msg = "service {} didn't restart after config change".format(s)
amulet.raise_status(amulet.FAIL, msg=msg)
sleep_time = 0
self.d.configure(juju_service, set_default)
u.log.debug('OK')
def _assert_services(self, should_run):
services = self.manila_svcs
u.get_unit_process_ids(
{self.manila_sentry: services},
expect_success=should_run)
def test_910_pause_and_resume(self):
"""The services can be paused and resumed. """
self._assert_services(should_run=True)
action_id = u.run_action(self.manila_sentry, "pause")
assert u.wait_on_action(action_id), "Pause action failed."
self._assert_services(should_run=False)
action_id = u.run_action(self.manila_sentry, "resume")
assert u.wait_on_action(action_id), "Resume action failed"
self._assert_services(should_run=True)

View File

@ -0,0 +1,33 @@
series: bionic
services:
manila:
charm: ../../../manila
num_units: 1
series: bionic
options:
default-share-backend: generic
manila-generic:
charm: cs:~openstack-charmers-next/manila-generic
options:
driver-handles-share-servers: False
rabbitmq-server:
charm: cs:~openstack-charmers-next/rabbitmq-server
num_units: 1
percona-cluster:
charm: cs:~openstack-charmers-next/percona-cluster
num_units: 1
keystone:
charm: cs:~openstack-charmers-next/keystone
num_units: 1
relations:
- - manila:manila-plugin
- manila-generic
- - manila
- rabbitmq-server
- - manila
- keystone
- - keystone
- percona-cluster
- - manila
- percona-cluster

View File

@ -0,0 +1,147 @@
series: bionic
options:
source: &source cloud:bionic-rocky
services:
manila-ganesha:
num_units: 1
charm: cs:~openstack-charmers-next/manila-ganesha
options:
openstack-origin: *source
ceph-mon:
charm: cs:~openstack-charmers-next/ceph-mon
num_units: 3
options:
source: *source
ceph-osd:
charm: cs:~openstack-charmers-next/ceph-osd
num_units: 3
options:
source: *source
storage:
osd-devices: 'cinder,10G'
ceph-fs:
charm: cs:~openstack-charmers-next/ceph-fs
num_units: 2
options:
source: *source
manila:
charm: ../../../manila
num_units: 1
series: bionic
options:
openstack-origin: *source
default-share-backend: cephfsnfs1
share-protocols: NFS
nova-cloud-controller:
charm: cs:~openstack-charmers-next/nova-cloud-controller
num_units: 1
options:
network-manager: Neutron
openstack-origin: *source
nova-compute:
charm: cs:~openstack-charmers-next/nova-compute
num_units: 2
constraints: mem=8G
options:
config-flags: default_ephemeral_format=ext4
enable-live-migration: true
enable-resize: true
migration-auth-type: ssh
openstack-origin: *source
glance:
charm: cs:~openstack-charmers-next/glance
num_units: 1
options:
openstack-origin: *source
neutron-api:
charm: cs:~openstack-charmers-next/neutron-api
num_units: 1
options:
flat-network-providers: physnet1
neutron-security-groups: true
openstack-origin: *source
neutron-openvswitch:
charm: cs:~openstack-charmers-next/neutron-openvswitch
neutron-gateway:
charm: cs:~openstack-charmers-next/neutron-gateway
num_units: 1
options:
bridge-mappings: physnet1:br-ex
openstack-origin: *source
rabbitmq-server:
charm: cs:~openstack-charmers-next/rabbitmq-server
num_units: 1
options:
source: *source
percona-cluster:
charm: cs:~openstack-charmers-next/percona-cluster
num_units: 1
options:
source: *source
keystone:
charm: cs:~openstack-charmers-next/keystone
num_units: 1
options:
openstack-origin: *source
relations:
- - ceph-mon
- ceph-osd
- - ceph-mon
- ceph-fs
- - ceph-mon
- manila-ganesha
- - manila-ganesha
- percona-cluster
- - manila-ganesha
- rabbitmq-server
- - manila-ganesha
- keystone
- - manila
- manila-ganesha
- - manila
- rabbitmq-server
- - manila
- keystone
- - keystone
- percona-cluster
- - manila
- percona-cluster
- - 'neutron-api:shared-db'
- 'percona-cluster:shared-db'
- - 'neutron-api:amqp'
- 'rabbitmq-server:amqp'
- - 'neutron-api:neutron-api'
- 'nova-cloud-controller:neutron-api'
- - 'neutron-api:neutron-plugin-api'
- 'neutron-gateway:neutron-plugin-api'
- - 'neutron-api:identity-service'
- 'keystone:identity-service'
- - 'nova-compute:neutron-plugin'
- 'neutron-openvswitch:neutron-plugin'
- - 'nova-cloud-controller:shared-db'
- 'percona-cluster:shared-db'
- - 'neutron-gateway:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-cloud-controller:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-compute:amqp'
- 'rabbitmq-server:amqp'
- - 'neutron-openvswitch:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-cloud-controller:identity-service'
- 'keystone:identity-service'
- - 'nova-cloud-controller:cloud-compute'
- 'nova-compute:cloud-compute'
- - 'glance:identity-service'
- 'keystone:identity-service'
- - 'glance:shared-db'
- 'percona-cluster:shared-db'
- - 'glance:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-compute:image-service'
- 'glance:image-service'
- - 'nova-cloud-controller:image-service'
- 'glance:image-service'
- - 'nova-cloud-controller:quantum-network-service'
- 'neutron-gateway:quantum-network-service'

View File

@ -0,0 +1,147 @@
series: bionic
options:
source: &source cloud:bionic-stein
services:
manila-ganesha:
num_units: 1
charm: cs:~openstack-charmers-next/manila-ganesha
options:
openstack-origin: *source
ceph-mon:
charm: cs:~openstack-charmers-next/ceph-mon
num_units: 3
options:
source: *source
ceph-osd:
charm: cs:~openstack-charmers-next/ceph-osd
num_units: 3
options:
source: *source
storage:
osd-devices: 'cinder,10G'
ceph-fs:
charm: cs:~openstack-charmers-next/ceph-fs
num_units: 2
options:
source: *source
manila:
charm: ../../../manila
num_units: 1
series: bionic
options:
openstack-origin: *source
default-share-backend: cephfsnfs1
share-protocols: NFS
nova-cloud-controller:
charm: cs:~openstack-charmers-next/nova-cloud-controller
num_units: 1
options:
network-manager: Neutron
openstack-origin: *source
nova-compute:
charm: cs:~openstack-charmers-next/nova-compute
num_units: 2
constraints: mem=8G
options:
config-flags: default_ephemeral_format=ext4
enable-live-migration: true
enable-resize: true
migration-auth-type: ssh
openstack-origin: *source
glance:
charm: cs:~openstack-charmers-next/glance
num_units: 1
options:
openstack-origin: *source
neutron-api:
charm: cs:~openstack-charmers-next/neutron-api
num_units: 1
options:
flat-network-providers: physnet1
neutron-security-groups: true
openstack-origin: *source
neutron-openvswitch:
charm: cs:~openstack-charmers-next/neutron-openvswitch
neutron-gateway:
charm: cs:~openstack-charmers-next/neutron-gateway
num_units: 1
options:
bridge-mappings: physnet1:br-ex
openstack-origin: *source
rabbitmq-server:
charm: cs:~openstack-charmers-next/rabbitmq-server
num_units: 1
options:
source: *source
percona-cluster:
charm: cs:~openstack-charmers-next/percona-cluster
num_units: 1
options:
source: *source
keystone:
charm: cs:~openstack-charmers-next/keystone
num_units: 1
options:
openstack-origin: *source
relations:
- - ceph-mon
- ceph-osd
- - ceph-mon
- ceph-fs
- - ceph-mon
- manila-ganesha
- - manila-ganesha
- percona-cluster
- - manila-ganesha
- rabbitmq-server
- - manila-ganesha
- keystone
- - manila
- manila-ganesha
- - manila
- rabbitmq-server
- - manila
- keystone
- - keystone
- percona-cluster
- - manila
- percona-cluster
- - 'neutron-api:shared-db'
- 'percona-cluster:shared-db'
- - 'neutron-api:amqp'
- 'rabbitmq-server:amqp'
- - 'neutron-api:neutron-api'
- 'nova-cloud-controller:neutron-api'
- - 'neutron-api:neutron-plugin-api'
- 'neutron-gateway:neutron-plugin-api'
- - 'neutron-api:identity-service'
- 'keystone:identity-service'
- - 'nova-compute:neutron-plugin'
- 'neutron-openvswitch:neutron-plugin'
- - 'nova-cloud-controller:shared-db'
- 'percona-cluster:shared-db'
- - 'neutron-gateway:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-cloud-controller:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-compute:amqp'
- 'rabbitmq-server:amqp'
- - 'neutron-openvswitch:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-cloud-controller:identity-service'
- 'keystone:identity-service'
- - 'nova-cloud-controller:cloud-compute'
- 'nova-compute:cloud-compute'
- - 'glance:identity-service'
- 'keystone:identity-service'
- - 'glance:shared-db'
- 'percona-cluster:shared-db'
- - 'glance:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-compute:image-service'
- 'glance:image-service'
- - 'nova-cloud-controller:image-service'
- 'glance:image-service'
- - 'nova-cloud-controller:quantum-network-service'
- 'neutron-gateway:quantum-network-service'

View File

@ -0,0 +1,159 @@
series: bionic
variables:
source: &source cloud:bionic-train
services:
manila-ganesha:
num_units: 1
charm: cs:~openstack-charmers-next/manila-ganesha
options:
openstack-origin: *source
ceph-mon:
charm: cs:~openstack-charmers-next/ceph-mon
num_units: 3
options:
source: *source
ceph-osd:
charm: cs:~openstack-charmers-next/ceph-osd
num_units: 3
options:
source: *source
storage:
osd-devices: 'cinder,10G'
ceph-fs:
charm: cs:~openstack-charmers-next/ceph-fs
num_units: 2
options:
source: *source
manila:
charm: ../../../manila
num_units: 1
series: bionic
options:
openstack-origin: *source
default-share-backend: cephfsnfs1
share-protocols: NFS
nova-cloud-controller:
charm: cs:~openstack-charmers-next/nova-cloud-controller
num_units: 1
options:
network-manager: Neutron
openstack-origin: *source
nova-compute:
charm: cs:~openstack-charmers-next/nova-compute
num_units: 2
constraints: mem=8G
options:
config-flags: default_ephemeral_format=ext4
enable-live-migration: true
enable-resize: true
migration-auth-type: ssh
openstack-origin: *source
glance:
charm: cs:~openstack-charmers-next/glance
num_units: 1
options:
openstack-origin: *source
neutron-api:
charm: cs:~openstack-charmers-next/neutron-api
num_units: 1
options:
flat-network-providers: physnet1
neutron-security-groups: true
openstack-origin: *source
neutron-openvswitch:
charm: cs:~openstack-charmers-next/neutron-openvswitch
neutron-gateway:
charm: cs:~openstack-charmers-next/neutron-gateway
num_units: 1
options:
bridge-mappings: physnet1:br-ex
openstack-origin: *source
rabbitmq-server:
charm: cs:~openstack-charmers-next/rabbitmq-server
num_units: 1
options:
source: *source
percona-cluster:
charm: cs:~openstack-charmers-next/percona-cluster
num_units: 1
options:
source: *source
keystone:
charm: cs:~openstack-charmers-next/keystone
num_units: 1
options:
openstack-origin: *source
placement:
charm: cs:~openstack-charmers-next/placement
num_units: 1
options:
openstack-origin: *source
relations:
- - ceph-mon
- ceph-osd
- - ceph-mon
- ceph-fs
- - ceph-mon
- manila-ganesha
- - manila-ganesha
- percona-cluster
- - manila-ganesha
- rabbitmq-server
- - manila-ganesha
- keystone
- - manila
- manila-ganesha
- - manila
- rabbitmq-server
- - manila
- keystone
- - keystone
- percona-cluster
- - manila
- percona-cluster
- - 'neutron-api:shared-db'
- 'percona-cluster:shared-db'
- - 'neutron-api:amqp'
- 'rabbitmq-server:amqp'
- - 'neutron-api:neutron-api'
- 'nova-cloud-controller:neutron-api'
- - 'neutron-api:neutron-plugin-api'
- 'neutron-gateway:neutron-plugin-api'
- - 'neutron-api:identity-service'
- 'keystone:identity-service'
- - 'nova-compute:neutron-plugin'
- 'neutron-openvswitch:neutron-plugin'
- - 'nova-cloud-controller:shared-db'
- 'percona-cluster:shared-db'
- - 'neutron-gateway:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-cloud-controller:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-compute:amqp'
- 'rabbitmq-server:amqp'
- - 'neutron-openvswitch:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-cloud-controller:identity-service'
- 'keystone:identity-service'
- - 'nova-cloud-controller:cloud-compute'
- 'nova-compute:cloud-compute'
- - 'glance:identity-service'
- 'keystone:identity-service'
- - 'glance:shared-db'
- 'percona-cluster:shared-db'
- - 'glance:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-compute:image-service'
- 'glance:image-service'
- - 'nova-cloud-controller:image-service'
- 'glance:image-service'
- - 'nova-cloud-controller:quantum-network-service'
- 'neutron-gateway:quantum-network-service'
- - 'placement:placement'
- 'nova-cloud-controller:placement'
- - 'placement:amqp'
- 'rabbitmq-server:amqp'
- - 'placement:shared-db'
- 'percona-cluster:shared-db'
- - 'placement:identity-service'
- 'keystone:identity-service'

View File

@ -0,0 +1,42 @@
series: &series xenial
variables:
source: &source distro
services:
manila:
charm: ../../../manila
num_units: 1
series: *series
options:
default-share-backend: generic
openstack-origin: *source
manila-generic:
charm: cs:~openstack-charmers-next/manila-generic
options:
driver-handles-share-servers: False
rabbitmq-server:
charm: cs:~openstack-charmers-next/rabbitmq-server
num_units: 1
options:
source: *source
percona-cluster:
charm: cs:~openstack-charmers-next/percona-cluster
num_units: 1
options:
source: *source
keystone:
charm: cs:~openstack-charmers-next/keystone
num_units: 1
options:
openstack-origin: *source
relations:
- - manila:manila-plugin
- manila-generic
- - manila
- rabbitmq-server
- - manila
- keystone
- - keystone
- percona-cluster
- - manila
- percona-cluster

View File

@ -0,0 +1,42 @@
series: &series xenial
variables:
source: &source cloud:xenial-ocata
services:
manila:
charm: ../../../manila
num_units: 1
series: *series
options:
default-share-backend: generic
openstack-origin: *source
manila-generic:
charm: cs:~openstack-charmers-next/manila-generic
options:
driver-handles-share-servers: False
rabbitmq-server:
charm: cs:~openstack-charmers-next/rabbitmq-server
num_units: 1
options:
source: *source
percona-cluster:
charm: cs:~openstack-charmers-next/percona-cluster
num_units: 1
options:
source: *source
keystone:
charm: cs:~openstack-charmers-next/keystone
num_units: 1
options:
openstack-origin: *source
relations:
- - manila:manila-plugin
- manila-generic
- - manila
- rabbitmq-server
- - manila
- keystone
- - keystone
- percona-cluster
- - manila
- percona-cluster

View File

@ -0,0 +1,42 @@
series: &series xenial
variables:
source: &source cloud:xenial-pike
services:
manila:
charm: ../../../manila
num_units: 1
series: *series
options:
default-share-backend: generic
openstack-origin: *source
manila-generic:
charm: cs:~openstack-charmers-next/manila-generic
options:
driver-handles-share-servers: False
rabbitmq-server:
charm: cs:~openstack-charmers-next/rabbitmq-server
num_units: 1
options:
source: *source
percona-cluster:
charm: cs:~openstack-charmers-next/percona-cluster
num_units: 1
options:
source: *source
keystone:
charm: cs:~openstack-charmers-next/keystone
num_units: 1
options:
openstack-origin: *source
relations:
- - manila:manila-plugin
- manila-generic
- - manila
- rabbitmq-server
- - manila
- keystone
- - keystone
- percona-cluster
- - manila
- percona-cluster

View File

@ -0,0 +1,42 @@
series: &series xenial
variables:
source: &source cloud:xenial-queens
services:
manila:
charm: ../../../manila
num_units: 1
series: *series
options:
default-share-backend: generic
openstack-origin: *source
manila-generic:
charm: cs:~openstack-charmers-next/manila-generic
options:
driver-handles-share-servers: False
rabbitmq-server:
charm: cs:~openstack-charmers-next/rabbitmq-server
num_units: 1
options:
source: *source
percona-cluster:
charm: cs:~openstack-charmers-next/percona-cluster
num_units: 1
options:
source: *source
keystone:
charm: cs:~openstack-charmers-next/keystone
num_units: 1
options:
openstack-origin: *source
relations:
- - manila:manila-plugin
- manila-generic
- - manila
- rabbitmq-server
- - manila
- keystone
- - keystone
- percona-cluster
- - manila
- percona-cluster

View File

@ -1,10 +0,0 @@
#!/usr/bin/env python
"""Amulet tests on a basic manila deployment on bionic-queens.
"""
from basic_deployment import ManilaBasicDeployment
if __name__ == '__main__':
deployment = ManilaBasicDeployment(series='bionic')
deployment.run_tests()

View File

@ -1,10 +0,0 @@
#!/usr/bin/env python
"""Amulet tests on a basic manila deployment on bionic-rocky.
"""
from basic_deployment import ManilaBasicDeployment
if __name__ == '__main__':
deployment = ManilaBasicDeployment(series='bionic')
deployment.run_tests()

View File

@ -1,10 +0,0 @@
#!/usr/bin/env python
"""Amulet tests on a basic manila deployment on bionic-stein.
"""
from basic_deployment import ManilaBasicDeployment
if __name__ == '__main__':
deployment = ManilaBasicDeployment(series='bionic')
deployment.run_tests()

View File

@ -1,12 +0,0 @@
#!/usr/bin/env python
"""Amulet tests on a basic manila deployment on bionic-train.
"""
from basic_deployment import ManilaBasicDeployment
if __name__ == '__main__':
deployment = ManilaBasicDeployment(series='bionic',
openstack='cloud:bionic-train',
source='cloud:bionic-train')
deployment.run_tests()

View File

@ -1,10 +0,0 @@
#!/usr/bin/env python
"""Amulet tests on a basic manila deployment on xenial-mitaka.
"""
from basic_deployment import ManilaBasicDeployment
if __name__ == '__main__':
deployment = ManilaBasicDeployment(series='xenial')
deployment.run_tests()

View File

@ -1,10 +0,0 @@
#!/usr/bin/env python
"""Amulet tests on a basic manila deployment on xenial-ocata.
"""
from basic_deployment import ManilaBasicDeployment
if __name__ == '__main__':
deployment = ManilaBasicDeployment(series='xenial')
deployment.run_tests()

View File

@ -1,10 +0,0 @@
#!/usr/bin/env python
"""Amulet tests on a basic manila deployment on xenial-pike.
"""
from basic_deployment import ManilaBasicDeployment
if __name__ == '__main__':
deployment = ManilaBasicDeployment(series='xenial')
deployment.run_tests()

View File

@ -1,10 +0,0 @@
#!/usr/bin/env python
"""Amulet tests on a basic manila deployment on xenial-queens.
"""
from basic_deployment import ManilaBasicDeployment
if __name__ == '__main__':
deployment = ManilaBasicDeployment(series='xenial')
deployment.run_tests()

View File

@ -1,18 +1,28 @@
# Bootstrap the model if necessary.
bootstrap: True
# Re-use bootstrap node instead of destroying/re-bootstrapping.
reset: True
# Use tox/requirements to drive the venv instead of bundletester's venv feature.
virtualenv: False
# Leave makefile empty, otherwise unit/lint tests will rerun ahead of amulet.
makefile: []
# Do not specify juju PPA sources. Juju is presumed to be pre-installed
# and configured in all test runner environments.
#sources:
# Do not specify or rely on system packages.
#packages:
# Do not specify python packages here. Use test-requirements.txt
# and tox instead. ie. The venv is constructed before bundletester
# is invoked.
#python-packages:
reset_timeout: 600
charm_name: manila
dev_bundles:
- bionic
gate_bundles:
- xenial-mitaka
- xenial-ocata
- xenial-pike
- xenial-queens
- bionic-queens
- ganesha: bionic-rocky
- ganesha: bionic-stein
- ganesha: bionic-train
smoke_bundles:
- ganesha: bionic-stein
target_deploy_status: {}
tests:
- zaza.openstack.charm_tests.manila.tests.ManilaTests
- ganesha:
- zaza.openstack.charm_tests.manila_ganesha.tests.ManilaGaneshaTests
configure:
- zaza.openstack.charm_tests.keystone.setup.add_demo_user
- ganesha:
- zaza.openstack.charm_tests.glance.setup.add_lts_image
- zaza.openstack.charm_tests.neutron.setup.basic_overcloud_network
- zaza.openstack.charm_tests.nova.setup.create_flavors
- zaza.openstack.charm_tests.nova.setup.manage_ssh_key
- zaza.openstack.charm_tests.keystone.setup.add_demo_user
- zaza.openstack.charm_tests.manila_ganesha.setup.setup_ganesha_share_type

View File

@ -1,4 +1,4 @@
# Source charm (with amulet): ./src/tox.ini
# Source charm (with zaza): ./src/tox.ini
# This file is managed centrally by release-tools and should not be modified
# within individual charm repos. See the 'global' dir contents for available
# choices of tox.ini for OpenStack Charms:
@ -15,41 +15,36 @@ skip_missing_interpreters = False
[testenv]
setenv = VIRTUAL_ENV={envdir}
PYTHONHASHSEED=0
CHARM_DIR={envdir}
AMULET_SETUP_TIMEOUT=5400
whitelist_externals = juju
passenv = HOME TERM AMULET_* CS_* OS_* TEST_*
passenv = HOME TERM CS_* OS_* TEST_*
deps = -r{toxinidir}/test-requirements.txt
install_command =
pip install {opts} {packages}
[testenv:pep8]
basepython = python3
deps=charm-tools
commands = charm-proof
[testenv:func-noop]
# DRY RUN - For Debug
basepython = python2.7
basepython = python3
commands =
bundletester -vl DEBUG -r json -o func-results.json --test-pattern "gate-*" -n --no-destroy
functest-run-suite --help
[testenv:func]
# Run all gate tests which are +x (expected to always pass)
basepython = python2.7
basepython = python3
commands =
bundletester -vl DEBUG -r json -o func-results.json --test-pattern "gate-*" --no-destroy
functest-run-suite --keep-model
[testenv:func-smoke]
# Run a specific test as an Amulet smoke test (expected to always pass)
basepython = python2.7
basepython = python3
commands =
bundletester -vl DEBUG -r json -o func-results.json gate-basic-bionic-train --no-destroy
functest-run-suite --keep-model --smoke
[testenv:func-dev]
# Run all development test targets which are +x (may not always pass!)
basepython = python2.7
[testenv:func-target]
basepython = python3
commands =
bundletester -vl DEBUG -r json -o func-results.json --test-pattern "dev-*" --no-destroy
functest-run-suite --keep-model --bundle {posargs}
[testenv:venv]
commands = {posargs}
commands = {posargs}