1# (c) 2021 Red Hat Inc.
2#
3# This file is part of Ansible
4#
5# Ansible is free software: you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation, either version 3 of the License, or
8# (at your option) any later version.
9#
10# Ansible is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.
17
18# Make coding more python3-ish
19
20from __future__ import absolute_import, division, print_function
21
22__metaclass__ = type
23
24from textwrap import dedent
25from ansible_collections.cisco.iosxr.tests.unit.compat.mock import patch
26from ansible_collections.cisco.iosxr.plugins.modules import (
27    iosxr_logging_global,
28)
29from ansible_collections.cisco.iosxr.tests.unit.modules.utils import (
30    set_module_args,
31)
32from .iosxr_module import TestIosxrModule
33
34
35class TestIosxrLoggingGlobalModule(TestIosxrModule):
36    module = iosxr_logging_global
37
38    def setUp(self):
39        super(TestIosxrLoggingGlobalModule, self).setUp()
40
41        self.mock_get_resource_connection = patch(
42            "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module_base."
43            "get_resource_connection"
44        )
45        self.get_resource_connection = (
46            self.mock_get_resource_connection.start()
47        )
48
49        self.mock_get_config = patch(
50            "ansible_collections.cisco.iosxr.plugins.module_utils.network.iosxr.facts.logging_global.logging_global."
51            "Logging_globalFacts.get_config"
52        )
53        self.get_config = self.mock_get_config.start()
54
55    def tearDown(self):
56        super(TestIosxrLoggingGlobalModule, self).tearDown()
57        self.get_resource_connection.stop()
58        self.get_config.stop()
59
60    def test_iosxr_logging_global_merged_idempotent(self):
61        run_cfg = dedent(
62            """\
63                logging tls-server test
64                 vrf test
65                 trustpoint test2
66                 tls-hostname test2
67                !
68                logging file test path test maxfilesize 1024 severity info
69                logging file test2 path test1 maxfilesize 1024 severity debugging
70                logging ipv4 dscp af11
71                logging ipv6 precedence routine
72                logging trap informational
73                logging events filter
74                 match test
75                 match test1
76                !
77                logging events threshold 10
78                logging events buffer-size 1024
79                logging events display-location
80                logging events level warnings
81                logging format rfc5424
82                logging archive
83                 device disk0
84                 severity alerts
85                 file-size 1
86                 frequency daily
87                 archive-size 1
88                 archive-length 1
89                !
90                logging console warning
91                logging console discriminator
92                 match1 test
93                 nomatch1 test3
94                !
95                logging history size 10
96                logging monitor errors
97                logging monitor discriminator
98                 match1 test1
99                !
100                logging buffered 2097152
101                logging buffered warnings
102                logging buffered discriminator
103                 match2 test
104                !
105                logging 1.1.1.1 vrf default severity critical port default
106                logging correlator rule test type stateful
107                 reissue-nonbistate
108                 timeout 5
109                 reparent
110                 context-correlation
111                !
112                logging correlator rule test1 type nonstateful
113                 timeout 6
114                 context-correlation
115                !
116                logging correlator ruleset test
117                 rulename test
118                 rulename test1
119                !
120                logging correlator buffer-size 1024
121                logging localfilesize 1024
122                logging source-interface GigabitEthernet0/0/0/0 vrf test
123                logging hostnameprefix test
124                logging suppress duplicates
125                !
126            """
127        )
128        self.get_config.return_value = run_cfg
129        set_module_args(
130            dict(
131                config=dict(
132                    archive=dict(
133                        archive_length=1,
134                        archive_size=1,
135                        device="disk0",
136                        file_size=1,
137                        frequency="daily",
138                        severity="alerts",
139                    ),
140                    buffered=dict(
141                        size=2097152,
142                        severity="warnings",
143                        discriminator=[
144                            dict(match_params="match2", name="test")
145                        ],
146                    ),
147                    console=dict(
148                        severity="warning",
149                        discriminator=[
150                            dict(match_params="match1", name="test"),
151                            dict(match_params="nomatch1", name="test3"),
152                        ],
153                    ),
154                    correlator=dict(
155                        buffer_size=1024,
156                        rule_sets=[
157                            dict(name="test", rulename=["test1", "test"])
158                        ],
159                        rules=[
160                            dict(
161                                rule_name="test",
162                                rule_type="stateful",
163                                timeout=5,
164                                context_correlation=True,
165                                reissue_nonbistate=True,
166                                reparent=True,
167                            ),
168                            dict(
169                                rule_name="test1",
170                                rule_type="nonstateful",
171                                timeout=6,
172                                context_correlation=True,
173                            ),
174                        ],
175                    ),
176                    events=dict(
177                        severity="warnings",
178                        display_location=True,
179                        buffer_size=1024,
180                        filter_match=["test1", "test"],
181                        threshold=10,
182                    ),
183                    format=True,
184                    files=[
185                        dict(
186                            maxfilesize=1024,
187                            name="test",
188                            path="test",
189                            severity="info",
190                        ),
191                        dict(
192                            maxfilesize=1024,
193                            name="test2",
194                            path="test1",
195                            severity="debugging",
196                        ),
197                    ],
198                    history=dict(size=10),
199                    hostnameprefix="test",
200                    hosts=[
201                        dict(
202                            host="1.1.1.1",
203                            port="default",
204                            severity="critical",
205                            vrf="default",
206                        )
207                    ],
208                    ipv6=dict(precedence="routine"),
209                    ipv4=dict(dscp="af11"),
210                    localfilesize=1024,
211                    monitor=dict(
212                        severity="errors",
213                        discriminator=[
214                            dict(match_params="match1", name="test1")
215                        ],
216                    ),
217                    source_interfaces=[
218                        dict(interface="GigabitEthernet0/0/0/0", vrf="test")
219                    ],
220                    suppress=dict(duplicates=True),
221                    tls_servers=[
222                        dict(
223                            name="test",
224                            tls_hostname="test2",
225                            trustpoint="test2",
226                            vrf="test",
227                        )
228                    ],
229                    trap=dict(severity="informational"),
230                ),
231                state="merged",
232            )
233        )
234        self.execute_module(changed=False, commands=[])
235
236    def test_iosxr_logging_global_merged(self):
237        set_module_args(
238            dict(
239                config=dict(
240                    archive=dict(
241                        archive_length=1,
242                        archive_size=1,
243                        device="disk0",
244                        file_size=1,
245                        frequency="daily",
246                        severity="alerts",
247                    ),
248                    buffered=dict(
249                        size=2097152,
250                        severity="warnings",
251                        discriminator=[
252                            dict(match_params="match2", name="test")
253                        ],
254                    ),
255                    console=dict(
256                        severity="warning",
257                        discriminator=[
258                            dict(match_params="match1", name="test"),
259                            dict(match_params="nomatch1", name="test3"),
260                        ],
261                    ),
262                    correlator=dict(
263                        buffer_size=1024,
264                        rule_sets=[
265                            dict(name="test", rulename=["test1", "test"])
266                        ],
267                        rules=[
268                            dict(
269                                rule_name="test",
270                                rule_type="stateful",
271                                timeout=5,
272                                context_correlation=True,
273                                reissue_nonbistate=True,
274                                reparent=True,
275                            ),
276                            dict(
277                                rule_name="test1",
278                                rule_type="nonstateful",
279                                timeout=6,
280                                context_correlation=True,
281                            ),
282                        ],
283                    ),
284                    events=dict(
285                        severity="warnings",
286                        display_location=True,
287                        buffer_size=1024,
288                        filter_match=["test1", "test"],
289                        threshold=10,
290                    ),
291                    format=True,
292                    files=[
293                        dict(
294                            maxfilesize=1024,
295                            name="test",
296                            path="test",
297                            severity="info",
298                        ),
299                        dict(
300                            maxfilesize=1024,
301                            name="test2",
302                            path="test1",
303                            severity="debugging",
304                        ),
305                    ],
306                    history=dict(state="disabled", size=10),
307                    hostnameprefix="test",
308                    hosts=[
309                        dict(
310                            host="1.1.1.1",
311                            port="default",
312                            severity="critical",
313                            vrf="default",
314                        )
315                    ],
316                    ipv6=dict(precedence="routine"),
317                    ipv4=dict(dscp="af11"),
318                    localfilesize=1024,
319                    monitor=dict(
320                        severity="errors",
321                        discriminator=[
322                            dict(match_params="match1", name="test1")
323                        ],
324                    ),
325                    source_interfaces=[
326                        dict(interface="GigabitEthernet0/0/0/0", vrf="test")
327                    ],
328                    suppress=dict(duplicates=True),
329                    tls_servers=[
330                        dict(
331                            name="test",
332                            tls_hostname="test2",
333                            trustpoint="test2",
334                            vrf="test",
335                        )
336                    ],
337                    trap=dict(severity="informational"),
338                ),
339                state="merged",
340            )
341        )
342        commands = [
343            "logging archive device disk0",
344            "logging archive frequency daily",
345            "logging archive severity alerts",
346            "logging archive archive-size 1",
347            "logging archive archive-length 1",
348            "logging archive file-size 1",
349            "logging buffered 2097152",
350            "logging buffered warnings",
351            "logging console warning",
352            "logging correlator buffer-size 1024",
353            "logging events threshold 10",
354            "logging events buffer-size 1024",
355            "logging events display-location",
356            "logging events level warnings",
357            "logging hostnameprefix test",
358            "logging format rfc5424",
359            "logging ipv4 dscp af11",
360            "logging ipv6 precedence routine",
361            "logging localfilesize 1024",
362            "logging suppress duplicates",
363            "logging monitor errors",
364            "logging history size 10",
365            "logging history disable",
366            "logging trap informational",
367            "logging 1.1.1.1 vrf default severity critical port default",
368            "logging file test path test maxfilesize 1024 severity info",
369            "logging file test2 path test1 maxfilesize 1024 severity debugging",
370            "logging source-interface GigabitEthernet0/0/0/0 vrf test",
371            "logging tls-server test tls-hostname test2",
372            "logging tls-server test trustpoint test2",
373            "logging tls-server test vrf test",
374            "logging correlator ruleset  test  rulename test1",
375            "logging correlator ruleset  test  rulename test",
376            "logging correlator rule test type stateful timeout 5",
377            "logging correlator rule test type stateful reissue-nonbistate",
378            "logging correlator rule test type stateful reparent",
379            "logging correlator rule test type stateful context-correlation",
380            "logging correlator rule test1 type nonstateful timeout 6",
381            "logging correlator rule test1 type nonstateful context-correlation",
382            "logging events filter match test1",
383            "logging events filter match test",
384            "logging buffered discriminator match2 test",
385            "logging monitor discriminator match1 test1",
386            "logging console discriminator match1 test",
387            "logging console discriminator nomatch1 test3",
388        ]
389        result = self.execute_module(changed=True)
390        self.assertEqual(sorted(result["commands"]), sorted(commands))
391
392    def test_iosxr_logging_global_deleted(self):
393        self.maxDiff = None
394        run_cfg = dedent(
395            """\
396                logging tls-server test
397                 vrf test
398                 trustpoint test2
399                 tls-hostname test2
400                !
401                logging file test path test maxfilesize 1024 severity info
402                logging file test2 path test1 maxfilesize 1024 severity debugging
403                logging ipv4 dscp af11
404                logging ipv6 precedence routine
405                logging trap informational
406                logging events filter
407                 match test
408                 match test1
409                !
410                logging events threshold 10
411                logging events buffer-size 1024
412                logging events display-location
413                logging events level warnings
414                logging format rfc5424
415                logging archive
416                 device disk0
417                 severity alerts
418                 file-size 1
419                 frequency daily
420                 archive-size 1
421                 archive-length 1
422                !
423                logging console warning
424                logging console discriminator
425                 match1 test
426                 nomatch1 test3
427                !
428                logging history size 10
429                logging history disable
430                logging monitor errors
431                logging monitor discriminator
432                 match1 test1
433                !
434                logging buffered 2097152
435                logging buffered warnings
436                logging buffered discriminator
437                 match2 test
438                !
439                logging 1.1.1.1 vrf default severity critical port default
440                logging correlator rule test type stateful
441                 reissue-nonbistate
442                 timeout 5
443                 reparent
444                 context-correlation
445                !
446                logging correlator rule test1 type nonstateful
447                 timeout 6
448                 context-correlation
449                !
450                logging correlator ruleset test
451                 rulename test
452                 rulename test1
453                !
454                logging correlator buffer-size 1024
455                logging localfilesize 1024
456                logging source-interface GigabitEthernet0/0/0/0 vrf test
457                logging hostnameprefix test
458                logging suppress duplicates
459                !
460            """
461        )
462        self.get_config.return_value = run_cfg
463        set_module_args(dict(state="deleted"))
464        commands = [
465            "no logging archive device disk0",
466            "no logging archive frequency daily",
467            "no logging archive severity alerts",
468            "no logging archive archive-size 1",
469            "no logging archive archive-length 1",
470            "no logging archive file-size 1",
471            "no logging buffered 2097152",
472            "no logging buffered warnings",
473            "no logging console warning",
474            "no logging correlator buffer-size 1024",
475            "no logging events threshold 10",
476            "no logging events buffer-size 1024",
477            "no logging events display-location",
478            "no logging events level warnings",
479            "no logging hostnameprefix test",
480            "no logging format rfc5424",
481            "no logging ipv4 dscp af11",
482            "no logging ipv6 precedence routine",
483            "no logging localfilesize 1024",
484            "no logging suppress duplicates",
485            "no logging monitor errors",
486            "no logging history size 10",
487            "no logging history disable",
488            "no logging trap informational",
489            "no logging 1.1.1.1 vrf default severity critical port default",
490            "no logging file test path test maxfilesize 1024 severity info",
491            "no logging file test2 path test1 maxfilesize 1024 severity debugging",
492            "no logging source-interface GigabitEthernet0/0/0/0 vrf test",
493            "no logging tls-server test",
494            "no logging correlator ruleset  test  rulename test",
495            "no logging correlator ruleset  test  rulename test1",
496            "no logging correlator rule test type stateful timeout 5",
497            "no logging correlator rule test type stateful reissue-nonbistate",
498            "no logging correlator rule test type stateful reparent",
499            "no logging correlator rule test type stateful context-correlation",
500            "no logging correlator rule test1 type nonstateful timeout 6",
501            "no logging correlator rule test1 type nonstateful context-correlation",
502            "no logging events filter match test",
503            "no logging events filter match test1",
504            "no logging buffered discriminator match2 test",
505            "no logging monitor discriminator match1 test1",
506            "no logging console discriminator match1 test",
507            "no logging console discriminator nomatch1 test3",
508        ]
509        result = self.execute_module(changed=True)
510        self.assertEqual(sorted(result["commands"]), sorted(commands))
511
512    def test_iosxr_logging_global_replaced(self):
513        self.maxDiff = None
514        run_cfg = dedent(
515            """\
516                logging tls-server test
517                 vrf test
518                 trustpoint test2
519                 tls-hostname test2
520                !
521                logging file test path test maxfilesize 1024 severity info
522                logging file test2 path test1 maxfilesize 1024 severity debugging
523                logging ipv4 dscp af11
524                logging ipv6 precedence routine
525                logging trap informational
526                logging events filter
527                 match test
528                 match test1
529                !
530                logging events threshold 10
531                logging events buffer-size 1024
532                logging events display-location
533                logging events level warnings
534                logging format rfc5424
535                logging archive
536                 device disk0
537                 severity alerts
538                 file-size 1
539                 frequency daily
540                 archive-size 1
541                 archive-length 1
542                !
543                logging console warning
544                logging console discriminator
545                 match1 test
546                 nomatch1 test3
547                !
548                logging history size 10
549                logging history disable
550                logging monitor errors
551                logging monitor discriminator
552                 match1 test1
553                !
554                logging buffered 2097152
555                logging buffered warnings
556                logging buffered discriminator
557                 match2 test
558                !
559                logging 1.1.1.1 vrf default severity critical port default
560                logging correlator rule test type stateful
561                 reissue-nonbistate
562                 timeout 5
563                 reparent
564                 context-correlation
565                !
566                logging correlator rule test1 type nonstateful
567                 timeout 6
568                 context-correlation
569                !
570                logging correlator ruleset test
571                 rulename test
572                 rulename test1
573                !
574                logging correlator buffer-size 1024
575                logging localfilesize 1024
576                logging source-interface GigabitEthernet0/0/0/0 vrf test
577                logging hostnameprefix test
578                logging suppress duplicates
579                !
580            """
581        )
582        self.get_config.return_value = run_cfg
583        set_module_args(
584            dict(
585                config=dict(
586                    archive=dict(
587                        archive_length=1,
588                        archive_size=1,
589                        device="disk0",
590                        file_size=1,
591                        severity="alerts",
592                    ),
593                    buffered=dict(size=2097152, severity="warnings"),
594                    console=dict(
595                        severity="warning",
596                        discriminator=[
597                            dict(match_params="match1", name="test1")
598                        ],
599                    ),
600                    correlator=dict(
601                        buffer_size=1024,
602                        rules=[
603                            dict(
604                                rule_name="test",
605                                rule_type="stateful",
606                                timeout=6,
607                                context_correlation=True,
608                                reissue_nonbistate=True,
609                                reparent=True,
610                            )
611                        ],
612                    ),
613                    events=dict(
614                        severity="warnings",
615                        display_location=True,
616                        buffer_size=1024,
617                        filter_match=["test1"],
618                        threshold=12,
619                    ),
620                    format=True,
621                    files=[
622                        dict(
623                            maxfilesize=1024,
624                            name="test",
625                            path="test1",
626                            severity="info",
627                        )
628                    ],
629                    history=dict(state="disabled", size=10),
630                    hostnameprefix="test",
631                    hosts=[
632                        dict(
633                            host="1.1.1.2",
634                            port="default",
635                            severity="critical",
636                            vrf="default",
637                        )
638                    ],
639                    ipv6=dict(precedence="routine"),
640                    ipv4=dict(dscp="af11"),
641                    localfilesize=1024,
642                    source_interfaces=[
643                        dict(interface="GigabitEthernet0/0/0/0", vrf="test")
644                    ],
645                    tls_servers=[
646                        dict(
647                            name="test",
648                            tls_hostname="test2",
649                            trustpoint="test3",
650                            vrf="test",
651                        )
652                    ],
653                ),
654                state="replaced",
655            )
656        )
657        commands = [
658            "logging console discriminator match1 test1",
659            "logging correlator rule test type stateful timeout 6",
660            "logging events threshold 12",
661            "logging 1.1.1.2 vrf default severity critical port default",
662            "logging file test path test1 maxfilesize 1024 severity info",
663            "logging tls-server test trustpoint test3",
664            "no logging 1.1.1.1 vrf default severity critical port default",
665            "no logging archive frequency daily",
666            "no logging buffered discriminator match2 test",
667            "no logging console discriminator match1 test",
668            "no logging console discriminator nomatch1 test3",
669            "no logging correlator rule test1 type nonstateful context-correlation",
670            "no logging correlator rule test1 type nonstateful timeout 6",
671            "no logging correlator ruleset  test  rulename test",
672            "no logging correlator ruleset  test  rulename test1",
673            "no logging events filter match test",
674            "no logging file test2 path test1 maxfilesize 1024 severity debugging",
675            "no logging monitor discriminator match1 test1",
676            "no logging monitor errors",
677            "no logging suppress duplicates",
678            "no logging trap informational",
679        ]
680        result = self.execute_module(changed=True)
681        self.assertEqual(sorted(result["commands"]), sorted(commands))
682
683    def test_iosxr_logging_global_rendered(self):
684        self.maxDiff = None
685        set_module_args(
686            dict(
687                config=dict(
688                    archive=dict(
689                        archive_length=1,
690                        archive_size=1,
691                        device="disk0",
692                        file_size=1,
693                        frequency="daily",
694                        severity="alerts",
695                    ),
696                    buffered=dict(
697                        size=2097152,
698                        severity="warnings",
699                        discriminator=[
700                            dict(match_params="match2", name="test")
701                        ],
702                    ),
703                    console=dict(
704                        severity="warning",
705                        discriminator=[
706                            dict(match_params="match1", name="test"),
707                            dict(match_params="nomatch1", name="test3"),
708                        ],
709                    ),
710                    correlator=dict(
711                        buffer_size=1024,
712                        rule_sets=[
713                            dict(name="test", rulename=["test1", "test"])
714                        ],
715                        rules=[
716                            dict(
717                                rule_name="test",
718                                rule_type="stateful",
719                                timeout=5,
720                                context_correlation=True,
721                                reissue_nonbistate=True,
722                                reparent=True,
723                            ),
724                            dict(
725                                rule_name="test1",
726                                rule_type="nonstateful",
727                                timeout=6,
728                                context_correlation=True,
729                            ),
730                        ],
731                    ),
732                    events=dict(
733                        severity="warnings",
734                        display_location=True,
735                        buffer_size=1024,
736                        filter_match=["test1", "test"],
737                        threshold=10,
738                    ),
739                    format=True,
740                    files=[
741                        dict(
742                            maxfilesize=1024,
743                            name="test",
744                            path="test",
745                            severity="info",
746                        ),
747                        dict(
748                            maxfilesize=1024,
749                            name="test2",
750                            path="test1",
751                            severity="debugging",
752                        ),
753                    ],
754                    history=dict(state="disabled", size=10),
755                    hostnameprefix="test",
756                    hosts=[
757                        dict(
758                            host="1.1.1.1",
759                            port="default",
760                            severity="critical",
761                            vrf="default",
762                        )
763                    ],
764                    ipv6=dict(precedence="routine"),
765                    ipv4=dict(dscp="af11"),
766                    localfilesize=1024,
767                    monitor=dict(
768                        severity="errors",
769                        discriminator=[
770                            dict(match_params="match1", name="test1")
771                        ],
772                    ),
773                    source_interfaces=[
774                        dict(interface="GigabitEthernet0/0/0/0", vrf="test")
775                    ],
776                    suppress=dict(duplicates=True),
777                    tls_servers=[
778                        dict(
779                            name="test",
780                            tls_hostname="test2",
781                            trustpoint="test2",
782                            vrf="test",
783                        )
784                    ],
785                    trap=dict(severity="informational"),
786                ),
787                state="rendered",
788            )
789        )
790        commands = [
791            "logging archive device disk0",
792            "logging archive frequency daily",
793            "logging archive severity alerts",
794            "logging archive archive-size 1",
795            "logging archive archive-length 1",
796            "logging archive file-size 1",
797            "logging buffered 2097152",
798            "logging buffered warnings",
799            "logging console warning",
800            "logging correlator buffer-size 1024",
801            "logging events threshold 10",
802            "logging events buffer-size 1024",
803            "logging events display-location",
804            "logging events level warnings",
805            "logging hostnameprefix test",
806            "logging format rfc5424",
807            "logging ipv4 dscp af11",
808            "logging ipv6 precedence routine",
809            "logging localfilesize 1024",
810            "logging suppress duplicates",
811            "logging monitor errors",
812            "logging history size 10",
813            "logging history disable",
814            "logging trap informational",
815            "logging 1.1.1.1 vrf default severity critical port default",
816            "logging file test path test maxfilesize 1024 severity info",
817            "logging file test2 path test1 maxfilesize 1024 severity debugging",
818            "logging source-interface GigabitEthernet0/0/0/0 vrf test",
819            "logging tls-server test tls-hostname test2",
820            "logging tls-server test trustpoint test2",
821            "logging tls-server test vrf test",
822            "logging correlator ruleset  test  rulename test1",
823            "logging correlator ruleset  test  rulename test",
824            "logging correlator rule test type stateful timeout 5",
825            "logging correlator rule test type stateful reissue-nonbistate",
826            "logging correlator rule test type stateful reparent",
827            "logging correlator rule test type stateful context-correlation",
828            "logging correlator rule test1 type nonstateful timeout 6",
829            "logging correlator rule test1 type nonstateful context-correlation",
830            "logging events filter match test1",
831            "logging events filter match test",
832            "logging buffered discriminator match2 test",
833            "logging monitor discriminator match1 test1",
834            "logging console discriminator match1 test",
835            "logging console discriminator nomatch1 test3",
836        ]
837        result = self.execute_module(changed=False)
838        self.assertEqual(sorted(result["rendered"]), sorted(commands))
839
840    def test_iosxr_logging_global_overridden(self):
841        self.maxDiff = None
842        run_cfg = dedent(
843            """\
844                logging tls-server test
845                 vrf test
846                 trustpoint test2
847                 tls-hostname test2
848                !
849                logging file test path test maxfilesize 1024 severity info
850                logging file test2 path test1 maxfilesize 1024 severity debugging
851                logging ipv4 dscp af11
852                logging ipv6 precedence routine
853                logging trap informational
854                logging events filter
855                 match test
856                 match test1
857                !
858                logging events threshold 10
859                logging events buffer-size 1024
860                logging events display-location
861                logging events level warnings
862                logging format rfc5424
863                logging archive
864                 device disk0
865                 severity alerts
866                 file-size 1
867                 frequency daily
868                 archive-size 1
869                 archive-length 1
870                !
871                logging console warning
872                logging console discriminator
873                 match1 test
874                 nomatch1 test3
875                !
876                logging history size 10
877                logging history disable
878                logging monitor errors
879                logging monitor discriminator
880                 match1 test1
881                !
882                logging buffered 2097152
883                logging buffered warnings
884                logging buffered discriminator
885                 match2 test
886                !
887                logging 1.1.1.1 vrf default severity critical port default
888                logging correlator rule test type stateful
889                 reissue-nonbistate
890                 timeout 5
891                 reparent
892                 context-correlation
893                !
894                logging correlator rule test1 type nonstateful
895                 timeout 6
896                 context-correlation
897                !
898                logging correlator ruleset test
899                 rulename test
900                 rulename test1
901                !
902                logging correlator buffer-size 1024
903                logging localfilesize 1024
904                logging source-interface GigabitEthernet0/0/0/0 vrf test
905                logging hostnameprefix test
906                logging suppress duplicates
907                !
908            """
909        )
910        self.get_config.return_value = run_cfg
911        set_module_args(
912            dict(
913                config=dict(
914                    archive=dict(
915                        archive_length=1,
916                        archive_size=1,
917                        device="disk0",
918                        file_size=1,
919                        severity="alerts",
920                    ),
921                    buffered=dict(size=2097152, severity="warnings"),
922                    console=dict(
923                        severity="warning",
924                        discriminator=[
925                            dict(match_params="match1", name="test1")
926                        ],
927                    ),
928                    correlator=dict(
929                        buffer_size=1024,
930                        rules=[
931                            dict(
932                                rule_name="test",
933                                rule_type="stateful",
934                                timeout=6,
935                                context_correlation=True,
936                                reissue_nonbistate=True,
937                                reparent=True,
938                            )
939                        ],
940                    ),
941                    events=dict(
942                        severity="warnings",
943                        display_location=True,
944                        buffer_size=1024,
945                        filter_match=["test1"],
946                        threshold=12,
947                    ),
948                    format=True,
949                    files=[
950                        dict(
951                            maxfilesize=1024,
952                            name="test",
953                            path="test1",
954                            severity="info",
955                        )
956                    ],
957                    history=dict(state="disabled", size=10),
958                    hostnameprefix="test",
959                    hosts=[
960                        dict(
961                            host="1.1.1.2",
962                            port="default",
963                            severity="critical",
964                            vrf="default",
965                        )
966                    ],
967                    ipv6=dict(precedence="routine"),
968                    ipv4=dict(dscp="af11"),
969                    localfilesize=1024,
970                    source_interfaces=[
971                        dict(interface="GigabitEthernet0/0/0/0", vrf="test")
972                    ],
973                    tls_servers=[
974                        dict(
975                            name="test",
976                            tls_hostname="test2",
977                            trustpoint="test3",
978                            vrf="test",
979                        )
980                    ],
981                ),
982                state="overridden",
983            )
984        )
985        commands = [
986            "logging console discriminator match1 test1",
987            "logging correlator rule test type stateful timeout 6",
988            "logging events threshold 12",
989            "logging 1.1.1.2 vrf default severity critical port default",
990            "logging file test path test1 maxfilesize 1024 severity info",
991            "logging tls-server test trustpoint test3",
992            "no logging 1.1.1.1 vrf default severity critical port default",
993            "no logging archive frequency daily",
994            "no logging buffered discriminator match2 test",
995            "no logging console discriminator match1 test",
996            "no logging console discriminator nomatch1 test3",
997            "no logging correlator rule test1 type nonstateful context-correlation",
998            "no logging correlator rule test1 type nonstateful timeout 6",
999            "no logging correlator ruleset  test  rulename test",
1000            "no logging correlator ruleset  test  rulename test1",
1001            "no logging events filter match test",
1002            "no logging file test2 path test1 maxfilesize 1024 severity debugging",
1003            "no logging monitor discriminator match1 test1",
1004            "no logging monitor errors",
1005            "no logging suppress duplicates",
1006            "no logging trap informational",
1007        ]
1008        result = self.execute_module(changed=True)
1009        self.assertEqual(sorted(result["commands"]), sorted(commands))
1010
1011    def test_iosxr_logging_global_gathered(self):
1012        run_cfg = dedent(
1013            """\
1014                logging tls-server test
1015                 vrf test
1016                 trustpoint test2
1017                 tls-hostname test2
1018                !
1019                logging file test path test maxfilesize 1024 severity info
1020                logging ipv4 dscp af11
1021                logging ipv6 precedence routine
1022                logging trap informational
1023                logging events filter
1024                 match test
1025                !
1026                logging events threshold 10
1027                logging events buffer-size 1024
1028                logging events display-location
1029                logging events level warnings
1030                logging format rfc5424
1031                logging archive
1032                 device disk0
1033                 severity alerts
1034                 file-size 1
1035                 frequency daily
1036                 archive-size 1
1037                 archive-length 1
1038                !
1039                logging console warning
1040                logging console discriminator
1041                 match1 test
1042                !
1043                logging history size 10
1044                logging history disable
1045                logging monitor errors
1046                logging monitor discriminator
1047                 match1 test1
1048                !
1049                logging buffered 2097152
1050                logging buffered warnings
1051                logging buffered discriminator
1052                 match2 test
1053                !
1054                logging 1.1.1.1 vrf default severity critical port default
1055                logging correlator rule test type stateful
1056                 reissue-nonbistate
1057                 timeout 5
1058                 reparent
1059                 context-correlation
1060                !
1061                logging correlator ruleset test
1062                 rulename test
1063                !
1064                logging correlator buffer-size 1024
1065                logging localfilesize 1024
1066                logging source-interface GigabitEthernet0/0/0/0 vrf test
1067                logging hostnameprefix test
1068                logging suppress duplicates
1069                !
1070            """
1071        )
1072        self.get_config.return_value = run_cfg
1073        set_module_args(dict(state="gathered"))
1074        gathered = {
1075            "archive": {
1076                "archive_length": 1,
1077                "archive_size": 1,
1078                "device": "disk0",
1079                "file_size": 1,
1080                "frequency": "daily",
1081                "severity": "alerts",
1082            },
1083            "buffered": {
1084                "discriminator": [{"match_params": "match2", "name": "test"}],
1085                "severity": "warnings",
1086                "size": 2097152,
1087            },
1088            "console": {
1089                "discriminator": [{"match_params": "match1", "name": "test"}],
1090                "severity": "warning",
1091            },
1092            "correlator": {
1093                "buffer_size": 1024,
1094                "rule_sets": [{"name": "test", "rulename": ["test"]}],
1095                "rules": [
1096                    {
1097                        "context_correlation": True,
1098                        "reissue_nonbistate": True,
1099                        "reparent": True,
1100                        "rule_name": "test",
1101                        "rule_type": "stateful",
1102                        "timeout": 5,
1103                    }
1104                ],
1105            },
1106            "events": {
1107                "buffer_size": 1024,
1108                "display_location": True,
1109                "filter_match": ["test"],
1110                "severity": "warnings",
1111                "threshold": 10,
1112            },
1113            "files": [
1114                {
1115                    "maxfilesize": 1024,
1116                    "name": "test",
1117                    "path": "test",
1118                    "severity": "info",
1119                }
1120            ],
1121            "format": True,
1122            "history": {"state": "disabled", "size": 10},
1123            "hostnameprefix": "test",
1124            "hosts": [
1125                {
1126                    "host": "1.1.1.1",
1127                    "port": "default",
1128                    "severity": "critical",
1129                    "vrf": "default",
1130                }
1131            ],
1132            "ipv4": {"dscp": "af11"},
1133            "ipv6": {"precedence": "routine"},
1134            "localfilesize": 1024,
1135            "monitor": {
1136                "discriminator": [{"match_params": "match1", "name": "test1"}],
1137                "severity": "errors",
1138            },
1139            "source_interfaces": [
1140                {"interface": "GigabitEthernet0/0/0/0", "vrf": "test"}
1141            ],
1142            "suppress": {"duplicates": True},
1143            "tls_servers": [
1144                {
1145                    "name": "test",
1146                    "tls_hostname": "test2",
1147                    "trustpoint": "test2",
1148                    "vrf": "test",
1149                }
1150            ],
1151            "trap": {"severity": "informational"},
1152        }
1153        result = self.execute_module(changed=False)
1154        self.assertEqual(gathered, result["gathered"])
1155
1156    def test_iosxr_logging_global_parsed(self):
1157        set_module_args(
1158            dict(
1159                running_config="logging tls-server test\n vrf test\n trustpoint test2\n tls-hostname test2"
1160                "\n!\nlogging file test path test maxfilesize 1024 severity info\nlogging ipv4 dscp"
1161                " af11\nlogging ipv6 precedence routine\nlogging trap informational\nlogging events"
1162                " filter\n match test1\n!\nlogging events threshold "
1163                "10\nlogging events buffer-size 1024\nlogging events display-location"
1164                "\nlogging events level warnings"
1165                "\nlogging format rfc5424\nlogging archive\n device disk0"
1166                "\n severity alerts\n file-size 1\n frequency "
1167                "daily\n archive-size 1\n archive-length 1\n!\nlogging console "
1168                "warning\nlogging console discriminator\n "
1169                "match1 test\n!\nlogging history size "
1170                "10\nlogging history disable\nlogging monitor errors"
1171                "\nlogging monitor discriminator\n match1 test1\n!"
1172                "\nlogging buffered 2097152\nlogging buffered warnings\n"
1173                "logging buffered discriminator\n match2 test\n!\nlogging "
1174                "1.1.1.1 vrf default severity critical port default"
1175                "\nlogging correlator rule test type stateful\n reissue-nonbistate\n "
1176                "timeout 5\n reparent\n context-correlation\n!"
1177                "\n!\nlogging correlator ruleset test\n rulename test1"
1178                "\n!\nlogging correlator buffer-size 1024\nlogging "
1179                "localfilesize 1024\nlogging source-interface"
1180                " GigabitEthernet0/0/0/0 vrf test\nlogging hostnameprefix "
1181                "test\nlogging suppress duplicates",
1182                state="parsed",
1183            )
1184        )
1185        result = self.execute_module(changed=False)
1186        parsed_list = {
1187            "archive": {
1188                "archive_length": 1,
1189                "archive_size": 1,
1190                "device": "disk0",
1191                "file_size": 1,
1192                "frequency": "daily",
1193                "severity": "alerts",
1194            },
1195            "buffered": {
1196                "discriminator": [{"match_params": "match2", "name": "test"}],
1197                "severity": "warnings",
1198                "size": 2097152,
1199            },
1200            "console": {
1201                "discriminator": [{"match_params": "match1", "name": "test"}],
1202                "severity": "warning",
1203            },
1204            "correlator": {
1205                "buffer_size": 1024,
1206                "rule_sets": [{"name": "test", "rulename": ["test1"]}],
1207                "rules": [
1208                    {
1209                        "context_correlation": True,
1210                        "reissue_nonbistate": True,
1211                        "reparent": True,
1212                        "rule_name": "test",
1213                        "rule_type": "stateful",
1214                        "timeout": 5,
1215                    }
1216                ],
1217            },
1218            "events": {
1219                "buffer_size": 1024,
1220                "display_location": True,
1221                "filter_match": ["test1"],
1222                "severity": "warnings",
1223                "threshold": 10,
1224            },
1225            "files": [
1226                {
1227                    "maxfilesize": 1024,
1228                    "name": "test",
1229                    "path": "test",
1230                    "severity": "info",
1231                }
1232            ],
1233            "format": True,
1234            "history": {"state": "disabled", "size": 10},
1235            "hostnameprefix": "test",
1236            "hosts": [
1237                {
1238                    "host": "1.1.1.1",
1239                    "port": "default",
1240                    "severity": "critical",
1241                    "vrf": "default",
1242                }
1243            ],
1244            "ipv4": {"dscp": "af11"},
1245            "ipv6": {"precedence": "routine"},
1246            "localfilesize": 1024,
1247            "monitor": {
1248                "discriminator": [{"match_params": "match1", "name": "test1"}],
1249                "severity": "errors",
1250            },
1251            "source_interfaces": [
1252                {"interface": "GigabitEthernet0/0/0/0", "vrf": "test"}
1253            ],
1254            "suppress": {"duplicates": True},
1255            "tls_servers": [
1256                {
1257                    "name": "test",
1258                    "tls_hostname": "test2",
1259                    "trustpoint": "test2",
1260                    "vrf": "test",
1261                }
1262            ],
1263            "trap": {"severity": "informational"},
1264        }
1265
1266        self.assertEqual(parsed_list, result["parsed"])
1267