def resume(args): """Resume the MySQL service. @raises Exception should the service fail to start. """ resume_unit_helper(register_configs()) # NOTE(ajkavanagh) - we force a config_changed pseudo-hook to see if the # unit needs to bootstrap or restart it's services here. config_changed()
def test_config_changed_open_port(self): '''Ensure open_port is called with MySQL default port''' self.is_unit_paused_set.return_value = False self.is_bootstrapped.return_value = False self.is_leader.return_value = False self.relation_ids.return_value = [] self.is_relation_made.return_value = False hooks.config_changed() self.open_port.assert_called_with(3306)
def test_config_changed_render_leader(self): '''Ensure configuration is only rendered when ready for the leader''' self.is_leader.return_value = True # Render without peers, leader not bootsrapped self.get_cluster_hosts.return_value = [] hooks.config_changed() self.install_percona_xtradb_cluster.assert_called_once() self.render_config_restart_on_changed.assert_called_once_with( [], bootstrap=True) # Render without peers, leader bootstrapped self.is_leader_bootstrapped.return_value = True self.get_cluster_hosts.return_value = [] self.render_config_restart_on_changed.reset_mock() hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( [], bootstrap=False) # Render without hosts, leader bootstrapped, never clustered self.is_leader_bootstrapped.return_value = True self.get_cluster_hosts.return_value = ['10.10.10.20', '10.10.10.30'] self.render_config_restart_on_changed.reset_mock() hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( [], bootstrap=False) # Clustered at least once self.clustered_once.return_value = True # Render with hosts, leader bootstrapped self.is_leader_bootstrapped.return_value = True self.get_cluster_hosts.return_value = ['10.10.10.20', '10.10.10.30'] self.render_config_restart_on_changed.reset_mock() hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( ['10.10.10.20', '10.10.10.30'], bootstrap=False) # In none of the prior scenarios should update_root_password have been # called. self.update_root_password.assert_not_called() # Render with hosts, leader and cluster bootstrapped self.is_leader_bootstrapped.return_value = True self.is_bootstrapped.return_value = True self.get_cluster_hosts.return_value = ['10.10.10.20', '10.10.10.30'] self.render_config_restart_on_changed.reset_mock() hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( ['10.10.10.20', '10.10.10.30'], bootstrap=False) self.update_root_password.assert_called_once()
def complete_cluster_series_upgrade(args): """ Complete the series upgrade process After all nodes have been upgraded, this action is run to inform the whole cluster the upgrade is done. Config files will be re-rendered with each peer in the wsrep_cluster_address config. """ if is_leader(): # Unset cluster_series_upgrading leader_set(cluster_series_upgrading="") leader_set(cluster_series_upgrade_leader="") config_changed()
def complete_cluster_series_upgrade(args): """ Complete the series upgrade process After all nodes have been upgraded, this action is run to inform the whole cluster the upgrade is done. Config files will be re-rendered with each peer in the wsrep_cluster_address config. """ if is_leader(): # Unset cluster_series_upgrading leader_set(cluster_series_upgrading="") leader_set(cluster_series_upgrade_leader="") for r_id in relation_ids('shared-db'): relation_set(relation_id=r_id, relation_settings={DB_SERIES_UPGRADING_KEY: None}) percona_hooks.config_changed()
def test_config_changed_render_non_leader(self): '''Ensure configuration is only rendered when ready for non-leaders''' # Avoid rendering for non-leader. # Bug #1738896 # Leader not bootstrapped # Do not render self.get_cluster_hosts.return_value = ['10.10.10.20', '10.10.10.30', '10.10.10.10'] self.is_leader_bootstrapped.return_value = False hooks.config_changed() self.install_percona_xtradb_cluster.assert_called_once_with() self.render_config_restart_on_changed.assert_not_called() self.update_bootstrap_uuid.assert_not_called() # Leader is bootstrapped, insufficient peers # Do not render self.is_sufficient_peers.return_value = False self.is_leader_bootstrapped.return_value = True self.render_config_restart_on_changed.reset_mock() self.install_percona_xtradb_cluster.reset_mock() hooks.config_changed() self.install_percona_xtradb_cluster.assert_called_once_with() self.render_config_restart_on_changed.assert_not_called() self.update_bootstrap_uuid.assert_not_called() # Leader is bootstrapped, sufficient peers # Use the leader node and render. self.is_sufficient_peers.return_value = True self.is_leader_bootstrapped.return_value = True self.get_cluster_hosts.return_value = [] self.render_config_restart_on_changed.reset_mock() self.install_percona_xtradb_cluster.reset_mock() hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( ['10.10.10.10']) # Missing leader, leader bootstrapped # Bug #1738896 # Leader bootstrapped # Add the leader node and render. self.render_config_restart_on_changed.reset_mock() self.update_bootstrap_uuid.reset_mock() self.get_cluster_hosts.return_value = ['10.10.10.20', '10.10.10.30'] hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( ['10.10.10.10', '10.10.10.20', '10.10.10.30']) self.update_bootstrap_uuid.assert_called_once() # Leader present, leader bootstrapped self.render_config_restart_on_changed.reset_mock() self.update_bootstrap_uuid.reset_mock() self.get_cluster_hosts.return_value = ['10.10.10.20', '10.10.10.30', '10.10.10.10'] hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( ['10.10.10.20', '10.10.10.30', '10.10.10.10']) self.update_bootstrap_uuid.assert_called_once() # In none of the prior scenarios should update_root_password have been # called. is_bootstrapped was defaulted to False self.update_root_password.assert_not_called() self.set_ready_on_peers.assert_not_called() # Leader present, leader bootstrapped, cluster bootstrapped self.is_bootstrapped.return_value = True self.render_config_restart_on_changed.reset_mock() self.update_bootstrap_uuid.reset_mock() self.get_cluster_hosts.return_value = ['10.10.10.20', '10.10.10.30', '10.10.10.10'] hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( ['10.10.10.20', '10.10.10.30', '10.10.10.10']) self.update_bootstrap_uuid.assert_called_once() self.update_root_password.assert_called_once() self.set_ready_on_peers.called_once()
def test_config_changed_open_port(self): '''Ensure open_port is called with MySQL default port''' self.is_leader_bootstrapped.return_value = True hooks.config_changed() self.open_port.assert_called_with(3306)
def test_config_changed_render_non_leader(self): '''Ensure configuration is only rendered when ready for non-leaders''' # Avoid rendering for non-leader. # Bug #1738896 # Leader not bootstrapped # Do not render self.get_cluster_hosts.return_value = [ '10.10.10.20', '10.10.10.30', '10.10.10.10' ] self.is_leader_bootstrapped.return_value = False hooks.config_changed() self.install_percona_xtradb_cluster.assert_called_once_with() self.render_config_restart_on_changed.assert_not_called() self.update_bootstrap_uuid.assert_not_called() # Leader is bootstrapped, insufficient peers # Do not render self.is_sufficient_peers.return_value = False self.is_leader_bootstrapped.return_value = True self.render_config_restart_on_changed.reset_mock() self.install_percona_xtradb_cluster.reset_mock() hooks.config_changed() self.install_percona_xtradb_cluster.assert_called_once_with() self.render_config_restart_on_changed.assert_not_called() self.update_bootstrap_uuid.assert_not_called() # Leader is bootstrapped, sufficient peers # Use the leader node and render. self.is_sufficient_peers.return_value = True self.is_leader_bootstrapped.return_value = True self.get_cluster_hosts.return_value = [] self.render_config_restart_on_changed.reset_mock() self.install_percona_xtradb_cluster.reset_mock() hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( ['10.10.10.10']) # Missing leader, leader bootstrapped # Bug #1738896 # Leader bootstrapped # Add the leader node and render. self.render_config_restart_on_changed.reset_mock() self.update_bootstrap_uuid.reset_mock() self.get_cluster_hosts.return_value = ['10.10.10.20', '10.10.10.30'] hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( ['10.10.10.10', '10.10.10.20', '10.10.10.30']) self.update_bootstrap_uuid.assert_called_once() # Leader present, leader bootstrapped self.render_config_restart_on_changed.reset_mock() self.update_bootstrap_uuid.reset_mock() self.get_cluster_hosts.return_value = [ '10.10.10.20', '10.10.10.30', '10.10.10.10' ] hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( ['10.10.10.20', '10.10.10.30', '10.10.10.10']) self.update_bootstrap_uuid.assert_called_once() # Bug #1838648 # Do not add *this* host as a former leader self.get_cluster_host_ip.return_value = '10.10.10.30' self.render_config_restart_on_changed.reset_mock() self.update_bootstrap_uuid.reset_mock() self.get_cluster_hosts.return_value = ['10.10.10.10', '10.10.10.20'] def _leader_get(key): settings = { 'leader-ip': '10.10.10.30', 'cluster_series_upgrading': False } return settings.get(key) self.leader_get.side_effect = _leader_get hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( ['10.10.10.10', '10.10.10.20']) self.update_bootstrap_uuid.assert_called_once() # In none of the prior scenarios should update_root_password have been # called. is_bootstrapped was defaulted to False self.update_root_password.assert_not_called() self.set_ready_on_peers.assert_not_called() # Leader present, leader bootstrapped, cluster bootstrapped self.is_bootstrapped.return_value = True self.render_config_restart_on_changed.reset_mock() self.update_bootstrap_uuid.reset_mock() self.get_cluster_hosts.return_value = [ '10.10.10.20', '10.10.10.30', '10.10.10.10' ] hooks.config_changed() self.render_config_restart_on_changed.assert_called_once_with( ['10.10.10.20', '10.10.10.30', '10.10.10.10']) self.update_bootstrap_uuid.assert_called_once() self.assertFalse(self.update_root_password.called) self.set_ready_on_peers.called_once()