Ensure leader settings on charm upgrade

Currently bootstrapping is gated by is_leader_bootstrapped which
checks a handful of leader settings. When upgrading from older
versions of the charm, these settings are missing leading to an
attempt to bootstrap an already bootstrapped cluster.

This change makes sure the leader settings is_leader_bootstrapped is
checking for are all set by the leader on upgrade-charm.

Closes-Bug: #1755507

Change-Id: I172f10221b9447ca3e0c5403feaa49acccfa9e42
This commit is contained in:
David Ames 2018-03-14 21:43:11 +00:00
parent bf84218e31
commit 5bce1985e1
2 changed files with 17 additions and 24 deletions

View File

@ -305,8 +305,11 @@ def upgrade():
log('Unit is paused, skiping upgrade', level=INFO)
return
# Set the Leader's IP
# Leader sets on upgrade
leader_set(**{'leader-ip': get_relation_ip('cluster')})
configure_sstuser(sst_password())
if not leader_get('root-password') and leader_get('mysql.passwd'):
leader_set(**{'root-password': leader_get('mysql.passwd')})
# broadcast the bootstrap-uuid
wsrep_ready = get_wsrep_value('wsrep_ready') or ""

View File

@ -1,5 +1,4 @@
import mock
import os
import shutil
import sys
import tempfile
@ -485,6 +484,11 @@ class TestUpgradeCharm(CharmTestCase):
'config_changed',
'get_relation_ip',
'leader_set',
'sst_password',
'configure_sstuser',
'leader_get',
'notify_bootstrapped',
'mark_seeded',
]
def print_log(self, msg, level=None):
@ -503,19 +507,11 @@ class TestUpgradeCharm(CharmTestCase):
except:
pass
@mock.patch('percona_utils.is_leader')
@mock.patch('percona_utils.leader_set')
@mock.patch('percona_utils.relation_set')
@mock.patch('percona_utils.get_wsrep_value')
@mock.patch('percona_utils.relation_ids')
@mock.patch('percona_utils.resolve_data_dir')
def test_upgrade_charm(self, mock_data_dir, mock_rids, mock_wsrep,
mock_rset, mock_lset, mock_is_leader):
mock_rids.return_value = ['cluster:22']
mock_is_leader.return_value = True
def test_upgrade_charm_leader(self):
self.is_leader.return_value = True
self.is_unit_paused_set.return_value = False
self.get_relation_ip.return_value = '10.10.10.10'
self.leader_get.side_effect = [None, 'mypasswd', 'mypasswd']
def c(k):
values = {'wsrep_ready': 'on',
@ -523,19 +519,13 @@ class TestUpgradeCharm(CharmTestCase):
return values[k]
self.get_wsrep_value.side_effect = c
mock_wsrep.side_effect = c
mock_data_dir.return_value = self.tmpdir
hooks.upgrade()
seeded_file = os.path.join(self.tmpdir, 'seeded')
self.assertTrue(os.path.isfile(seeded_file),
"%s is not file" % seeded_file)
with open(seeded_file) as f:
self.assertEqual(f.read(), 'done')
self.mark_seeded.assert_called_once()
self.notify_bootstrapped.assert_called_with(cluster_uuid='1234-abcd')
self.configure_sstuser.assert_called_once()
mock_rset.assert_called_with(relation_id='cluster:22',
**{'bootstrap-uuid': '1234-abcd'})
mock_lset.assert_called_with(**{'bootstrap-uuid': '1234-abcd'})
self.leader_set.assert_called_with(**{'leader-ip': '10.10.10.10'})
self.leader_set.assert_has_calls(
[mock.call(**{'leader-ip': '10.10.10.10'}),
mock.call(**{'root-password': 'mypasswd'})])