Exemplo n.º 1
0
def get_fence_agent_info(argv):
    if len(argv) != 1:
        utils.err("One parameter expected")

    agent = argv[0]
    if not agent.startswith("stonith:"):
        utils.err("Invalid fence agent name")

    runner = utils.cmd_runner()

    try:
        metadata_dom = lib_ra.get_fence_agent_metadata(
            runner,
            agent.split("stonith:", 1)[1]
        )
        metadata = lib_ra.get_agent_desc(metadata_dom)
        metadata["name"] = agent
        metadata["parameters"] = lib_ra.get_fence_agent_parameters(
            runner, metadata_dom
        )

        print(json.dumps(metadata))
    except lib_ra.ResourceAgentLibError as e:
        utils.process_library_reports(
            [lib_ra.resource_agent_lib_error_to_report_item(e)]
        )
    except LibraryError as e:
        utils.process_library_reports(e.args)
Exemplo n.º 2
0
    def test_not_runnable(self, mock_obj):
        mock_runner = mock.MagicMock(spec_set=CommandRunner)
        mock_obj.return_value = False
        agent_name = "fence_agent"

        self.assert_raises(
            lib_ra.AgentNotFound,
            lambda: lib_ra.get_fence_agent_metadata(mock_runner, agent_name),
            {"agent": agent_name}
        )
        mock_runner.run.assert_not_called()
Exemplo n.º 3
0
 def test_not_runnable(self, mock_obj):
     mock_obj.return_value = False
     agent_name = "fence_agent"
     self.assert_raise_library_error(
         lambda: lib_ra.get_fence_agent_metadata(agent_name),
         (
             Severities.ERROR,
             error_codes.INVALID_RESOURCE_NAME,
             {"agent_name": agent_name}
         )
     )
Exemplo n.º 4
0
 def test_relative_path_name(self, mock_obj):
     mock_obj.return_value = True
     agent_name = "fence_agent/../fence"
     self.assert_raise_library_error(
         lambda: lib_ra.get_fence_agent_metadata(agent_name),
         (
             Severities.ERROR,
             error_codes.INVALID_RESOURCE_NAME,
             {"agent_name": agent_name}
         )
     )
Exemplo n.º 5
0
    def test_success(self, mock_run, mock_is_runnable):
        agent_name = "fence_ipmi"
        xml = "<xml />"
        mock_run.return_value = (xml, 0)
        mock_is_runnable.return_value = True
        out_dom = lib_ra.get_fence_agent_metadata(agent_name)
        script_path = os.path.join(settings.fence_agent_binaries, agent_name)

        mock_run.assert_called_once_with(
            [script_path, "-o", "metadata"]
        )
        assert_xml_equal(xml, str(XmlMan(out_dom)))
Exemplo n.º 6
0
 def test_invalid_xml(self, mock_run, mock_is_runnable):
     mock_run.return_value = ("not xml", 0)
     mock_is_runnable.return_value = True
     agent_name = "fence_ipmi"
     self.assert_raise_library_error(
         lambda: lib_ra.get_fence_agent_metadata(agent_name),
         (
             Severities.ERROR,
             error_codes.UNABLE_TO_GET_AGENT_METADATA,
             {"agent_name": agent_name}
         )
     )
Exemplo n.º 7
0
def stonith_list_options(stonith_agent):
    runner = utils.cmd_runner()
    try:
        metadata = lib_ra.get_fence_agent_metadata(runner, stonith_agent)
        desc = lib_ra.get_agent_desc(metadata)
        params = lib_ra.get_fence_agent_parameters(runner, metadata)
        resource.resource_print_options(stonith_agent, desc, params)
    except lib_ra.ResourceAgentLibError as e:
        utils.process_library_reports(
            [lib_ra.resource_agent_lib_error_to_report_item(e)]
        )
    except LibraryError as e:
        utils.process_library_reports(e.args)
Exemplo n.º 8
0
def stonith_list_available(argv):
    if len(argv) != 0:
        filter_string = argv[0]
    else:
        filter_string = ""

    bad_fence_devices = ["kdump_send", "legacy", "na", "nss_wrapper",
            "pcmk", "vmware_helper", "ack_manual", "virtd", "sanlockd",
            "check", "tool", "node"]
    fence_devices = sorted(glob.glob(utils.fence_bin + "fence_*"))
    for bfd in bad_fence_devices:
        try:
            fence_devices.remove(utils.fence_bin + "fence_"+bfd)
        except ValueError:
            continue

    if not fence_devices:
        utils.err(
            "No stonith agents available. Do you have fence agents installed?"
        )
    fence_devices_filtered = [fd for fd in fence_devices if filter_string in fd]
    if not fence_devices_filtered:
        utils.err("No stonith agents matching the filter.")

    for fd in fence_devices_filtered:
        sd = ""
        agent_name = os.path.basename(fd)
        if "--nodesc" not in utils.pcs_options:
            try:
                metadata = lib_ra.get_fence_agent_metadata(
                    utils.cmd_runner(), agent_name
                )
                shortdesc = lib_ra.get_agent_desc(metadata)["shortdesc"]
                if shortdesc:
                    sd = " - " + resource.format_desc(
                        len(agent_name) + 3, shortdesc
                    )
            except lib_ra.ResourceAgentLibError as e:
                utils.process_library_reports([
                    lib_ra.resource_agent_lib_error_to_report_item(
                        e, ReportItemSeverity.WARNING
                    )
                ])
            except LibraryError as e:
                utils.err(
                    e.args[-1].message, False
                )
                continue
        print(agent_name + sd)
Exemplo n.º 9
0
def stonith_list_options(stonith_agent):
    runner = utils.cmd_runner()
    try:
        metadata = lib_ra.get_fence_agent_metadata(runner, stonith_agent)
        desc = lib_ra.get_agent_desc(metadata)
        params = lib_ra.get_fence_agent_parameters(runner, metadata)
        # Fence agents just list the actions, usually without any attributes.
        # We could print them but it wouldn't add any usefull information.
        resource.resource_print_options(stonith_agent, desc, params, actions=[])
    except lib_ra.ResourceAgentLibError as e:
        utils.process_library_reports(
            [lib_ra.resource_agent_lib_error_to_report_item(e)]
        )
    except LibraryError as e:
        utils.process_library_reports(e.args)
Exemplo n.º 10
0
    def test_invalid_xml(self, mock_is_runnable):
        mock_runner = mock.MagicMock(spec_set=CommandRunner)
        mock_runner.run.return_value = ("not xml", "", 0)
        mock_is_runnable.return_value = True
        agent_name = "fence_ipmi"
        self.assert_raises(
            lib_ra.UnableToGetAgentMetadata,
            lambda: lib_ra.get_fence_agent_metadata(mock_runner, agent_name),
            {"agent": agent_name}
        )

        script_path = os.path.join(settings.fence_agent_binaries, agent_name)
        mock_runner.run.assert_called_once_with(
            [script_path, "-o", "metadata"]
        )
Exemplo n.º 11
0
def get_fence_agent_info(argv):
    if len(argv) != 1:
        utils.err("One parameter expected")

    agent = argv[0]
    if not agent.startswith("stonith:"):
        utils.err("Invalid fence agent name")

    try:
        metadata_dom = lib_ra.get_fence_agent_metadata(
            agent.split("stonith:", 1)[1]
        )
        metadata = lib_ra.get_agent_desc(metadata_dom)
        metadata["name"] = agent
        metadata["parameters"] = lib_ra.get_fence_agent_parameters(
            metadata_dom
        )

        print(json.dumps(metadata))
    except lib_ra.LibraryError as e:
        utils.process_library_reports(e.args)
Exemplo n.º 12
0
def stonith_create(argv):
    if len(argv) < 2:
        usage.stonith(["create"])
        sys.exit(1)

    stonith_id = argv.pop(0)
    stonith_type = argv.pop(0)
    st_values, op_values, meta_values = resource.parse_resource_options(
        argv, with_clone=False
    )

    try:
        metadata = lib_ra.get_fence_agent_metadata(
            utils.cmd_runner(), stonith_type
        )
        if stonith_does_agent_provide_unfencing(metadata):
            meta_values = [
                meta for meta in meta_values if not meta.startswith("provides=")
            ]
            meta_values.append("provides=unfencing")
    except lib_ra.ResourceAgentLibError as e:
        forced = utils.get_modificators().get("force", False)
        if forced:
            severity = ReportItemSeverity.WARNING
        else:
            severity = ReportItemSeverity.ERROR
        utils.process_library_reports([
            lib_ra.resource_agent_lib_error_to_report_item(
                e, severity, not forced
            )
        ])
    except LibraryError as e:
        utils.process_library_reports(e.args)

    resource.resource_create(
        stonith_id, "stonith:" + stonith_type, st_values, op_values, meta_values,
        group=utils.pcs_options.get("--group", None)
    )