Fix pool creation for single zone setups.

Deprecate 'pool-prefix' charm config.

Change-Id: I34079d8975d995ea958f219e0516a972d73319f7
Closes-Bug: #1856106
Co-Authored-By: Andrei Bacos <abacos@cloudbasesolutions.com>
This commit is contained in:
Dan Ardelean 2020-09-22 14:30:19 +00:00
parent 85b3b74026
commit 2466691f85
5 changed files with 55 additions and 16 deletions

View File

@ -77,12 +77,13 @@ options:
type: string type: string
default: default:
description: | description: |
The rados gateway stores objects in many different pools. If you would DEPRECATED, use zone instead - pool name can be inherited from the zone config
like to have multiple rados gateways each pointing to a separate set of option. The rados gateway stores objects in many different pools. If you
pools set this prefix. The charm will then set up a new set of pools. would like to have multiple rados gateways each pointing to a separate
If your prefix has a dash in it that will be used to split the prefix set of pools set this prefix. The charm will then set up a new set of pools.
into region and zone. Please read the documentation on federated rados If your prefix has a dash in it that will be used to split the prefix into
gateways for more information on region and zone. region and zone. Please read the documentation on federated rados gateways
for more information on region and zone.
restrict-ceph-pools: restrict-ceph-pools:
type: boolean type: boolean
default: False default: False
@ -414,7 +415,7 @@ options:
Name of RADOS Gateway Zone Group to create for multi-site replication. Name of RADOS Gateway Zone Group to create for multi-site replication.
zone: zone:
type: string type: string
default: default: default
description: | description: |
Name of RADOS Gateway Zone to create for multi-site replication. This Name of RADOS Gateway Zone to create for multi-site replication. This
option must be specific to the local site e.g. us-west or us-east. option must be specific to the local site e.g. us-west or us-east.

View File

@ -259,7 +259,6 @@ def mon_relation(rid=None, unit=None):
relation_set(relation_id=rid, relation_set(relation_id=rid,
key_name=key_name) key_name=key_name)
try: try:
# NOTE: prefer zone name if in use over pool-prefix.
rq = ceph.get_create_rgw_pools_rq( rq = ceph.get_create_rgw_pools_rq(
prefix=config('zone') or config('pool-prefix')) prefix=config('zone') or config('pool-prefix'))
except ValueError as e: except ValueError as e:
@ -271,6 +270,7 @@ def mon_relation(rid=None, unit=None):
'configuration?: "{}"'.format(str(e)), 'configuration?: "{}"'.format(str(e)),
level=DEBUG) level=DEBUG)
return return
if is_request_complete(rq, relation='mon'): if is_request_complete(rq, relation='mon'):
log('Broker request complete', level=DEBUG) log('Broker request complete', level=DEBUG)
CONFIGS.write_all() CONFIGS.write_all()
@ -313,7 +313,24 @@ def mon_relation(rid=None, unit=None):
.format(service_name()), level=DEBUG) .format(service_name()), level=DEBUG)
service_resume(service_name()) service_resume(service_name())
process_multisite_relations() if multisite_deployment():
process_multisite_relations()
elif is_leader():
# In a non multi-site deployment create the
# zone using the default zonegroup and restart the service
internal_url = '{}:{}'.format(
canonical_url(CONFIGS, INTERNAL),
listen_port(),
)
endpoints = [internal_url]
zonegroup = 'default'
zone = config('zone')
if zone not in multisite.list_zones():
multisite.create_zone(zone,
endpoints=endpoints,
default=True, master=True,
zonegroup=zonegroup)
service_restart(service_name())
else: else:
send_request_if_needed(rq, relation='mon') send_request_if_needed(rq, relation='mon')
_mon_relation() _mon_relation()

View File

@ -103,6 +103,7 @@ class MultisiteActionsTestCase(CharmTestCase):
self.multisite.update_period.assert_called_once_with() self.multisite.update_period.assert_called_once_with()
def test_promote_unconfigured(self): def test_promote_unconfigured(self):
self.test_config.set('zone', None)
actions.promote([]) actions.promote([])
self.action_fail.assert_called_once() self.action_fail.assert_called_once()
@ -116,6 +117,7 @@ class MultisiteActionsTestCase(CharmTestCase):
self.multisite.update_period.assert_called_once_with() self.multisite.update_period.assert_called_once_with()
def test_readonly_unconfigured(self): def test_readonly_unconfigured(self):
self.test_config.set('zone', None)
actions.readonly([]) actions.readonly([])
self.action_fail.assert_called_once() self.action_fail.assert_called_once()
@ -129,6 +131,7 @@ class MultisiteActionsTestCase(CharmTestCase):
self.multisite.update_period.assert_called_once_with() self.multisite.update_period.assert_called_once_with()
def test_readwrite_unconfigured(self): def test_readwrite_unconfigured(self):
self.test_config.set('zone', None)
actions.readwrite([]) actions.readwrite([])
self.action_fail.assert_called_once() self.action_fail.assert_called_once()
@ -138,5 +141,6 @@ class MultisiteActionsTestCase(CharmTestCase):
self.multisite.tidy_defaults.assert_called_once_with() self.multisite.tidy_defaults.assert_called_once_with()
def test_tidydefaults_unconfigured(self): def test_tidydefaults_unconfigured(self):
self.test_config.set('zone', None)
actions.tidydefaults([]) actions.tidydefaults([])
self.action_fail.assert_called_once() self.action_fail.assert_called_once()

View File

@ -385,7 +385,7 @@ class MonContextTest(CharmTestCase):
'port': 70, 'port': 70,
'client_radosgw_gateway': {'rgw init timeout': 60}, 'client_radosgw_gateway': {'rgw init timeout': 60},
'ipv6': False, 'ipv6': False,
'rgw_zone': None, 'rgw_zone': 'default',
'fsid': 'testfsid', 'fsid': 'testfsid',
} }
self.assertEqual(expect, mon_ctxt()) self.assertEqual(expect, mon_ctxt())
@ -433,7 +433,7 @@ class MonContextTest(CharmTestCase):
'port': 70, 'port': 70,
'client_radosgw_gateway': {'rgw init timeout': 60}, 'client_radosgw_gateway': {'rgw init timeout': 60},
'ipv6': False, 'ipv6': False,
'rgw_zone': None, 'rgw_zone': 'default',
'fsid': 'testfsid', 'fsid': 'testfsid',
} }
self.assertEqual(expect, mon_ctxt()) self.assertEqual(expect, mon_ctxt())
@ -490,7 +490,7 @@ class MonContextTest(CharmTestCase):
'port': 70, 'port': 70,
'client_radosgw_gateway': {'rgw init timeout': 60}, 'client_radosgw_gateway': {'rgw init timeout': 60},
'ipv6': False, 'ipv6': False,
'rgw_zone': None, 'rgw_zone': 'default',
'fsid': 'testfsid', 'fsid': 'testfsid',
} }
self.assertEqual(expect, mon_ctxt()) self.assertEqual(expect, mon_ctxt())
@ -529,7 +529,7 @@ class MonContextTest(CharmTestCase):
'port': 70, 'port': 70,
'client_radosgw_gateway': {'rgw init timeout': 60}, 'client_radosgw_gateway': {'rgw init timeout': 60},
'ipv6': False, 'ipv6': False,
'rgw_zone': None, 'rgw_zone': 'default',
'fsid': 'testfsid', 'fsid': 'testfsid',
} }
self.assertEqual(expect, mon_ctxt()) self.assertEqual(expect, mon_ctxt())

View File

@ -68,6 +68,7 @@ TO_PATCH = [
'filter_missing_packages', 'filter_missing_packages',
'ceph_utils', 'ceph_utils',
'multisite_deployment', 'multisite_deployment',
'multisite',
] ]
@ -189,10 +190,15 @@ class CephRadosGWTests(CharmTestCase):
@patch.object(ceph_hooks, 'is_request_complete', @patch.object(ceph_hooks, 'is_request_complete',
lambda *args, **kwargs: True) lambda *args, **kwargs: True)
def test_mon_relation(self): @patch.object(ceph_hooks, 'is_leader')
@patch('charmhelpers.contrib.openstack.ip.resolve_address')
@patch('charmhelpers.contrib.openstack.ip.config')
def test_mon_relation(self, _config, _resolve_address, is_leader):
_ceph = self.patch('ceph') _ceph = self.patch('ceph')
_ceph.import_radosgw_key.return_value = True _ceph.import_radosgw_key.return_value = True
is_leader.return_value = True
self.relation_get.return_value = 'seckey' self.relation_get.return_value = 'seckey'
self.multisite.list_zones.return_value = []
self.socket.gethostname.return_value = 'testinghostname' self.socket.gethostname.return_value = 'testinghostname'
ceph_hooks.mon_relation() ceph_hooks.mon_relation()
self.relation_set.assert_not_called() self.relation_set.assert_not_called()
@ -203,9 +209,14 @@ class CephRadosGWTests(CharmTestCase):
@patch.object(ceph_hooks, 'is_request_complete', @patch.object(ceph_hooks, 'is_request_complete',
lambda *args, **kwargs: True) lambda *args, **kwargs: True)
def test_mon_relation_request_key(self): @patch.object(ceph_hooks, 'is_leader')
@patch('charmhelpers.contrib.openstack.ip.resolve_address')
@patch('charmhelpers.contrib.openstack.ip.config')
def test_mon_relation_request_key(self, _config,
_resolve_address, is_leader):
_ceph = self.patch('ceph') _ceph = self.patch('ceph')
_ceph.import_radosgw_key.return_value = True _ceph.import_radosgw_key.return_value = True
is_leader.return_value = True
self.relation_get.return_value = 'seckey' self.relation_get.return_value = 'seckey'
self.socket.gethostname.return_value = 'testinghostname' self.socket.gethostname.return_value = 'testinghostname'
self.request_per_unit_key.return_value = True self.request_per_unit_key.return_value = True
@ -221,10 +232,15 @@ class CephRadosGWTests(CharmTestCase):
@patch.object(ceph_hooks, 'is_request_complete', @patch.object(ceph_hooks, 'is_request_complete',
lambda *args, **kwargs: True) lambda *args, **kwargs: True)
def test_mon_relation_nokey(self): @patch.object(ceph_hooks, 'is_leader')
@patch('charmhelpers.contrib.openstack.ip.resolve_address')
@patch('charmhelpers.contrib.openstack.ip.config')
def test_mon_relation_nokey(self, _config,
_resolve_address, is_leader):
_ceph = self.patch('ceph') _ceph = self.patch('ceph')
_ceph.import_radosgw_key.return_value = False _ceph.import_radosgw_key.return_value = False
self.relation_get.return_value = None self.relation_get.return_value = None
is_leader.return_value = True
ceph_hooks.mon_relation() ceph_hooks.mon_relation()
self.assertFalse(_ceph.import_radosgw_key.called) self.assertFalse(_ceph.import_radosgw_key.called)
self.service_resume.assert_not_called() self.service_resume.assert_not_called()
@ -493,6 +509,7 @@ class MiscMultisiteTests(CharmTestCase):
'slave_relation_changed', 'slave_relation_changed',
'service_restart', 'service_restart',
'service_name', 'service_name',
'multisite'
] ]
_relation_ids = { _relation_ids = {