Example #1
0
 def push_corosync_conf(
     self, corosync_conf_facade, skip_offline_nodes=False
 ):
     corosync_conf_data = corosync_conf_facade.config.export()
     if self.is_corosync_conf_live:
         node_list = corosync_conf_facade.get_nodes()
         if corosync_conf_facade.need_stopped_cluster:
             check_corosync_offline_on_nodes(
                 self.node_communicator(),
                 self.report_processor,
                 node_list,
                 skip_offline_nodes
             )
         distribute_corosync_conf(
             self.node_communicator(),
             self.report_processor,
             node_list,
             corosync_conf_data,
             skip_offline_nodes
         )
         if is_service_running(self.cmd_runner(), "corosync"):
             reload_corosync_config(self.cmd_runner())
             self.report_processor.process(
                 reports.corosync_config_reloaded()
             )
         if corosync_conf_facade.need_qdevice_reload:
             qdevice_reload_on_nodes(
                 self.node_communicator(),
                 self.report_processor,
                 node_list,
                 skip_offline_nodes
             )
     else:
         self._corosync_conf_data = corosync_conf_data
Example #2
0
    def test_success(self):
        nodes = ["node1", "node2"]
        node_addrs_list = NodeAddressesList(
            [NodeAddresses(addr) for addr in nodes]
        )
        self.mock_communicator.call_node.return_value = '{"corosync": false}'

        lib.check_corosync_offline_on_nodes(
            self.mock_communicator,
            self.mock_reporter,
            node_addrs_list
        )

        assert_report_item_list_equal(
            self.mock_reporter.report_item_list,
            [
                (
                    severity.INFO,
                    report_codes.COROSYNC_NOT_RUNNING_CHECK_STARTED,
                    {}
                ),
                (
                    severity.INFO,
                    report_codes.COROSYNC_NOT_RUNNING_ON_NODE,
                    {"node": nodes[0]}
                ),
                (
                    severity.INFO,
                    report_codes.COROSYNC_NOT_RUNNING_ON_NODE,
                    {"node": nodes[1]}
                ),
            ]
        )
Example #3
0
def disable_sbd(lib_env, ignore_offline_nodes=False):
    """
    Disable SBD on all nodes in cluster.

    lib_env -- LibraryEnvironment
    ignore_offline_nodes -- if True, omit offline nodes
    """
    node_list = _get_online_nodes(lib_env, _get_cluster_nodes(lib_env),
                                  ignore_offline_nodes)

    if lib_env.is_cman_cluster:
        nodes_task.check_corosync_offline_on_nodes(lib_env.node_communicator(),
                                                   lib_env.report_processor,
                                                   node_list,
                                                   ignore_offline_nodes)

    sbd.set_stonith_watchdog_timeout_to_zero_on_all_nodes(
        lib_env.node_communicator(), node_list)
    sbd.disable_sbd_service_on_all_nodes(lib_env.report_processor,
                                         lib_env.node_communicator(),
                                         node_list)

    if not lib_env.is_cman_cluster:
        lib_env.report_processor.process(
            reports.cluster_restart_required_to_apply_changes())
Example #4
0
def disable_sbd(lib_env, ignore_offline_nodes=False):
    """
    Disable SBD on all nodes in cluster.

    lib_env -- LibraryEnvironment
    ignore_offline_nodes -- if True, omit offline nodes
    """
    node_list = _get_online_nodes(
        lib_env, _get_cluster_nodes(lib_env), ignore_offline_nodes
    )

    if lib_env.is_cman_cluster:
        nodes_task.check_corosync_offline_on_nodes(
            lib_env.node_communicator(),
            lib_env.report_processor,
            node_list,
            ignore_offline_nodes
        )

    sbd.set_stonith_watchdog_timeout_to_zero_on_all_nodes(
        lib_env.node_communicator(), node_list
    )
    sbd.disable_sbd_service_on_all_nodes(
        lib_env.report_processor,
        lib_env.node_communicator(),
        node_list
    )

    if not lib_env.is_cman_cluster:
        lib_env.report_processor.process(
            reports.cluster_restart_required_to_apply_changes()
        )
Example #5
0
    def test_errors_forced(self):
        nodes = ["node1", "node2"]
        node_addrs_list = NodeAddressesList([NodeAddresses(addr) for addr in nodes])

        def side_effect(node, request, data):
            if node.ring0 == nodes[1]:
                raise NodeAuthenticationException(nodes[1], "command", "HTTP error: 401")
            return "{"  # invalid json

        self.mock_communicator.call_node.side_effect = side_effect

        lib.check_corosync_offline_on_nodes(
            self.mock_communicator, self.mock_reporter, node_addrs_list, skip_offline_nodes=True
        )

        assert_report_item_list_equal(
            self.mock_reporter.report_item_list,
            [
                (severity.INFO, report_codes.COROSYNC_NOT_RUNNING_CHECK_STARTED, {}),
                (severity.WARNING, report_codes.COROSYNC_NOT_RUNNING_CHECK_NODE_ERROR, {"node": nodes[0]}),
                (
                    severity.WARNING,
                    report_codes.NODE_COMMUNICATION_ERROR_NOT_AUTHORIZED,
                    {"node": nodes[1], "command": "command", "reason": "HTTP error: 401"},
                ),
                (severity.WARNING, report_codes.COROSYNC_NOT_RUNNING_CHECK_NODE_ERROR, {"node": nodes[1]}),
            ],
        )
Example #6
0
File: env.py Project: jmartign/pcs
 def push_corosync_conf(
     self, corosync_conf_facade, skip_offline_nodes=False
 ):
     corosync_conf_data = corosync_conf_facade.config.export()
     if self.is_corosync_conf_live:
         node_list = corosync_conf_facade.get_nodes()
         if corosync_conf_facade.need_stopped_cluster:
             check_corosync_offline_on_nodes(
                 self.node_communicator(),
                 self.report_processor,
                 node_list,
                 skip_offline_nodes
             )
         distribute_corosync_conf(
             self.node_communicator(),
             self.report_processor,
             node_list,
             corosync_conf_data,
             skip_offline_nodes
         )
         if is_service_running(self.cmd_runner(), "corosync"):
             reload_corosync_config(self.cmd_runner())
             self.report_processor.process(
                 reports.corosync_config_reloaded()
             )
         if corosync_conf_facade.need_qdevice_reload:
             qdevice_reload_on_nodes(
                 self.node_communicator(),
                 self.report_processor,
                 node_list,
                 skip_offline_nodes
             )
     else:
         self._corosync_conf_data = corosync_conf_data
Example #7
0
    def test_node_down(self):
        nodes = ["node1", "node2"]
        node_addrs_list = NodeAddressesList(
            [NodeAddresses(addr) for addr in nodes])

        def side_effect(node, request, data):
            if node.ring0 == nodes[1]:
                raise NodeAuthenticationException(nodes[1], "command",
                                                  "HTTP error: 401")
            return '{"corosync": false}'

        self.mock_communicator.call_node.side_effect = side_effect

        assert_raise_library_error(
            lambda: lib.check_corosync_offline_on_nodes(
                self.mock_communicator, self.mock_reporter, node_addrs_list),
            (severity.ERROR,
             report_codes.NODE_COMMUNICATION_ERROR_NOT_AUTHORIZED, {
                 "node": nodes[1],
                 "command": "command",
                 "reason": "HTTP error: 401",
             }, report_codes.SKIP_OFFLINE_NODES),
            (severity.ERROR,
             report_codes.COROSYNC_NOT_RUNNING_CHECK_NODE_ERROR, {
                 "node": nodes[1],
             }, report_codes.SKIP_OFFLINE_NODES))
Example #8
0
    def test_json_error(self):
        nodes = ["node1", "node2"]
        node_addrs_list = NodeAddressesList(
            [NodeAddresses(addr) for addr in nodes]
        )
        self.mock_communicator.call_node.side_effect = [
            '{}', # missing key
            '{', # not valid json
        ]

        assert_raise_library_error(
            lambda: lib.check_corosync_offline_on_nodes(
                self.mock_communicator,
                self.mock_reporter,
                node_addrs_list
            ),
            (
                severity.ERROR,
                report_codes.COROSYNC_NOT_RUNNING_CHECK_NODE_ERROR,
                {
                    "node": nodes[0],
                },
                report_codes.SKIP_OFFLINE_NODES
            ),
            (
                severity.ERROR,
                report_codes.COROSYNC_NOT_RUNNING_CHECK_NODE_ERROR,
                {
                    "node": nodes[1],
                },
                report_codes.SKIP_OFFLINE_NODES
            )
        )
Example #9
0
    def test_node_down(self):
        nodes = ["node1", "node2"]
        node_addrs_list = NodeAddressesList([NodeAddresses(addr) for addr in nodes])

        def side_effect(node, request, data):
            if node.ring0 == nodes[1]:
                raise NodeAuthenticationException(nodes[1], "command", "HTTP error: 401")
            return '{"corosync": false}'

        self.mock_communicator.call_node.side_effect = side_effect

        assert_raise_library_error(
            lambda: lib.check_corosync_offline_on_nodes(self.mock_communicator, self.mock_reporter, node_addrs_list),
            (
                severity.ERROR,
                report_codes.NODE_COMMUNICATION_ERROR_NOT_AUTHORIZED,
                {"node": nodes[1], "command": "command", "reason": "HTTP error: 401"},
                report_codes.SKIP_OFFLINE_NODES,
            ),
            (
                severity.ERROR,
                report_codes.COROSYNC_NOT_RUNNING_CHECK_NODE_ERROR,
                {"node": nodes[1]},
                report_codes.SKIP_OFFLINE_NODES,
            ),
        )
Example #10
0
    def test_one_node_running(self):
        node_responses = {
            "node1": '{"corosync": false}',
            "node2": '{"corosync": true}',
        }
        node_addrs_list = NodeAddressesList(
            [NodeAddresses(addr) for addr in node_responses.keys()]
        )

        self.mock_communicator.call_node.side_effect = (
            lambda node, request, data: node_responses[node.label]
        )


        assert_raise_library_error(
            lambda: lib.check_corosync_offline_on_nodes(
                self.mock_communicator,
                self.mock_reporter,
                node_addrs_list
            ),
            (
                severity.ERROR,
                report_codes.COROSYNC_RUNNING_ON_NODE,
                {
                    "node": "node2",
                }
            )
        )
Example #11
0
    def test_one_node_running(self):
        nodes = ["node1", "node2"]
        node_addrs_list = NodeAddressesList([NodeAddresses(addr) for addr in nodes])
        self.mock_communicator.call_node.side_effect = ['{"corosync": false}', '{"corosync": true}']

        assert_raise_library_error(
            lambda: lib.check_corosync_offline_on_nodes(self.mock_communicator, self.mock_reporter, node_addrs_list),
            (severity.ERROR, report_codes.COROSYNC_RUNNING_ON_NODE, {"node": nodes[1]}),
        )
Example #12
0
    def test_success(self):
        nodes = ["node1", "node2"]
        node_addrs_list = NodeAddressesList(
            [NodeAddresses(addr) for addr in nodes])
        self.mock_communicator.call_node.return_value = '{"corosync": false}'

        lib.check_corosync_offline_on_nodes(self.mock_communicator,
                                            self.mock_reporter,
                                            node_addrs_list)

        assert_report_item_list_equal(self.mock_reporter.report_item_list, [
            (severity.INFO, report_codes.COROSYNC_NOT_RUNNING_CHECK_STARTED,
             {}),
            (severity.INFO, report_codes.COROSYNC_NOT_RUNNING_ON_NODE, {
                "node": nodes[0]
            }),
            (severity.INFO, report_codes.COROSYNC_NOT_RUNNING_ON_NODE, {
                "node": nodes[1]
            }),
        ])
Example #13
0
    def test_errors_forced(self):
        nodes = ["node1", "node2"]
        node_addrs_list = NodeAddressesList(
            [NodeAddresses(addr) for addr in nodes])

        def side_effect(node, request, data):
            if node.ring0 == nodes[1]:
                raise NodeAuthenticationException(nodes[1], "command",
                                                  "HTTP error: 401")
            return '{'  # invalid json

        self.mock_communicator.call_node.side_effect = side_effect

        lib.check_corosync_offline_on_nodes(self.mock_communicator,
                                            self.mock_reporter,
                                            node_addrs_list,
                                            skip_offline_nodes=True)

        assert_report_item_list_equal(
            self.mock_reporter.report_item_list,
            [(severity.INFO, report_codes.COROSYNC_NOT_RUNNING_CHECK_STARTED,
              {}),
             (severity.WARNING,
              report_codes.COROSYNC_NOT_RUNNING_CHECK_NODE_ERROR, {
                  "node": nodes[0],
              }),
             (severity.WARNING,
              report_codes.NODE_COMMUNICATION_ERROR_NOT_AUTHORIZED, {
                  "node": nodes[1],
                  "command": "command",
                  "reason": "HTTP error: 401",
              }),
             (severity.WARNING,
              report_codes.COROSYNC_NOT_RUNNING_CHECK_NODE_ERROR, {
                  "node": nodes[1],
              })])
Example #14
0
    def test_one_node_running(self):
        nodes = ["node1", "node2"]
        node_addrs_list = NodeAddressesList(
            [NodeAddresses(addr) for addr in nodes])
        self.mock_communicator.call_node.side_effect = [
            '{"corosync": false}',
            '{"corosync": true}',
        ]

        assert_raise_library_error(
            lambda: lib.check_corosync_offline_on_nodes(
                self.mock_communicator, self.mock_reporter, node_addrs_list),
            (severity.ERROR, report_codes.COROSYNC_RUNNING_ON_NODE, {
                "node": nodes[1],
            }))
Example #15
0
    def test_one_node_running(self):
        node_responses = {
            "node1": '{"corosync": false}',
            "node2": '{"corosync": true}',
        }
        node_addrs_list = NodeAddressesList(
            [NodeAddresses(addr) for addr in node_responses.keys()])

        self.mock_communicator.call_node.side_effect = (
            lambda node, request, data: node_responses[node.label])

        assert_raise_library_error(
            lambda: lib.check_corosync_offline_on_nodes(
                self.mock_communicator, self.mock_reporter, node_addrs_list),
            (severity.ERROR, report_codes.COROSYNC_RUNNING_ON_NODE, {
                "node": "node2",
            }))
Example #16
0
    def test_json_error(self):
        nodes = ["node1", "node2"]
        node_addrs_list = NodeAddressesList(
            [NodeAddresses(addr) for addr in nodes])
        self.mock_communicator.call_node.side_effect = [
            '{}',  # missing key
            '{',  # not valid json
        ]

        assert_raise_library_error(
            lambda: lib.check_corosync_offline_on_nodes(
                self.mock_communicator, self.mock_reporter, node_addrs_list),
            (severity.ERROR,
             report_codes.COROSYNC_NOT_RUNNING_CHECK_NODE_ERROR, {
                 "node": nodes[0],
             }, report_codes.SKIP_OFFLINE_NODES),
            (severity.ERROR,
             report_codes.COROSYNC_NOT_RUNNING_CHECK_NODE_ERROR, {
                 "node": nodes[1],
             }, report_codes.SKIP_OFFLINE_NODES))