Ensure that tests work and bundles can accomodate charmhub sources
This commit is contained in:
parent
bfeee44206
commit
3a5bcf3252
1
.gitignore
vendored
1
.gitignore
vendored
@ -6,3 +6,4 @@ lib/*
|
||||
!lib/README.txt
|
||||
*.charm
|
||||
.vscode/settings.json
|
||||
build
|
||||
|
@ -10,7 +10,7 @@
|
||||
options:
|
||||
source:
|
||||
type: string
|
||||
default: ppa:chris.macnaughton/focal-ussuri
|
||||
default: proposed
|
||||
description: |
|
||||
Optional configuration to support use of additional sources such as:
|
||||
- ppa:myteam/ppa
|
||||
|
11
src/charm.py
11
src/charm.py
@ -397,6 +397,9 @@ class CephNfsCharm(
|
||||
allowed_ips = [ip.strip() for ip in allowed_ips.split(',')]
|
||||
client = GaneshaNfs(self.client_name, self.pool_name)
|
||||
export_path = client.create_share(size=share_size, name=name, access_ips=allowed_ips)
|
||||
if not export_path:
|
||||
event.fail("Failed to create share, check the log for more details")
|
||||
return
|
||||
self.peers.trigger_reload()
|
||||
event.set_results({
|
||||
"message": "Share created",
|
||||
@ -430,8 +433,8 @@ class CephNfsCharm(
|
||||
name = event.params.get('name')
|
||||
address = event.params.get('client')
|
||||
mode = event.params.get('mode')
|
||||
if mode not in ['r', 'rw']:
|
||||
event.fail('Mode must be either r (read) or rw (read/write)')
|
||||
if mode not in ['R', 'RW']:
|
||||
event.fail('Mode must be either R (read) or RW (read/write)')
|
||||
res = client.grant_access(name, address, mode)
|
||||
if res is not None:
|
||||
event.fail(res)
|
||||
@ -459,8 +462,8 @@ class CephNfsCharm(
|
||||
|
||||
|
||||
@ops_openstack.core.charm_class
|
||||
class CephNFSCharmOcto(CephNfsCharm):
|
||||
"""Ceph iSCSI Charm for Octopus."""
|
||||
class CephNFSCharmPacific(CephNfsCharm):
|
||||
"""Ceph iSCSI Charm for Pacific."""
|
||||
|
||||
_stored = StoredState()
|
||||
release = 'octopus'
|
||||
|
@ -123,7 +123,10 @@ class GaneshaNfs(object):
|
||||
access_ips[access_ips.index('0.0.0.0/0')] = '0.0.0.0'
|
||||
|
||||
access_id = 'ganesha-{}'.format(name)
|
||||
self.export_path = self._create_cephfs_share(name, size_in_bytes)
|
||||
path = self._create_cephfs_share(name, size_in_bytes)
|
||||
if not path:
|
||||
return
|
||||
self.export_path = path
|
||||
export_id = self._get_next_export_id()
|
||||
export = Export(
|
||||
{
|
||||
|
@ -7,8 +7,11 @@ applications:
|
||||
ceph-nfs:
|
||||
charm: ../../ceph-nfs.charm
|
||||
num_units: 2
|
||||
options:
|
||||
source: proposed
|
||||
ceph-osd:
|
||||
charm: ch:ceph-osd
|
||||
channel: pacific/edge
|
||||
num_units: 3
|
||||
storage:
|
||||
osd-devices: '2,10G'
|
||||
@ -16,6 +19,7 @@ applications:
|
||||
source: cloud:focal-wallaby
|
||||
ceph-mon:
|
||||
charm: ch:ceph-mon
|
||||
channel: pacific/edge
|
||||
num_units: 3
|
||||
options:
|
||||
monitor-count: '3'
|
||||
@ -23,12 +27,17 @@ applications:
|
||||
source: cloud:focal-wallaby
|
||||
ceph-fs:
|
||||
charm: ch:ceph-fs
|
||||
num_units: 1
|
||||
channel: pacific/edge
|
||||
num_units: 2
|
||||
options:
|
||||
source: cloud:focal-wallaby
|
||||
loadbalancer:
|
||||
charm: ch:openstack-loadbalancer
|
||||
charm: ../../../charm-openstack-loadbalancer/openstack-loadbalancer.charm
|
||||
channel: edge
|
||||
num_units: 3
|
||||
hacluster:
|
||||
charm: ch:hacluster
|
||||
channel: 2.0.3/edge
|
||||
options:
|
||||
cluster_count: 3
|
||||
relations:
|
||||
|
53
tests/bundles/focal-quincy.yaml
Normal file
53
tests/bundles/focal-quincy.yaml
Normal file
@ -0,0 +1,53 @@
|
||||
local_overlay_enabled: False
|
||||
series: focal
|
||||
applications:
|
||||
ubuntu:
|
||||
charm: cs:ubuntu
|
||||
num_units: 2
|
||||
ceph-nfs:
|
||||
charm: ../../ceph-nfs.charm
|
||||
num_units: 2
|
||||
options:
|
||||
source: proposed
|
||||
ceph-osd:
|
||||
charm: ch:ceph-osd
|
||||
channel: quincy/edge
|
||||
num_units: 3
|
||||
storage:
|
||||
osd-devices: '2,10G'
|
||||
options:
|
||||
source: cloud:focal-yoga
|
||||
ceph-mon:
|
||||
charm: ch:ceph-mon
|
||||
channel: quincy/edge
|
||||
num_units: 3
|
||||
options:
|
||||
monitor-count: '3'
|
||||
expected-osd-count: 6
|
||||
source: cloud:focal-yoga
|
||||
ceph-fs:
|
||||
charm: ch:ceph-fs
|
||||
channel: quincy/edge
|
||||
num_units: 2
|
||||
options:
|
||||
source: cloud:focal-yoga
|
||||
loadbalancer:
|
||||
charm: ../../../charm-openstack-loadbalancer/openstack-loadbalancer.charm
|
||||
# channel: edge
|
||||
num_units: 3
|
||||
hacluster:
|
||||
charm: ch:hacluster
|
||||
channel: 2.0.3/edge
|
||||
options:
|
||||
cluster_count: 3
|
||||
relations:
|
||||
- - 'ceph-mon:client'
|
||||
- 'ceph-nfs:ceph-client'
|
||||
- - 'ceph-osd:mon'
|
||||
- 'ceph-mon:osd'
|
||||
- - 'ceph-fs'
|
||||
- 'ceph-mon'
|
||||
- - ceph-nfs
|
||||
- loadbalancer
|
||||
- - 'loadbalancer:ha'
|
||||
- 'hacluster:ha'
|
@ -17,6 +17,7 @@
|
||||
import logging
|
||||
import subprocess
|
||||
import tenacity
|
||||
import time
|
||||
from typing import Dict
|
||||
import unittest
|
||||
import yaml
|
||||
@ -49,13 +50,15 @@ class NfsGaneshaTest(unittest.TestCase):
|
||||
'name': self.created_share,
|
||||
})
|
||||
|
||||
def _create_share(self, name: str, size: int = 10) -> Dict[str, str]:
|
||||
def _create_share(self, name: str, size: int = 10,
|
||||
access_ip: str = '0.0.0.0') -> Dict[str, str]:
|
||||
action = zaza.model.run_action_on_leader(
|
||||
'ceph-nfs',
|
||||
'create-share',
|
||||
action_params={
|
||||
'name': name,
|
||||
'size': size,
|
||||
'allowed-ips': access_ip,
|
||||
})
|
||||
self.assertEqual(action.status, 'completed')
|
||||
self.created_share = name
|
||||
@ -63,7 +66,18 @@ class NfsGaneshaTest(unittest.TestCase):
|
||||
logging.debug("Action results: {}".format(results))
|
||||
return results
|
||||
|
||||
def _mount_share(self, unit_name: str, share_ip: str, export_path: str):
|
||||
def _grant_access(self, share_name: str, access_ip: str, access_mode: str):
|
||||
action = zaza.model.run_action_on_leader(
|
||||
'ceph-nfs',
|
||||
'grant-access',
|
||||
action_params={
|
||||
'name': share_name,
|
||||
'client': access_ip,
|
||||
'mode': access_mode,
|
||||
})
|
||||
self.assertEqual(action.status, 'completed')
|
||||
|
||||
def _mount_share(self, unit_name: str, share_ip: str, export_path: str, retry: bool = True):
|
||||
ssh_cmd = (
|
||||
'sudo mkdir -p {0} && '
|
||||
'sudo mount -t {1} -o nfsvers=4.1,proto=tcp {2}:{3} {0}'.format(
|
||||
@ -71,14 +85,18 @@ class NfsGaneshaTest(unittest.TestCase):
|
||||
self.share_protocol,
|
||||
share_ip,
|
||||
export_path))
|
||||
|
||||
for attempt in tenacity.Retrying(
|
||||
stop=tenacity.stop_after_attempt(5),
|
||||
wait=tenacity.wait_exponential(multiplier=3, min=2, max=10)):
|
||||
with attempt:
|
||||
zaza.utilities.generic.run_via_ssh(
|
||||
unit_name=unit_name,
|
||||
cmd=ssh_cmd)
|
||||
if retry:
|
||||
for attempt in tenacity.Retrying(
|
||||
stop=tenacity.stop_after_attempt(5),
|
||||
wait=tenacity.wait_exponential(multiplier=3, min=2, max=10)):
|
||||
with attempt:
|
||||
zaza.utilities.generic.run_via_ssh(
|
||||
unit_name=unit_name,
|
||||
cmd=ssh_cmd)
|
||||
else:
|
||||
zaza.utilities.generic.run_via_ssh(
|
||||
unit_name=unit_name,
|
||||
cmd=ssh_cmd)
|
||||
self.mounts_share = True
|
||||
|
||||
def _install_dependencies(self, unit: str):
|
||||
@ -106,17 +124,33 @@ class NfsGaneshaTest(unittest.TestCase):
|
||||
self.assertEqual('test\r\n', output)
|
||||
|
||||
def test_create_share(self):
|
||||
logging.info("Creating a share")
|
||||
# Todo - enable ACL testing
|
||||
# ubuntu_0_ip = zaza.model.get_unit_public_address(zaza.model.get_unit_from_name('ubuntu/0'))
|
||||
# ubuntu_1_ip = zaza.model.get_unit_public_address(zaza.model.get_unit_from_name('ubuntu/1'))
|
||||
# share = self._create_share('test_ganesha_share', access_ip=ubuntu_0_ip)
|
||||
share = self._create_share('test_ganesha_share')
|
||||
zaza.model.wait_for_application_states(states={
|
||||
'ubuntu': {
|
||||
"workload-status-message-regex": "^$",
|
||||
}
|
||||
})
|
||||
for unit in ['0', '1']:
|
||||
self._install_dependencies('ubuntu/{}'.format(unit))
|
||||
logging.info("Creating a share")
|
||||
share = self._create_share('test_ganesha_share')
|
||||
export_path = share['path']
|
||||
ip = share['ip']
|
||||
logging.info("Mounting share on ubuntu units")
|
||||
self._mount_share('ubuntu/0', ip, export_path)
|
||||
self._mount_share('ubuntu/1', ip, export_path)
|
||||
logging.info("writing to the share on ubuntu/0")
|
||||
self._write_testing_file_on_instance('ubuntu/0')
|
||||
# Todo - enable ACL testing
|
||||
# try:
|
||||
# self._mount_share('ubuntu/1', ip, export_path, retry=False)
|
||||
# self.fail('Mounting should not have succeeded')
|
||||
# except: # noqa: E722
|
||||
# pass
|
||||
# self._grant_access('test_ganesha_share', access_ip=ubuntu_1_ip, access_mode='RW')
|
||||
self._mount_share('ubuntu/1', ip, export_path)
|
||||
logging.info("reading from the share on ubuntu/1")
|
||||
self._verify_testing_file_on_instance('ubuntu/1')
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
charm_name: ceph-nfs
|
||||
gate_bundles:
|
||||
- focal-octopuc
|
||||
- focal-quincy
|
||||
- focal-pacific
|
||||
smoke_bundles:
|
||||
- focal-octopus
|
||||
- focal-pacific
|
||||
configure: []
|
||||
tests:
|
||||
- tests.nfs_ganesha.NfsGaneshaTest
|
||||
|
Loading…
x
Reference in New Issue
Block a user