cisco_node_utils 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/CHANGELOG.md +126 -1
  4. data/README.md +19 -12
  5. data/Rakefile +1 -0
  6. data/bin/git/hooks/commit-msg/enforce_style +8 -0
  7. data/cisco_node_utils.gemspec +4 -3
  8. data/docs/README-develop-best-practices.md +127 -109
  9. data/docs/README-develop-node-utils-APIs.md +47 -39
  10. data/docs/template-router.rb +3 -7
  11. data/lib/.rubocop.yml +4 -4
  12. data/lib/cisco_node_utils.rb +1 -1
  13. data/lib/cisco_node_utils/aaa_authentication_login.rb +96 -0
  14. data/lib/cisco_node_utils/aaa_authentication_login_service.rb +133 -0
  15. data/lib/cisco_node_utils/aaa_authorization_service.rb +150 -0
  16. data/lib/cisco_node_utils/ace.rb +196 -0
  17. data/lib/cisco_node_utils/acl.rb +100 -0
  18. data/lib/cisco_node_utils/bgp.rb +301 -163
  19. data/lib/cisco_node_utils/bgp_af.rb +187 -19
  20. data/lib/cisco_node_utils/bgp_neighbor.rb +18 -33
  21. data/lib/cisco_node_utils/bgp_neighbor_af.rb +25 -48
  22. data/lib/cisco_node_utils/cisco_cmn_utils.rb +23 -4
  23. data/lib/cisco_node_utils/cmd_ref/README_YAML.md +593 -0
  24. data/lib/cisco_node_utils/cmd_ref/aaa_auth_login_service.yaml +22 -0
  25. data/lib/cisco_node_utils/cmd_ref/aaa_authentication_login.yaml +31 -0
  26. data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +22 -0
  27. data/lib/cisco_node_utils/cmd_ref/acl.yaml +43 -0
  28. data/lib/cisco_node_utils/cmd_ref/bgp.yaml +242 -0
  29. data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +164 -0
  30. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +131 -0
  31. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +179 -0
  32. data/lib/cisco_node_utils/cmd_ref/dnsclient.yaml +34 -0
  33. data/lib/cisco_node_utils/cmd_ref/evpn_vni.yaml +42 -0
  34. data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +172 -0
  35. data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +35 -0
  36. data/lib/cisco_node_utils/cmd_ref/feature.yaml +42 -0
  37. data/lib/cisco_node_utils/cmd_ref/fex.yaml +9 -0
  38. data/lib/cisco_node_utils/cmd_ref/images.yaml +7 -0
  39. data/lib/cisco_node_utils/cmd_ref/interface.yaml +339 -0
  40. data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +28 -0
  41. data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +61 -0
  42. data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +54 -0
  43. data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +32 -0
  44. data/lib/cisco_node_utils/cmd_ref/inventory.yaml +45 -0
  45. data/lib/cisco_node_utils/cmd_ref/memory.yaml +13 -0
  46. data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +7 -0
  47. data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +14 -0
  48. data/lib/cisco_node_utils/cmd_ref/ospf.yaml +74 -0
  49. data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +33 -0
  50. data/lib/cisco_node_utils/cmd_ref/pim.yaml +40 -0
  51. data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +69 -0
  52. data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +25 -0
  53. data/lib/cisco_node_utils/cmd_ref/radius_server.yaml +64 -0
  54. data/lib/cisco_node_utils/cmd_ref/radius_server_group.yaml +14 -0
  55. data/lib/cisco_node_utils/cmd_ref/show_system.yaml +5 -0
  56. data/lib/cisco_node_utils/cmd_ref/show_version.yaml +72 -0
  57. data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +23 -0
  58. data/lib/cisco_node_utils/cmd_ref/snmp_group.yaml +7 -0
  59. data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +50 -0
  60. data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +51 -0
  61. data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +55 -0
  62. data/lib/cisco_node_utils/cmd_ref/snmpnotification.yaml +11 -0
  63. data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +18 -0
  64. data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +7 -0
  65. data/lib/cisco_node_utils/cmd_ref/system.yaml +6 -0
  66. data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +49 -0
  67. data/lib/cisco_node_utils/cmd_ref/tacacs_server_group.yaml +33 -0
  68. data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +35 -0
  69. data/lib/cisco_node_utils/cmd_ref/vdc.yaml +38 -0
  70. data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +6 -0
  71. data/lib/cisco_node_utils/cmd_ref/vlan.yaml +56 -0
  72. data/lib/cisco_node_utils/cmd_ref/vni.yaml +76 -0
  73. data/lib/cisco_node_utils/cmd_ref/vpc.yaml +197 -0
  74. data/lib/cisco_node_utils/cmd_ref/vrf.yaml +88 -0
  75. data/lib/cisco_node_utils/cmd_ref/vtp.yaml +38 -0
  76. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +60 -0
  77. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +39 -0
  78. data/lib/cisco_node_utils/cmd_ref/yum.yaml +13 -0
  79. data/lib/cisco_node_utils/command_reference.rb +359 -187
  80. data/lib/cisco_node_utils/configparser_lib.rb +1 -1
  81. data/lib/cisco_node_utils/dns_domain.rb +19 -5
  82. data/lib/cisco_node_utils/domain_name.rb +4 -8
  83. data/lib/cisco_node_utils/evpn_vni.rb +157 -0
  84. data/lib/cisco_node_utils/fabricpath_global.rb +388 -0
  85. data/lib/cisco_node_utils/fabricpath_topology.rb +150 -0
  86. data/lib/cisco_node_utils/feature.rb +111 -0
  87. data/lib/cisco_node_utils/interface.rb +390 -97
  88. data/lib/cisco_node_utils/interface_channel_group.rb +124 -0
  89. data/lib/cisco_node_utils/interface_ospf.rb +11 -34
  90. data/lib/cisco_node_utils/interface_portchannel.rb +157 -0
  91. data/lib/cisco_node_utils/interface_service_vni.rb +132 -0
  92. data/lib/cisco_node_utils/name_server.rb +1 -1
  93. data/lib/cisco_node_utils/node.rb +55 -249
  94. data/lib/cisco_node_utils/node_util.rb +5 -1
  95. data/lib/cisco_node_utils/ntp_config.rb +2 -2
  96. data/lib/cisco_node_utils/ntp_server.rb +14 -5
  97. data/lib/cisco_node_utils/overlay_global.rb +153 -0
  98. data/lib/cisco_node_utils/pim.rb +124 -0
  99. data/lib/cisco_node_utils/pim_group_list.rb +108 -0
  100. data/lib/cisco_node_utils/pim_rp_address.rb +102 -0
  101. data/lib/cisco_node_utils/platform.rb +8 -9
  102. data/lib/cisco_node_utils/portchannel_global.rb +277 -0
  103. data/lib/cisco_node_utils/radius_global.rb +9 -19
  104. data/lib/cisco_node_utils/radius_server.rb +31 -41
  105. data/lib/cisco_node_utils/radius_server_group.rb +117 -0
  106. data/lib/cisco_node_utils/router_ospf.rb +1 -1
  107. data/lib/cisco_node_utils/router_ospf_vrf.rb +14 -19
  108. data/lib/cisco_node_utils/snmp_notification_receiver.rb +158 -0
  109. data/lib/cisco_node_utils/snmpcommunity.rb +3 -5
  110. data/lib/cisco_node_utils/snmpgroup.rb +1 -1
  111. data/lib/cisco_node_utils/snmpnotification.rb +57 -0
  112. data/lib/cisco_node_utils/snmpserver.rb +8 -17
  113. data/lib/cisco_node_utils/snmpuser.rb +67 -28
  114. data/lib/cisco_node_utils/syslog_server.rb +3 -9
  115. data/lib/cisco_node_utils/syslog_settings.rb +2 -10
  116. data/lib/cisco_node_utils/tacacs_server.rb +9 -14
  117. data/lib/cisco_node_utils/tacacs_server_group.rb +145 -0
  118. data/lib/cisco_node_utils/tacacs_server_host.rb +5 -9
  119. data/lib/cisco_node_utils/vdc.rb +88 -0
  120. data/lib/cisco_node_utils/version.rb +5 -2
  121. data/lib/cisco_node_utils/vlan.rb +71 -8
  122. data/lib/cisco_node_utils/vni.rb +227 -0
  123. data/lib/cisco_node_utils/vpc.rb +377 -0
  124. data/lib/cisco_node_utils/vrf.rb +60 -9
  125. data/lib/cisco_node_utils/vrf_af.rb +191 -0
  126. data/lib/cisco_node_utils/vtp.rb +8 -6
  127. data/lib/cisco_node_utils/vxlan_vtep.rb +151 -0
  128. data/lib/cisco_node_utils/vxlan_vtep_vni.rb +234 -0
  129. data/lib/cisco_node_utils/yum.rb +1 -1
  130. data/tests/.rubocop.yml +1 -1
  131. data/tests/basetest.rb +16 -7
  132. data/tests/ciscotest.rb +55 -13
  133. data/tests/cmd_config.yaml +2 -2
  134. data/tests/platform_info.rb +3 -2
  135. data/tests/test_aaa_authentication_login.rb +219 -0
  136. data/tests/test_aaa_authentication_login_service.rb +759 -0
  137. data/tests/test_aaa_authorization_service.rb +1041 -0
  138. data/tests/test_ace.rb +160 -0
  139. data/tests/test_acl.rb +176 -0
  140. data/tests/test_bgp_af.rb +269 -13
  141. data/tests/test_bgp_neighbor.rb +38 -40
  142. data/tests/test_bgp_neighbor_af.rb +92 -32
  143. data/tests/test_command_config.rb +5 -5
  144. data/tests/test_command_reference.rb +284 -101
  145. data/tests/test_dns_domain.rb +1 -1
  146. data/tests/test_domain_name.rb +1 -1
  147. data/tests/test_evpn_vni.rb +106 -0
  148. data/tests/test_fabricpath_global.rb +243 -0
  149. data/tests/test_fabricpath_topology.rb +98 -0
  150. data/tests/test_interface.rb +292 -74
  151. data/tests/test_interface_channel_group.rb +74 -0
  152. data/tests/test_interface_ospf.rb +9 -4
  153. data/tests/test_interface_portchannel.rb +105 -0
  154. data/tests/test_interface_service_vni.rb +232 -0
  155. data/tests/test_interface_svi.rb +77 -62
  156. data/tests/test_interface_switchport.rb +17 -5
  157. data/tests/test_name_server.rb +1 -1
  158. data/tests/test_node.rb +1 -1
  159. data/tests/test_node_ext.rb +10 -20
  160. data/tests/test_ntp_config.rb +1 -1
  161. data/tests/test_ntp_server.rb +18 -6
  162. data/tests/test_overlay_global.rb +102 -0
  163. data/tests/test_pim.rb +177 -0
  164. data/tests/test_pim_group_list.rb +181 -0
  165. data/tests/test_pim_rp_address.rb +153 -0
  166. data/tests/test_platform.rb +3 -3
  167. data/tests/test_portchannel_global.rb +202 -0
  168. data/tests/test_radius_global.rb +1 -1
  169. data/tests/test_radius_server.rb +92 -57
  170. data/tests/test_radius_server_group.rb +149 -0
  171. data/tests/test_router_bgp.rb +283 -112
  172. data/tests/test_router_ospf.rb +2 -2
  173. data/tests/test_router_ospf_vrf.rb +4 -4
  174. data/tests/test_snmp_notification_receiver.rb +167 -0
  175. data/tests/test_snmpcommunity.rb +1 -1
  176. data/tests/test_snmpgroup.rb +1 -1
  177. data/tests/test_snmpnotification.rb +72 -0
  178. data/tests/test_snmpserver.rb +29 -105
  179. data/tests/test_snmpuser.rb +32 -30
  180. data/tests/test_syslog_server.rb +36 -10
  181. data/tests/test_syslog_settings.rb +1 -1
  182. data/tests/test_tacacs_server.rb +1 -1
  183. data/tests/test_tacacs_server_group.rb +405 -0
  184. data/tests/test_tacacs_server_host.rb +1 -1
  185. data/tests/test_vdc.rb +78 -0
  186. data/tests/test_vlan.rb +74 -19
  187. data/tests/test_vlan_mt_full.rb +95 -0
  188. data/tests/test_vni.rb +106 -0
  189. data/tests/test_vpc.rb +361 -0
  190. data/tests/test_vrf.rb +172 -29
  191. data/tests/test_vtp.rb +1 -1
  192. data/tests/test_vxlan_vtep.rb +214 -0
  193. data/tests/test_vxlan_vtep_vni.rb +201 -0
  194. data/tests/test_yum.rb +1 -1
  195. metadata +120 -11
  196. data/lib/cisco_node_utils/README_YAML.md +0 -325
  197. data/lib/cisco_node_utils/command_reference_common.yaml +0 -1051
  198. data/lib/cisco_node_utils/command_reference_common_bgp.yaml +0 -535
  199. data/lib/cisco_node_utils/command_reference_n3064.yaml +0 -13
  200. data/lib/cisco_node_utils/command_reference_n7k.yaml +0 -52
  201. data/lib/cisco_node_utils/command_reference_n9k.yaml +0 -26
  202. data/tests/platform_info.yaml +0 -10
@@ -0,0 +1,196 @@
1
+ # Copyright (c) 2015-2016 Cisco and/or its affiliates.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'node_util'
16
+
17
+ module Cisco
18
+ # Ace - node utility class for Ace Configuration
19
+ class Ace < NodeUtil
20
+ attr_reader :afi, :acl_name, :seqno
21
+
22
+ def initialize(afi, acl_name, seqno)
23
+ @afi = Acl.afi_cli(afi)
24
+ @acl_name = acl_name.to_s
25
+ @seqno = seqno.to_s
26
+ set_args_keys_default
27
+ end
28
+
29
+ # Create a hash of all aces under a given acl_name.
30
+ def self.aces
31
+ afis = %w(ipv4 ipv6)
32
+ hash = {}
33
+ afis.each do |afi|
34
+ hash[afi] = {}
35
+ acls = config_get('acl', 'all_acls', afi: Acl.afi_cli(afi))
36
+ next if acls.nil?
37
+
38
+ acls.each do |acl_name|
39
+ hash[afi][acl_name] = {}
40
+ aces = config_get('acl', 'all_aces',
41
+ afi: Acl.afi_cli(afi), acl_name: acl_name)
42
+ next if aces.nil?
43
+
44
+ aces.each do |seqno|
45
+ hash[afi][acl_name][seqno] = Ace.new(afi, acl_name, seqno)
46
+ end
47
+ end
48
+ end
49
+ hash
50
+ end
51
+
52
+ def destroy
53
+ set_args_keys(state: 'no')
54
+ config_set('acl', 'ace_destroy', @set_args)
55
+ end
56
+
57
+ def set_args_keys_default
58
+ keys = { afi: @afi, acl_name: @acl_name, seqno: @seqno }
59
+ @get_args = @set_args = keys
60
+ end
61
+
62
+ # rubocop:disable Style/AccessorMethodName
63
+ def set_args_keys(hash={})
64
+ set_args_keys_default
65
+ @set_args = @get_args.merge!(hash) unless hash.empty?
66
+ end
67
+
68
+ # common ace getter
69
+ def ace_get
70
+ str = config_get('acl', 'ace', @get_args)
71
+ return nil if str.nil?
72
+
73
+ # remark is a description field, needs a separate regex
74
+ # Example: <MatchData "20 remark foo bar" seqno:"20" remark:"foo bar">
75
+ remark = Regexp.new('(?<seqno>\d+) remark (?<remark>.*)').match(str)
76
+ return remark unless remark.nil?
77
+
78
+ # rubocop:disable Metrics/LineLength
79
+ regexp = Regexp.new('(?<seqno>\d+) (?<action>\S+)'\
80
+ ' *(?<proto>\d+|\S+)'\
81
+ ' *(?<src_addr>any|host \S+|\S+\/\d+|\S+ [:\.0-9a-fA-F]+|addrgroup \S+)*'\
82
+ ' *(?<src_port>eq \S+|neq \S+|lt \S+|''gt \S+|range \S+ \S+|portgroup \S+)?'\
83
+ ' *(?<dst_addr>any|host \S+|\S+\/\d+|\S+ [:\.0-9a-fA-F]+|addrgroup \S+)'\
84
+ ' *(?<dst_port>eq \S+|neq \S+|lt \S+|gt \S+|range \S+ \S+|portgroup \S+)?')
85
+ # rubocop:enable Metrics/LineLength
86
+ regexp.match(str)
87
+ end
88
+
89
+ # common ace setter. Put the values you need in a hash and pass it in.
90
+ # attrs = {:action=>'permit', :proto=>'tcp', :src =>'host 1.1.1.1'}
91
+ def ace_set(attrs)
92
+ if attrs.empty?
93
+ attrs[:state] = 'no'
94
+ else
95
+ # remove existing ace first
96
+ destroy if seqno
97
+ attrs[:state] = ''
98
+ end
99
+
100
+ if attrs[:remark]
101
+ cmd = 'ace_remark'
102
+ else
103
+ cmd = 'ace'
104
+ [:action,
105
+ :proto,
106
+ :src_addr,
107
+ :src_port,
108
+ :dst_addr,
109
+ :dst_port,
110
+ ].each do |p|
111
+ attrs[p] = '' if attrs[p].nil?
112
+ end
113
+ end
114
+ set_args_keys(attrs)
115
+ config_set('acl', cmd, @set_args)
116
+ end
117
+
118
+ # PROPERTIES
119
+ # ----------
120
+ def seqno
121
+ match = ace_get
122
+ return nil if match.nil?
123
+ match.names.include?('seqno') ? match[:seqno] : nil
124
+ end
125
+
126
+ def action
127
+ match = ace_get
128
+ return nil if match.nil?
129
+ match.names.include?('action') ? match[:action] : nil
130
+ end
131
+
132
+ def action=(action)
133
+ @set_args[:action] = action
134
+ end
135
+
136
+ def remark
137
+ match = ace_get
138
+ return nil if match.nil?
139
+ match.names.include?('remark') ? match[:remark] : nil
140
+ end
141
+
142
+ def remark=(remark)
143
+ @set_args[:remark] = remark
144
+ end
145
+
146
+ def proto
147
+ match = ace_get
148
+ return nil if match.nil?
149
+ match.names.include?('proto') ? match[:proto] : nil
150
+ end
151
+
152
+ def proto=(proto)
153
+ @set_args[:proto] = proto # TBD ip vs ipv4
154
+ end
155
+
156
+ def src_addr
157
+ match = ace_get
158
+ return nil if match.nil?
159
+ match.names.include?('src_addr') ? match[:src_addr] : nil
160
+ end
161
+
162
+ def src_addr=(src_addr)
163
+ @set_args[:src_addr] = src_addr
164
+ end
165
+
166
+ def src_port
167
+ match = ace_get
168
+ return nil if match.nil?
169
+ match.names.include?('src_port') ? match[:src_port] : nil
170
+ end
171
+
172
+ def src_port=(src_port)
173
+ @set_args[:src_port] = src_port
174
+ end
175
+
176
+ def dst_addr
177
+ match = ace_get
178
+ return nil if match.nil?
179
+ match.names.include?('dst_addr') ? match[:dst_addr] : nil
180
+ end
181
+
182
+ def dst_addr=(dst_addr)
183
+ @set_args[:dst_addr] = dst_addr
184
+ end
185
+
186
+ def dst_port
187
+ match = ace_get
188
+ return nil if match.nil?
189
+ match.names.include?('dst_port') ? match[:dst_port] : nil
190
+ end
191
+
192
+ def dst_port=(src_port)
193
+ @set_args[:dst_port] = src_port
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,100 @@
1
+ # Copyright (c) 2014-2016 Cisco and/or its affiliates.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'node_util'
16
+
17
+ module Cisco
18
+ # Acl - node utility class for ACL configuration
19
+ class Acl < NodeUtil
20
+ attr_reader :acl_name, :afi
21
+
22
+ def initialize(afi, acl_name, instantiate=true)
23
+ @set_args = @get_args = { afi: Acl.afi_cli(afi), acl_name: acl_name.to_s }
24
+ create if instantiate
25
+ end
26
+
27
+ # Return all acls currently on the switch
28
+ def self.acls
29
+ afis = %w(ipv4 ipv6)
30
+ acl_hash = {}
31
+ afis.each do |afi|
32
+ acl_hash[afi] = {}
33
+ afi_cli = Acl.afi_cli(afi)
34
+ instances = config_get('acl', 'all_acls', afi: afi_cli)
35
+
36
+ next if instances.nil?
37
+ instances.each do |acl_name|
38
+ acl_hash[afi][acl_name] = Acl.new(afi, acl_name, false)
39
+ end
40
+ end
41
+ acl_hash
42
+ end
43
+
44
+ # Platform-specific afi cli string
45
+ def self.afi_cli(afi)
46
+ fail ArgumentError, "Argument afi must be 'ipv4' or 'ipv6'" unless
47
+ afi[/(ipv4|ipv6)/]
48
+ afi[/ipv4/] ? 'ip' : afi
49
+ end
50
+
51
+ def create
52
+ config_acl('')
53
+ end
54
+
55
+ def destroy
56
+ config_acl('no')
57
+ end
58
+
59
+ def config_acl(state)
60
+ @set_args[:state] = state
61
+ config_set('acl', 'acl', @set_args)
62
+ end
63
+
64
+ # ----------
65
+ # PROPERTIES
66
+ # ----------
67
+ def stats_per_entry
68
+ config_get('acl', 'stats_per_entry', @get_args)
69
+ end
70
+
71
+ def stats_per_entry=(state)
72
+ @set_args[:state] = (state ? '' : 'no')
73
+ config_set('acl', 'stats_per_entry', @set_args)
74
+ end
75
+
76
+ def default_stats_per_entry
77
+ config_get_default('acl', 'stats_per_entry')
78
+ end
79
+
80
+ def fragments
81
+ config_get('acl', 'fragments', @get_args)
82
+ end
83
+
84
+ def fragments=(action)
85
+ @set_args[:state] = (action ? '' : 'no')
86
+ action = fragments unless action
87
+ @set_args[:action] = action
88
+ config_set('acl', 'fragments', @set_args) if action
89
+ end
90
+
91
+ def default_fragments
92
+ config_get_default('acl', 'fragments')
93
+ end
94
+
95
+ # acl == overide func
96
+ def ==(other)
97
+ acl_name == other.acl_name && afi == other.afi
98
+ end
99
+ end
100
+ end
@@ -1,6 +1,6 @@
1
1
  # June 2015, Michael G Wiebe
2
2
  #
3
- # Copyright (c) 2015 Cisco and/or its affiliates.
3
+ # Copyright (c) 2015-2016 Cisco and/or its affiliates.
4
4
  #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
6
6
  # you may not use this file except in compliance with the License.
@@ -15,6 +15,8 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require_relative 'node_util'
18
+ require_relative 'feature'
19
+ require_relative 'bgp_af'
18
20
 
19
21
  module Cisco
20
22
  # RouterBgp - node utility class for BGP general config management
@@ -24,49 +26,30 @@ module Cisco
24
26
  def initialize(asnum, vrf='default', instantiate=true)
25
27
  fail ArgumentError unless vrf.is_a? String
26
28
  fail ArgumentError unless vrf.length > 0
27
- @asnum = RouterBgp.process_asnum(asnum)
29
+ @asnum = RouterBgp.validate_asnum(asnum)
28
30
  @vrf = vrf
29
- if @vrf == 'default'
30
- @get_args = @set_args = { asnum: @asnum }
31
- else
32
- @get_args = @set_args = { asnum: @asnum, vrf: @vrf }
33
- end
31
+ set_args_keys_default
34
32
  create if instantiate
35
33
  end
36
34
 
37
- def self.process_asnum(asnum)
38
- err_msg = "BGP asnum must be either a 'String' or an" \
39
- " 'Integer' object"
40
- fail ArgumentError, err_msg unless asnum.is_a?(Integer) ||
41
- asnum.is_a?(String)
42
- if asnum.is_a? String
43
- # Match ASDOT '1.5' or ASPLAIN '55' strings
44
- fail ArgumentError unless /^(\d+|\d+\.\d+)$/.match(asnum)
45
- asnum = RouterBgp.dot_to_big(asnum) if /\d+\.\d+/.match(asnum)
46
- end
47
- asnum.to_i
48
- end
49
-
50
35
  # Create a hash of all router bgp default and non-default
51
36
  # vrf instances
52
37
  def self.routers
53
- bgp_ids = config_get('bgp', 'router')
54
- return {} if bgp_ids.nil?
38
+ asnum = config_get('bgp', 'router')
39
+ return {} if asnum.nil?
55
40
 
56
41
  hash_final = {}
57
- # TODO: Remove loop if only single ASN supported by RFC?
58
- bgp_ids.each do |asnum|
59
- asnum = asnum.to_i unless /\d+.\d+/.match(asnum)
60
- hash_tmp = { asnum =>
61
- { 'default' => RouterBgp.new(asnum, 'default', false) } }
62
- vrf_ids = config_get('bgp', 'vrf', asnum: asnum)
63
- unless vrf_ids.nil?
64
- vrf_ids.each do |vrf|
65
- hash_tmp[asnum][vrf] = RouterBgp.new(asnum, vrf, false)
66
- end
42
+ asnum = asnum.to_i unless /\d+.\d+/.match(asnum)
43
+ hash_tmp = {
44
+ asnum => { 'default' => RouterBgp.new(asnum, 'default', false) }
45
+ }
46
+ vrf_ids = config_get('bgp', 'vrf', asnum: asnum)
47
+ unless vrf_ids.nil?
48
+ vrf_ids.each do |vrf|
49
+ hash_tmp[asnum][vrf] = RouterBgp.new(asnum, vrf, false)
67
50
  end
68
- hash_final.merge!(hash_tmp)
69
51
  end
52
+ hash_final.merge!(hash_tmp)
70
53
  return hash_final
71
54
  rescue Cisco::CliError => e
72
55
  # cmd will syntax reject when feature is not enabled
@@ -74,44 +57,18 @@ module Cisco
74
57
  return {}
75
58
  end
76
59
 
77
- def self.enabled
78
- feat = config_get('bgp', 'feature')
79
- return !(feat.nil? || feat.empty?)
80
- rescue Cisco::CliError => e
81
- # cmd will syntax reject when feature is not enabled
82
- raise unless e.clierror =~ /Syntax error/
83
- return false
84
- end
85
-
86
- def self.enable(state='')
87
- config_set('bgp', 'feature', state: state)
88
- end
89
-
90
- # Convert BGP ASN ASDOT+ to ASPLAIN
91
- def self.dot_to_big(dot_str)
92
- fail ArgumentError unless dot_str.is_a? String
93
- return dot_str unless /\d+\.\d+/.match(dot_str)
94
- mask = 0b1111111111111111
95
- high = dot_str.to_i
96
- low = 0
97
- low_match = dot_str.match(/\.(\d+)/)
98
- low = low_match[1].to_i if low_match
99
- high_bits = (mask & high) << 16
100
- low_bits = mask & low
101
- high_bits + low_bits
102
- end
103
-
104
- def router_bgp(asnum, vrf, state='')
105
- # Only one bgp autonomous system number is allowed
106
- # Raise an error if one is already configured that
107
- # differs from the one being created.
108
- configured = config_get('bgp', 'router')
109
- if !configured.nil? && configured.first.to_s != asnum.to_s
110
- fail %(
111
- Changing the BGP Autonomous System Number is not allowed.
112
- Current BGP asn: #{configured.first}
113
- Attempted change to asn: #{asnum})
60
+ def self.validate_asnum(asnum)
61
+ err_msg = 'BGP asnum must be type String or Integer'
62
+ fail ArgumentError, err_msg unless asnum.is_a?(Integer) ||
63
+ asnum.is_a?(String)
64
+ if asnum.is_a? String
65
+ # Match ASDOT '1.5' or ASPLAIN '55' strings
66
+ fail ArgumentError unless /^(\d+|\d+\.\d+)$/.match(asnum)
114
67
  end
68
+ asnum.to_s
69
+ end
70
+
71
+ def router_bgp(state='')
115
72
  @set_args[:state] = state
116
73
  if vrf == 'default'
117
74
  config_set('bgp', 'router', @set_args)
@@ -121,79 +78,53 @@ module Cisco
121
78
  set_args_keys_default
122
79
  end
123
80
 
124
- def enable_create_router_bgp(asnum, vrf)
125
- RouterBgp.enable
126
- router_bgp(asnum, vrf)
127
- end
128
-
129
81
  # Create one router bgp instance
130
82
  def create
131
- if RouterBgp.enabled
132
- router_bgp(@asnum, @vrf)
133
- else
134
- enable_create_router_bgp(@asnum, @vrf)
135
- end
83
+ Feature.bgp_enable
84
+ router_bgp
136
85
  end
137
86
 
138
87
  # Destroy router bgp instance
139
88
  def destroy
140
- vrf_ids = config_get('bgp', 'vrf', asnum: @asnum)
141
- vrf_ids = ['default'] if vrf_ids.nil?
142
- if vrf_ids.size == 1 || @vrf == 'default'
143
- RouterBgp.enable('no')
144
- else
145
- router_bgp(asnum, @vrf, 'no')
146
- end
147
- rescue Cisco::CliError => e
148
- # cmd will syntax reject when feature is not enabled
149
- raise unless e.clierror =~ /Syntax error/
89
+ router_bgp('no')
150
90
  end
151
91
 
152
92
  # Helper method to delete @set_args hash keys
153
93
  def set_args_keys_default
154
- if @vrf == 'default'
155
- @set_args = { asnum: @asnum }
156
- else
157
- @set_args = { asnum: @asnum, vrf: @vrf }
158
- end
94
+ @set_args = { asnum: @asnum }
95
+ @set_args[:vrf] = @vrf unless @vrf == 'default'
96
+ @get_args = @set_args
159
97
  end
160
98
 
161
99
  # Attributes:
162
100
 
163
101
  # Bestpath Getters
164
102
  def bestpath_always_compare_med
165
- match = config_get('bgp', 'bestpath_always_compare_med', @get_args)
166
- match.nil? ? default_bestpath_always_compare_med : true
103
+ config_get('bgp', 'bestpath_always_compare_med', @get_args)
167
104
  end
168
105
 
169
106
  def bestpath_aspath_multipath_relax
170
- match = config_get('bgp', 'bestpath_aspath_multipath_relax', @get_args)
171
- match.nil? ? default_bestpath_aspath_multipath_relax : true
107
+ config_get('bgp', 'bestpath_aspath_multipath_relax', @get_args)
172
108
  end
173
109
 
174
110
  def bestpath_compare_routerid
175
- match = config_get('bgp', 'bestpath_compare_routerid', @get_args)
176
- match.nil? ? default_bestpath_compare_routerid : true
111
+ config_get('bgp', 'bestpath_compare_routerid', @get_args)
177
112
  end
178
113
 
179
114
  def bestpath_cost_community_ignore
180
- match = config_get('bgp', 'bestpath_cost_community_ignore', @get_args)
181
- match.nil? ? default_bestpath_cost_community_ignore : true
115
+ config_get('bgp', 'bestpath_cost_community_ignore', @get_args)
182
116
  end
183
117
 
184
118
  def bestpath_med_confed
185
- match = config_get('bgp', 'bestpath_med_confed', @get_args)
186
- match.nil? ? default_bestpath_med_confed : true
119
+ config_get('bgp', 'bestpath_med_confed', @get_args)
187
120
  end
188
121
 
189
122
  def bestpath_med_missing_as_worst
190
- match = config_get('bgp', 'bestpath_med_missing_as_worst', @get_args)
191
- match.nil? ? default_bestpath_med_missing_as_worst : true
123
+ config_get('bgp', 'bestpath_med_missing_as_worst', @get_args)
192
124
  end
193
125
 
194
126
  def bestpath_med_non_deterministic
195
- match = config_get('bgp', 'bestpath_med_non_deterministic', @get_args)
196
- match.nil? ? default_bestpath_med_non_deterministic : true
127
+ config_get('bgp', 'bestpath_med_non_deterministic', @get_args)
197
128
  end
198
129
 
199
130
  # Bestpath Setters
@@ -270,8 +201,7 @@ module Cisco
270
201
 
271
202
  # Cluster Id (Getter/Setter/Default)
272
203
  def cluster_id
273
- match = config_get('bgp', 'cluster_id', @get_args)
274
- match.nil? ? default_cluster_id : match.first
204
+ config_get('bgp', 'cluster_id', @get_args)
275
205
  end
276
206
 
277
207
  def cluster_id=(id)
@@ -279,7 +209,7 @@ module Cisco
279
209
  # 'no bgp cluster-id'. IMO this should be possible because you
280
210
  # can only configure a single bgp cluster-id.
281
211
  #
282
- # HACK: specify a dummy id when removing the feature.
212
+ # HACK: specify a dummy id when removing the property.
283
213
  dummy_id = 1
284
214
  if id == default_cluster_id
285
215
  @set_args[:state] = 'no'
@@ -298,8 +228,7 @@ module Cisco
298
228
 
299
229
  # Confederation Id (Getter/Setter/Default)
300
230
  def confederation_id
301
- match = config_get('bgp', 'confederation_id', @get_args)
302
- match.nil? ? default_confederation_id : match.first
231
+ config_get('bgp', 'confederation_id', @get_args)
303
232
  end
304
233
 
305
234
  def confederation_id=(id)
@@ -307,7 +236,7 @@ module Cisco
307
236
  # 'no bgp confederation id'. IMO this should be possible
308
237
  # because you can only configure a single bgp confed id.
309
238
  #
310
- # HACK: specify a dummy id when removing the feature.
239
+ # HACK: specify a dummy id when removing the property.
311
240
  dummy_id = 1
312
241
  if id == default_confederation_id
313
242
  @set_args[:state] = 'no'
@@ -324,10 +253,74 @@ module Cisco
324
253
  config_get_default('bgp', 'confederation_id')
325
254
  end
326
255
 
256
+ #
257
+ # disable-policy-batching (Getter/Setter/Default)
258
+ #
259
+ def disable_policy_batching
260
+ config_get('bgp', 'disable_policy_batching', @get_args)
261
+ end
262
+
263
+ def disable_policy_batching=(enable)
264
+ @set_args[:state] = (enable ? '' : 'no')
265
+ config_set('bgp', 'disable_policy_batching', @set_args)
266
+ set_args_keys_default
267
+ end
268
+
269
+ def default_disable_policy_batching
270
+ config_get_default('bgp', 'disable_policy_batching')
271
+ end
272
+
273
+ #
274
+ # disable-policy-batching ipv4 prefix-list <prefix_list>
275
+ #
276
+ def disable_policy_batching_ipv4
277
+ config_get('bgp', 'disable_policy_batching_ipv4', @get_args)
278
+ end
279
+
280
+ def disable_policy_batching_ipv4=(prefix_list)
281
+ dummy_prefixlist = 'x'
282
+ if prefix_list == default_disable_policy_batching_ipv4
283
+ @set_args[:state] = 'no'
284
+ @set_args[:prefix_list] = dummy_prefixlist
285
+ else
286
+ @set_args[:state] = ''
287
+ @set_args[:prefix_list] = prefix_list
288
+ end
289
+ config_set('bgp', 'disable_policy_batching_ipv4', @set_args)
290
+ set_args_keys_default
291
+ end
292
+
293
+ def default_disable_policy_batching_ipv4
294
+ config_get_default('bgp', 'disable_policy_batching_ipv4')
295
+ end
296
+
297
+ #
298
+ # disable-policy-batching ipv6 prefix-list <prefix_list>
299
+ #
300
+ def disable_policy_batching_ipv6
301
+ config_get('bgp', 'disable_policy_batching_ipv6', @get_args)
302
+ end
303
+
304
+ def disable_policy_batching_ipv6=(prefix_list)
305
+ dummy_prefixlist = 'x'
306
+ if prefix_list == default_disable_policy_batching_ipv6
307
+ @set_args[:state] = 'no'
308
+ @set_args[:prefix_list] = dummy_prefixlist
309
+ else
310
+ @set_args[:state] = ''
311
+ @set_args[:prefix_list] = prefix_list
312
+ end
313
+ config_set('bgp', 'disable_policy_batching_ipv6', @set_args)
314
+ set_args_keys_default
315
+ end
316
+
317
+ def default_disable_policy_batching_ipv6
318
+ config_get_default('bgp', 'disable_policy_batching_ipv6')
319
+ end
320
+
327
321
  # Enforce First As (Getter/Setter/Default)
328
322
  def enforce_first_as
329
- match = config_get('bgp', 'enforce_first_as', @get_args)
330
- match.nil? ? false : true
323
+ config_get('bgp', 'enforce_first_as', @get_args)
331
324
  end
332
325
 
333
326
  def enforce_first_as=(enable)
@@ -340,10 +333,133 @@ module Cisco
340
333
  config_get_default('bgp', 'enforce_first_as')
341
334
  end
342
335
 
336
+ # event-history
337
+ # event-history cli [ size <size> ]
338
+ # Nvgen as True With optional 'size <size>
339
+ def event_history_cli
340
+ match = config_get('bgp', 'event_history_cli', @get_args)
341
+ if match.is_a?(Array)
342
+ return 'false' if match[0] == 'no '
343
+ return 'size_' + match[1] if match[1]
344
+ end
345
+ default_event_history_cli
346
+ end
347
+
348
+ def event_history_cli=(val)
349
+ size = val[/small|medium|large|disable/]
350
+ @set_args[:size] = size.nil? ? '' : "size #{size}"
351
+ @set_args[:state] = val[/false/] ? 'no' : ''
352
+ config_set('bgp', 'event_history_cli', @set_args)
353
+ set_args_keys_default
354
+ end
355
+
356
+ def default_event_history_cli
357
+ config_get_default('bgp', 'event_history_cli')
358
+ end
359
+
360
+ # event-history detail [ size <size> ]
361
+ # Nvgen as True With optional 'size <size>
362
+ def event_history_detail
363
+ match = config_get('bgp', 'event_history_detail', @get_args)
364
+ # This property requires auto_default=false
365
+ if match.is_a?(Array)
366
+ return 'false' if match[0] == 'no '
367
+ return 'size_' + match[1] if match[1]
368
+ end
369
+ default_event_history_detail
370
+ end
371
+
372
+ def event_history_detail=(val)
373
+ size = val[/small|medium|large|disable/]
374
+ @set_args[:size] = size.nil? ? '' : "size #{size}"
375
+ @set_args[:state] = val[/false/] ? 'no' : ''
376
+ config_set('bgp', 'event_history_detail', @set_args)
377
+ set_args_keys_default
378
+ end
379
+
380
+ def default_event_history_detail
381
+ config_get_default('bgp', 'event_history_detail')
382
+ end
383
+
384
+ # event-history events [ size <size> ]
385
+ # Nvgen as True With optional 'size <size>
386
+ def event_history_events
387
+ match = config_get('bgp', 'event_history_events', @get_args)
388
+ if match.is_a?(Array)
389
+ return 'false' if match[0] == 'no '
390
+ return 'size_' + match[1] if match[1]
391
+ end
392
+ default_event_history_events
393
+ end
394
+
395
+ def event_history_events=(val)
396
+ size = val[/small|medium|large|disable/]
397
+ @set_args[:size] = size.nil? ? '' : "size #{size}"
398
+ @set_args[:state] = val[/false/] ? 'no' : ''
399
+ config_set('bgp', 'event_history_events', @set_args)
400
+ set_args_keys_default
401
+ end
402
+
403
+ def default_event_history_events
404
+ config_get_default('bgp', 'event_history_events')
405
+ end
406
+
407
+ # event-history periodic [ size <size> ]
408
+ # Nvgen as True With optional 'size <size>
409
+ def event_history_periodic
410
+ match = config_get('bgp', 'event_history_periodic', @get_args)
411
+ if match.is_a?(Array)
412
+ return 'false' if match[0] == 'no '
413
+ return 'size_' + match[1] if match[1]
414
+ end
415
+ default_event_history_periodic
416
+ end
417
+
418
+ def event_history_periodic=(val)
419
+ size = val[/small|medium|large|disable/]
420
+ @set_args[:size] = size.nil? ? '' : "size #{size}"
421
+ @set_args[:state] = val[/false/] ? 'no' : ''
422
+ config_set('bgp', 'event_history_periodic', @set_args)
423
+ set_args_keys_default
424
+ end
425
+
426
+ def default_event_history_periodic
427
+ config_get_default('bgp', 'event_history_periodic')
428
+ end
429
+
430
+ # Fast External fallover (Getter/Setter/Default)
431
+ def fast_external_fallover
432
+ config_get('bgp', 'fast_external_fallover', @get_args)
433
+ end
434
+
435
+ def fast_external_fallover=(enable)
436
+ @set_args[:state] = (enable ? '' : 'no')
437
+ config_set('bgp', 'fast_external_fallover', @set_args)
438
+ set_args_keys_default
439
+ end
440
+
441
+ def default_fast_external_fallover
442
+ config_get_default('bgp', 'fast_external_fallover')
443
+ end
444
+
445
+ # Flush Routes (Getter/Setter/Default)
446
+ def flush_routes
447
+ config_get('bgp', 'flush_routes', @get_args)
448
+ end
449
+
450
+ def flush_routes=(enable)
451
+ @set_args[:state] = (enable ? '' : 'no')
452
+ config_set('bgp', 'flush_routes', @set_args)
453
+ set_args_keys_default
454
+ end
455
+
456
+ def default_flush_routes
457
+ config_get_default('bgp', 'flush_routes')
458
+ end
459
+
343
460
  # Confederation Peers (Getter/Setter/Default)
344
461
  def confederation_peers
345
- match = config_get('bgp', 'confederation_peers', @get_args)
346
- match.nil? ? default_confederation_peers : match.first
462
+ config_get('bgp', 'confederation_peers', @get_args)
347
463
  end
348
464
 
349
465
  def confederation_peers_set(peers)
@@ -368,28 +484,19 @@ module Cisco
368
484
 
369
485
  # Graceful Restart Getters
370
486
  def graceful_restart
371
- match = config_get('bgp', 'graceful_restart', @get_args)
372
- match.nil? ? false : true
487
+ config_get('bgp', 'graceful_restart', @get_args)
373
488
  end
374
489
 
375
490
  def graceful_restart_timers_restart
376
- match = config_get('bgp', 'graceful_restart_timers_restart', @get_args)
377
- match.nil? ? default_graceful_restart_timers_restart : match.first.to_i
491
+ config_get('bgp', 'graceful_restart_timers_restart', @get_args)
378
492
  end
379
493
 
380
494
  def graceful_restart_timers_stalepath_time
381
- match = config_get('bgp', 'graceful_restart_timers_stalepath_time',
382
- @get_args)
383
- if match.nil?
384
- default_graceful_restart_timers_stalepath_time
385
- else
386
- match.first.to_i
387
- end
495
+ config_get('bgp', 'graceful_restart_timers_stalepath_time', @get_args)
388
496
  end
389
497
 
390
498
  def graceful_restart_helper
391
- match = config_get('bgp', 'graceful_restart_helper', @get_args)
392
- match.nil? ? default_graceful_restart_helper : true
499
+ config_get('bgp', 'graceful_restart_helper', @get_args)
393
500
  end
394
501
 
395
502
  # Graceful Restart Setters
@@ -446,10 +553,24 @@ module Cisco
446
553
  config_get_default('bgp', 'graceful_restart_helper')
447
554
  end
448
555
 
556
+ # Isolate (Getter/Setter/Default)
557
+ def isolate
558
+ config_get('bgp', 'isolate', @get_args)
559
+ end
560
+
561
+ def isolate=(enable)
562
+ @set_args[:state] = (enable ? '' : 'no')
563
+ config_set('bgp', 'isolate', @set_args)
564
+ set_args_keys_default
565
+ end
566
+
567
+ def default_isolate
568
+ config_get_default('bgp', 'isolate')
569
+ end
570
+
449
571
  # MaxAs Limit (Getter/Setter/Default)
450
572
  def maxas_limit
451
- match = config_get('bgp', 'maxas_limit', @get_args)
452
- match.nil? ? default_maxas_limit : match.first.to_i
573
+ config_get('bgp', 'maxas_limit', @get_args)
453
574
  end
454
575
 
455
576
  def maxas_limit=(limit)
@@ -470,8 +591,7 @@ module Cisco
470
591
 
471
592
  # Log Neighbor Changes (Getter/Setter/Default)
472
593
  def log_neighbor_changes
473
- match = config_get('bgp', 'log_neighbor_changes', @get_args)
474
- match.nil? ? default_log_neighbor_changes : true
594
+ config_get('bgp', 'log_neighbor_changes', @get_args)
475
595
  end
476
596
 
477
597
  def log_neighbor_changes=(enable)
@@ -484,26 +604,24 @@ module Cisco
484
604
  config_get_default('bgp', 'log_neighbor_changes')
485
605
  end
486
606
 
487
- # Neighbor fib down accelerate (Getter/Setter/Default)
488
- def neighbor_fib_down_accelerate
489
- match = config_get('bgp', 'neighbor_fib_down_accelerate', @get_args)
490
- match.nil? ? default_neighbor_fib_down_accelerate : true
607
+ # Neighbor down fib accelerate (Getter/Setter/Default)
608
+ def neighbor_down_fib_accelerate
609
+ config_get('bgp', 'neighbor_down_fib_accelerate', @get_args)
491
610
  end
492
611
 
493
- def neighbor_fib_down_accelerate=(enable)
612
+ def neighbor_down_fib_accelerate=(enable)
494
613
  @set_args[:state] = (enable ? '' : 'no')
495
- config_set('bgp', 'neighbor_fib_down_accelerate', @set_args)
614
+ config_set('bgp', 'neighbor_down_fib_accelerate', @set_args)
496
615
  set_args_keys_default
497
616
  end
498
617
 
499
- def default_neighbor_fib_down_accelerate
500
- config_get_default('bgp', 'neighbor_fib_down_accelerate')
618
+ def default_neighbor_down_fib_accelerate
619
+ config_get_default('bgp', 'neighbor_down_fib_accelerate')
501
620
  end
502
621
 
503
622
  # Reconnect Interval (Getter/Setter/Default)
504
623
  def reconnect_interval
505
- match = config_get('bgp', 'reconnect_interval', @get_args)
506
- match.nil? ? default_reconnect_interval : match.first.to_i
624
+ config_get('bgp', 'reconnect_interval', @get_args)
507
625
  end
508
626
 
509
627
  def reconnect_interval=(seconds)
@@ -522,19 +640,43 @@ module Cisco
522
640
  config_get_default('bgp', 'reconnect_interval')
523
641
  end
524
642
 
643
+ # route_distinguisher
644
+ # Note that this property is supported by both bgp and vrf providers.
645
+ def route_distinguisher
646
+ config_get('bgp', 'route_distinguisher', @get_args)
647
+ end
648
+
649
+ def route_distinguisher=(rd)
650
+ Feature.nv_overlay_evpn_enable
651
+ if rd == default_route_distinguisher
652
+ @set_args[:state] = 'no'
653
+ @set_args[:rd] = ''
654
+ else
655
+ @set_args[:state] = ''
656
+ @set_args[:rd] = rd
657
+ end
658
+ config_set('bgp', 'route_distinguisher', @set_args)
659
+ set_args_keys_default
660
+ end
661
+
662
+ def default_route_distinguisher
663
+ config_get_default('bgp', 'route_distinguisher')
664
+ end
665
+
525
666
  # Router ID (Getter/Setter/Default)
526
667
  def router_id
527
- match = config_get('bgp', 'router_id', @get_args)
528
- match.nil? ? default_router_id : match.first
668
+ config_get('bgp', 'router_id', @get_args)
529
669
  end
530
670
 
531
671
  def router_id=(id)
532
672
  # In order to remove a bgp router-id you cannot simply issue
533
- # 'no bgp router-id'. Dummy-id specified to work around this.
534
- dummy_id = '1.2.3.4'
673
+ # 'no bgp router-id'. On some platforms you can specify a dummy
674
+ # value, but on N7K at least you need the current router_id.
535
675
  if id == default_router_id
676
+ # Nothing to do if router_id is already set to default.
677
+ return if router_id == default_router_id
536
678
  @set_args[:state] = 'no'
537
- @set_args[:id] = dummy_id
679
+ @set_args[:id] = router_id
538
680
  else
539
681
  @set_args[:state] = ''
540
682
  @set_args[:id] = id
@@ -549,8 +691,7 @@ module Cisco
549
691
 
550
692
  # Shutdown (Getter/Setter/Default)
551
693
  def shutdown
552
- match = config_get('bgp', 'shutdown', @asnum)
553
- match.nil? ? default_shutdown : true
694
+ config_get('bgp', 'shutdown', @asnum)
554
695
  end
555
696
 
556
697
  def shutdown=(enable)
@@ -565,8 +706,7 @@ module Cisco
565
706
 
566
707
  # Supress Fib Pending (Getter/Setter/Default)
567
708
  def suppress_fib_pending
568
- match = config_get('bgp', 'suppress_fib_pending', @get_args)
569
- match.nil? ? default_suppress_fib_pending : true
709
+ config_get('bgp', 'suppress_fib_pending', @get_args)
570
710
  end
571
711
 
572
712
  def suppress_fib_pending=(enable)
@@ -582,7 +722,7 @@ module Cisco
582
722
  # BGP Timers Getters
583
723
  def timer_bgp_keepalive_hold
584
724
  match = config_get('bgp', 'timer_bgp_keepalive_hold', @get_args)
585
- match.nil? ? default_timer_bgp_keepalive_hold : match.first
725
+ match.nil? ? default_timer_bgp_keepalive_hold : match
586
726
  end
587
727
 
588
728
  def timer_bgp_keepalive
@@ -598,13 +738,11 @@ module Cisco
598
738
  end
599
739
 
600
740
  def timer_bestpath_limit
601
- match = config_get('bgp', 'timer_bestpath_limit', @get_args)
602
- match.nil? ? default_timer_bestpath_limit : match.first.to_i
741
+ config_get('bgp', 'timer_bestpath_limit', @get_args)
603
742
  end
604
743
 
605
744
  def timer_bestpath_limit_always
606
- match = config_get('bgp', 'timer_bestpath_limit_always', @get_args)
607
- match.nil? ? default_timer_bestpath_limit_always : true
745
+ config_get('bgp', 'timer_bestpath_limit_always', @get_args)
608
746
  end
609
747
 
610
748
  # BGP Timers Setters
@@ -625,9 +763,9 @@ module Cisco
625
763
 
626
764
  def timer_bestpath_limit_set(seconds, always=false)
627
765
  if always
628
- feature = 'timer_bestpath_limit_always'
766
+ opt = 'timer_bestpath_limit_always'
629
767
  else
630
- feature = 'timer_bestpath_limit'
768
+ opt = 'timer_bestpath_limit'
631
769
  end
632
770
  if seconds == default_timer_bestpath_limit
633
771
  @set_args[:state] = 'no'
@@ -636,7 +774,7 @@ module Cisco
636
774
  @set_args[:state] = ''
637
775
  @set_args[:seconds] = seconds
638
776
  end
639
- config_set('bgp', feature, @set_args)
777
+ config_set('bgp', opt, @set_args)
640
778
  set_args_keys_default
641
779
  end
642
780