Example #1
0
    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"],
        )
Example #2
0
    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],
            [],
        )
Example #3
0
 def test_not_stonith(self):
     self.assertFalse(
         self._fixture_metadata(
             ra.ResourceAgentName("ocf", "pacemaker", "Dummy"),
             [self._fixture_action("on", True, True)],
         ).provides_unfencing
     )
Example #4
0
    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()
Example #5
0
    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()
Example #6
0
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)
Example #7
0
    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"],
                )
Example #8
0
 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
     )
Example #9
0
 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)
Example #10
0
 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=[],
     )
Example #11
0
 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=[],
     )
Example #12
0
    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)
Example #13
0
    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)
Example #14
0
 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,
     )
Example #15
0
    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"))
Example #16
0
 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],
         [],
     )
Example #17
0
    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")
Example #18
0
    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"))
Example #19
0
 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"],
             )
Example #20
0
    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"],
        )
Example #21
0
    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)),
        )
Example #22
0
    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(),
        )
Example #23
0
 def test_full_name_2_parts_empty(self):
     self.assertEqual(
         ra.ResourceAgentName("standard", "", "type").full_name,
         "standard:type",
     )
Example #24
0
 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,
     )
Example #25
0
 def test_is_stonith_yes(self):
     self.assertTrue(
         ra.ResourceAgentName("stonith", "pacemaker", "Dummy").is_stonith
     )
Example #26
0
 def test_is_stonith_no(self):
     self.assertFalse(
         ra.ResourceAgentName("lsb", None, "fence_xvm").is_stonith
     )
Example #27
0
 def test_is_fake_pcmk_agent_yes(self):
     self.assertTrue(
         ra.ResourceAgentName(
             ra.const.FAKE_AGENT_STANDARD, None, "Dummy"
         ).is_pcmk_fake_agent
     )
Example #28
0
 def test_is_fake_pcmk_agent_no(self):
     self.assertFalse(
         ra.ResourceAgentName("pacemaker", None, "fenced").is_pcmk_fake_agent
     )
Example #29
0
 def test_full_name_3_parts(self):
     self.assertEqual(
         ra.ResourceAgentName("standard", "provider", "type").full_name,
         "standard:provider:type",
     )