cisco_node_utils 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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