1# -*- coding: utf-8 -*-
2# Copyright 2020 Red Hat
3# GNU General Public License v3.0+
4# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
6#############################################
7#                WARNING                    #
8#############################################
9#
10# This file is auto generated by the resource
11#   module builder playbook.
12#
13# Do not edit this file manually.
14#
15# Changes to this file will be over written
16#   by the resource module builder.
17#
18# Changes should be made in the model used to
19#   generate this file or in the resource module
20#   builder template.
21#
22#############################################
23
24from __future__ import absolute_import, division, print_function
25
26__metaclass__ = type
27
28from ansible_collections.junipernetworks.junos.tests.unit.compat.mock import (
29    patch,
30)
31from ansible_collections.junipernetworks.junos.plugins.modules import (
32    junos_bgp_global,
33)
34from ansible_collections.junipernetworks.junos.tests.unit.modules.utils import (
35    set_module_args,
36)
37from .junos_module import TestJunosModule, load_fixture
38
39
40class TestJunosBgp_globalModule(TestJunosModule):
41    module = junos_bgp_global
42
43    def setUp(self):
44        super(TestJunosBgp_globalModule, self).setUp()
45
46        self.mock_lock_configuration = patch(
47            "ansible_collections.junipernetworks.junos.plugins.module_utils.network.junos.junos.lock_configuration"
48        )
49        self.lock_configuration = self.mock_lock_configuration.start()
50
51        self.mock_unlock_configuration = patch(
52            "ansible_collections.junipernetworks.junos.plugins.module_utils.network.junos.junos.unlock_configuration"
53        )
54        self.unlock_configuration = self.mock_unlock_configuration.start()
55
56        self.mock_load_config = patch(
57            "ansible_collections.junipernetworks.junos.plugins.module_utils.network.junos.config.bgp_global.bgp_global.load_config"
58        )
59        self.load_config = self.mock_load_config.start()
60
61        self.mock_commit_configuration = patch(
62            "ansible_collections.junipernetworks.junos.plugins.module_utils.network.junos.config.bgp_global.bgp_global.commit_configuration"
63        )
64        self.mock_commit_configuration = self.mock_commit_configuration.start()
65
66        self.mock_execute_show_command = patch(
67            "ansible_collections.junipernetworks.junos.plugins.module_utils.network.junos.facts.bgp_global.bgp_global."
68            "Bgp_globalFacts.get_device_data"
69        )
70        self.execute_show_command = self.mock_execute_show_command.start()
71
72    def tearDown(self):
73        super(TestJunosBgp_globalModule, self).tearDown()
74        self.mock_load_config.stop()
75        self.mock_lock_configuration.stop()
76        self.mock_unlock_configuration.stop()
77        self.mock_commit_configuration.stop()
78        self.mock_execute_show_command.stop()
79
80    def load_fixtures(
81        self, commands=None, format="text", changed=False, filename=None
82    ):
83        def load_from_file(*args, **kwargs):
84            if filename:
85                output = load_fixture(filename)
86            else:
87                output = load_fixture("junos_bgp_global_config.cfg")
88            return output
89
90        self.execute_show_command.side_effect = load_from_file
91
92    def test_junos_bgp_global_merged(self):
93        set_module_args(
94            dict(
95                config=dict(
96                    damping=True,
97                    description="This is configured with Junos_bgp resource module",
98                    preference="2",
99                    bfd_liveness_detection=dict(
100                        minimum_receive_interval=4,
101                        multiplier=10,
102                        no_adaptation=True,
103                        version="automatic",
104                    ),
105                ),
106                state="merged",
107            )
108        )
109        commands = [
110            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
111            "<nc:bgp><nc:damping/><nc:description>This is configured with Junos_bgp resource module</nc:description>"
112            "<nc:preference>2</nc:preference><nc:bfd-liveness-detection>"
113            "<nc:minimum-receive-interval>4</nc:minimum-receive-interval>"
114            "<nc:multiplier>10</nc:multiplier>"
115            "<nc:no-adaptation/><nc:version>automatic</nc:version></nc:bfd-liveness-detection></nc:bgp></nc:protocols>",
116            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
117        ]
118        result = self.execute_module(changed=True, commands=commands)
119        self.assertEqual(sorted(result["commands"]), sorted(commands))
120
121    def test_junos_bgp_global_merged_idempotent(self):
122        set_module_args(
123            dict(
124                config=dict(
125                    accept_remote_nexthop=True,
126                    advertise_from_main_vpn_tables=True,
127                    advertise_inactive=True,
128                    as_number="65432",
129                    authentication_algorithm="md5",
130                    bgp_error_tolerance=dict(malformed_route_limit=30000000),
131                    damping=True,
132                    description="This is configured with Junos_bgp resource module",
133                    hold_time=5,
134                    holddown_all_stale_labels=True,
135                    log_updown=True,
136                    no_advertise_peer_as=True,
137                    no_aggregator_id=True,
138                    out_delay=10,
139                    preference="2",
140                ),
141                state="merged",
142            )
143        )
144        result = self.execute_module(changed=True)
145        self.assertEqual(result["before"], result["after"])
146
147    def test_junos_bgp_global_replaced(self):
148        """
149        :return:
150        """
151        set_module_args(
152            dict(
153                config=dict(
154                    accept_remote_nexthop=True,
155                    advertise_from_main_vpn_tables=True,
156                    advertise_inactive=True,
157                    as_number="65432",
158                    authentication_algorithm="md5",
159                    bgp_error_tolerance=dict(malformed_route_limit=20000000),
160                    damping=True,
161                    description="This is configured with Junos_bgp resource module",
162                    groups=[
163                        dict(name="internal", out_delay=22),
164                        dict(name="external", out_delay=20),
165                    ],
166                    hold_time=4,
167                    holddown_all_stale_labels=True,
168                    log_updown=True,
169                    keep="all",
170                    mtu_discovery=True,
171                    no_precision_timers=True,
172                    no_advertise_peer_as=True,
173                    no_aggregator_id=True,
174                    out_delay=10,
175                    preference="2",
176                ),
177                state="replaced",
178            )
179        )
180
181        commands = [
182            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
183            '<nc:bgp><nc:accept-remote-nexthop delete="delete"/>'
184            '<nc:add-path-display-ipv4-address delete="delete"/>'
185            '<nc:advertise-bgp-static delete="delete"/>'
186            '<nc:advertise-external delete="delete"/>'
187            '<nc:advertise-from-main-vpn-tables delete="delete"/>'
188            '<nc:advertise-inactive delete="delete"/>'
189            '<nc:advertise-peer-as delete="delete"/>'
190            '<nc:authentication-algorithm delete="delete"/>'
191            '<nc:authentication-key delete="delete"/>'
192            '<nc:authentication-key-chain delete="delete"/>'
193            '<nc:bfd-liveness-detection delete="delete"/>'
194            '<nc:bgp-error-tolerance delete="delete"/><nc:bmp delete="delete"/>'
195            '<nc:group delete="delete"/><nc:cluster delete="delete"/>'
196            '<nc:damping delete="delete"/><nc:description delete="delete"/>'
197            '<nc:disable delete="delete"/><nc:egress-te-sid-stats delete="delete"/>'
198            '<nc:enforce-first-as delete="delete"/><nc:export delete="delete"/>'
199            '<nc:forwarding-context delete="delete"/><nc:hold-time delete="delete"/>'
200            '<nc:holddown-all-stale-labels delete="delete"/><nc:import delete="delete"/>'
201            '<nc:include-mp-next-hop delete="delete"/><nc:ipsec-sa delete="delete"/>'
202            '<nc:keep delete="delete"/><nc:local-address delete="delete"/>'
203            '<nc:local-interface delete="delete"/><nc:local-preference delete="delete"/>'
204            '<nc:log-updown delete="delete"/><nc:mtu-discovery delete="delete"/>'
205            '<nc:no-advertise-peer-as delete="delete"/><nc:no-aggregator-id delete="delete"/>'
206            '<nc:no-client-reflect delete="delete"/><nc:no-precision-timers delete="delete"/>'
207            '<nc:passive delete="delete"/><nc:peer-as delete="delete"/>'
208            '<nc:precision-timers delete="delete"/><nc:preference delete="delete"/>'
209            '<nc:out-delay delete="delete"/><nc:rfc6514-compliant-safi129 delete="delete"/>'
210            '<nc:route-server-client delete="delete"/><nc:send-addpath-optimization delete="delete"/>'
211            '<nc:sr-preference-override delete="delete"/>'
212            '<nc:stale-labels-holddown-period delete="delete"/><nc:tcp-aggressive-transmission delete="delete"/>'
213            '<nc:tcp-mss delete="delete"/><nc:ttl delete="delete"/>'
214            '<nc:unconfigured-peer-graceful-restart delete="delete"/>'
215            '<nc:vpn-apply-export delete="delete"/></nc:bgp><nc:bgp>'
216            "<nc:accept-remote-nexthop/><nc:advertise-from-main-vpn-tables/>"
217            "<nc:advertise-inactive/><nc:damping/><nc:holddown-all-stale-labels/>"
218            "<nc:log-updown/><nc:mtu-discovery/><nc:no-advertise-peer-as/>"
219            "<nc:no-aggregator-id/><nc:no-precision-timers/>"
220            "<nc:authentication-algorithm>md5</nc:authentication-algorithm>"
221            "<nc:description>This is configured with Junos_bgp resource module</nc:description>"
222            "<nc:hold-time>4</nc:hold-time><nc:keep>all</nc:keep><nc:preference>2</nc:preference>"
223            "<nc:out-delay>10</nc:out-delay><nc:bgp-error-tolerance>"
224            "<nc:malformed-route-limit>20000000</nc:malformed-route-limit>"
225            "</nc:bgp-error-tolerance><nc:group><nc:name>internal</nc:name>"
226            "<nc:out-delay>22</nc:out-delay></nc:group><nc:group><nc:name>external</nc:name>"
227            "<nc:out-delay>20</nc:out-delay></nc:group></nc:bgp></nc:protocols>",
228            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
229            '<nc:autonomous-system delete="delete"/>'
230            "<nc:autonomous-system>65432</nc:autonomous-system></nc:routing-options>",
231        ]
232        result = self.execute_module(changed=True, commands=commands)
233        self.assertEqual(sorted(result["commands"]), sorted(commands))
234
235    def test_junos_bgp_global_replaced_idempotent(self):
236        set_module_args(
237            dict(
238                config=dict(
239                    accept_remote_nexthop=True,
240                    advertise_from_main_vpn_tables=True,
241                    advertise_inactive=True,
242                    as_number="65432",
243                    authentication_algorithm="md5",
244                    bgp_error_tolerance=dict(malformed_route_limit=30000000),
245                    damping=True,
246                    description="This is configured with Junos_bgp resource module",
247                    hold_time=5,
248                    holddown_all_stale_labels=True,
249                    log_updown=True,
250                    no_advertise_peer_as=True,
251                    no_aggregator_id=True,
252                    out_delay=10,
253                    preference="2",
254                ),
255                state="replaced",
256            )
257        )
258        result = self.execute_module(changed=True)
259        self.assertEqual(result["before"], result["after"])
260
261    def test_junos_bgp_global_rendered(self):
262        """
263        :return:
264        """
265        set_module_args(
266            dict(
267                config=dict(
268                    description="This is configured with Junos_bgp resource module",
269                    groups=[dict(name="internal", out_delay=22)],
270                    hold_time=4,
271                    holddown_all_stale_labels=True,
272                    include_mp_next_hop=True,
273                    log_updown=True,
274                    loops=5,
275                    keep="all",
276                    mtu_discovery=True,
277                    out_delay=10,
278                    preference="2",
279                ),
280                state="rendered",
281            )
282        )
283
284        rendered = (
285            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"><nc:bgp>'
286            "<nc:holddown-all-stale-labels/><nc:include-mp-next-hop/><nc:log-updown/>"
287            "<nc:mtu-discovery/>"
288            "<nc:description>This is configured with Junos_bgp resource module</nc:description>"
289            "<nc:hold-time>4</nc:hold-time><nc:keep>all</nc:keep><nc:preference>2</nc:preference>"
290            "<nc:out-delay>10</nc:out-delay><nc:group>"
291            "<nc:name>internal</nc:name><nc:out-delay>22</nc:out-delay>"
292            "</nc:group></nc:bgp></nc:protocols>"
293        )
294        result = self.execute_module(changed=False)
295        self.assertEqual(sorted(result["rendered"]), sorted(rendered))
296
297    def test_junos_bgp_global_rendered_empty(self):
298        """
299        :return:
300        """
301        set_module_args(dict(config=dict(description=""), state="rendered"))
302        rendered = ""
303        result = self.execute_module(changed=False)
304        self.assertEqual(sorted(result["rendered"]), sorted(rendered))
305
306    def test_junos_bgp_global_gathered(self):
307        """
308        :return:
309        """
310        set_module_args(dict(state="gathered"))
311        result = self.execute_module(changed=False)
312        gather_dict = {
313            "accept_remote_nexthop": True,
314            "advertise_from_main_vpn_tables": True,
315            "advertise_inactive": True,
316            "as_number": "65432",
317            "authentication_algorithm": "md5",
318            "bgp_error_tolerance": {"malformed_route_limit": "30000000"},
319            "damping": True,
320            "description": "This is configured with Junos_bgp resource module",
321            "hold_time": "5",
322            "holddown_all_stale_labels": True,
323            "log_updown": True,
324            "no_advertise_peer_as": True,
325            "no_aggregator_id": True,
326            "out_delay": "10",
327            "preference": "2",
328        }
329        self.assertEqual(sorted(gather_dict), sorted(result["gathered"]))
330
331    def test_junos_bgp_global_parsed(self):
332        parsed_str = """
333            <rpc-reply message-id="urn:uuid:0cadb4e8-5bba-47f4-986e-72906227007f">
334                <configuration changed-seconds="1590139550" changed-localtime="2020-05-22 09:25:50 UTC">
335                    <version>18.4R1-S2.4</version>
336                    <protocols>
337                        <bgp>
338                            <advertise-from-main-vpn-tables />
339                            <holddown-all-stale-labels />
340                            <description>This is configured with Junos_bgp resource module</description>
341                            <accept-remote-nexthop />
342                            <preference>2</preference>
343                            <hold-time>5</hold-time>
344                            <advertise-inactive />
345                            <no-advertise-peer-as />
346                            <no-aggregator-id />
347                            <out-delay>10</out-delay>
348                            <log-updown />
349                            <damping />
350                            <bgp-error-tolerance>
351                            <malformed-route-limit>30000000</malformed-route-limit>
352                            </bgp-error-tolerance>
353                            <authentication-algorithm>md5</authentication-algorithm>
354                        </bgp>
355                    </protocols>
356                    <routing-options>
357                        <static>
358                            <route>
359                            <name>172.16.17.0/24</name>
360                            <discard />
361                            </route>
362                        </static>
363                        <router-id>10.200.16.75</router-id>
364                        <autonomous-system>
365                            <as-number>65432</as-number>
366                        </autonomous-system>
367                    </routing-options>
368                </configuration>
369            </rpc-reply>
370        """
371        set_module_args(dict(running_config=parsed_str, state="parsed"))
372        result = self.execute_module(changed=False)
373        parsed_dict = {
374            "accept_remote_nexthop": "True",
375            "advertise_from_main_vpn_tables": "True",
376            "advertise_inactive": "True",
377            "as_number": "65534",
378            "authentication_algorithm": "md5",
379            "bgp_error_tolerance": {"malformed_route_limit": "30000000"},
380            "damping": "True",
381            "description": "This is configured with Junos_bgp resource module",
382            "hold_time": "5",
383            "holddown_all_stale_labels": "True",
384            "log_updown": "true",
385            "no_advertise_peer_as": "true",
386            "no_aggregator_id": "true",
387            "out_delay": "10",
388            "preference": "2",
389        }
390        self.assertEqual(sorted(parsed_dict), sorted(result["parsed"]))
391
392    def test_junos_bgp_global_parsed_empty_running_config(self):
393        set_module_args(dict(running_config="", state="parsed"))
394        try:
395            self.execute_module(changed=False)
396        except Exception:
397            pass
398
399    def test_junos_bgp_global_delete(self):
400        set_module_args(dict(config=dict(), state="deleted"))
401
402        commands = [
403            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
404            '<nc:bgp><nc:accept-remote-nexthop delete="delete"/><nc:add-path-display-ipv4-address delete="delete"/>'
405            '<nc:advertise-bgp-static delete="delete"/><nc:advertise-external delete="delete"/>'
406            '<nc:advertise-from-main-vpn-tables delete="delete"/><nc:advertise-inactive delete="delete"/>'
407            '<nc:advertise-peer-as delete="delete"/><nc:authentication-algorithm delete="delete"/>'
408            '<nc:authentication-key delete="delete"/><nc:authentication-key-chain delete="delete"/>'
409            '<nc:bfd-liveness-detection delete="delete"/><nc:bgp-error-tolerance delete="delete"/>'
410            '<nc:bmp delete="delete"/><nc:group delete="delete"/><nc:cluster delete="delete"/>'
411            '<nc:damping delete="delete"/><nc:description delete="delete"/><nc:disable delete="delete"/>'
412            '<nc:egress-te-sid-stats delete="delete"/><nc:enforce-first-as delete="delete"/>'
413            '<nc:export delete="delete"/><nc:forwarding-context delete="delete"/>'
414            '<nc:hold-time delete="delete"/><nc:holddown-all-stale-labels delete="delete"/>'
415            '<nc:import delete="delete"/><nc:include-mp-next-hop delete="delete"/>'
416            '<nc:ipsec-sa delete="delete"/><nc:keep delete="delete"/><nc:local-address delete="delete"/>'
417            '<nc:local-interface delete="delete"/>'
418            '<nc:local-preference delete="delete"/><nc:log-updown delete="delete"/>'
419            '<nc:mtu-discovery delete="delete"/><nc:no-advertise-peer-as delete="delete"/>'
420            '<nc:no-aggregator-id delete="delete"/><nc:no-client-reflect delete="delete"/>'
421            '<nc:no-precision-timers delete="delete"/><nc:passive delete="delete"/>'
422            '<nc:peer-as delete="delete"/><nc:precision-timers delete="delete"/>'
423            '<nc:preference delete="delete"/><nc:out-delay delete="delete"/>'
424            '<nc:rfc6514-compliant-safi129 delete="delete"/><nc:route-server-client delete="delete"/>'
425            '<nc:send-addpath-optimization delete="delete"/><nc:sr-preference-override delete="delete"/>'
426            '<nc:stale-labels-holddown-period delete="delete"/><nc:tcp-aggressive-transmission delete="delete"/>'
427            '<nc:tcp-mss delete="delete"/><nc:ttl delete="delete"/>'
428            '<nc:unconfigured-peer-graceful-restart delete="delete"/>'
429            '<nc:vpn-apply-export delete="delete"/>'
430            "</nc:bgp></nc:protocols>",
431            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
432            '<nc:autonomous-system delete="delete"/></nc:routing-options>',
433        ]
434
435        result = self.execute_module(changed=True)
436        self.assertEqual(sorted(result["commands"]), sorted(commands))
437
438    def test_junos_bgp_global_delete_purged(self):
439        set_module_args(dict(config=dict(), state="purged"))
440
441        commands = [
442            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"><nc:bgp delete="delete"/></nc:protocols>',
443            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"><nc:autonomous-system delete="delete"/></nc:routing-options>',
444        ]
445        result = self.execute_module(changed=True)
446        self.assertEqual(sorted(result["commands"]), sorted(commands))
447
448    def test_junos_bgp_global_merged_routing_options(self):
449        """
450        configure routing-options attributes:
451         - loops
452         - as_number
453         - asdot_notation
454        """
455        set_module_args(
456            dict(
457                config=dict(as_number="65432", loops=5, asdot_notation=True),
458                state="merged",
459            )
460        )
461        commands = [
462            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
463            "<nc:bgp/></nc:protocols>",
464            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
465            "<nc:autonomous-system>65432<nc:loops>5</nc:loops><nc:asdot-notation/></nc:autonomous-system>"
466            "</nc:routing-options>",
467        ]
468        result = self.execute_module(changed=True, commands=commands)
469        self.assertEqual(sorted(result["commands"]), sorted(commands))
470
471    def test_junos_bgp_global_merge_groups(self):
472        """
473        description: configure groups attributes:
474        """
475        set_module_args(
476            dict(
477                config=dict(
478                    groups=[
479                        dict(
480                            name="internal",
481                            neighbors=[
482                                dict(
483                                    neighbor_address="11.11.11.11",
484                                    peer_as="65534",
485                                    out_delay=11,
486                                    accept_remote_nexthop=True,
487                                ),
488                                dict(
489                                    neighbor_address="11.11.11.12",
490                                    peer_as="65534",
491                                    out_delay=12,
492                                    accept_remote_nexthop=True,
493                                ),
494                            ],
495                        )
496                    ]
497                ),
498                state="merged",
499            )
500        )
501        commands = [
502            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
503            "<nc:bgp><nc:group><nc:name>internal</nc:name>"
504            "<nc:neighbor><nc:name>11.11.11.11</nc:name>"
505            "<nc:accept-remote-nexthop/><nc:peer-as>65534</nc:peer-as>"
506            "<nc:out-delay>11</nc:out-delay></nc:neighbor>"
507            "<nc:neighbor><nc:name>11.11.11.12</nc:name><nc:accept-remote-nexthop/>"
508            "<nc:peer-as>65534</nc:peer-as><nc:out-delay>12</nc:out-delay></nc:neighbor></nc:group>"
509            "</nc:bgp></nc:protocols>",
510            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
511        ]
512        result = self.execute_module(changed=True, commands=commands)
513        self.assertEqual(sorted(result["commands"]), sorted(commands))
514
515    def test_junos_bgp_global_merged_advertise_bgp_static(self):
516        """
517        configure advertise_bgp_static attributes:
518        """
519        set_module_args(
520            dict(
521                config=dict(advertise_bgp_static=dict(policy="static-to-bgp")),
522                state="merged",
523            )
524        )
525        commands = [
526            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
527            "<nc:bgp><nc:advertise-bgp-static><nc:policy>static-to-bgp</nc:policy>"
528            "</nc:advertise-bgp-static>"
529            "</nc:bgp></nc:protocols>",
530            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
531        ]
532        result = self.execute_module(changed=True, commands=commands)
533        self.assertEqual(sorted(result["commands"]), sorted(commands))
534
535    def test_junos_bgp_global_merged_advertise_external(self):
536        """
537        configure advertise_external attributes:
538        """
539        set_module_args(
540            dict(
541                config=dict(
542                    advertise_external=dict(set=True, conditional=True)
543                ),
544                state="merged",
545            )
546        )
547        commands = [
548            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
549            "<nc:bgp><nc:advertise-external><nc:conditional/></nc:advertise-external>"
550            "</nc:bgp></nc:protocols>",
551            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
552        ]
553        result = self.execute_module(changed=True, commands=commands)
554        self.assertEqual(sorted(result["commands"]), sorted(commands))
555
556    def test_junos_bgp_global_merged_bfd_liveness_detection(self):
557        """
558        configure bfd_liveness_detection attributes:
559        """
560        set_module_args(
561            dict(
562                config=dict(
563                    bfd_liveness_detection=dict(
564                        minimum_receive_interval=8,
565                        no_adaptation=True,
566                        authentication=dict(
567                            algorithm="keyed-md5",
568                            key_chain="junos",
569                            loose_check=True,
570                        ),
571                        detection_time=dict(threshold=1000000),
572                        transmit_interval=dict(
573                            minimum_interval=20, threshold=100000
574                        ),
575                        holddown_interval=20,
576                        multiplier=20,
577                        session_mode="multihop",
578                        version="1",
579                    )
580                ),
581                state="merged",
582            )
583        )
584        commands = [
585            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
586            "<nc:bgp><nc:bfd-liveness-detection><nc:authentication>"
587            "<nc:algorithm>keyed-md5</nc:algorithm><nc:key-chain>junos</nc:key-chain>"
588            "<nc:loose-check/></nc:authentication><nc:detection-time>"
589            "<nc:threshold>1000000</nc:threshold></nc:detection-time><nc:transmit-interval>"
590            "<nc:minimum-interval>20</nc:minimum-interval></nc:transmit-interval>"
591            "<nc:holddown-interval>20</nc:holddown-interval><nc:minimum-receive-interval>8</nc:minimum-receive-interval>"
592            "<nc:multiplier>20</nc:multiplier><nc:no-adaptation/>"
593            "<nc:session-mode>multihop</nc:session-mode>"
594            "<nc:version>1</nc:version></nc:bfd-liveness-detection>"
595            "</nc:bgp></nc:protocols>",
596            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
597        ]
598        result = self.execute_module(changed=True, commands=commands)
599        self.assertEqual(sorted(result["commands"]), sorted(commands))
600
601    def test_junos_bgp_global_merged_bgp_error_tolerance(self):
602        """
603        configure bgp_error_tolerance attributes:
604        """
605        set_module_args(
606            dict(
607                config=dict(
608                    bgp_error_tolerance=dict(
609                        set=True,
610                        malformed_route_limit=10,
611                        malformed_update_log_interval=15,
612                        no_malformed_route_limit=True,
613                    )
614                ),
615                state="merged",
616            )
617        )
618        commands = [
619            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
620            "<nc:bgp><nc:bgp-error-tolerance><nc:malformed-route-limit>10</nc:malformed-route-limit>"
621            "<nc:malformed-update-log-interval>15</nc:malformed-update-log-interval>"
622            "<nc:no-malformed-route-limit/></nc:bgp-error-tolerance>"
623            "</nc:bgp></nc:protocols>",
624            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
625        ]
626        result = self.execute_module(changed=True, commands=commands)
627        self.assertEqual(sorted(result["commands"]), sorted(commands))
628
629    def test_junos_bgp_global_merged_bmp(self):
630        """
631        configure bmp attributes:
632        """
633        set_module_args(
634            dict(
635                config=dict(
636                    bmp=dict(
637                        monitor=True,
638                        route_monitoring=dict(
639                            none=True,
640                            post_policy=True,
641                            post_policy_exclude_non_eligible=True,
642                            pre_policy=True,
643                            post_policy_exclude_non_feasible=True,
644                        ),
645                    )
646                ),
647                state="merged",
648            )
649        )
650        commands = [
651            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
652            "<nc:bgp><nc:bmp><nc:monitor>enable</nc:monitor><nc:route-monitoring><nc:none/>"
653            "<nc:post-policy><nc:exclude-non-eligible/></nc:post-policy></nc:route-monitoring></nc:bmp>"
654            "</nc:bgp></nc:protocols>",
655            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
656        ]
657        result = self.execute_module(changed=True, commands=commands)
658        self.assertEqual(sorted(result["commands"]), sorted(commands))
659
660    def test_junos_bgp_global_merged_bmp_2(self):
661        """
662        configure bmp attributes:
663        """
664        set_module_args(
665            dict(
666                config=dict(
667                    bmp=dict(
668                        monitor=False,
669                        route_monitoring=dict(
670                            none=False,
671                            post_policy=False,
672                            post_policy_exclude_non_eligible=False,
673                            pre_policy=False,
674                            post_policy_exclude_non_feasible=False,
675                        ),
676                    )
677                ),
678                state="merged",
679            )
680        )
681        commands = [
682            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
683            "<nc:bgp><nc:bmp><nc:monitor>disable</nc:monitor><nc:route-monitoring/></nc:bmp>"
684            "</nc:bgp></nc:protocols>",
685            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
686        ]
687        result = self.execute_module(changed=True, commands=commands)
688        self.assertEqual(sorted(result["commands"]), sorted(commands))
689
690    def test_junos_bgp_global_merged_egress_te(self):
691        """
692        configure egress_te attributes:
693        """
694        set_module_args(
695            dict(
696                config=dict(egress_te=dict(set=True, backup_path="sample")),
697                state="merged",
698            )
699        )
700        commands = [
701            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
702            "<nc:bgp><nc:egress-te><nc:backup-path>sample</nc:backup-path></nc:egress-te>"
703            "</nc:bgp></nc:protocols>",
704            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
705        ]
706        result = self.execute_module(changed=True, commands=commands)
707        self.assertEqual(sorted(result["commands"]), sorted(commands))
708
709    def test_junos_bgp_global_merged_egress_te_backup_paths(self):
710        """
711        configure egress_te_backup_paths attributes:
712        """
713        set_module_args(
714            dict(
715                config=dict(
716                    egress_te_backup_paths=dict(
717                        templates=[
718                            dict(
719                                path_name="temp",
720                                ip_forward=dict(set=True, rti_name="sample"),
721                                peers=["10.10.10.10", "11.11.11.11"],
722                                remote_nexthop="11.1.1.1",
723                            )
724                        ]
725                    )
726                ),
727                state="merged",
728            )
729        )
730        commands = [
731            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
732            "<nc:bgp><nc:egress-te-backup-paths><nc:template><nc:name>temp</nc:name><nc:peer>"
733            "<nc:name>10.10.10.10</nc:name></nc:peer><nc:peer><nc:name>11.11.11.11</nc:name>"
734            "</nc:peer><nc:remote-nexthop>11.1.1.1</nc:remote-nexthop><nc:ip-forward/>"
735            "</nc:template></nc:egress-te-backup-paths>"
736            "</nc:bgp></nc:protocols>",
737            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
738        ]
739        result = self.execute_module(changed=True, commands=commands)
740        self.assertEqual(sorted(result["commands"]), sorted(commands))
741
742    def test_junos_bgp_global_merged_groups_allow(self):
743        """
744        configure allow attributes:
745        """
746        set_module_args(
747            dict(
748                config=dict(
749                    groups=[dict(name="internal", allow=["all", "1.1.1.0/24"])]
750                ),
751                state="merged",
752            )
753        )
754        commands = [
755            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
756            "<nc:bgp><nc:group><nc:name>internal</nc:name><nc:allow>all</nc:allow>"
757            "<nc:allow>1.1.1.0/24</nc:allow></nc:group>"
758            "</nc:bgp></nc:protocols>",
759            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
760        ]
761        result = self.execute_module(changed=True, commands=commands)
762        self.assertEqual(sorted(result["commands"]), sorted(commands))
763
764    def test_junos_bgp_global_merged_optimal_route_reflection(self):
765        """
766        configure optimal_route_reflection attributes:
767        """
768        set_module_args(
769            dict(
770                config=dict(
771                    groups=[
772                        dict(
773                            name="internal",
774                            optimal_route_reflection=dict(
775                                igp_backup="test_igp",
776                                igp_primary="test_primary",
777                            ),
778                        )
779                    ]
780                ),
781                state="merged",
782            )
783        )
784        commands = [
785            '<nc:protocols xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">'
786            "<nc:bgp><nc:group><nc:name>internal</nc:name><nc:optimal-route-reflection>"
787            "<nc:igp-backup>test_igp</nc:igp-backup><nc:igp-primary>test_primary</nc:igp-primary>"
788            "</nc:optimal-route-reflection></nc:group>"
789            "</nc:bgp></nc:protocols>",
790            '<nc:routing-options xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"/>',
791        ]
792        result = self.execute_module(changed=True, commands=commands)
793        self.assertEqual(sorted(result["commands"]), sorted(commands))
794
795    def test_junos_bgp_global_parsed_bgp_global(self):
796        parsed_str = """
797            <rpc-reply message-id="urn:uuid:0cadb4e8-5bba-47f4-986e-72906227007f">
798                <configuration changed-seconds="1590139550" changed-localtime="2020-05-22 09:25:50 UTC">
799                    <version>18.4R1-S2.4</version>
800                    <protocols>
801                        <bgp>
802                            <bgp-error-tolerance>
803                                <malformed-update-log-interval>10000</malformed-update-log-interval>
804                                <no-malformed-route-limit/>
805                            </bgp-error-tolerance>
806                            <advertise-peer-as/>
807                            <advertise-external>
808                                <conditional/>
809                            </advertise-external>
810                            <precision-timers/>
811                            <advertise-from-main-vpn-tables/>
812                            <holddown-all-stale-labels/>
813                            <description>Config is updated with merged operation</description>
814                            <accept-remote-nexthop/>
815                            <preference>3</preference>
816                            <hold-time>15</hold-time>
817                            <advertise-inactive/>
818                            <no-advertise-peer-as/>
819                            <keep>all</keep>
820                            <no-aggregator-id/>
821                            <mtu-discovery/>
822                            <out-delay>20</out-delay>
823                            <log-updown/>
824                            <damping/>
825                            <authentication-algorithm>md5</authentication-algorithm>
826                            <no-client-reflect/>
827                            <include-mp-next-hop/>
828                            <bmp>
829                                <monitor>enable</monitor>
830                                <route-monitoring>
831                                    <pre-policy>
832                                        <exclude-non-feasible/>
833                                    </pre-policy>
834                                    <post-policy>
835                                        <exclude-non-eligible/>
836                                    </post-policy>
837                                </route-monitoring>
838                            </bmp>>
839                            <add-path-display-ipv4-address/>
840                            <egress-te-sid-stats/>
841                            <egress-te-set-segment>
842                                <name>est1</name>
843                                <label>
844                                    <label-value>1048400</label-value>
845                                </label>
846                                <egress-te-backup-segment>
847                                    <label>
848                                        <label-value>1048300</label-value>
849                                    </label>
850                                </egress-te-backup-segment>
851                            </egress-te-set-segment>
852                            <egress-te-set-segment>
853                                <name>est2</name>
854                                <label>
855                                    <label-value>1048400</label-value>
856                                </label>
857                            </egress-te-set-segment>
858                            <egress-te-backup-paths>
859                                <template>
860                                    <name>mpls</name>
861                                    <peer>
862                                        <name>1.1.1.1</name>
863                                    </peer>
864                                    <ip-forward>
865                                    </ip-forward>
866                                </template>
867                                <template>
868                                    <name>mpls2</name>
869                                    <peer>
870                                        <name>1.1.1.1</name>
871                                    </peer>
872                                    <peer>
873                                        <name>1.1.1.2</name>
874                                    </peer>
875                                    <remote-nexthop>
876                                        <remote-nh-addr>10.10.10.11</remote-nh-addr>
877                                    </remote-nexthop>
878                                </template>
879                            </egress-te-backup-paths>
880                            <group>
881                                <name>internal</name>
882                                <out-delay>22</out-delay>
883                                <neighbor>
884                                    <name>11.11.11.1</name>
885                                    <peer-as>65432</peer-as>
886                                </neighbor>
887                            </group>
888                            <graceful-restart>
889                                <disable/>
890                            </graceful-restart>
891                            <metric-out>
892                                <metric-value>4294967291</metric-value>
893                            </metric-out>
894                            <multipath>
895                                <disable/>
896                                <multiple-as/>
897                            </multipath>
898                        </bgp>
899                    </protocols>
900                    <routing-options>
901                        <autonomous-system>
902                            <as-number>65534</as-number>
903                            <loops>5</loops>
904                            <asdot-notation/>
905                        </autonomous-system>
906                    </routing-options>
907                </configuration>
908            </rpc-reply>
909        """
910        set_module_args(dict(running_config=parsed_str, state="parsed"))
911        self.execute_module(changed=False)
912
913    def test_junos_bgp_global_parsed_bgp_group_neighbors_list(self):
914        parsed_str = """
915            <rpc-reply message-id="urn:uuid:0cadb4e8-5bba-47f4-986e-72906227007f">
916                <configuration changed-seconds="1590139550" changed-localtime="2020-05-22 09:25:50 UTC">
917                    <version>18.4R1-S2.4</version>
918                    <protocols>
919                        <bgp>
920                            <disable/>
921                             <egress-te-set-segment>
922                                <name>est2</name>
923                                <label>
924                                    <label-value>1048400</label-value>
925                                </label>
926                            </egress-te-set-segment>
927                            <bfd-liveness-detection>
928                                <minimum-interval>1000</minimum-interval>
929                                <holddown-interval>1000</holddown-interval>
930                                <minimum-receive-interval>100</minimum-receive-interval>
931                                <multiplier>400</multiplier>
932                                <no-adaptation/>
933                                <session-mode>multihop</session-mode>
934                                <version>1</version>
935                            </bfd-liveness-detection>
936                            <bgp-error-tolerance>
937                                <malformed-update-log-interval>10000</malformed-update-log-interval>
938                                <malformed-route-limit>4294967285</malformed-route-limit>
939                            </bgp-error-tolerance>
940                            <bmp>
941                                <monitor>enable</monitor>
942                                <route-monitoring>
943                                    <none/>
944                                </route-monitoring>
945                            </bmp>
946                            <authentication-key>$9$6HxBAtOrlMXNbp0MX</authentication-key>
947                            <advertise-external/>
948                            <cluster>0.0.4.198</cluster>
949                            <egress-te-backup-segment>
950                                    <label>
951                                        <label-value>1048300</label-value>
952                                    </label>
953                            </egress-te-backup-segment>
954                            <egress-te-backup-paths>
955                                <template>
956                                    <name>mpls</name>
957                                    <peer>
958                                        <name>1.1.1.1</name>
959                                    </peer>
960                                    <ip-forward>
961                                    </ip-forward>
962                                </template>
963                            </egress-te-backup-paths>
964                            <group>
965                                <name>internal</name>
966                                <out-delay>22</out-delay>
967                                <neighbor>
968                                    <name>11.11.11.1</name>
969                                    <peer-as>65432</peer-as>
970                                </neighbor>
971                                <neighbor>
972                                    <name>11.11.11.2</name>
973                                    <peer-as>65432</peer-as>
974                                </neighbor>
975                            </group>
976                            <idle-after-switch-over>
977                                <timeout>4294967291</timeout>
978                            </idle-after-switch-over>
979                            <graceful-restart>
980                            </graceful-restart>
981                           <import>art1</import>
982                           <metric-out>
983                                <igp>
984                                    <delay-med-update/>
985                                </igp>
986                            </metric-out>
987                            <multihop>
988                            </multihop>
989                            <multipath>
990                            </multipath>
991                            <no-precision-timers/>
992                        </bgp>
993                    </protocols>
994                    <routing-options xmlns="http://yang.juniper.net/junos-es/conf/routing-options">
995                        <autonomous-system>
996                            <as-number>65534</as-number>
997                            <loops>5</loops>
998                            <asdot-notation/>
999                        </autonomous-system>
1000                    </routing-options>
1001                </configuration>
1002            </rpc-reply>
1003        """
1004        set_module_args(dict(running_config=parsed_str, state="parsed"))
1005        self.execute_module(changed=False)
1006
1007    def test_junos_bgp_global_parsed_bgp_group_neighbors_list_2(self):
1008        parsed_str = """
1009            <rpc-reply message-id="urn:uuid:0cadb4e8-5bba-47f4-986e-72906227007f">
1010                <configuration changed-seconds="1590139550" changed-localtime="2020-05-22 09:25:50 UTC">
1011                    <version>18.4R1-S2.4</version>
1012                    <protocols>
1013                        <bgp>
1014                        <graceful-restart>
1015                                <forwarding-state-bit>from-fib</forwarding-state-bit>
1016                                <restart-time>1700</restart-time>
1017                                <stale-routes-time>1500</stale-routes-time>
1018                                <long-lived>
1019                                    <receiver>
1020                                        <disable/>
1021                                    </receiver>
1022                                    <advertise-to-non-llgr-neighbor>
1023                                    </advertise-to-non-llgr-neighbor>
1024                                </long-lived>
1025                        </graceful-restart>
1026                        <idle-after-switch-over>
1027                            <forever/>
1028                        </idle-after-switch-over>
1029                        <import>art1</import>
1030                        <import>art12</import>
1031                        <local-as>
1032                            <as-number>65432</as-number>
1033                            <private/>
1034                            <alias/>
1035                            <no-prepend-global-as/>
1036                        </local-as>
1037                        <local-interface>ge-0/0/1.0</local-interface>
1038                        <local-preference>12</local-preference>
1039                        <metric-out>
1040                            <minimum-igp>
1041                                <metric-offset>100</metric-offset>
1042                            </minimum-igp>
1043                        </metric-out>
1044                        <traceoptions>
1045                                <file>
1046                                    <filename>temp_trace</filename>
1047                                    <size>4294967100</size>
1048                                    <files>3</files>
1049                                    <no-world-readable/>
1050                                </file>
1051                                <flag>
1052                                    <name>4byte-as</name>
1053                                    <receive/>
1054                                    <detail/>
1055                                </flag>
1056                                <flag>
1057                                    <name>all</name>
1058                                    <send/>
1059                                </flag>
1060                                <flag>
1061                                    <name>state</name>
1062                                    <receive/>
1063                                </flag>
1064                                <flag>
1065                                    <name>task</name>
1066                                    <disable/>
1067                                </flag>
1068                                <flag>
1069                                    <name>update</name>
1070                                    <filter>
1071                                        <match-on>prefix</match-on>
1072                                        <policy>pol1</policy>
1073                                    </filter>
1074                                </flag>
1075                            </traceoptions>
1076                            <multihop>
1077                                <ttl>200</ttl>
1078                                <no-nexthop-change/>
1079                            </multihop>
1080                            <traffic-statistics-labeled-path>
1081                                <file>
1082                                    <filename>traffic_temp</filename>
1083                                    <size>20000</size>
1084                                    <files>10</files>
1085                                    <world-readable/>
1086                                </file>
1087                            </traffic-statistics-labeled-path>
1088                            <path-selection>
1089                                <cisco-non-deterministic/>
1090                                <always-compare-med/>
1091                                <med-plus-igp>
1092                                    <igp-multiplier>500</igp-multiplier>
1093                                </med-plus-igp>
1094                                <external-router-id/>
1095                                <as-path-ignore/>
1096                                <l2vpn-use-bgp-rules/>
1097                            </path-selection>
1098                            <outbound-route-filter>
1099                                <bgp-orf-cisco-mode/>
1100                                <prefix-based>
1101                                    <accept>
1102                                        <inet/>
1103                                    </accept>
1104                                </prefix-based>
1105                            </outbound-route-filter>
1106                            <output-queue-priority>
1107                                <expedited>
1108                                    <update-tokens>10</update-tokens>
1109                                </expedited>
1110                                <priority>
1111                                    <name>13</name>
1112                                    <update-tokens>20</update-tokens>
1113                                </priority>
1114                                <defaults>
1115                                    <low>
1116                                        <priority>14</priority>
1117                                    </low>
1118                                    <high>
1119                                        <priority>15</priority>
1120                                    </high>
1121                                </defaults>
1122                            </output-queue-priority>
1123                            <remove-private>
1124                                <all>
1125                                    <replace>
1126                                        <nearest/>
1127                                    </replace>
1128                                </all>
1129                            </remove-private>
1130                            <rfc6514-compliant-safi129/>
1131                            <route-server-client/>
1132                            <send-addpath-optimization/>
1133                            <tcp-aggressive-transmission/>
1134                            <group>
1135                                <name>internal</name>
1136                                <out-delay>22</out-delay>
1137                                <neighbor>
1138                                    <name>11.11.11.1</name>
1139                                    <peer-as>65432</peer-as>
1140                                </neighbor>
1141                            </group>
1142                            <bfd-liveness-detection>
1143                            <minimum-interval>1000</minimum-interval>
1144                                <transmit-interval>
1145                                    <minimum-interval>220000</minimum-interval>
1146                                    <threshold>2000</threshold>
1147                                </transmit-interval>
1148                                <detection-time>
1149                                    <threshold>10000</threshold>
1150                                </detection-time>
1151                                <authentication>
1152                                    <key-chain>cisco</key-chain>
1153                                    <loose-check/>
1154                                    <algorithm>keyed-md5</algorithm>
1155                                </authentication>
1156                            </bfd-liveness-detection>
1157                        </bgp>
1158                    </protocols>
1159                    <routing-options xmlns="http://yang.juniper.net/junos-es/conf/routing-options">
1160                        <autonomous-system>
1161                            <as-number>65534</as-number>
1162                            <loops>5</loops>
1163                            <asdot-notation/>
1164                        </autonomous-system>
1165                    </routing-options>
1166                </configuration>
1167            </rpc-reply>
1168        """
1169        set_module_args(dict(running_config=parsed_str, state="parsed"))
1170        self.execute_module(changed=False)
1171
1172    def test_junos_bgp_global_parsed_only_routing_options(self):
1173        parsed_str = """
1174            <rpc-reply message-id="urn:uuid:0cadb4e8-5bba-47f4-986e-72906227007f">
1175                <configuration changed-seconds="1590139550" changed-localtime="2020-05-22 09:25:50 UTC">
1176                    <version>18.4R1-S2.4</version>
1177                    <routing-options>
1178                        <autonomous-system>
1179                            <as-number>65534</as-number>
1180                            <loops>5</loops>
1181                            <asdot-notation/>
1182                        </autonomous-system>
1183                    </routing-options>
1184                </configuration>
1185            </rpc-reply>
1186        """
1187        set_module_args(dict(running_config=parsed_str, state="parsed"))
1188        self.execute_module(changed=False)
1189