Ejemplo n.º 1
0
Archivo: live.py Proyecto: bgistone/pcs
def remove_node(runner, node_name):
    stdout, stderr, retval = runner.run([
        __exec("crm_node"),
        "--force",
        "--remove",
        node_name,
    ])
    if retval != 0:
        raise LibraryError(
            reports.node_remove_in_pacemaker_failed(node_name,
                                                    reason=join_multilines(
                                                        [stderr, stdout])))
Ejemplo n.º 2
0
def remove_node(runner, node_name):
    stdout, stderr, retval = runner.run([
        __exec("crm_node"),
        "--force",
        "--remove",
        node_name,
    ])
    if retval != 0:
        raise LibraryError(
            reports.node_remove_in_pacemaker_failed(
                [node_name],
                reason=join_multilines([stderr, stdout])
            )
        )
Ejemplo n.º 3
0
 def _process_response(self, response):
     report = self._get_response_report(response)
     if report is not None:
         self._report(report)
         return
     node_label = response.request.target.label
     try:
         output = json.loads(response.data)
         if output["code"] != "success":
             self._report(
                 reports.node_remove_in_pacemaker_failed(
                     self._nodes_to_remove,
                     node=node_label,
                     reason=output["message"],
                 ))
     except (KeyError, json.JSONDecodeError):
         self._report(reports.invalid_response_format(node_label))
Ejemplo n.º 4
0
 def _process_response(self, response):
     report = self._get_response_report(response)
     if report is not None:
         self._report(report)
         return
     node_label = response.request.target.label
     try:
         output = json.loads(response.data)
         if output["code"] != "success":
             self._report(
                 reports.node_remove_in_pacemaker_failed(
                     self._nodes_to_remove,
                     node=node_label,
                     reason=output["message"],
                 )
             )
     except (KeyError, json.JSONDecodeError):
         self._report(reports.invalid_response_format(node_label))
Ejemplo n.º 5
0
def remove_nodes_from_cib(env, node_list):
    """
    Remove specified nodes from CIB. When pcmk is running 'crm_node -R <node>'
    will be used. Otherwise nodes will be removed directly from CIB file.

    env LibraryEnvironment
    node_list iterable -- names of nodes to remove
    """
    # TODO: more advanced error handling
    # TODO: Tests
    if not env.is_cib_live:
        raise LibraryError(reports.live_environment_required(["CIB"]))

    if is_service_running(env.cmd_runner(), "pacemaker"):
        for node in node_list:
            # this may raise a LibraryError
            # NOTE: crm_node cannot remove multiple nodes at once
            remove_node(env.cmd_runner(), node)
        return

    # TODO: We need to remove nodes from the CIB file. We don't want to do it
    # using environment as this is a special case in which we have to edit CIB
    # file directly.
    for node in node_list:
        stdout, stderr, retval = env.cmd_runner().run(
            [
                settings.cibadmin,
                "--delete-all",
                "--force",
                f"--xpath=/cib/configuration/nodes/node[@uname='{node}']",
            ],
            env_extend={"CIB_file": os.path.join(settings.cib_dir, "cib.xml")}
        )
        if retval != 0:
            raise LibraryError(
                reports.node_remove_in_pacemaker_failed(
                    [node],
                    reason=join_multilines([stderr, stdout])
                )
            )