コード例 #1
0
    def test_update_controller_ip_port_list(self):
        """Test update_controller_ip_port_list.

        Add a unit and then delete a unit, then query the list of ports to
        check that the port has been deleted.
        """
        raise unittest.SkipTest("Skipping because of lp:1951858")
        app = self.test_config['charm_name']
        logging.info("test_update_controller_ip_port_list: start test")
        logging.info("Wait till model is idle ...")
        zaza.model.block_until_all_units_idle()
        ips = self.get_port_ips()
        num = len(ips)
        logging.info('initial hm port num is {}: {}'.format(num, ips))

        logging.info("test_update_controller_ip_port_list: add one unit")
        logging.info("Adding one unit ...")
        zaza.model.add_unit(app)
        logging.info("Wait until one unit is added ...")
        zaza.model.block_until_unit_count(app, num+1)
        zaza.model.wait_for_application_states()
        ips = self.get_port_ips()
        logging.info('hm ports are {} after adding one unit'.format(ips))
        self.assertTrue(len(ips) == num+1)

        logging.info("test_update_controller_ip_port_list: remove one unit")
        logging.info("Removing one unit ...")
        _, nons = generic_utils.get_leaders_and_non_leaders(app)
        zaza.model.destroy_unit(app, nons[0])
        logging.info("Wait until one unit is deleted ...")
        zaza.model.block_until_unit_count(app, num)
        zaza.model.wait_for_application_states()
        ips = self.get_port_ips()
        logging.info('hm ports are {} after deleting one unit'.format(ips))
        self.assertTrue(len(ips) == num)
コード例 #2
0
    def test_803_remove_fourth(self):
        """Remove mysql-innodb-cluster node.

        We start with a four node full cluster, remove one, down to a three
        node full cluster.
        """
        leader, nons = generic_utils.get_leaders_and_non_leaders(
            self.application_name)
        non_leader_unit = zaza.model.get_unit_from_name(nons[0])
        non_leader_unit_ip = zaza.model.get_unit_public_address(
            non_leader_unit)

        # Wait until we are idle in the hopes clients are not running
        # update-status hooks
        logging.info("Wait till model is idle ...")
        zaza.model.block_until_all_units_idle()

        zaza.model.destroy_unit(self.application_name, nons[0])

        logging.info("Scale in test: back down to three")
        logging.info("Wait until 3 units ...")
        zaza.model.block_until_unit_count(self.application, 3)

        logging.info("Wait for status ready ...")
        zaza.model.wait_for_application_states(states=self.states)

        # Show status
        logging.info(self.get_cluster_status())

        logging.info(
            "Removing old unit from cluster: {} ".format(non_leader_unit_ip))
        action = zaza.model.run_action(leader,
                                       "remove-instance",
                                       action_params={
                                           "address": non_leader_unit_ip,
                                           "force": True
                                       })
        assert action.data.get("results") is not None, (
            "Remove instance action failed: No results: {}".format(
                action.data))
コード例 #3
0
    def test_800_remove_leader(self):
        """Remove leader node.

        We start with a three node cluster, remove one, down to two.
        The cluster will be in waiting state.
        """
        logging.info("Scale in test: remove leader")
        leader, nons = generic_utils.get_leaders_and_non_leaders(
            self.application_name)
        leader_unit = zaza.model.get_unit_from_name(leader)

        # Wait until we are idle in the hopes clients are not running
        # update-status hooks
        logging.info("Wait till model is idle ...")
        zaza.model.block_until_all_units_idle()
        zaza.model.destroy_unit(self.application_name, leader)

        logging.info("Wait until all only 2 units ...")
        zaza.model.block_until_unit_count(self.application, 2)

        logging.info("Wait until all units are cluster incomplete ...")
        zaza.model.block_until_wl_status_info_starts_with(
            self.application, "'cluster' incomplete")

        # Show status
        logging.info(self.get_cluster_status())

        logging.info(
            "Removing old unit from cluster: {} "
            .format(zaza.model.get_unit_public_address(leader_unit)))
        action = zaza.model.run_action(
            nons[0],
            "remove-instance",
            action_params={
                "address": zaza.model.get_unit_public_address(leader_unit),
                "force": True})
        assert action.data.get("results") is not None, (
            "Remove instance action failed: No results: {}"
            .format(action.data))
コード例 #4
0
    def test_100_cold_start_bootstrap(self):
        """Bootstrap a non-leader node.

        After bootstrapping a non-leader node, notify bootstrapped on the
        leader node.
        """
        _machines = sorted(
            juju_utils.get_machine_uuids_for_application(self.application))
        # Stop Nodes
        # Avoid hitting an update-status hook
        logging.info("Wait till model is idle ...")
        zaza.model.block_until_all_units_idle()
        logging.info("Stopping instances: {}".format(_machines))
        for uuid in _machines:
            self.nova_client.servers.stop(uuid)
        logging.info("Wait till all machines are shutoff ...")
        for uuid in _machines:
            openstack_utils.resource_reaches_status(self.nova_client.servers,
                                                    uuid,
                                                    expected_status='SHUTOFF',
                                                    stop_after_attempt=16)

        # Start nodes
        _machines.sort(reverse=True)
        logging.info("Starting instances: {}".format(_machines))
        for uuid in _machines:
            self.nova_client.servers.start(uuid)

        for unit in zaza.model.get_units(self.application):
            zaza.model.block_until_unit_wl_status(
                unit.entity_id,
                'unknown',
                negate_match=True)

        logging.info("Wait till model is idle ...")
        # XXX If a hook was executing on a unit when it was powered off
        #     it comes back in an error state.
        try:
            zaza.model.block_until_all_units_idle()
        except zaza.model.UnitError:
            self.resolve_update_status_errors()
            zaza.model.block_until_all_units_idle()

        logging.info("Wait for application states ...")
        for unit in zaza.model.get_units(self.application):
            try:
                zaza.model.run_on_unit(unit.entity_id, "hooks/update-status")
            except zaza.model.UnitError:
                self.resolve_update_status_errors()
                zaza.model.run_on_unit(unit.entity_id, "hooks/update-status")
        states = {"percona-cluster": {
            "workload-status": "blocked",
            "workload-status-message": "MySQL is down"}}
        zaza.model.wait_for_application_states(states=states)

        # Update which node is the leader and which are not
        _leader, _non_leaders = generic_utils.get_leaders_and_non_leaders(
            self.application_name)
        # We want to test the worst possible scenario which is the
        # non-leader with the highest sequence number. We will use the leader
        # for the notify-bootstrapped after. They just need to be different
        # units.
        logging.info("Execute bootstrap-pxc action after cold boot ...")
        zaza.model.run_action(
            _non_leaders[0],
            "bootstrap-pxc",
            action_params={})
        logging.info("Wait for application states ...")
        for unit in zaza.model.get_units(self.application):
            zaza.model.run_on_unit(unit.entity_id, "hooks/update-status")
        states = {"percona-cluster": {
            "workload-status": "waiting",
            "workload-status-message": "Unit waiting for cluster bootstrap"}}
        zaza.model.wait_for_application_states(
            states=states)
        logging.info("Execute notify-bootstrapped action after cold boot on "
                     "the leader node ...")
        zaza.model.run_action_on_leader(
            self.application,
            "notify-bootstrapped",
            action_params={})
        logging.info("Wait for application states ...")
        for unit in zaza.model.get_units(self.application):
            zaza.model.run_on_unit(unit.entity_id, "hooks/update-status")
        test_config = lifecycle_utils.get_charm_config(fatal=False)
        zaza.model.wait_for_application_states(
            states=test_config.get("target_deploy_status", {}))