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
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # April 2015, Alex Hunsberger
5
5
  #
6
- # Copyright (c) 2015 Cisco and/or its affiliates.
6
+ # Copyright (c) 2015-2016 Cisco and/or its affiliates.
7
7
  #
8
8
  # Licensed under the Apache License, Version 2.0 (the "License");
9
9
  # you may not use this file except in compliance with the License.
data/tests/.rubocop.yml CHANGED
@@ -9,7 +9,7 @@ Metrics/CyclomaticComplexity:
9
9
  Max: 15
10
10
 
11
11
  Metrics/MethodLength:
12
- Max: 86
12
+ Max: 91
13
13
 
14
14
  Metrics/PerceivedComplexity:
15
15
  Max: 17
data/tests/basetest.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  # Basic unit test case class.
4
4
  # December 2014, Glenn F. Matthews
5
5
  #
6
- # Copyright (c) 2014-2015 Cisco and/or its affiliates.
6
+ # Copyright (c) 2014-2016 Cisco and/or its affiliates.
7
7
  #
8
8
  # Licensed under the Apache License, Version 2.0 (the "License");
9
9
  # you may not use this file except in compliance with the License.
@@ -27,11 +27,7 @@ require 'rubygems'
27
27
  gem 'minitest', '~> 5.0'
28
28
  require 'minitest/autorun'
29
29
  require 'net/telnet'
30
- begin
31
- require 'cisco_nxapi'
32
- rescue LoadError
33
- require File.expand_path('../../../cisco-nxapi/lib/cisco_nxapi')
34
- end
30
+ require 'cisco_nxapi'
35
31
 
36
32
  # rubocop:disable Style/ClassVars
37
33
  # We *want* the address/username/password class variables to be shared
@@ -88,7 +84,7 @@ class TestCase < Minitest::Test
88
84
  @device.login(username, password)
89
85
  CiscoLogger.debug_enable if ARGV[3] == 'debug' || ENV['DEBUG'] == '1'
90
86
  rescue Errno::ECONNREFUSED
91
- puts 'Connection refused - please check that the IP address is correct'
87
+ puts 'Telnet login refused - please check that the IP address is correct'
92
88
  puts " and that you have enabled 'feature telnet' on the UUT"
93
89
  exit
94
90
  end
@@ -98,12 +94,25 @@ class TestCase < Minitest::Test
98
94
  GC.start
99
95
  end
100
96
 
97
+ # Extend standard Minitest error handling to report UnsupportedError as skip
98
+ def capture_exceptions
99
+ super do
100
+ begin
101
+ yield
102
+ rescue Cisco::UnsupportedError => e
103
+ skip(e.to_s)
104
+ end
105
+ end
106
+ end
107
+
101
108
  def config(*args)
102
109
  # Send the entire config as one string but be sure not to return until
103
110
  # we are safely back out of config mode, i.e. prompt is
104
111
  # 'switch#' not 'switch(config)#' or 'switch(config-if)#' etc.
105
112
  @device.cmd('String' => "configure terminal\n" + args.join("\n") + "\nend",
106
113
  'Match' => /^[^()]+[$%#>] \z/n)
114
+ rescue Net::ReadTimeout => e
115
+ raise "Timeout when configuring:\n#{args.join("\n")}\n\n#{e}"
107
116
  end
108
117
 
109
118
  def assert_show_match(pattern: nil, command: nil, msg: nil)
data/tests/ciscotest.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2015 Cisco and/or its affiliates.
1
+ # Copyright (c) 2013-2016 Cisco and/or its affiliates.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -12,8 +12,11 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'ipaddr'
16
+ require 'resolv'
15
17
  require_relative 'basetest'
16
18
  require_relative 'platform_info'
19
+ require_relative '../lib/cisco_node_utils/interface'
17
20
  require_relative '../lib/cisco_node_utils/node'
18
21
 
19
22
  include Cisco
@@ -42,8 +45,9 @@ class CiscoTestCase < TestCase
42
45
  end
43
46
  @@node
44
47
  rescue CiscoNxapi::HTTPUnauthorized
45
- puts "Unauthorized to connect as #{username}:#{password}@#{address}"
46
- exit
48
+ abort "Unauthorized to connect as #{username}:#{password}@#{address}"
49
+ rescue StandardError => e
50
+ abort "Error in establishing connection: #{e}"
47
51
  end
48
52
 
49
53
  def setup
@@ -61,23 +65,39 @@ class CiscoTestCase < TestCase
61
65
  result
62
66
  end
63
67
 
68
+ def ip_address?(ip)
69
+ return IPAddr.new(ip).ipv4?
70
+ rescue IPAddr::InvalidAddressError
71
+ false
72
+ end
73
+
74
+ def convert_dns_name(ip)
75
+ ip_address?(ip) ? ip : Resolv.getaddress(ip)
76
+ rescue Resolv::ResolvError
77
+ raise "Unable to resolve name #{ip}. Use static ip to connect instead!"
78
+ end
79
+
80
+ def address_match?(int_ip)
81
+ # Compare the interface address with the current session address.
82
+ # and return true if they match.
83
+ return false if int_ip.nil?
84
+ int_ip == convert_dns_name(address)
85
+ end
86
+
64
87
  def interfaces
65
88
  unless @@interfaces
66
89
  # Build the platform_info, used for interface lookup
67
90
  # rubocop:disable Style/ClassVars
68
- begin
69
- platform_info = PlatformInfo.new(node.host_name)
70
- @@interfaces = platform_info.get_value_from_key('interfaces')
71
- rescue RuntimeError => e
72
- # If there is a problem reading platform_info.yaml,
73
- # assign default values
74
- default_interfaces = ['Ethernet1/1', 'Ethernet1/2', 'Ethernet1/3']
75
- puts "Caught exception: #{e}, assigning interfaces to default " \
76
- "- #{default_interfaces}"
77
- @@interfaces = default_interfaces
91
+ @@interfaces = []
92
+ Interface.interfaces.each do |int, obj|
93
+ next unless /ethernet/.match(int)
94
+ next if address_match?(obj.ipv4_address)
95
+ @@interfaces << int
78
96
  end
79
97
  # rubocop:enable Style/ClassVars
80
98
  end
99
+ abort "No suitable interfaces found on #{node} for this test" if
100
+ @@interfaces.empty?
81
101
  @@interfaces
82
102
  end
83
103
 
@@ -93,4 +113,26 @@ class CiscoTestCase < TestCase
93
113
  end
94
114
  @@interfaces_id
95
115
  end
116
+
117
+ # Remove all router bgps.
118
+ def remove_all_bgps
119
+ require_relative '../lib/cisco_node_utils/bgp'
120
+ RouterBgp.routers.each do |_asn, vrfs|
121
+ vrfs.each do |vrf, obj|
122
+ if vrf == 'default'
123
+ obj.destroy
124
+ break
125
+ end
126
+ end
127
+ end
128
+ end
129
+
130
+ # Remove all user vrfs.
131
+ def remove_all_vrfs
132
+ require_relative '../lib/cisco_node_utils/vrf'
133
+ Vrf.vrfs.each do |vrf, obj|
134
+ next if vrf[/management/]
135
+ obj.destroy
136
+ end
137
+ end
96
138
  end
@@ -41,11 +41,11 @@ feature-snmp-comm-acl-rw:
41
41
  snmp-server community admincom use-acl SNMP_RW
42
42
 
43
43
  feature-int-loopback:
44
- command: >
44
+ command: >
45
45
  interface loopback0
46
46
  description testloopback
47
47
 
48
48
  feature-int-portchannel:
49
- command: >
49
+ command: >
50
50
  interface port-channel100
51
51
  description test-portchannel
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2015 Cisco and/or its affiliates.
1
+ # Copyright (c) 2013-2016 Cisco and/or its affiliates.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@ class PlatformInfo
27
27
  # @param[in] device_name hostname of device on which
28
28
  # UTs are to be run
29
29
  #
30
- def initialize(device_name)
30
+ def initialize(device_name, platform)
31
31
  if device_name.nil? || device_name.empty?
32
32
  fail 'device name must be specified in PlatformInfo constructor.'
33
33
  end
@@ -41,6 +41,7 @@ class PlatformInfo
41
41
  end
42
42
 
43
43
  @platform_info_hash = project_info_hash[device_name]
44
+ @platform_info_hash ||= project_info_hash['default'][platform.to_s]
44
45
  fail "Error - could not find #{device_name} device specific information " \
45
46
  'in platform_info.yaml' if @platform_info_hash.nil?
46
47
  end
@@ -0,0 +1,219 @@
1
+ # Copyright (c) 2013-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 'ciscotest'
16
+ require_relative '../lib/cisco_node_utils/aaa_authentication_login'
17
+
18
+ # Test class for AAA Authentication Login
19
+ class TestAaaAuthenticationLogin < CiscoTestCase
20
+ # DEFAULT(:ascii_authentication)
21
+ # => false
22
+ # rubocop:disable Style/MethodName
23
+ def DEFAULT(prop_name)
24
+ cmd_ref.lookup('aaa_authentication_login', prop_name.to_s).default_value
25
+ end
26
+ # rubocop:enable Style/MethodName
27
+
28
+ def aaaauthenticationlogin_detach(authlogin)
29
+ # Reset the device to a clean test state. Note that AAA will raise an error
30
+ # when disabling an authentication method while a different type is present.
31
+ s = @device.cmd("show run | i 'aaa authentication login'")
32
+ if s[/aaa authentication login (\S+) enable/]
33
+ config("no aaa authentication login #{Regexp.last_match(1)} enable")
34
+ end
35
+ authlogin.ascii_authentication = DEFAULT(:ascii_authentication)
36
+ authlogin.error_display = DEFAULT(:error_display)
37
+ end
38
+
39
+ def test_get_ascii_authentication
40
+ aaaauthlogin = AaaAuthenticationLogin
41
+
42
+ config('no aaa authentication login ascii-authentication')
43
+ refute(aaaauthlogin.ascii_authentication)
44
+
45
+ config('aaa authentication login ascii-authentication')
46
+ assert(aaaauthlogin.ascii_authentication,
47
+ 'Error: AAA authentication login ascii get with preconfig')
48
+ aaaauthenticationlogin_detach(aaaauthlogin)
49
+ end
50
+
51
+ def test_get_default_ascii_authentication
52
+ aaaauthlogin = AaaAuthenticationLogin
53
+ config('no aaa authentication login ascii-authentication')
54
+ assert_equal(DEFAULT(:ascii_authentication),
55
+ aaaauthlogin.default_ascii_authentication,
56
+ 'Error: AAA authentication login, default ascii incorrect')
57
+ aaaauthenticationlogin_detach(aaaauthlogin)
58
+ end
59
+
60
+ def test_set_ascii_authentication
61
+ aaaauthlogin = AaaAuthenticationLogin
62
+
63
+ aaaauthlogin.ascii_authentication = true
64
+ assert_show_match(command: 'show run aaa all | no-more',
65
+ pattern: /^aaa authentication login ascii-authentication/)
66
+
67
+ aaaauthlogin.ascii_authentication = false
68
+ refute_show_match(command: 'show run aaa all | no-more',
69
+ pattern: /^aaa authentication login ascii-authentication/)
70
+
71
+ aaaauthenticationlogin_detach(aaaauthlogin)
72
+ end
73
+
74
+ def test_get_chap
75
+ aaaauthlogin = AaaAuthenticationLogin
76
+
77
+ config('no aaa authentication login chap enable')
78
+ refute(aaaauthlogin.chap)
79
+
80
+ config('aaa authentication login chap enable')
81
+ assert(aaaauthlogin.chap,
82
+ "Error: AAA authentication login chap get with preconfig\n")
83
+ aaaauthenticationlogin_detach(aaaauthlogin)
84
+ end
85
+
86
+ def test_get_default_chap
87
+ aaaauthlogin = AaaAuthenticationLogin
88
+
89
+ config('no aaa authentication login chap enable')
90
+ assert_equal(DEFAULT(:chap),
91
+ aaaauthlogin.default_chap,
92
+ 'Error: AAA authentication login, default chap incorrect')
93
+ aaaauthenticationlogin_detach(aaaauthlogin)
94
+ end
95
+
96
+ def test_set_chap
97
+ aaaauthlogin = AaaAuthenticationLogin
98
+
99
+ aaaauthlogin.chap = true
100
+ assert_show_match(command: 'show run aaa all | no-more',
101
+ pattern: /^aaa authentication login chap enable/)
102
+ aaaauthlogin.chap = false
103
+ refute_show_match(command: 'show run aaa all | no-more',
104
+ pattern: /^aaa authentication login chap enable/)
105
+
106
+ aaaauthenticationlogin_detach(aaaauthlogin)
107
+ end
108
+
109
+ def test_get_error_display
110
+ aaaauthlogin = AaaAuthenticationLogin
111
+
112
+ config('no aaa authentication login error-enable')
113
+ refute(aaaauthlogin.error_display,
114
+ 'Error: AAA authentication login error display get')
115
+
116
+ config('aaa authentication login error-enable')
117
+ assert(aaaauthlogin.error_display,
118
+ 'Error: AAA authentication login error display get with preconfig')
119
+ aaaauthenticationlogin_detach(aaaauthlogin)
120
+ end
121
+
122
+ def test_get_default_error_display
123
+ aaaauthlogin = AaaAuthenticationLogin
124
+
125
+ config('no aaa authentication login error-enable')
126
+ assert_equal(DEFAULT(:error_display),
127
+ aaaauthlogin.default_error_display,
128
+ 'Error: default error display incorrect')
129
+ aaaauthenticationlogin_detach(aaaauthlogin)
130
+ end
131
+
132
+ def test_set_error_display
133
+ aaaauthlogin = AaaAuthenticationLogin
134
+
135
+ aaaauthlogin.error_display = true
136
+ assert_show_match(command: 'show run aaa all | no-more',
137
+ pattern: /^aaa authentication login error-enable/)
138
+
139
+ aaaauthlogin.error_display = false
140
+ refute_show_match(command: 'show run aaa all | no-more',
141
+ pattern: /^aaa authentication login error-enable/)
142
+
143
+ aaaauthenticationlogin_detach(aaaauthlogin)
144
+ end
145
+
146
+ def test_get_mschap
147
+ aaaauthlogin = AaaAuthenticationLogin
148
+
149
+ config('no aaa authentication login mschap enable')
150
+ refute(aaaauthlogin.mschap,
151
+ "Error: AAA authentication login mschap get\n")
152
+
153
+ config('aaa authentication login mschap enable')
154
+ assert(aaaauthlogin.mschap,
155
+ "Error: AAA authentication login mschap get with preconfig\n")
156
+ aaaauthenticationlogin_detach(aaaauthlogin)
157
+ end
158
+
159
+ def test_get_default_mschap
160
+ aaaauthlogin = AaaAuthenticationLogin
161
+
162
+ config('no aaa authentication login mschap enable')
163
+ assert_equal(DEFAULT(:mschap),
164
+ aaaauthlogin.default_mschap,
165
+ 'Error: AAA authentication login, default mschap incorrect')
166
+ aaaauthenticationlogin_detach(aaaauthlogin)
167
+ end
168
+
169
+ def test_set_mschap
170
+ aaaauthlogin = AaaAuthenticationLogin
171
+
172
+ aaaauthlogin.mschap = true
173
+ assert_show_match(command: 'show run aaa all | no-more',
174
+ pattern: /^aaa authentication login mschap enable/)
175
+
176
+ aaaauthlogin.mschap = false
177
+ refute_show_match(command: 'show run aaa all | no-more',
178
+ pattern: /^aaa authentication login mschap enable/)
179
+
180
+ aaaauthenticationlogin_detach(aaaauthlogin)
181
+ end
182
+
183
+ def test_get_mschapv2
184
+ aaaauthlogin = AaaAuthenticationLogin
185
+
186
+ config('no aaa authentication login mschapv2 enable')
187
+ refute(aaaauthlogin.mschapv2,
188
+ "Error: AAA authentication login mschapv2 get\n")
189
+
190
+ config('aaa authentication login mschapv2 enable')
191
+ assert(aaaauthlogin.mschapv2,
192
+ "Error: AAA authentication login mschapv2 get with preconfig\n")
193
+ aaaauthenticationlogin_detach(aaaauthlogin)
194
+ end
195
+
196
+ def test_get_default_mschapv2
197
+ aaaauthlogin = AaaAuthenticationLogin
198
+
199
+ config('no aaa authentication login mschapv2 enable')
200
+ assert_equal(DEFAULT(:mschapv2),
201
+ aaaauthlogin.default_mschapv2,
202
+ 'Error: AAA authentication login, default mschapv2 incorrect')
203
+ aaaauthenticationlogin_detach(aaaauthlogin)
204
+ end
205
+
206
+ def test_set_mschapv2
207
+ aaaauthlogin = AaaAuthenticationLogin
208
+
209
+ aaaauthlogin.mschapv2 = true
210
+ assert_show_match(command: 'show run aaa all | no-more',
211
+ pattern: /^aaa authentication login mschapv2 enable/)
212
+
213
+ aaaauthlogin.mschapv2 = false
214
+ refute_show_match(command: 'show run aaa all | no-more',
215
+ pattern: /^aaa authentication login mschapv2 enable/)
216
+
217
+ aaaauthenticationlogin_detach(aaaauthlogin)
218
+ end
219
+ end
@@ -0,0 +1,759 @@
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 'ciscotest'
16
+ require_relative '../lib/cisco_node_utils/aaa_authentication_login_service'
17
+
18
+ AAA_AUTH_LOGIN_SERVICE_METHOD_NONE = :none
19
+ AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL = :local
20
+ AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED = :unselected
21
+
22
+ # Test class for AAA Authentication Login Service
23
+ class TestAaaAuthenticationLoginService < CiscoTestCase
24
+ def unconfig_tacacs
25
+ config('no feature tacacs+')
26
+ end
27
+
28
+ def unconfig_aaa
29
+ # configure defaults = unconfigure
30
+ config('aaa authentication login default local')
31
+ config('aaa authentication login console local')
32
+ end
33
+
34
+ def config_tacacs_servers(servers)
35
+ config('feature tacacs+')
36
+ servers.each do |server|
37
+ config("aaa group server tacacs+ #{server}")
38
+ end
39
+ end
40
+
41
+ def aaaauthloginservices_default
42
+ config('aaa authentication login default local')
43
+ config('aaa authentication login console local')
44
+ end
45
+
46
+ def aaaauthloginservice_detach(authloginservice, revert=true)
47
+ aaaauthloginservices_default if revert != false
48
+ authloginservice.destroy
49
+ end
50
+
51
+ def test_create_empty_service
52
+ assert_raises(ArgumentError) do
53
+ AaaAuthenticationLoginService.new('')
54
+ end
55
+ end
56
+
57
+ def test_create_invalid_service
58
+ assert_raises(TypeError) do
59
+ AaaAuthenticationLoginService.new(:test)
60
+ end
61
+ end
62
+
63
+ def test_create_service_default
64
+ aaaauthloginservice = AaaAuthenticationLoginService.new('default')
65
+ refute_nil(aaaauthloginservice,
66
+ 'Error: login service default create')
67
+ aaaauthloginservice_detach(aaaauthloginservice) unless
68
+ aaaauthloginservice.nil?
69
+ end
70
+
71
+ def test_create_service_console
72
+ aaaauthloginservice = AaaAuthenticationLoginService.new('console')
73
+ refute_nil(aaaauthloginservice,
74
+ 'Error: login service console create')
75
+ aaaauthloginservice_detach(aaaauthloginservice) unless
76
+ aaaauthloginservice.nil?
77
+ end
78
+
79
+ def test_collection_with_service_default
80
+ unconfig_aaa
81
+ aaaauthloginservice_list = AaaAuthenticationLoginService.services
82
+ refute_empty(aaaauthloginservice_list,
83
+ 'Error: service collection is not filled')
84
+ assert_equal(1, aaaauthloginservice_list.size,
85
+ 'Error: collection not reporting correct ')
86
+ assert(aaaauthloginservice_list.key?('default'),
87
+ 'Error: collection does contain default')
88
+ aaaauthloginservice_list.each do |name, aaaauthloginservice|
89
+ assert_equal(name, aaaauthloginservice.name,
90
+ "Error: Invalid name #{name} in collection")
91
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
92
+ aaaauthloginservice.method,
93
+ 'Error: Invalid method for defaultin collection')
94
+ assert_empty(aaaauthloginservice.groups,
95
+ 'Error: Invalid groups for default in collection')
96
+ aaaauthloginservice_detach(aaaauthloginservice, false)
97
+ end
98
+ aaaauthloginservices_default
99
+ end
100
+
101
+ def test_collection_with_service_default_and_console
102
+ unconfig_aaa
103
+ # preconfig console
104
+ config('aaa authentication login console none')
105
+
106
+ aaaauthloginservice_list = AaaAuthenticationLoginService.services
107
+ refute_empty(aaaauthloginservice_list,
108
+ 'Error: service collection is not filled')
109
+ assert_equal(2, aaaauthloginservice_list.size,
110
+ 'Error: collection not reporting correct size')
111
+ assert(aaaauthloginservice_list.key?('default'),
112
+ 'Error: collection does contain default')
113
+ assert(aaaauthloginservice_list.key?('console'),
114
+ 'Error: collection does contain console')
115
+ aaaauthloginservice_list.each do |name, aaaauthloginservice|
116
+ assert_equal(name, aaaauthloginservice.name,
117
+ "Error: Invalid name #{name} in collection")
118
+ if name == 'default'
119
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
120
+ aaaauthloginservice.method,
121
+ 'Error: Invalid method for default in collection')
122
+ end
123
+
124
+ if name == 'console'
125
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
126
+ aaaauthloginservice.method,
127
+ 'Error: Invalid method for console in collection')
128
+ end
129
+
130
+ assert_equal([], aaaauthloginservice.groups,
131
+ 'Error: Invalid groups for default in collection')
132
+ aaaauthloginservice_detach(aaaauthloginservice, false)
133
+ end
134
+ aaaauthloginservices_default
135
+ end
136
+
137
+ def test_collection_with_service_default_and_console_with_group
138
+ # preconfig servers
139
+ servers = %w(group1 group2)
140
+ config_tacacs_servers(servers)
141
+
142
+ # preconfig console
143
+ # we need in some specific order
144
+ config('aaa authentication login default group group2 group1 none',
145
+ 'aaa authentication login console group group1')
146
+
147
+ aaaauthloginservice_list = AaaAuthenticationLoginService.services
148
+ refute_empty(aaaauthloginservice_list,
149
+ 'Error: service collection is not filled')
150
+ assert_equal(2, aaaauthloginservice_list.size,
151
+ 'Error: Login collection not reporting correct size')
152
+ assert(aaaauthloginservice_list.key?('default'),
153
+ 'Error: collection does contain default')
154
+ assert(aaaauthloginservice_list.key?('console'),
155
+ 'Error: collection does contain console')
156
+ aaaauthloginservice_list.each do |name, aaaauthloginservice|
157
+ assert_equal(name, aaaauthloginservice.name,
158
+ "Error: Invalid name #{name} in collection")
159
+
160
+ if name == 'default'
161
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
162
+ aaaauthloginservice.method,
163
+ 'Error: Invalid method for default in collection')
164
+ groups = %w(group2 group1)
165
+ assert_equal(groups, aaaauthloginservice.groups,
166
+ 'Error: Invalid groups for default in collection')
167
+ end
168
+
169
+ if name == 'console'
170
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED,
171
+ aaaauthloginservice.method,
172
+ 'Error: Invalid method for console in collection')
173
+ groups = ['group1']
174
+ assert_equal(groups, aaaauthloginservice.groups,
175
+ 'Error: Invalid groups for default in collection')
176
+ end
177
+ aaaauthloginservice_detach(aaaauthloginservice, false)
178
+ end
179
+ aaaauthloginservices_default
180
+ unconfig_tacacs
181
+ end
182
+
183
+ def test_service_default_get_method
184
+ aaaauthloginservice =
185
+ AaaAuthenticationLoginService.new('default')
186
+
187
+ # default case
188
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
189
+ aaaauthloginservice.method,
190
+ 'Error: login service default get method for local')
191
+
192
+ # preconfig default
193
+ config('aaa authentication login default none')
194
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
195
+ aaaauthloginservice.method,
196
+ 'Error: login service default get method for none')
197
+
198
+ # preconfig servers
199
+ servers = %w(bxb100 bxb200)
200
+ config_tacacs_servers(servers)
201
+
202
+ # preconfig default
203
+ config('aaa authentication login default group bxb100 bxb200')
204
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED,
205
+ aaaauthloginservice.method,
206
+ 'Error: login service group or method incorrect')
207
+
208
+ # preconfig default
209
+ config('aaa authentication login default group bxb200 none')
210
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
211
+ aaaauthloginservice.method,
212
+ "Error: login service group incorrect or method not 'none'")
213
+
214
+ # cleanup
215
+ aaaauthloginservice_detach(aaaauthloginservice)
216
+ unconfig_tacacs
217
+ end
218
+
219
+ def test_service_console_get_method
220
+ aaaauthloginservice = AaaAuthenticationLoginService.new('console')
221
+
222
+ # default case
223
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
224
+ aaaauthloginservice.method,
225
+ "Error: login service method not 'local'")
226
+
227
+ # preconfig console
228
+ config('aaa authentication login console none')
229
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
230
+ aaaauthloginservice.method,
231
+ "Error: login service method not 'none'")
232
+
233
+ # preconfig servers
234
+ servers = %w(bxb100 bxb200)
235
+ config_tacacs_servers(servers)
236
+
237
+ # preconfig console
238
+ config('aaa authentication login console group bxb100 bxb200')
239
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED,
240
+ aaaauthloginservice.method,
241
+ "Error: login service method not 'unselected'")
242
+
243
+ # preconfig console
244
+ config('aaa authentication login console group bxb200 none')
245
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
246
+ aaaauthloginservice.method,
247
+ "Error: login service group incorrect or method not 'none'")
248
+
249
+ # cleanup
250
+ aaaauthloginservice_detach(aaaauthloginservice)
251
+ unconfig_tacacs
252
+ end
253
+
254
+ def test_get_default_method
255
+ # service default
256
+ aaaauthloginservice =
257
+ AaaAuthenticationLoginService.new('default')
258
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
259
+ aaaauthloginservice.default_method,
260
+ 'Error: login service default, default method')
261
+ aaaauthloginservice_detach(aaaauthloginservice)
262
+
263
+ # service console
264
+ aaaauthloginservice =
265
+ AaaAuthenticationLoginService.new('console')
266
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
267
+ aaaauthloginservice.default_method,
268
+ 'Error: login service console, default method')
269
+ aaaauthloginservice_detach(aaaauthloginservice, false)
270
+ end
271
+
272
+ def test_service_default_get_groups
273
+ aaaauthloginservice =
274
+ AaaAuthenticationLoginService.new('default')
275
+
276
+ # default case
277
+ assert_equal(aaaauthloginservice.default_groups, aaaauthloginservice.groups,
278
+ 'Error: login service default get groups for default')
279
+
280
+ # preconfig servers
281
+ servers = %w(bxb100 sjc200 rtp10)
282
+ config_tacacs_servers(servers)
283
+
284
+ # preconfig default
285
+ config('aaa authentication login default group bxb100 sjc200')
286
+ groups = %w(bxb100 sjc200)
287
+ assert_equal(groups, aaaauthloginservice.groups,
288
+ 'Error: login service default get groups')
289
+
290
+ # preconfig default
291
+ config('aaa authentication login default group sjc200 bxb100 rtp10 none')
292
+ groups = %w(sjc200 bxb100 rtp10)
293
+ assert_equal(groups, aaaauthloginservice.groups,
294
+ 'Error: login service default get groups')
295
+
296
+ # cleanup
297
+ aaaauthloginservice_detach(aaaauthloginservice)
298
+ unconfig_tacacs
299
+ end
300
+
301
+ def test_service_console_get_groups
302
+ aaaauthloginservice =
303
+ AaaAuthenticationLoginService.new('console')
304
+
305
+ # default case
306
+ assert_equal(aaaauthloginservice.default_groups, aaaauthloginservice.groups,
307
+ 'Error: login service console get groups for default')
308
+
309
+ # preconfig servers
310
+ servers = %w(bxb100 sjc200 rtp10)
311
+ config_tacacs_servers(servers)
312
+
313
+ # preconfig console
314
+ config('aaa authentication login console group bxb100 sjc200')
315
+ groups = %w(bxb100 sjc200)
316
+ assert_equal(groups, aaaauthloginservice.groups,
317
+ "Error: login service console get groups #{groups}")
318
+
319
+ # preconfig console
320
+ config('aaa authentication login console group rtp10 bxb100 none')
321
+ groups = %w(rtp10 bxb100)
322
+ assert_equal(groups, aaaauthloginservice.groups,
323
+ "Error: login service console get groups #{groups}")
324
+
325
+ # preconfig console
326
+ config('aaa authentication login console group sjc200 bxb100 rtp10')
327
+ groups = %w(sjc200 bxb100 rtp10)
328
+ assert_equal(groups, aaaauthloginservice.groups,
329
+ "Error: login service console get groups #{groups}")
330
+
331
+ # cleanup
332
+ aaaauthloginservice_detach(aaaauthloginservice)
333
+ unconfig_tacacs
334
+ end
335
+
336
+ # rubocop:disable Metrics/MethodLength
337
+ # TODO: Consider refactoring this method
338
+ def test_service_default_and_console_mix
339
+ aaaauthloginservice_default =
340
+ AaaAuthenticationLoginService.new('default')
341
+ aaaauthloginservice_console =
342
+ AaaAuthenticationLoginService.new('console')
343
+
344
+ # default cases
345
+ assert_equal(aaaauthloginservice_default.default_groups,
346
+ aaaauthloginservice_default.groups,
347
+ 'Error: login default, get groups default')
348
+ assert_equal(aaaauthloginservice_console.default_groups,
349
+ aaaauthloginservice_console.groups,
350
+ 'Error: login console, get groups default')
351
+ assert_equal(aaaauthloginservice_default.default_method,
352
+ aaaauthloginservice_default.method,
353
+ 'Error: login default, get method default')
354
+ assert_equal(aaaauthloginservice_console.default_method,
355
+ aaaauthloginservice_console.method,
356
+ 'Error: login console, get method default')
357
+
358
+ # preconfig servers
359
+ servers = %w(bxb100 sjc200 rtp10)
360
+ config_tacacs_servers(servers)
361
+
362
+ groups = %w(bxb100 sjc200)
363
+ aaaauthloginservice_default.groups_method_set(
364
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED)
365
+
366
+ assert_equal(groups, aaaauthloginservice_default.groups,
367
+ "Error: login default, get groups #{groups}")
368
+ assert_empty(aaaauthloginservice_console.groups,
369
+ 'Error: login console, get groups non empty')
370
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED,
371
+ aaaauthloginservice_default.method,
372
+ 'Error: login default, get method')
373
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
374
+ aaaauthloginservice_console.method,
375
+ 'Error: login console, get method')
376
+
377
+ # set groups
378
+ aaaauthloginservice_default.groups_method_set(
379
+ [], AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
380
+ aaaauthloginservice_console.groups_method_set(
381
+ [], AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
382
+
383
+ # get
384
+ assert(aaaauthloginservice_default.groups.empty?,
385
+ 'Error: login default ,get groups non empty')
386
+ assert_empty(aaaauthloginservice_console.groups,
387
+ 'Error: login console, get groups empty')
388
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
389
+ aaaauthloginservice_default.method,
390
+ 'Error: login default, get method none')
391
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
392
+ aaaauthloginservice_console.method,
393
+ 'Error: login console, get method none')
394
+
395
+ # set groups
396
+ aaaauthloginservice_default.groups_method_set(
397
+ [], AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL)
398
+ aaaauthloginservice_console.groups_method_set(
399
+ [], AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL)
400
+
401
+ # get
402
+ assert_empty(aaaauthloginservice_default.groups,
403
+ 'Error: login default, get groups non-empty')
404
+ assert_empty(aaaauthloginservice_console.groups,
405
+ 'Error: login console, get groups non-empty')
406
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
407
+ aaaauthloginservice_default.method,
408
+ 'Error: login default, get method local')
409
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
410
+ aaaauthloginservice_console.method,
411
+ 'Error: login console, get method local')
412
+
413
+ # set groups
414
+ aaaauthloginservice_default.groups_method_set(
415
+ [], AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
416
+ aaaauthloginservice_console.groups_method_set(
417
+ [], AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL)
418
+
419
+ # get
420
+ assert_empty(aaaauthloginservice_default.groups,
421
+ 'Error: login default, get groups non-empty')
422
+ assert_empty(aaaauthloginservice_console.groups,
423
+ 'Error: login console, get groups non-empty')
424
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
425
+ aaaauthloginservice_default.method,
426
+ 'Error: login default, get method none')
427
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
428
+ aaaauthloginservice_console.method,
429
+ 'Error: login console, get method local')
430
+
431
+ # set groups
432
+ aaaauthloginservice_default.groups_method_set(
433
+ [], AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL)
434
+ aaaauthloginservice_console.groups_method_set(
435
+ [], AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
436
+
437
+ # get
438
+ assert_empty(aaaauthloginservice_default.groups,
439
+ 'Error: login default, get groups non-empty')
440
+ assert_empty(aaaauthloginservice_console.groups,
441
+ 'Error: login console, get groups non-empty')
442
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
443
+ aaaauthloginservice_default.method,
444
+ 'Error: login default, get method local')
445
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
446
+ aaaauthloginservice_console.method,
447
+ 'Error: login console, get method none')
448
+
449
+ # set groups
450
+ groups_default = ['bxb100']
451
+ groups_console = %w(bxb100 sjc200)
452
+ aaaauthloginservice_default.groups_method_set(
453
+ groups_default, AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED)
454
+ aaaauthloginservice_console.groups_method_set(
455
+ groups_console, AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
456
+
457
+ # get
458
+ assert_equal(groups_default,
459
+ aaaauthloginservice_default.groups,
460
+ "Error: login default, get groups #{groups}")
461
+ assert_equal(groups_console,
462
+ aaaauthloginservice_console.groups,
463
+ "Error: login console, get groups #{groups}")
464
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED,
465
+ aaaauthloginservice_default.method,
466
+ 'Error: login default, get method local')
467
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
468
+ aaaauthloginservice_console.method,
469
+ 'Error: login console, get method none')
470
+
471
+ # set same groups and method
472
+ groups = ['bxb100']
473
+ aaaauthloginservice_default.groups_method_set(
474
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
475
+ aaaauthloginservice_console.groups_method_set(
476
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
477
+ # get
478
+ assert_equal(groups,
479
+ aaaauthloginservice_default.groups,
480
+ "Error: login default, get groups #{groups}")
481
+ assert_equal(groups,
482
+ aaaauthloginservice_console.groups,
483
+ "Error: login console, get groups #{groups}")
484
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
485
+ aaaauthloginservice_default.method,
486
+ 'Error: login default, get method none')
487
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
488
+ aaaauthloginservice_console.method,
489
+ 'Error: login console, get method none')
490
+
491
+ # set group for console and empty for default
492
+ groups = %w(bxb100 rtp10)
493
+ aaaauthloginservice_default.groups_method_set(
494
+ [], AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL)
495
+ aaaauthloginservice_console.groups_method_set(
496
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
497
+
498
+ # get
499
+ assert_empty(aaaauthloginservice_default.groups,
500
+ 'Error: login default, get groups non empty')
501
+ assert_equal(groups,
502
+ aaaauthloginservice_console.groups,
503
+ "Error: login console, get groups #{groups}")
504
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
505
+ aaaauthloginservice_default.method,
506
+ 'Error: login default, get method local')
507
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
508
+ aaaauthloginservice_console.method,
509
+ 'Error: login console, get method none')
510
+
511
+ # set groups for default and empty for console
512
+ groups = %w(bxb100 rtp10)
513
+ aaaauthloginservice_default.groups_method_set(
514
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
515
+ aaaauthloginservice_console.groups_method_set(
516
+ [], AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL)
517
+
518
+ # get
519
+ assert_equal(groups,
520
+ aaaauthloginservice_default.groups,
521
+ "Error: login default, get groups #{groups}")
522
+ assert_empty(aaaauthloginservice_console.groups,
523
+ 'Error: login console, get groups non-empty')
524
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
525
+ aaaauthloginservice_default.method,
526
+ 'Error: login default, get method none')
527
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL,
528
+ aaaauthloginservice_console.method,
529
+ 'Error: login console, get method local')
530
+
531
+ # set group for default and empty for console, same methos none
532
+ groups = %w(bxb100 rtp10)
533
+ aaaauthloginservice_default.groups_method_set(
534
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
535
+ aaaauthloginservice_console.groups_method_set(
536
+ [], AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
537
+
538
+ # get
539
+ assert_equal(groups,
540
+ aaaauthloginservice_default.groups,
541
+ "Error: login default, get groups #{groups}")
542
+ assert_empty(aaaauthloginservice_console.groups,
543
+ 'Error: login console, get groups non-empty')
544
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
545
+ aaaauthloginservice_default.method,
546
+ 'Error: login default, get method none')
547
+ assert_equal(AAA_AUTH_LOGIN_SERVICE_METHOD_NONE,
548
+ aaaauthloginservice_console.method,
549
+ 'Error: login console, get method none')
550
+
551
+ # cleanup
552
+ aaaauthloginservice_detach(aaaauthloginservice_default)
553
+ aaaauthloginservice_detach(aaaauthloginservice_console)
554
+ unconfig_tacacs
555
+ end
556
+ # rubocop:enable Metrics/MethodLength,Metrics/AbcSize
557
+
558
+ def test_get_default_groups
559
+ # service default
560
+ aaaauthloginservice =
561
+ AaaAuthenticationLoginService.new('default')
562
+ assert_empty(aaaauthloginservice.default_groups,
563
+ 'Error: login default, default groups')
564
+ aaaauthloginservice_detach(aaaauthloginservice)
565
+
566
+ # service console
567
+ aaaauthloginservice =
568
+ AaaAuthenticationLoginService.new('console')
569
+ assert_empty(aaaauthloginservice.default_groups,
570
+ 'Error: login console, default groups')
571
+ aaaauthloginservice_detach(aaaauthloginservice)
572
+ end
573
+
574
+ def test_service_default_set_groups
575
+ # preconfig servers
576
+ prefix = '^aaa authentication login default group '
577
+ servers = %w(bxb100 sjc200 rtp10)
578
+ config_tacacs_servers(servers)
579
+
580
+ # service default
581
+ service = 'default'
582
+ aaaauthloginservice =
583
+ AaaAuthenticationLoginService.new(service)
584
+
585
+ # one group and method is unselected
586
+ method = AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED
587
+ groups = ['bxb100']
588
+ aaaauthloginservice.groups_method_set(groups, method)
589
+ assert_show_match(command: 'show run aaa all | no-more',
590
+ pattern: Regexp.new(prefix + groups.join(' ')))
591
+
592
+ # multiple group and method is unselected
593
+ method = AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED
594
+ groups = %w(bxb100 sjc200)
595
+ aaaauthloginservice.groups_method_set(groups, method)
596
+ assert_show_match(command: 'show run aaa all | no-more',
597
+ pattern: Regexp.new(prefix + groups.join(' ')))
598
+
599
+ # multi group and method is none
600
+ method = AAA_AUTH_LOGIN_SERVICE_METHOD_NONE
601
+ groups = %w(rtp10 bxb100 sjc200)
602
+ aaaauthloginservice.groups_method_set(groups, method)
603
+ assert_show_match(command: 'show run aaa all | no-more',
604
+ pattern: Regexp.new(prefix + groups.join(' ')))
605
+
606
+ # default group and method
607
+ method = aaaauthloginservice.default_method
608
+ groups = aaaauthloginservice.default_groups
609
+ aaaauthloginservice.groups_method_set(groups, method)
610
+ assert_show_match(command: 'show run aaa all | no-more',
611
+ pattern: /^aaa authentication login default local/)
612
+
613
+ aaaauthloginservice_detach(aaaauthloginservice)
614
+ unconfig_tacacs
615
+ end
616
+
617
+ def test_service_console_set_groups
618
+ # preconfig servers
619
+ prefix = '^aaa authentication login console group '
620
+ servers = %w(bxb100 sjc200 rtp10)
621
+ config_tacacs_servers(servers)
622
+
623
+ # service console
624
+ service = 'console'
625
+ aaaauthloginservice =
626
+ AaaAuthenticationLoginService.new(service)
627
+
628
+ # one group and method is unselected
629
+ method = AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED
630
+ groups = ['bxb100']
631
+ aaaauthloginservice.groups_method_set(groups, method)
632
+ assert_show_match(command: 'show run aaa all | no-more',
633
+ pattern: Regexp.new(prefix + groups.join(' ')))
634
+
635
+ # multi group and method is unselected
636
+ method = AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED
637
+ groups = %w(bxb100 sjc200)
638
+ aaaauthloginservice.groups_method_set(groups, method)
639
+ assert_show_match(command: 'show run aaa all | no-more',
640
+ pattern: Regexp.new(prefix + groups.join(' ')))
641
+
642
+ # multi group and method is none
643
+ method = AAA_AUTH_LOGIN_SERVICE_METHOD_NONE
644
+ groups = %w(rtp10 bxb100 sjc200)
645
+ aaaauthloginservice.groups_method_set(groups, method)
646
+ assert_show_match(command: 'show run aaa all | no-more',
647
+ pattern: Regexp.new(prefix + groups.join(' ')))
648
+
649
+ # default group and method
650
+ method = aaaauthloginservice.default_method
651
+ groups = aaaauthloginservice.default_groups
652
+ aaaauthloginservice.groups_method_set(groups, method)
653
+ refute_show_match(command: 'show run aaa all | no-more',
654
+ pattern: /^aaa authentication login console local/)
655
+
656
+ aaaauthloginservice_detach(aaaauthloginservice)
657
+ unconfig_tacacs
658
+ end
659
+
660
+ def test_service_set_groups_invalid_groups
661
+ # preconfig servers
662
+ servers = %w(bxb100 sjc200 rtp10)
663
+ config_tacacs_servers(servers)
664
+
665
+ # service default
666
+ service = 'default'
667
+ aaaauthloginservice =
668
+ AaaAuthenticationLoginService.new(service)
669
+
670
+ # one invalid group
671
+ groups = ['test1']
672
+ assert_raises(RuntimeError) do
673
+ aaaauthloginservice.groups_method_set(
674
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL)
675
+ end
676
+
677
+ # multiple groups with invalid group
678
+ groups = %w(rtp10 test2 bxb100)
679
+ assert_raises(CliError) do
680
+ aaaauthloginservice.groups_method_set(
681
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
682
+ end
683
+
684
+ # multiple groups with invalid group
685
+ groups = %w(test4 test2 bxb100)
686
+ assert_raises(CliError) do
687
+ aaaauthloginservice.groups_method_set(
688
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
689
+ end
690
+
691
+ # invalid array
692
+ groups = ['bxb100', 100, 'bxb100']
693
+ assert_raises(TypeError) do
694
+ aaaauthloginservice.groups_method_set(
695
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
696
+ end
697
+ aaaauthloginservice_detach(aaaauthloginservice)
698
+
699
+ # repeat the test for service 'console'
700
+ service = 'console'
701
+ aaaauthloginservice =
702
+ AaaAuthenticationLoginService.new(service)
703
+
704
+ # one invalid group
705
+ groups = ['test1']
706
+ assert_raises(CliError) do
707
+ aaaauthloginservice.groups_method_set(
708
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_UNSELECTED)
709
+ end
710
+
711
+ # multiple group with invalid group
712
+ groups = %w(rtp1 test1 bxb100)
713
+ assert_raises(RuntimeError) do
714
+ aaaauthloginservice.groups_method_set(
715
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_LOCAL)
716
+ end
717
+
718
+ # multiple group with invalid group
719
+ groups = %w(rtp10 test1 bxb100)
720
+ assert_raises(CliError) do
721
+ aaaauthloginservice.groups_method_set(
722
+ groups, AAA_AUTH_LOGIN_SERVICE_METHOD_NONE)
723
+ end
724
+ aaaauthloginservice_detach(aaaauthloginservice)
725
+ unconfig_tacacs
726
+ end
727
+
728
+ def test_service_set_groups_invalid_method
729
+ # service default
730
+ service = 'default'
731
+ aaaauthloginservice =
732
+ AaaAuthenticationLoginService.new(service)
733
+
734
+ assert_raises(TypeError) do
735
+ aaaauthloginservice.groups_method_set([], 'bxb100')
736
+ end
737
+
738
+ assert_raises(ArgumentError) do
739
+ aaaauthloginservice.groups_method_set([], :invalid)
740
+ end
741
+
742
+ aaaauthloginservice_detach(aaaauthloginservice)
743
+
744
+ # service console
745
+ service = 'console'
746
+ aaaauthloginservice =
747
+ AaaAuthenticationLoginService.new(service)
748
+
749
+ assert_raises(TypeError) do
750
+ aaaauthloginservice.groups_method_set([], 'test')
751
+ end
752
+
753
+ assert_raises(TypeError) do
754
+ aaaauthloginservice.groups_method_set([], 15)
755
+ end
756
+
757
+ aaaauthloginservice_detach(aaaauthloginservice)
758
+ end
759
+ end