Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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()
Ejemplo n.º 3
0
 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 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()
Ejemplo n.º 6
0
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()
Ejemplo n.º 7
0
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()
Ejemplo n.º 8
0
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()
    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)