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