cisco_node_utils 1.2.0 → 1.3.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 (255) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +13 -0
  5. data/.travis.yml +4 -1
  6. data/CHANGELOG.md +81 -2
  7. data/CONTRIBUTING.md +2 -17
  8. data/Gemfile +5 -0
  9. data/README.md +92 -47
  10. data/Rakefile +23 -1
  11. data/bin/git/hooks/hook_lib +7 -0
  12. data/bin/git/hooks/pre-commit/check_unstaged_changes +18 -0
  13. data/bin/git/hooks/pre-commit/rubocop +7 -2
  14. data/bin/git/hooks/pre-commit/validate-diffs +18 -4
  15. data/bin/git/hooks/pre-commit/validate-yaml +18 -0
  16. data/bin/git/update-hooks +64 -6
  17. data/cisco_node_utils.gemspec +9 -6
  18. data/docs/README-develop-best-practices.md +149 -50
  19. data/docs/README-develop-node-utils-APIs.md +92 -42
  20. data/docs/README-maintainers.md +7 -4
  21. data/docs/README-test-execution.md +57 -0
  22. data/docs/cisco_node_utils.yaml.example +30 -0
  23. data/docs/template-router.rb +4 -0
  24. data/ext/mkrf_conf.rb +63 -0
  25. data/lib/.rubocop.yml +2 -2
  26. data/lib/cisco_node_utils.rb +5 -0
  27. data/lib/cisco_node_utils/aaa_authentication_login.rb +5 -6
  28. data/lib/cisco_node_utils/aaa_authorization_service.rb +1 -1
  29. data/lib/cisco_node_utils/ace.rb +165 -12
  30. data/lib/cisco_node_utils/acl.rb +2 -1
  31. data/lib/cisco_node_utils/bgp.rb +184 -21
  32. data/lib/cisco_node_utils/bgp_af.rb +94 -249
  33. data/lib/cisco_node_utils/bgp_neighbor.rb +94 -14
  34. data/lib/cisco_node_utils/bgp_neighbor_af.rb +75 -8
  35. data/lib/cisco_node_utils/bridge_domain.rb +183 -0
  36. data/lib/cisco_node_utils/bridge_domain_vni.rb +206 -0
  37. data/lib/cisco_node_utils/cisco_cmn_utils.rb +85 -2
  38. data/lib/cisco_node_utils/client.rb +35 -0
  39. data/lib/cisco_node_utils/client/client.rb +234 -0
  40. data/lib/cisco_node_utils/client/grpc.rb +33 -0
  41. data/lib/cisco_node_utils/client/grpc/client.rb +311 -0
  42. data/lib/cisco_node_utils/client/grpc/ems.proto +148 -0
  43. data/lib/cisco_node_utils/client/grpc/ems.rb +111 -0
  44. data/lib/cisco_node_utils/client/grpc/ems_services.rb +49 -0
  45. data/lib/cisco_node_utils/client/nxapi.rb +31 -0
  46. data/lib/cisco_node_utils/client/nxapi/client.rb +305 -0
  47. data/lib/cisco_node_utils/client/utils.rb +164 -0
  48. data/lib/cisco_node_utils/cmd_ref/README_YAML.md +222 -254
  49. data/lib/cisco_node_utils/cmd_ref/aaa_auth_login_service.yaml +11 -8
  50. data/lib/cisco_node_utils/cmd_ref/aaa_authentication_login.yaml +22 -15
  51. data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +11 -8
  52. data/lib/cisco_node_utils/cmd_ref/acl.yaml +21 -16
  53. data/lib/cisco_node_utils/cmd_ref/bgp.yaml +239 -109
  54. data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +114 -55
  55. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +76 -52
  56. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +106 -62
  57. data/lib/cisco_node_utils/cmd_ref/bridge_domain.yaml +71 -0
  58. data/lib/cisco_node_utils/cmd_ref/bridge_domain_vni.yaml +33 -0
  59. data/lib/cisco_node_utils/cmd_ref/dnsclient.yaml +35 -14
  60. data/lib/cisco_node_utils/cmd_ref/encapsulation.yaml +25 -0
  61. data/lib/cisco_node_utils/cmd_ref/evpn_vni.yaml +23 -17
  62. data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +94 -83
  63. data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +22 -17
  64. data/lib/cisco_node_utils/cmd_ref/feature.yaml +76 -26
  65. data/lib/cisco_node_utils/cmd_ref/images.yaml +3 -2
  66. data/lib/cisco_node_utils/cmd_ref/interface.yaml +381 -153
  67. data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +21 -11
  68. data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +21 -21
  69. data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +30 -21
  70. data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +18 -13
  71. data/lib/cisco_node_utils/cmd_ref/inventory.yaml +26 -31
  72. data/lib/cisco_node_utils/cmd_ref/itd_device_group.yaml +83 -0
  73. data/lib/cisco_node_utils/cmd_ref/itd_service.yaml +119 -0
  74. data/lib/cisco_node_utils/cmd_ref/memory.yaml +17 -6
  75. data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +10 -3
  76. data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +17 -5
  77. data/lib/cisco_node_utils/cmd_ref/ospf.yaml +33 -29
  78. data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +12 -10
  79. data/lib/cisco_node_utils/cmd_ref/pim.yaml +16 -19
  80. data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +40 -25
  81. data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +17 -12
  82. data/lib/cisco_node_utils/cmd_ref/radius_server.yaml +71 -35
  83. data/lib/cisco_node_utils/cmd_ref/radius_server_group.yaml +10 -5
  84. data/lib/cisco_node_utils/cmd_ref/show_system.yaml +6 -2
  85. data/lib/cisco_node_utils/cmd_ref/show_version.yaml +47 -43
  86. data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +13 -11
  87. data/lib/cisco_node_utils/cmd_ref/snmp_group.yaml +4 -2
  88. data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +23 -21
  89. data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +26 -22
  90. data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +19 -17
  91. data/lib/cisco_node_utils/cmd_ref/snmpnotification.yaml +18 -6
  92. data/lib/cisco_node_utils/cmd_ref/stp_global.yaml +234 -0
  93. data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +24 -9
  94. data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +5 -3
  95. data/lib/cisco_node_utils/cmd_ref/system.yaml +4 -3
  96. data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +22 -20
  97. data/lib/cisco_node_utils/cmd_ref/tacacs_server_group.yaml +27 -15
  98. data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +45 -16
  99. data/lib/cisco_node_utils/cmd_ref/vdc.yaml +21 -11
  100. data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +3 -2
  101. data/lib/cisco_node_utils/cmd_ref/vlan.yaml +60 -32
  102. data/lib/cisco_node_utils/cmd_ref/vpc.yaml +118 -101
  103. data/lib/cisco_node_utils/cmd_ref/vrf.yaml +54 -58
  104. data/lib/cisco_node_utils/cmd_ref/vrf_af.yaml +118 -0
  105. data/lib/cisco_node_utils/cmd_ref/vtp.yaml +19 -25
  106. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +28 -18
  107. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +34 -17
  108. data/lib/cisco_node_utils/cmd_ref/yum.yaml +6 -4
  109. data/lib/cisco_node_utils/command_reference.rb +261 -142
  110. data/lib/cisco_node_utils/constants.rb +33 -0
  111. data/lib/cisco_node_utils/encapsulation.rb +112 -0
  112. data/lib/cisco_node_utils/environment.rb +102 -0
  113. data/lib/cisco_node_utils/evpn_vni.rb +5 -3
  114. data/lib/cisco_node_utils/exceptions.rb +111 -0
  115. data/lib/cisco_node_utils/fabricpath_global.rb +52 -35
  116. data/lib/cisco_node_utils/fabricpath_topology.rb +44 -57
  117. data/lib/cisco_node_utils/feature.rb +165 -3
  118. data/lib/cisco_node_utils/interface.rb +1051 -260
  119. data/lib/cisco_node_utils/interface_channel_group.rb +11 -10
  120. data/lib/cisco_node_utils/interface_ospf.rb +1 -2
  121. data/lib/cisco_node_utils/interface_portchannel.rb +4 -12
  122. data/lib/cisco_node_utils/interface_service_vni.rb +7 -7
  123. data/lib/cisco_node_utils/itd_device_group.rb +248 -0
  124. data/lib/cisco_node_utils/itd_device_group_node.rb +144 -0
  125. data/lib/cisco_node_utils/itd_service.rb +523 -0
  126. data/lib/cisco_node_utils/logger.rb +75 -0
  127. data/lib/cisco_node_utils/node.rb +62 -192
  128. data/lib/cisco_node_utils/node_util.rb +56 -10
  129. data/lib/cisco_node_utils/overlay_global.rb +2 -2
  130. data/lib/cisco_node_utils/pim.rb +2 -13
  131. data/lib/cisco_node_utils/pim_group_list.rb +1 -1
  132. data/lib/cisco_node_utils/pim_rp_address.rb +1 -1
  133. data/lib/cisco_node_utils/platform.rb +52 -21
  134. data/lib/cisco_node_utils/portchannel_global.rb +89 -19
  135. data/lib/cisco_node_utils/radius_server.rb +168 -37
  136. data/lib/cisco_node_utils/router_ospf.rb +20 -35
  137. data/lib/cisco_node_utils/router_ospf_vrf.rb +4 -4
  138. data/lib/cisco_node_utils/snmpserver.rb +1 -6
  139. data/lib/cisco_node_utils/snmpuser.rb +6 -4
  140. data/lib/cisco_node_utils/stp_global.rb +676 -0
  141. data/lib/cisco_node_utils/syslog_server.rb +77 -18
  142. data/lib/cisco_node_utils/syslog_settings.rb +1 -1
  143. data/lib/cisco_node_utils/tacacs_server_group.rb +8 -4
  144. data/lib/cisco_node_utils/tacacs_server_host.rb +115 -25
  145. data/lib/cisco_node_utils/vdc.rb +12 -0
  146. data/lib/cisco_node_utils/version.rb +1 -1
  147. data/lib/cisco_node_utils/vlan.rb +147 -29
  148. data/lib/cisco_node_utils/vpc.rb +55 -3
  149. data/lib/cisco_node_utils/vrf.rb +72 -11
  150. data/lib/cisco_node_utils/vrf_af.rb +114 -29
  151. data/lib/cisco_node_utils/vtp.rb +34 -52
  152. data/lib/cisco_node_utils/vxlan_vtep.rb +34 -8
  153. data/lib/cisco_node_utils/vxlan_vtep_vni.rb +36 -4
  154. data/lib/minitest/environment_plugin.rb +31 -0
  155. data/lib/minitest/log_level_plugin.rb +41 -0
  156. data/spec/client_spec.rb +7 -0
  157. data/spec/environment_spec.rb +263 -0
  158. data/spec/grpc_client_spec.rb +23 -0
  159. data/spec/isolate/all_clients_spec.rb +9 -0
  160. data/spec/isolate/grpc_only_spec.rb +16 -0
  161. data/spec/isolate/no_clients_spec.rb +26 -0
  162. data/spec/isolate/nxapi_only_spec.rb +16 -0
  163. data/spec/nxapi_client_spec.rb +42 -0
  164. data/spec/schema.yaml +75 -0
  165. data/spec/shared_examples_for_clients.rb +14 -0
  166. data/spec/spec_helper.rb +91 -0
  167. data/spec/whitespace_spec.rb +10 -0
  168. data/spec/yaml_spec.rb +42 -0
  169. data/tests/.rubocop.yml +2 -2
  170. data/tests/CSCuxdublin-1.0.0-7.0.3.I3.1.lib32_n9000.rpm +0 -0
  171. data/tests/basetest.rb +96 -36
  172. data/tests/ciscotest.rb +220 -12
  173. data/tests/cmd_config.yaml +71 -49
  174. data/tests/cmd_config_invalid.yaml +1 -1
  175. data/tests/test_aaa_authentication_login.rb +1 -0
  176. data/tests/test_aaa_authentication_login_service.rb +9 -0
  177. data/tests/test_aaa_authorization_service.rb +173 -367
  178. data/tests/test_ace.rb +171 -100
  179. data/tests/test_acl.rb +10 -1
  180. data/tests/test_bgp_af.rb +395 -728
  181. data/tests/test_bgp_neighbor.rb +274 -115
  182. data/tests/test_bgp_neighbor_af.rb +178 -77
  183. data/tests/test_bridge_domain.rb +191 -0
  184. data/tests/test_bridge_domain_vni.rb +116 -0
  185. data/tests/test_client_utils.rb +111 -0
  186. data/tests/test_command_config.rb +9 -5
  187. data/tests/test_command_reference.rb +380 -102
  188. data/tests/test_dns_domain.rb +13 -3
  189. data/tests/test_domain_name.rb +13 -3
  190. data/tests/test_encapsulation.rb +77 -0
  191. data/tests/test_evpn_vni.rb +25 -7
  192. data/tests/test_fabricpath_global.rb +167 -163
  193. data/tests/test_fabricpath_topology.rb +12 -33
  194. data/tests/test_feature.rb +215 -0
  195. data/tests/test_grpc.rb +166 -0
  196. data/tests/test_interface.rb +585 -344
  197. data/tests/test_interface_bdi.rb +80 -0
  198. data/tests/test_interface_channel_group.rb +6 -3
  199. data/tests/test_interface_ospf.rb +26 -24
  200. data/tests/test_interface_portchannel.rb +1 -0
  201. data/tests/test_interface_private_vlan.rb +724 -0
  202. data/tests/test_interface_service_vni.rb +37 -66
  203. data/tests/test_interface_svi.rb +98 -101
  204. data/tests/test_interface_switchport.rb +419 -549
  205. data/tests/test_itd_device_group.rb +145 -0
  206. data/tests/test_itd_device_group_node.rb +199 -0
  207. data/tests/test_itd_service.rb +298 -0
  208. data/tests/test_logger.rb +43 -0
  209. data/tests/test_name_server.rb +11 -2
  210. data/tests/test_node.rb +16 -75
  211. data/tests/test_node_ext.rb +174 -163
  212. data/tests/test_node_util.rb +119 -0
  213. data/tests/test_ntp_config.rb +5 -1
  214. data/tests/test_ntp_server.rb +2 -2
  215. data/tests/test_nxapi.rb +221 -0
  216. data/tests/test_overlay_global.rb +47 -38
  217. data/tests/test_pim.rb +2 -0
  218. data/tests/test_pim_group_list.rb +2 -0
  219. data/tests/test_pim_rp_address.rb +2 -0
  220. data/tests/test_platform.rb +86 -39
  221. data/tests/test_portchannel_global.rb +211 -135
  222. data/tests/test_radius_global.rb +13 -5
  223. data/tests/test_radius_server.rb +256 -104
  224. data/tests/test_radius_server_group.rb +2 -0
  225. data/tests/test_router_bgp.rb +781 -485
  226. data/tests/test_router_ospf.rb +26 -103
  227. data/tests/test_router_ospf_vrf.rb +52 -57
  228. data/tests/test_snmp_notification_receiver.rb +2 -0
  229. data/tests/test_snmpcommunity.rb +2 -0
  230. data/tests/test_snmpgroup.rb +2 -0
  231. data/tests/test_snmpnotification.rb +40 -21
  232. data/tests/test_snmpserver.rb +2 -0
  233. data/tests/test_snmpuser.rb +2 -0
  234. data/tests/test_stp_global.rb +563 -0
  235. data/tests/test_syslog_server.rb +32 -8
  236. data/tests/test_syslog_settings.rb +22 -9
  237. data/tests/test_tacacs_server.rb +32 -27
  238. data/tests/test_tacacs_server_group.rb +100 -45
  239. data/tests/test_tacacs_server_host.rb +135 -43
  240. data/tests/test_vdc.rb +2 -16
  241. data/tests/test_vlan.rb +106 -54
  242. data/tests/test_vlan_mt_full.rb +11 -21
  243. data/tests/test_vlan_private.rb +669 -0
  244. data/tests/test_vpc.rb +312 -159
  245. data/tests/test_vrf.rb +122 -113
  246. data/tests/test_vrf_af.rb +238 -0
  247. data/tests/test_vtp.rb +58 -102
  248. data/tests/test_vxlan_vtep.rb +38 -17
  249. data/tests/test_vxlan_vtep_vni.rb +61 -9
  250. data/tests/test_yum.rb +49 -25
  251. metadata +122 -36
  252. data/lib/cisco_node_utils/cmd_ref/fex.yaml +0 -9
  253. data/lib/cisco_node_utils/cmd_ref/vni.yaml +0 -76
  254. data/lib/cisco_node_utils/vni.rb +0 -227
  255. data/tests/test_vni.rb +0 -106
@@ -25,7 +25,7 @@ module Cisco
25
25
  class RadiusServer < NodeUtil
26
26
  attr_reader :name
27
27
 
28
- def initialize(name, instantiate=true)
28
+ def initialize(name, instantiate=true, auth_p=nil, acct_p=nil)
29
29
  unless name =~ /^[a-zA-Z0-9\.\:]*$/
30
30
  fail ArgumentError,
31
31
  'Invalid value (IPv4/IPv6 address contains invalid characters)'
@@ -39,7 +39,37 @@ module Cisco
39
39
  end
40
40
  @name = name
41
41
 
42
+ if platform == :ios_xr
43
+ if auth_p.nil?
44
+ @auth_port = config_get_default('radius_server', 'auth-port')
45
+ else
46
+ fail ArgumentError, 'auth_p must be an Integer' \
47
+ unless auth_p.is_a?(Integer)
48
+ @auth_port = auth_p
49
+ end
50
+
51
+ if acct_p.nil?
52
+ @acct_port = config_get_default('radius_server', 'acct-port')
53
+ else
54
+ fail ArgumentError, 'acct_p must be an Integer' \
55
+ unless acct_p.is_a?(Integer)
56
+ @acct_port = acct_p
57
+ end
58
+ end
59
+
42
60
  create if instantiate
61
+
62
+ return if platform == :ios_xr
63
+ unless auth_p.nil?
64
+ fail ArgumentError, 'auth_p must be an Integer' \
65
+ unless auth_p.is_a?(Integer)
66
+ self.auth_port = auth_p
67
+ end
68
+
69
+ return if acct_p.nil?
70
+ fail ArgumentError, 'acct_p must be an Integer' \
71
+ unless acct_p.is_a?(Integer)
72
+ self.acct_port = acct_p
43
73
  end
44
74
 
45
75
  def self.radiusservers
@@ -48,24 +78,65 @@ module Cisco
48
78
  radiusservers_list = config_get('radius_server', 'hosts')
49
79
  return hash if radiusservers_list.empty?
50
80
  radiusservers_list.each do |id|
51
- hash[id] = RadiusServer.new(id, false)
81
+ if platform == :ios_xr
82
+ authp = config_get('radius_server', 'auth-port', ip: id)
83
+ authp = authp[0] if authp.is_a?(Array)
84
+ authp = authp.to_i
85
+
86
+ acctp = config_get('radius_server', 'acct-port', ip: id)
87
+ acctp = acctp[0] if acctp.is_a?(Array)
88
+ acctp = acctp.to_i
89
+
90
+ hash[id] = RadiusServer.new(id, false, authp, acctp)
91
+ else
92
+ hash[id] = RadiusServer.new(id, false)
93
+ end
52
94
  end
53
95
 
54
96
  hash
55
97
  end
56
98
 
57
99
  def create
100
+ destroy if platform == :ios_xr
58
101
  config_set('radius_server',
59
102
  'hosts',
60
- state: '',
61
- ip: @name)
103
+ state: '',
104
+ ip: @name,
105
+ auth_port: @auth_port,
106
+ acct_port: @acct_port)
62
107
  end
63
108
 
64
109
  def destroy
65
- config_set('radius_server',
66
- 'hosts',
67
- state: 'no',
68
- ip: @name)
110
+ if platform == :ios_xr
111
+ # This provider only support a 1-1 mapping between host and ports.
112
+ # Thus, we must remove the other entries on different ports.
113
+ all_hosts = config_get('radius_server', 'host_port_pairs', ip: @name)
114
+ return unless all_hosts.is_a?(Array)
115
+
116
+ warn("#{name} is configured multiple times on the device" \
117
+ ' (possibly using different ports). This is unsupported by this' \
118
+ ' API and the duplicate entries are being deleted.') \
119
+ if all_hosts.count > 1
120
+
121
+ all_hosts.each do |host|
122
+ auth = host[0]
123
+ acct = host[1]
124
+
125
+ config_set('radius_server',
126
+ 'hosts',
127
+ state: 'no',
128
+ ip: @name,
129
+ auth_port: auth,
130
+ acct_port: acct)
131
+ end
132
+ else
133
+ config_set('radius_server',
134
+ 'hosts',
135
+ state: 'no',
136
+ ip: @name,
137
+ auth_port: @auth_port,
138
+ acct_port: @acct_port)
139
+ end
69
140
  end
70
141
 
71
142
  def ==(other)
@@ -73,7 +144,8 @@ module Cisco
73
144
  end
74
145
 
75
146
  def auth_port
76
- config_get('radius_server', 'auth-port', @name)
147
+ platform == :ios_xr ? @auth_port : config_get('radius_server',
148
+ 'auth-port', ip: @name)
77
149
  end
78
150
 
79
151
  def default_auth_port
@@ -81,6 +153,10 @@ module Cisco
81
153
  end
82
154
 
83
155
  def auth_port=(val)
156
+ fail("'auth_port' setter method not applicable for this platform." \
157
+ 'auth_port must be passed in to the constructor.') \
158
+ if platform == :ios_xr
159
+
84
160
  unless val.nil?
85
161
  fail ArgumentError, 'auth_port must be an Integer' \
86
162
  unless val.is_a?(Integer)
@@ -102,7 +178,8 @@ module Cisco
102
178
  end
103
179
 
104
180
  def acct_port
105
- config_get('radius_server', 'acct-port', @name)
181
+ platform == :ios_xr ? @acct_port : config_get('radius_server',
182
+ 'acct-port', ip: @name)
106
183
  end
107
184
 
108
185
  def default_acct_port
@@ -110,6 +187,10 @@ module Cisco
110
187
  end
111
188
 
112
189
  def acct_port=(val)
190
+ fail("'acct_port' setter method not applicable for this platform." \
191
+ 'acct_port must be passed in to the constructor.') \
192
+ if platform == :ios_xr
193
+
113
194
  unless val.nil?
114
195
  fail ArgumentError, 'acct_port must be an Integer' \
115
196
  unless val.is_a?(Integer)
@@ -131,7 +212,15 @@ module Cisco
131
212
  end
132
213
 
133
214
  def timeout
134
- config_get('radius_server', 'timeout', @name)
215
+ val = config_get('radius_server',
216
+ 'timeout',
217
+ ip: @name,
218
+ auth_port: @auth_port,
219
+ acct_port: @acct_port)
220
+
221
+ val = val[0] if val.is_a?(Array)
222
+ val = val.to_i unless val.nil?
223
+ val
135
224
  end
136
225
 
137
226
  def default_timeout
@@ -145,22 +234,34 @@ module Cisco
145
234
  end
146
235
 
147
236
  if val.nil?
237
+ return if timeout.nil?
148
238
  config_set('radius_server',
149
239
  'timeout',
150
- state: 'no',
151
- ip: @name,
152
- timeout: timeout)
240
+ state: 'no',
241
+ ip: @name,
242
+ auth_port: @auth_port,
243
+ acct_port: @acct_port,
244
+ timeout: timeout)
153
245
  else
154
246
  config_set('radius_server',
155
247
  'timeout',
156
- state: '',
157
- ip: @name,
158
- timeout: val)
248
+ state: '',
249
+ ip: @name,
250
+ auth_port: @auth_port,
251
+ acct_port: @acct_port,
252
+ timeout: val)
159
253
  end
160
254
  end
161
255
 
162
256
  def retransmit_count
163
- config_get('radius_server', 'retransmit', @name)
257
+ val = config_get('radius_server',
258
+ 'retransmit',
259
+ ip: @name,
260
+ auth_port: @auth_port,
261
+ acct_port: @acct_port)
262
+ val = val[0] if val.is_a?(Array)
263
+ val = val.to_i unless val.nil?
264
+ val
164
265
  end
165
266
 
166
267
  def default_retransmit_count
@@ -174,22 +275,28 @@ module Cisco
174
275
  end
175
276
 
176
277
  if val.nil?
278
+ return if retransmit_count.nil?
177
279
  config_set('radius_server',
178
280
  'retransmit',
179
- state: 'no',
180
- ip: @name,
181
- count: retransmit_count)
281
+ state: 'no',
282
+ ip: @name,
283
+ auth_port: @auth_port,
284
+ acct_port: @acct_port,
285
+ count: retransmit_count)
182
286
  else
183
287
  config_set('radius_server',
184
288
  'retransmit',
185
- state: '',
186
- ip: @name,
187
- count: val)
289
+ state: '',
290
+ ip: @name,
291
+ auth_port: @auth_port,
292
+ acct_port: @acct_port,
293
+ count: val)
188
294
  end
189
295
  end
190
296
 
191
297
  def accounting
192
- val = config_get('radius_server', 'accounting', @name)
298
+ return nil if platform == :ios_xr
299
+ val = config_get('radius_server', 'accounting', ip: @name)
193
300
  if val.nil?
194
301
  false
195
302
  else
@@ -216,7 +323,8 @@ module Cisco
216
323
  end
217
324
 
218
325
  def authentication
219
- val = config_get('radius_server', 'authentication', @name)
326
+ return nil if platform == :ios_xr
327
+ val = config_get('radius_server', 'authentication', ip: @name)
220
328
  if val.nil?
221
329
  false
222
330
  else
@@ -243,11 +351,25 @@ module Cisco
243
351
  end
244
352
 
245
353
  def key_format
246
- config_get('radius_server', 'key_format', @name)
354
+ val = config_get('radius_server',
355
+ 'key_format',
356
+ ip: @name,
357
+ auth_port: @auth_port,
358
+ acct_port: @acct_port)
359
+
360
+ val = val[0] if val.is_a?(Array)
361
+ val
247
362
  end
248
363
 
249
364
  def key
250
- config_get('radius_server', 'key', @name)
365
+ val = config_get('radius_server',
366
+ 'key',
367
+ ip: @name,
368
+ auth_port: @auth_port,
369
+ acct_port: @acct_port)
370
+
371
+ val = val[0] if val.is_a?(Array)
372
+ val
251
373
  end
252
374
 
253
375
  def key_set(value, format)
@@ -261,24 +383,33 @@ module Cisco
261
383
  unless format.is_a?(Integer)
262
384
  end
263
385
 
386
+ # Return as we don't need to do anything
387
+ return if value.nil? && key.nil?
388
+
264
389
  if value.nil? && !key.nil?
265
390
  config_set('radius_server',
266
391
  'key',
267
- state: 'no',
268
- ip: @name,
269
- key: "#{key_format} #{key}")
392
+ state: 'no',
393
+ ip: @name,
394
+ auth_port: @auth_port,
395
+ acct_port: @acct_port,
396
+ key: "#{key_format} #{key}")
270
397
  elsif !format.nil?
271
398
  config_set('radius_server',
272
399
  'key',
273
- state: '',
274
- ip: @name,
275
- key: "#{format} #{value}")
400
+ state: '',
401
+ ip: @name,
402
+ auth_port: @auth_port,
403
+ acct_port: @acct_port,
404
+ key: "#{format} #{value}")
276
405
  else
277
406
  config_set('radius_server',
278
407
  'key',
279
- state: '',
280
- ip: @name,
281
- key: "#{value}")
408
+ state: '',
409
+ ip: @name,
410
+ auth_port: @auth_port,
411
+ acct_port: @acct_port,
412
+ key: "#{value}")
282
413
  end
283
414
  end
284
415
  end # class
@@ -44,49 +44,34 @@ module Cisco
44
44
  return {}
45
45
  end
46
46
 
47
- def self.enabled
48
- feat = config_get('ospf', 'feature')
49
- return (!feat.nil? && !feat.empty?)
50
- rescue Cisco::CliError => e
51
- # cmd will syntax reject when feature is not enabled
52
- raise unless e.clierror =~ /Syntax error/
53
- return false
47
+ # Create one router ospf instance
48
+ def create
49
+ Feature.ospf_enable
50
+ config_set('ospf', 'router', state: '', name: @name)
51
+ wait_for_process_initialized
54
52
  end
55
53
 
56
- def self.enable(state='')
57
- config_set('ospf', 'feature', state)
54
+ # Destroy one router ospf instance
55
+ def destroy
56
+ config_set('ospf', 'router', state: 'no', name: @name)
58
57
  end
59
58
 
60
- def ospf_router(name, state='')
61
- config_set('ospf', 'router', state, name)
59
+ def process_initialized?
60
+ !config_get('ospf', 'process_initialized')
62
61
  end
63
62
 
64
- def enable_create_router_ospf(name)
65
- RouterOspf.enable
66
- ospf_router(name)
67
- end
63
+ def wait_for_process_initialized
64
+ return unless node.product_id[/N(5|6)/]
68
65
 
69
- # Create one router ospf instance
70
- def create
71
- if RouterOspf.enabled
72
- ospf_router(name)
73
- else
74
- enable_create_router_ospf(name)
66
+ # Hack for slow-start platforms which will have setter failures if the
67
+ # ospf instance is still initializing. To see this problem in a sandbox
68
+ # or even the cli do 'router ospf 1 ; router ospf 1 ; shutdown'.
69
+ 4.times do
70
+ return if process_initialized?
71
+ sleep 1
72
+ node.cache_flush
75
73
  end
76
- end
77
-
78
- # Destroy one router ospf instance
79
- def destroy
80
- ospf_ids = config_get('ospf', 'router')
81
- return if ospf_ids.nil?
82
- if ospf_ids.size == 1
83
- RouterOspf.enable('no')
84
- else
85
- ospf_router(name, 'no')
86
- end
87
- rescue Cisco::CliError => e
88
- # cmd will syntax reject when feature is not enabled
89
- raise unless e.clierror =~ /Syntax error/
74
+ fail 'OSPF process is not initialized yet'
90
75
  end
91
76
  end
92
77
  end
@@ -155,13 +155,13 @@ module Cisco
155
155
  config_get('ospf', 'router_id', @get_args)
156
156
  end
157
157
 
158
- def router_id=(router_id)
159
- if router_id == default_router_id
158
+ def router_id=(rid)
159
+ if rid == default_router_id
160
160
  @set_args[:state] = 'no'
161
- @set_args[:router_id] = ''
161
+ @set_args[:router_id] = router_id
162
162
  else
163
163
  @set_args[:state] = ''
164
- @set_args[:router_id] = router_id
164
+ @set_args[:router_id] = rid
165
165
  end
166
166
 
167
167
  config_set('ospf', 'router_id', @set_args)
@@ -24,12 +24,7 @@ module Cisco
24
24
  end
25
25
 
26
26
  def aaa_user_cache_timeout=(timeout)
27
- if timeout == default_aaa_user_cache_timeout
28
- config_set('snmp_server', 'aaa_user_cache_timeout', 'no',
29
- aaa_user_cache_timeout)
30
- else
31
- config_set('snmp_server', 'aaa_user_cache_timeout', '', timeout)
32
- end
27
+ config_set('snmp_server', 'aaa_user_cache_timeout', '', timeout)
33
28
  end
34
29
 
35
30
  def default_aaa_user_cache_timeout
@@ -222,7 +222,7 @@ module Cisco
222
222
  current_pw = auth_password
223
223
  if current_pw.nil?
224
224
  fail "SNMP user #{@name} #{@engine_id} has auth #{auth_protocol} " \
225
- "but no password?\n" + @@node.show('show run snmp all')
225
+ "but no password?\n" + @@node.get(command: 'show run snmp all')
226
226
  end
227
227
 
228
228
  if is_localized
@@ -242,7 +242,8 @@ module Cisco
242
242
  hashed_pw = SnmpUser.auth_password('dummy_user', @engine_id)
243
243
  if hashed_pw.nil?
244
244
  fail "SNMP dummy user #{dummy_user} #{@engine_id} was configured " \
245
- "but password is missing?\n" + @@node.show('show run snmp all')
245
+ "but password is missing?\n" \
246
+ + @@node.get(command: 'show run snmp all')
246
247
  end
247
248
 
248
249
  # Delete dummy user
@@ -267,7 +268,7 @@ module Cisco
267
268
  current_pw = priv_password
268
269
  if current_pw.nil?
269
270
  fail "SNMP user #{@name} #{@engine_id} has priv #{priv_protocol} " \
270
- "but no password?\n" + @@node.show('show run snmp all')
271
+ "but no password?\n" + @@node.get(command: 'show run snmp all')
271
272
  end
272
273
 
273
274
  if is_localized
@@ -289,7 +290,8 @@ module Cisco
289
290
  hashed_pw = SnmpUser.priv_password('dummy_user', @engine_id)
290
291
  if hashed_pw.nil?
291
292
  fail "SNMP dummy user #{dummy_user} #{@engine_id} was configured " \
292
- "but password is missing?\n" + @@node.show('show run snmp all')
293
+ "but password is missing?\n" \
294
+ + @@node.get(command: 'show run snmp all')
293
295
  end
294
296
 
295
297
  # Delete dummy user