def test_void_load_and_cache_fenced_for_stonith(self): name1 = ra.ResourceAgentName("stonith", None, "fence_xvm") name2 = ra.ResourceAgentName("stonith", None, "fence_virt") self.config.runner.pcmk.load_fenced_metadata( stdout=self._fixture_fenced_xml ) env = self.env_assist.get_env() factory = ra.ResourceAgentFacadeFactory( env.cmd_runner(), env.report_processor ) facade1 = factory.void_facade_from_parsed_name(name1) facade2 = factory.void_facade_from_parsed_name(name2) self.assertEqual(facade1.metadata.name, name1) self.assertEqual(facade2.metadata.name, name2) self.assertFalse(facade1.metadata.agent_exists) self.assertFalse(facade2.metadata.agent_exists) self.assertEqual( [param.name for param in facade1.metadata.parameters], ["fenced-param"], ) self.assertEqual( [param.name for param in facade2.metadata.parameters], ["fenced-param"], )
def test_void_load_and_cache_fenced_for_stonith_failure(self): name1 = ra.ResourceAgentName("stonith", None, "fence_xvm") name2 = ra.ResourceAgentName("stonith", None, "fence_virt") self.config.runner.pcmk.load_fenced_metadata( stdout="", stderr="fenced failure", returncode=1 ) env = self.env_assist.get_env() factory = ra.ResourceAgentFacadeFactory( env.cmd_runner(), env.report_processor ) facade1 = factory.void_facade_from_parsed_name(name1) facade2 = factory.void_facade_from_parsed_name(name2) self.env_assist.assert_reports( [ fixture.warn( reports.codes.UNABLE_TO_GET_AGENT_METADATA, agent="pacemaker-fenced", reason="fenced failure", ) ] ) self.assertEqual(facade1.metadata.name, name1) self.assertEqual(facade2.metadata.name, name2) self.assertFalse(facade1.metadata.agent_exists) self.assertFalse(facade2.metadata.agent_exists) self.assertEqual( [param.name for param in facade1.metadata.parameters], [], ) self.assertEqual( [param.name for param in facade2.metadata.parameters], [], )
def test_not_stonith(self): self.assertFalse( self._fixture_metadata( ra.ResourceAgentName("ocf", "pacemaker", "Dummy"), [self._fixture_action("on", True, True)], ).provides_unfencing )
def test_resource( self, mock_action_role, mock_parameter_desc, mock_parameter_advanced, mock_stonith_parameters, mock_stonith_action, mock_stonith_port, ): mock_action_role.return_value = "from action role" mock_parameter_desc.return_value = "from parameter desc" mock_parameter_advanced.return_value = "from parameter advanced" mock_stonith_parameters.return_value = "from stonith parameters" mock_stonith_action.return_value = "from stonith action" mock_stonith_port.return_value = "from stonith port" metadata = self._fixture_metadata( ra.ResourceAgentName("ocf", "pacemaker", "Dummy")) self.assertEqual( ra.pcs_transform.ocf_unified_to_pcs(metadata), "from action role", ) mock_action_role.assert_called_once_with(metadata) mock_parameter_desc.assert_not_called() mock_parameter_advanced.assert_not_called() mock_stonith_parameters.assert_not_called() mock_stonith_action.assert_not_called() mock_stonith_port.assert_not_called()
def test_pcmk_fake( self, mock_action_role, mock_parameter_desc, mock_parameter_advanced, mock_stonith_parameters, mock_stonith_action, mock_stonith_port, ): mock_action_role.return_value = "from action role" mock_parameter_desc.return_value = "from parameter desc" mock_parameter_advanced.return_value = "from parameter advanced" mock_stonith_parameters.return_value = "from stonith parameters" mock_stonith_action.return_value = "from stonith action" mock_stonith_port.return_value = "from stonith port" metadata = self._fixture_metadata( ra.ResourceAgentName(ra.const.FAKE_AGENT_STANDARD, None, ra.const.PACEMAKER_FENCED)) self.assertEqual( ra.pcs_transform.ocf_unified_to_pcs(metadata), "from parameter advanced", ) mock_action_role.assert_called_once_with(metadata) mock_parameter_desc.assert_called_once_with("from action role") mock_parameter_advanced.assert_called_once_with("from parameter desc") mock_stonith_parameters.assert_not_called() mock_stonith_action.assert_not_called() mock_stonith_port.assert_not_called()
class ParseOcfToolsMixin: agent_name = ra.ResourceAgentName("ocf", "pacemaker", "Dummy") ocf_version = None def parse(self, xml, agent_name=None): agent_name = agent_name or self.agent_name if not agent_name: raise AssertionError( "Invalid test usage, agent_name must be specified") with mock.patch( "pcs.lib.resource_agent.xml._load_metadata_xml") as mock_load: mock_load.return_value = xml return ra.xml.parse_metadata( agent_name, ra.xml.load_metadata(mock.MagicMock(spec=CommandRunner), agent_name), ) def xml(self, xml, agent_name=None, ocf_version=None): agent_name = agent_name or self.agent_name ocf_version = ocf_version or self.ocf_version dom = etree.fromstring(xml) if agent_name: dom.set("name", agent_name.full_name) if ocf_version: version_el = dom.find("./version") if version_el is None: version_el = etree.Element("version") dom.insert(0, version_el) version_el.text = ocf_version return etree_to_str(dom)
def test_facade_add_trace_for_ocf(self): self.config.runner.pcmk.load_agent( agent_name="ocf:heartbeat:Dummy", stdout=self._fixture_agent_xml, name="runner.pcmk.load_agent.heartbeat", ) self.config.runner.pcmk.load_agent( agent_name="ocf:pacemaker:Dummy", stdout=self._fixture_agent_xml, name="runner.pcmk.load_agent.pacemaker", ) env = self.env_assist.get_env() for provider in ["heartbeat", "pacemaker"]: with self.subTest(provider=provider): name = ra.ResourceAgentName("ocf", provider, "Dummy") facade = ra.ResourceAgentFacadeFactory( env.cmd_runner(), env.report_processor ).facade_from_parsed_name(name) self.assertEqual(facade.metadata.name, name) self.assertTrue(facade.metadata.agent_exists) self.assertEqual( [param.name for param in facade.metadata.parameters], ["agent-param", "trace_ra", "trace_file"], )
def test_not_action_on(self): self.assertFalse( self._fixture_metadata( ra.ResourceAgentName("stonith", None, "fence_xvm"), [self._fixture_action("off", True, True)], ).provides_unfencing )
def test_void(self): name = ra.ResourceAgentName("service", None, "daemon") env = self.env_assist.get_env() facade = ra.ResourceAgentFacadeFactory( env.cmd_runner(), env.report_processor ).void_facade_from_parsed_name(name) self.assertEqual(facade.metadata.name, name) self.assertFalse(facade.metadata.agent_exists)
def _fixture_metadata(shortdesc, parameters): return ra.ResourceAgentMetadata( ra.ResourceAgentName("standard", "provider", "type"), agent_exists=True, ocf_version=ra.const.OCF_1_0, shortdesc=shortdesc, longdesc=None, parameters=parameters, actions=[], )
def _fixture_metadata(parameters): return ra.ResourceAgentMetadata( ra.ResourceAgentName("ocf", "pacemaker", "Dummy"), agent_exists=True, ocf_version=ra.const.OCF_1_0, shortdesc=None, longdesc=None, parameters=parameters, actions=[], )
def test_facade_missing_agent(self): name = ra.ResourceAgentName("service", None, "daemon") self.config.runner.pcmk.load_agent(agent_name="service:daemon", agent_is_missing=True) env = self.env_assist.get_env() with self.assertRaises(ra.UnableToGetAgentMetadata) as cm: ra.ResourceAgentFacadeFactory( env.cmd_runner(), env.report_processor).facade_from_parsed_name(name) self.assertEqual(cm.exception.agent_name, name.full_name)
def test_facade(self): name = ra.ResourceAgentName("service", None, "daemon") self.config.runner.pcmk.load_agent(agent_name="service:daemon", stdout=self._fixture_agent_xml) env = self.env_assist.get_env() facade = ra.ResourceAgentFacadeFactory( env.cmd_runner(), env.report_processor).facade_from_parsed_name(name) self.assertEqual(facade.metadata.name, name) self.assertTrue(facade.metadata.agent_exists)
def test_ocf_1_0_minimal(self): metadata_in = ra.types.ResourceAgentMetadataOcf1_0( ra.ResourceAgentName("standard", "provider", "type"), shortdesc=None, longdesc=None, parameters=[], actions=[], ) metadata_out = ra.ResourceAgentMetadata( ra.ResourceAgentName("standard", "provider", "type"), agent_exists=True, ocf_version=ra.const.OCF_1_0, shortdesc=None, longdesc=None, parameters=[], actions=[], ) self.assertEqual( ra.ocf_transform.ocf_version_to_ocf_unified(metadata_in), metadata_out, )
def test_not_xml(self): agent_name = ra.ResourceAgentName("ocf", "pacemaker", "Dummy") self.config.runner.pcmk.load_agent( agent_name="ocf:pacemaker:Dummy", stdout="this is not an xml", ) env = self.env_assist.get_env() with self.assertRaises(ra.UnableToGetAgentMetadata) as cm: ra.xml.load_metadata(env.cmd_runner(), agent_name) self.assertEqual(cm.exception.agent_name, "ocf:pacemaker:Dummy") self.assertTrue(cm.exception.message.startswith("Start tag expected"))
def test_void_not_add_trace_for_ocf(self): name = ra.ResourceAgentName("ocf", "openstack", "Dummy") env = self.env_assist.get_env() facade = ra.ResourceAgentFacadeFactory( env.cmd_runner(), env.report_processor ).void_facade_from_parsed_name(name) self.assertEqual(facade.metadata.name, name) self.assertFalse(facade.metadata.agent_exists) self.assertEqual( [param.name for param in facade.metadata.parameters], [], )
def test_cannot_load(self): agent_name = ra.ResourceAgentName("ocf", "pacemaker", "Dummy") self.config.runner.pcmk.load_agent( agent_name="ocf:pacemaker:Dummy", agent_is_missing=True, stderr="error message", ) env = self.env_assist.get_env() with self.assertRaises(ra.UnableToGetAgentMetadata) as cm: ra.xml.load_metadata(env.cmd_runner(), agent_name) self.assertEqual(cm.exception.agent_name, "ocf:pacemaker:Dummy") self.assertEqual(cm.exception.message, "error message")
def test_not_valid_xml(self): agent_name = ra.ResourceAgentName("ocf", "pacemaker", "Dummy") self.config.runner.pcmk.load_agent( agent_name="ocf:pacemaker:Dummy", stdout="<resource-agent/>", ) env = self.env_assist.get_env() with self.assertRaises(ra.UnableToGetAgentMetadata) as cm: ra.xml.load_metadata(env.cmd_runner(), agent_name) self.assertEqual(cm.exception.agent_name, "ocf:pacemaker:Dummy") self.assertTrue( cm.exception.message.startswith( "Element resource-agent failed to validate"))
def test_void_add_trace_for_ocf(self): env = self.env_assist.get_env() for provider in ["heartbeat", "pacemaker"]: with self.subTest(provider=provider): name = ra.ResourceAgentName("ocf", provider, "Dummy") facade = ra.ResourceAgentFacadeFactory( env.cmd_runner(), env.report_processor ).void_facade_from_parsed_name(name) self.assertEqual(facade.metadata.name, name) self.assertFalse(facade.metadata.agent_exists) self.assertEqual( [param.name for param in facade.metadata.parameters], ["trace_ra", "trace_file"], )
def test_facade_not_add_trace_for_ocf(self): name = ra.ResourceAgentName("ocf", "openstack", "Dummy") self.config.runner.pcmk.load_agent(agent_name="ocf:openstack:Dummy", stdout=self._fixture_agent_xml) env = self.env_assist.get_env() facade = ra.ResourceAgentFacadeFactory( env.cmd_runner(), env.report_processor).facade_from_parsed_name(name) self.assertEqual(facade.metadata.name, name) self.assertTrue(facade.metadata.agent_exists) self.assertEqual( [param.name for param in facade.metadata.parameters], ["agent-param"], )
def test_success(self): agent_name = ra.ResourceAgentName("ocf", "pacemaker", "Dummy") metadata = """ <resource-agent name="Dummy"> </resource-agent> """ self.config.runner.pcmk.load_agent( agent_name="ocf:pacemaker:Dummy", stdout=metadata, ) env = self.env_assist.get_env() assert_xml_equal( metadata, etree_to_str(ra.xml.load_metadata(env.cmd_runner(), agent_name)), )
def test_success(self): agent_name = ra.ResourceAgentName("ocf", "pacemaker", "Dummy") metadata = """ <resource-agent name="Dummy"> </resource-agent> """ self.config.runner.pcmk.load_agent( agent_name="ocf:pacemaker:Dummy", stdout=metadata, ) env = self.env_assist.get_env() self.assertEqual( # pylint: disable=protected-access ra.xml._load_metadata_xml(env.cmd_runner(), agent_name), metadata.strip(), )
def test_full_name_2_parts_empty(self): self.assertEqual( ra.ResourceAgentName("standard", "", "type").full_name, "standard:type", )
def test_ocf_1_0(self): metadata_in = ra.types.ResourceAgentMetadataOcf1_0( ra.ResourceAgentName("standard", "provider", "type"), shortdesc="agent shortdesc", longdesc="agent longdesc", parameters=[ ra.types.ResourceAgentParameterOcf1_0( name="param_1", shortdesc=None, longdesc=None, type="string", default=None, enum_values=None, required=None, deprecated=None, obsoletes=None, unique=None, ), ra.types.ResourceAgentParameterOcf1_0( name="param_2", shortdesc="param_2 shortdesc", longdesc="param_2 longdesc", type="select", default="a", enum_values=["a", "b", "c"], required="0", deprecated="1", obsoletes=None, unique="0", ), ra.types.ResourceAgentParameterOcf1_0( name="param_3", shortdesc="param_3 shortdesc", longdesc="param_3 longdesc", type="integer", default="123", enum_values=None, required="1", deprecated="0", obsoletes="param_2", unique="1", ), ra.types.ResourceAgentParameterOcf1_0( name="param_4", shortdesc="param_4 shortdesc", longdesc="param_4 longdesc", type="string", default=None, enum_values=None, required="0", deprecated="0", obsoletes="param_5", unique="0", ), ra.types.ResourceAgentParameterOcf1_0( name="param_5", shortdesc="param_5 shortdesc", longdesc="param_5 longdesc", type="string", default=None, enum_values=None, required="1", deprecated="1", obsoletes="param_4", unique="1", ), ra.types.ResourceAgentParameterOcf1_0( name="param_6", shortdesc=None, longdesc=None, type="string", default=None, enum_values=None, required=None, deprecated=None, obsoletes="param_2", unique=None, ), ], actions=[ ra.types.ResourceAgentActionOcf1_0( name="action_1", timeout=None, interval=None, role=None, start_delay=None, depth=None, automatic=None, on_target=None, ), ra.types.ResourceAgentActionOcf1_0( name="action_2", timeout="12", interval="23", role="role", start_delay="34", depth="45", automatic="0", on_target="1", ), ra.types.ResourceAgentActionOcf1_0( name="action_3", timeout="0", interval="0", role="role", start_delay="0", depth="0", automatic="1", on_target="0", ), ], ) metadata_out = ra.ResourceAgentMetadata( ra.ResourceAgentName("standard", "provider", "type"), agent_exists=True, ocf_version=ra.const.OCF_1_0, shortdesc="agent shortdesc", longdesc="agent longdesc", parameters=[ ra.ResourceAgentParameter( name="param_1", shortdesc=None, longdesc=None, type="string", default=None, enum_values=None, required=False, advanced=False, deprecated=False, deprecated_by=[], deprecated_desc=None, unique_group=None, reloadable=False, ), ra.ResourceAgentParameter( name="param_2", shortdesc="param_2 shortdesc", longdesc="param_2 longdesc", type="select", default="a", enum_values=["a", "b", "c"], required=False, advanced=False, deprecated=True, deprecated_by=["param_3", "param_6"], deprecated_desc=None, unique_group=None, reloadable=False, ), ra.ResourceAgentParameter( name="param_3", shortdesc="param_3 shortdesc", longdesc="param_3 longdesc", type="integer", default="123", enum_values=None, required=True, advanced=False, deprecated=False, deprecated_by=[], deprecated_desc=None, unique_group="_pcs_unique_group_param_3", reloadable=True, ), ra.ResourceAgentParameter( name="param_4", shortdesc="param_4 shortdesc", longdesc="param_4 longdesc", type="string", default=None, enum_values=None, required=False, advanced=False, deprecated=False, deprecated_by=["param_5"], deprecated_desc=None, unique_group=None, reloadable=False, ), ra.ResourceAgentParameter( name="param_5", shortdesc="param_5 shortdesc", longdesc="param_5 longdesc", type="string", default=None, enum_values=None, required=True, advanced=False, deprecated=True, deprecated_by=["param_4"], deprecated_desc=None, unique_group="_pcs_unique_group_param_5", reloadable=True, ), ra.ResourceAgentParameter( name="param_6", shortdesc=None, longdesc=None, type="string", default=None, enum_values=None, required=False, advanced=False, deprecated=False, deprecated_by=[], deprecated_desc=None, unique_group=None, reloadable=False, ), ], actions=[ ra.ResourceAgentAction( name="action_1", timeout=None, interval=None, role=None, start_delay=None, depth=None, automatic=False, on_target=False, ), ra.ResourceAgentAction( name="action_2", timeout="12", interval="23", role="role", start_delay="34", depth="45", automatic=False, on_target=True, ), ra.ResourceAgentAction( name="action_3", timeout="0", interval="0", role="role", start_delay="0", depth="0", automatic=True, on_target=False, ), ], ) self.assertEqual( ra.ocf_transform.ocf_version_to_ocf_unified(metadata_in), metadata_out, )
def test_is_stonith_yes(self): self.assertTrue( ra.ResourceAgentName("stonith", "pacemaker", "Dummy").is_stonith )
def test_is_stonith_no(self): self.assertFalse( ra.ResourceAgentName("lsb", None, "fence_xvm").is_stonith )
def test_is_fake_pcmk_agent_yes(self): self.assertTrue( ra.ResourceAgentName( ra.const.FAKE_AGENT_STANDARD, None, "Dummy" ).is_pcmk_fake_agent )
def test_is_fake_pcmk_agent_no(self): self.assertFalse( ra.ResourceAgentName("pacemaker", None, "fenced").is_pcmk_fake_agent )
def test_full_name_3_parts(self): self.assertEqual( ra.ResourceAgentName("standard", "provider", "type").full_name, "standard:provider:type", )