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)
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()
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} ) )
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} ) )
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)))
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} ) )
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)
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)
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)
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"] )
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)
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) )