def test_one_nonsnmp_source(self, hostname, ipaddress, config_cache,
                                host_config, source):
        source = source(hostname, ipaddress)
        assert source.source_type is SourceType.HOST

        host_sections = _collect_host_sections(
            nodes=make_nodes(
                config_cache,
                host_config,
                ipaddress,
                sources=[source],
            ),
            file_cache_max_age=file_cache.MaxAge.none(),
            fetcher_messages=[
                FetcherMessage.from_raw_data(
                    result.OK(source.default_raw_data),
                    Snapshot.null(),
                    source.fetcher_type,
                ),
            ],
            selected_sections=NO_SELECTION,
        )[0]
        assert len(host_sections) == 1

        key = HostKey(hostname, ipaddress, source.source_type)
        assert key in host_sections

        section = host_sections[key]

        assert len(section.sections) == 1
        assert section.sections[SectionName("section_name_%s" %
                                            hostname)] == [["section_content"]]
Ejemplo n.º 2
0
    def test_no_sources(self, cluster, nodes, config_cache, host_config):
        sources = make_cluster_sources(config_cache, host_config)

        host_sections = _collect_host_sections(
            sources=sources,
            file_cache_max_age=file_cache.MaxAge.none(),
            fetcher_messages=[
                # We do not pass sources explicitly but still append Piggyback.
                FetcherMessage.from_raw_data(
                    result.OK(AgentRawData(b"")),
                    Snapshot.null(),
                    FetcherType.PIGGYBACK,
                )
                for _s in sources
            ],
            selected_sections=NO_SELECTION,
        )[0]
        assert len(host_sections) == len(nodes)

        key_clu = HostKey(cluster, None, SourceType.HOST)
        assert key_clu not in host_sections

        for hostname, addr in nodes.items():
            key = HostKey(hostname, addr, SourceType.HOST)
            assert key in host_sections

            section = host_sections[key]
            assert section.sections[SectionName("section_name_%s" % hostname)] == [
                ["section_content_%s" % hostname]
            ]
            assert not section.cache_info
            assert not section.piggybacked_raw_data
Ejemplo n.º 3
0
    def test_multiple_sources_from_different_hosts(
        self, hostname, ipaddress, config_cache, host_config
    ):
        sources = [
            ProgramSource.ds(HostName(f"{hostname}0"), ipaddress, template=""),
            TCPSource(HostName(f"{hostname}1"), ipaddress),
            TCPSource(HostName(f"{hostname}2"), ipaddress),
        ]

        host_sections = _collect_host_sections(
            sources=sources,
            file_cache_max_age=file_cache.MaxAge.none(),
            fetcher_messages=[
                FetcherMessage.from_raw_data(
                    result.OK(source.default_raw_data),
                    Snapshot.null(),
                    source.fetcher_type,
                )
                for source in sources
            ],
            selected_sections=NO_SELECTION,
        )[0]

        assert set(host_sections) == {
            HostKey(HostName(f"{hostname}0"), ipaddress, SourceType.HOST),
            HostKey(HostName(f"{hostname}1"), ipaddress, SourceType.HOST),
            HostKey(HostName(f"{hostname}2"), ipaddress, SourceType.HOST),
        }

        for source in sources:
            assert host_sections[
                HostKey(source.hostname, source.ipaddress, SourceType.HOST)
            ].sections[SectionName(f"section_name_{source.hostname}")] == [["section_content"]]
Ejemplo n.º 4
0
    def test_one_snmp_source(self, hostname, ipaddress, config_cache, host_config):
        raw_data: SNMPRawData = {}
        host_sections = _collect_host_sections(
            sources=[
                SNMPSource.snmp(
                    hostname,
                    ipaddress,
                    selected_sections=NO_SELECTION,
                    force_cache_refresh=False,
                    on_scan_error=OnError.RAISE,
                ),
            ],
            file_cache_max_age=file_cache.MaxAge.none(),
            fetcher_messages=[
                FetcherMessage.from_raw_data(
                    result.OK(raw_data),
                    Snapshot.null(),
                    FetcherType.SNMP,
                ),
            ],
            selected_sections=NO_SELECTION,
        )[0]
        assert len(host_sections) == 1

        key = HostKey(hostname, ipaddress, SourceType.HOST)
        assert key in host_sections

        section = host_sections[key]

        assert len(section.sections) == 1
        assert section.sections[SectionName("section_name_%s" % hostname)] == [["section_content"]]
    def test_multiple_sources_from_the_same_host(
        self,
        hostname,
        ipaddress,
        config_cache,
        host_config,
    ):
        sources = [
            ProgramSource.ds(hostname, ipaddress, template=""),
            TCPSource(hostname, ipaddress),
        ]

        host_sections = _collect_host_sections(
            sources=sources,
            file_cache_max_age=file_cache.MaxAge.none(),
            fetcher_messages=[
                FetcherMessage.from_raw_data(
                    result.OK(source.default_raw_data),
                    Snapshot.null(),
                    source.fetcher_type,
                ) for source in sources
            ],
            selected_sections=NO_SELECTION,
        )[0]
        assert len(host_sections) == 1

        key = HostKey(hostname, ipaddress, SourceType.HOST)
        assert key in host_sections

        section = host_sections[key]

        assert len(section.sections) == 1
        assert section.sections[SectionName(
            "section_name_%s" %
            hostname)] == len(sources) * [["section_content"]]
Ejemplo n.º 6
0
 def test_no_sources(self, hostname, ipaddress, config_cache, host_config):
     host_sections = _collect_host_sections(
         sources=(),
         file_cache_max_age=file_cache.MaxAge.none(),
         fetcher_messages=(),
         selected_sections=NO_SELECTION,
     )[0]
     assert not host_sections
Ejemplo n.º 7
0
    def test_multiple_sources_from_the_same_host(
        self,
        hostname,
        ipaddress,
        mode,
        config_cache,
        host_config,
    ):
        sources = [
            ProgramSource.ds(
                hostname,
                ipaddress,
                mode=mode,
                template="",
            ),
            TCPSource(
                hostname,
                ipaddress,
                mode=mode,
            ),
        ]

        broker = ParsedSectionsBroker(
            _collect_host_sections(
                nodes=make_nodes(
                    config_cache,
                    host_config,
                    ipaddress,
                    mode=mode,
                    sources=sources,
                ),
                file_cache_max_age=0,
                fetcher_messages=[
                    FetcherMessage.from_raw_data(
                        result.OK(source.default_raw_data),
                        Snapshot.null(),
                        source.fetcher_type,
                    ) for source in sources
                ],
                selected_sections=NO_SELECTION,
            )[0])
        assert len(broker) == 1

        key = HostKey(hostname, ipaddress, SourceType.HOST)
        assert key in broker

        section = broker[key]

        assert len(section.sections) == 1
        # yapf: disable
        assert (section.sections[SectionName("section_name_%s" % hostname)]
                == len(sources) * [["section_content"]])
Ejemplo n.º 8
0
    def test_multiple_sources_from_different_hosts(self, hostname, ipaddress, mode, config_cache, host_config):
        sources = [
            ProgramSource.ds(hostname + "0", ipaddress, mode=mode, template=""),
            TCPSource(hostname + "1", ipaddress, mode=mode),
            TCPSource(hostname + "2", ipaddress, mode=mode),
        ]

        nodes = make_nodes(
            config_cache,
            host_config,
            ipaddress,
            mode=mode,
            sources=sources,
        )

        host_sections = _collect_host_sections(
            nodes=nodes,
            file_cache_max_age=0,
            fetcher_messages=[
                FetcherMessage.from_raw_data(
                    result.OK(source.default_raw_data),
                    Snapshot.null(),
                    source.fetcher_type,
                )
                for _h, _i, sources in nodes for source in sources
            ],
            selected_sections=NO_SELECTION,
        )[0]
        assert len(host_sections) == 1

        key = HostKey(hostname, ipaddress, SourceType.HOST)
        assert key in host_sections

        section = host_sections[key]

        assert len(section.sections) == len(sources)
        for source in sources:
            # yapf: disable
            assert (
                section.sections[SectionName("section_name_%s" % source.hostname)]
                == [["section_content"]])
Ejemplo n.º 9
0
    def test_one_snmp_source(self, hostname, ipaddress, mode, config_cache,
                             host_config):
        broker = ParsedSectionsBroker(
            _collect_host_sections(
                nodes=make_nodes(
                    config_cache,
                    host_config,
                    ipaddress,
                    mode=mode,
                    sources=[
                        SNMPSource.snmp(
                            hostname,
                            ipaddress,
                            mode=mode,
                            selected_sections=NO_SELECTION,
                            force_cache_refresh=False,
                            on_scan_error="raise",
                        ),
                    ],
                ),
                file_cache_max_age=0,
                fetcher_messages=[
                    FetcherMessage.from_raw_data(
                        result.OK({}),
                        Snapshot.null(),
                        FetcherType.SNMP,
                    ),
                ],
                selected_sections=NO_SELECTION,
            )[0])
        assert len(broker) == 1

        key = HostKey(hostname, ipaddress, SourceType.HOST)
        assert key in broker

        section = broker[key]

        assert len(section.sections) == 1
        assert section.sections[SectionName("section_name_%s" %
                                            hostname)] == [["section_content"]]
    def test_no_sources(self, hostname, ipaddress, config_cache, host_config):
        host_sections = _collect_host_sections(
            nodes=make_nodes(
                config_cache,
                host_config,
                ipaddress,
                sources=(),
            ),
            file_cache_max_age=file_cache.MaxAge.none(),
            fetcher_messages=(),
            selected_sections=NO_SELECTION,
        )[0]
        # The length is not zero because the function always sets,
        # at least, a piggy back section.
        assert len(host_sections) == 1

        key = HostKey(hostname, ipaddress, SourceType.HOST)
        assert key in host_sections

        section = host_sections[key]

        # Public attributes from HostSections:
        assert not section.sections
Ejemplo n.º 11
0
    def test_no_sources(self, cluster, nodes, config_cache, host_config, mode):
        made_nodes = make_nodes(
            config_cache,
            host_config,
            None,
            mode=mode,
            sources=(),
        )

        broker = ParsedSectionsBroker(_collect_host_sections(
            nodes=made_nodes,
            file_cache_max_age=0,
            fetcher_messages=[
                # We do not pass sources explicitly but still append Piggyback.
                FetcherMessage.from_raw_data(
                    result.OK(AgentRawData(b"")),
                    Snapshot.null(),
                    FetcherType.PIGGYBACK,
                ) for _n in made_nodes
            ],
            selected_sections=NO_SELECTION,
        )[0])
        assert len(broker) == len(nodes)

        key_clu = HostKey(cluster, None, SourceType.HOST)
        assert key_clu not in broker

        for hostname, addr in nodes.items():
            key = HostKey(hostname, addr, SourceType.HOST)
            assert key in broker

            section = broker[key]
            # yapf: disable
            assert (section.sections[SectionName("section_name_%s" % hostname)]
                    == [["section_content_%s" % hostname]])
            assert not section.cache_info
            assert not section.piggybacked_raw_data
def test_get_host_sections_cluster(monkeypatch, mocker):
    hostname = "testhost"
    hosts = {
        "host0": "10.0.0.0",
        "host1": "10.0.0.1",
        "host2": "10.0.0.2",
    }
    address = "1.2.3.4"
    tags = {"agent": "no-agent"}
    section_name = SectionName("test_section")
    config_cache = make_scenario(hostname, tags).apply(monkeypatch)
    host_config = config.HostConfig.make_host_config(hostname)

    def fake_lookup_ip_address(host_config, family=None):
        return hosts[host_config.hostname]

    def check(_, *args, **kwargs):
        return result.OK(AgentHostSections(sections={section_name: [[str(section_name)]]}))

    monkeypatch.setattr(
        config,
        "lookup_ip_address",
        fake_lookup_ip_address,
    )
    monkeypatch.setattr(
        Source,
        "parse",
        check,
    )
    mocker.patch.object(
        cmk.utils.piggyback,
        "remove_source_status_file",
        autospec=True,
    )
    mocker.patch.object(
        cmk.utils.piggyback,
        "_store_status_file_of",
        autospec=True,
    )

    # Create a cluster
    host_config.nodes = list(hosts.keys())

    nodes = make_nodes(
        config_cache,
        host_config,
        address,
        sources=make_sources(host_config, address),
    )

    host_sections = _collect_host_sections(
        nodes=nodes,
        file_cache_max_age=host_config.max_cachefile_age,
        fetcher_messages=[
                FetcherMessage.from_raw_data(
                    result.OK(source.default_raw_data),
                    Snapshot.null(),
                    source.fetcher_type,
                )
                for _h, _i, sources in nodes for source in sources
            ],
        selected_sections=NO_SELECTION,
    )[0]
    assert len(host_sections) == len(hosts) == 3
    cmk.utils.piggyback._store_status_file_of.assert_not_called()  # type: ignore[attr-defined]
    assert cmk.utils.piggyback.remove_source_status_file.call_count == 3  # type: ignore[attr-defined]

    for host, addr in hosts.items():
        remove_source_status_file = cmk.utils.piggyback.remove_source_status_file
        remove_source_status_file.assert_any_call(host)  # type: ignore[attr-defined]
        key = HostKey(host, addr, SourceType.HOST)
        assert key in host_sections
        section = host_sections[key]
        assert len(section.sections) == 1
        assert next(iter(section.sections)) == section_name
        assert not section.cache_info
        assert not section.piggybacked_raw_data