boris 1.0.0.beta.1

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 (88) hide show
  1. data/LICENSE.md +9 -0
  2. data/README.md +94 -0
  3. data/boris.gemspec +28 -0
  4. data/doc/Array.html +437 -0
  5. data/doc/Boris.html +230 -0
  6. data/doc/Boris/ConnectionAlreadyActive.html +123 -0
  7. data/doc/Boris/ConnectionFailed.html +127 -0
  8. data/doc/Boris/Connector.html +794 -0
  9. data/doc/Boris/InvalidCredentials.html +131 -0
  10. data/doc/Boris/InvalidOption.html +123 -0
  11. data/doc/Boris/InvalidTargetName.html +123 -0
  12. data/doc/Boris/Lumberjack.html +466 -0
  13. data/doc/Boris/MissingCredentials.html +123 -0
  14. data/doc/Boris/NoActiveConnection.html +123 -0
  15. data/doc/Boris/NoProfileDetected.html +123 -0
  16. data/doc/Boris/Options.html +783 -0
  17. data/doc/Boris/Profiles.html +117 -0
  18. data/doc/Boris/Profiles/Linux.html +1151 -0
  19. data/doc/Boris/Profiles/RedHat.html +875 -0
  20. data/doc/Boris/Profiles/Solaris.html +1230 -0
  21. data/doc/Boris/Profiles/Structure.html +2050 -0
  22. data/doc/Boris/Profiles/UNIX.html +893 -0
  23. data/doc/Boris/Profiles/Windows.html +1846 -0
  24. data/doc/Boris/Profiles/Windows/Windows2003.html +304 -0
  25. data/doc/Boris/Profiles/Windows/Windows2008.html +379 -0
  26. data/doc/Boris/Profiles/Windows/Windows2012.html +304 -0
  27. data/doc/Boris/SNMPConnector.html +512 -0
  28. data/doc/Boris/SSHConnector.html +633 -0
  29. data/doc/Boris/Target.html +2002 -0
  30. data/doc/Boris/WMIConnector.html +1134 -0
  31. data/doc/BorisLogger.html +217 -0
  32. data/doc/Hash.html +195 -0
  33. data/doc/String.html +1246 -0
  34. data/doc/_index.html +420 -0
  35. data/doc/class_list.html +53 -0
  36. data/doc/css/common.css +1 -0
  37. data/doc/css/full_list.css +57 -0
  38. data/doc/css/style.css +328 -0
  39. data/doc/file.README.html +183 -0
  40. data/doc/file_list.html +55 -0
  41. data/doc/frames.html +28 -0
  42. data/doc/index.html +183 -0
  43. data/doc/js/app.js +214 -0
  44. data/doc/js/full_list.js +173 -0
  45. data/doc/js/jquery.js +4 -0
  46. data/doc/method_list.html +1468 -0
  47. data/doc/top-level-namespace.html +126 -0
  48. data/lib/boris.rb +30 -0
  49. data/lib/boris/connectors.rb +47 -0
  50. data/lib/boris/connectors/snmp.rb +56 -0
  51. data/lib/boris/connectors/ssh.rb +110 -0
  52. data/lib/boris/connectors/wmi.rb +186 -0
  53. data/lib/boris/errors.rb +17 -0
  54. data/lib/boris/helpers/array.rb +63 -0
  55. data/lib/boris/helpers/constants.rb +20 -0
  56. data/lib/boris/helpers/hash.rb +8 -0
  57. data/lib/boris/helpers/scrubber.rb +51 -0
  58. data/lib/boris/helpers/string.rb +130 -0
  59. data/lib/boris/lumberjack.rb +47 -0
  60. data/lib/boris/options.rb +86 -0
  61. data/lib/boris/profiles/linux/redhat.rb +77 -0
  62. data/lib/boris/profiles/linux_core.rb +216 -0
  63. data/lib/boris/profiles/unix/solaris.rb +307 -0
  64. data/lib/boris/profiles/unix_core.rb +85 -0
  65. data/lib/boris/profiles/windows/windows2003.rb +15 -0
  66. data/lib/boris/profiles/windows/windows2008.rb +23 -0
  67. data/lib/boris/profiles/windows/windows2012.rb +15 -0
  68. data/lib/boris/profiles/windows_core.rb +530 -0
  69. data/lib/boris/structure.rb +167 -0
  70. data/lib/boris/target.rb +340 -0
  71. data/test/connector_tests/test_snmp.rb +35 -0
  72. data/test/connector_tests/test_ssh.rb +51 -0
  73. data/test/connector_tests/test_wmi.rb +129 -0
  74. data/test/helper_tests/test_array.rb +25 -0
  75. data/test/helper_tests/test_hash.rb +10 -0
  76. data/test/helper_tests/test_string.rb +136 -0
  77. data/test/profile_tests/test_core_skeleton +107 -0
  78. data/test/profile_tests/test_linux_core.rb +331 -0
  79. data/test/profile_tests/test_redhat.rb +134 -0
  80. data/test/profile_tests/test_solaris.rb +523 -0
  81. data/test/profile_tests/test_unix_core.rb +117 -0
  82. data/test/profile_tests/test_windows.rb +536 -0
  83. data/test/setup_tests.rb +14 -0
  84. data/test/test_all.rb +8 -0
  85. data/test/test_options.rb +44 -0
  86. data/test/test_structure.rb +136 -0
  87. data/test/test_target.rb +146 -0
  88. metadata +241 -0
@@ -0,0 +1,523 @@
1
+ require 'setup_tests'
2
+
3
+ class SolarisCoreTest < ProfileTestSetup
4
+ context 'a Solaris target' do
5
+ setup do
6
+ @connector = @target.connector = instance_of(SSHConnector)
7
+ @target.stubs(:target_profile).returns(Profiles::Solaris)
8
+ @target.extend(Profiles::Solaris)
9
+ @connector.stubs(:value_at).with('uname').returns('SunOS')
10
+ end
11
+
12
+ should 'detect when a target should use the Solaris profile' do
13
+ assert_equal(Profiles::Solaris, @target.target_profile)
14
+ end
15
+
16
+ context 'being scanned' do
17
+ setup do
18
+ @showrev_command = 'showrev'
19
+ @zoneadm_command = '/usr/sbin/zoneadm list'
20
+ end
21
+
22
+ # handled by UNIX core
23
+ #context 'for file system information' do
24
+ #end
25
+
26
+ context 'for hardware information' do
27
+ setup do
28
+ @memory_command = "/usr/sbin/prtconf | egrep -i 'memory size' | awk '{print $3}'"
29
+ @memory_data = '1024'
30
+ @connector.stubs(:value_at).with(@memory_command).returns(@memory_data)
31
+
32
+ @isainfo_command = "isainfo -v | egrep -i applications | awk '{print $1}'"
33
+ @isainfo_data = ['64-bit', '32-bit']
34
+ @connector.stubs(:values_at).with(@isainfo_command).returns(@isainfo_data)
35
+
36
+ @sparc_model_command = '/usr/sbin/prtconf -b | grep banner-name'
37
+
38
+ @cpu_command = %q{kstat -m cpu_info | nawk '{if(tolower($1)~/^(chip_id|core_id|clock_mhz|vendor_id|brand)/) {sub($1, $1"|"); print $0}}'}
39
+ @smbios_command = "/usr/sbin/smbios -t SMB_TYPE_SYSTEM | egrep -i 'manufacturer|product|serial'"
40
+
41
+ @sparc_firmware_command = %q{/usr/platform/`uname -m`/sbin/prtdiag -v | egrep -i "^obp" | awk '{print $2}'}
42
+ @x86_firmware_command = '/usr/sbin/smbios -t SMB_TYPE_BIOS | grep -i "version string"'
43
+ @connector.stubs(:value_at).with(@x86_firmware_command).returns('Version string: 6.0')
44
+ @connector.stubs(:value_at).with(@sparc_firmware_command).returns('6.0')
45
+ end
46
+
47
+ context 'for an x86-based platform' do
48
+ setup do
49
+ @showrev_data = ['Application architecture: i386']
50
+ @cpu_data = %q{
51
+ brand| Intel(r) Xeon(r) CPU X5680 @ 3.33GHz
52
+ chip_id| 0
53
+ clock_MHz| 3333
54
+ core_id| 0
55
+ vendor_id| GenuineIntel
56
+ brand| Intel(r) Xeon(r) CPU X5680 @ 3.33GHz
57
+ chip_id| 0
58
+ clock_MHz| 3333
59
+ core_id| 1
60
+ vendor_id| GenuineIntel
61
+ }.strip.split(/\n/)
62
+ @cpu_data += @cpu_data # add another instance of this cpu, to emulate a hyperthreaded cpu
63
+
64
+ @expected_data = {
65
+ :cpu_architecture=>64,
66
+ :cpu_core_count=>2,
67
+ :cpu_model=>'Intel(r) Xeon(r) CPU X5680 @ 3.33GHz',
68
+ :cpu_physical_count=>1,
69
+ :cpu_speed_mhz=>3333,
70
+ :cpu_vendor=>'GenuineIntel',
71
+ :firmware_version=>'6.0',
72
+ :model=>'System x3650 M3 -[1234ABCD]-',
73
+ :memory_installed_mb=>1024,
74
+ :serial=>'ABCD1234',
75
+ :vendor=>'IBM'
76
+ }
77
+
78
+ @connector.stubs(:values_at).with(@showrev_command).returns(@showrev_data)
79
+ @connector.stubs(:values_at).with(@cpu_command).returns(@cpu_data)
80
+ end
81
+
82
+ context 'in the global zone' do
83
+ should 'return hardware information via #get_hardware' do
84
+
85
+ @smbios_data = %q{
86
+ Manufacturer: IBM
87
+ Product: System x3650 M3 -[1234ABCD]-
88
+ Serial Number: ABCD1234
89
+ }.strip.split(/\n/)
90
+ @connector.stubs(:values_at).with(@smbios_command).returns(@smbios_data)
91
+
92
+ @connector.stubs(:values_at).with(@zoneadm_command).returns('global')
93
+
94
+ @target.get_hardware
95
+ assert_equal(@expected_data, @target.hardware)
96
+ end
97
+ end
98
+ end
99
+
100
+ context 'for a SPARC-based platform' do
101
+ setup do
102
+ @showrev_data = ['Application architecture: sparc']
103
+ @cpu_data = %q{
104
+ brand| SPARC64-VI
105
+ chip_id| 0
106
+ clock_MHz| 2400
107
+ core_id| 0
108
+ brand| SPARC64-VI
109
+ chip_id| 0
110
+ clock_MHz| 2400
111
+ core_id| 1
112
+ }.strip.split(/\n/)
113
+
114
+ @expected_data = {
115
+ :cpu_architecture=>64,
116
+ :cpu_core_count=>2,
117
+ :cpu_model=>'SPARC64-VI',
118
+ :cpu_physical_count=>1,
119
+ :cpu_speed_mhz=>2400,
120
+ :cpu_vendor=>VENDOR_ORACLE,
121
+ :firmware_version=>'6.0',
122
+ :model=>nil,
123
+ :memory_installed_mb=>1024,
124
+ :serial=>nil,
125
+ :vendor=>VENDOR_ORACLE
126
+ }
127
+
128
+ @connector.stubs(:values_at).with(@showrev_command).returns(@showrev_data)
129
+ @connector.stubs(:values_at).with(@cpu_command).returns(@cpu_data)
130
+ end
131
+
132
+ context 'in the global zone' do
133
+ should 'return hardware information via #get_hardware' do
134
+ @connector.stubs(:value_at).with(@sparc_model_command).returns('banner-name: Sun Fire 480R')
135
+
136
+ @expected_data[:model] = 'Sun Fire 480R'
137
+
138
+ @connector.stubs(:values_at).with(@zoneadm_command).returns('global')
139
+
140
+ @target.get_hardware
141
+ assert_equal(@expected_data, @target.hardware)
142
+ end
143
+ end
144
+
145
+ context 'within a zone' do
146
+ should 'return hardware information via #get_hardware' do
147
+ @expected_data[:model] = 'Oracle Virtual Platform'
148
+ @expected_data[:firmware_version] = nil
149
+
150
+ @connector.stubs(:values_at).with(@smbios_command).returns([])
151
+ @connector.stubs(:values_at).with(@zoneadm_command).returns('somezone')
152
+
153
+ @target.get_hardware
154
+ assert_equal(@expected_data, @target.hardware)
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ context 'for hosted shares' do
161
+ setup do
162
+ @share_data = [
163
+ '/export/someshare|/dev/vs/dsk/ADMINSHARE/vol_someshare',
164
+ '/export/someothershare|/dev/vs/dsk/ADMINSHARE/vol_someothershare'
165
+ ]
166
+
167
+ @expected_data = [
168
+ {:name=>@share_data[0].split('|')[0], :path=>@share_data[0].split('|')[1]},
169
+ {:name=>@share_data[1].split('|')[0], :path=>@share_data[1].split('|')[1]}
170
+ ]
171
+ end
172
+
173
+ should 'return hosted share information via #get_hosted_shares' do
174
+ share_command = %q{nawk '{system("df -k | grep " $2)}' /usr/sbin/shares | nawk '{print $NF "|" $1}'}
175
+
176
+ @connector.stubs(:values_at).with(share_command).returns(@share_data)
177
+
178
+ @target.get_hosted_shares
179
+ assert_equal(@expected_data, @target.hosted_shares)
180
+ end
181
+ end
182
+
183
+ context 'for installed applications' do
184
+ setup do
185
+ @application_data = %q{
186
+ NAME: The Python interpreter, libraries and utilities
187
+ VERSION: 2.3.3
188
+ INSTDATE: Jan 1 2013 00:00
189
+
190
+ NAME: The Python interpreter, libraries and utilities - development files
191
+ VERSION: 2.3.3
192
+ BASEDIR: /usr
193
+ VENDOR: Oracle Corporation
194
+ INSTDATE: Jan 1 2013 00:00
195
+ }.strip.split(/\n/)
196
+
197
+ @expected_data = [
198
+ {
199
+ :date_installed=>DateTime.parse('Jan 1 2013 00:00'),
200
+ :install_location=>nil,
201
+ :license_key=>nil,
202
+ :name=>'The Python interpreter, libraries and utilities',
203
+ :vendor=>nil,
204
+ :version=>'2.3.3'
205
+ },
206
+ {
207
+ :date_installed=>DateTime.parse('Jan 1 2013 00:00'),
208
+ :install_location=>'/usr',
209
+ :license_key=>nil,
210
+ :name=>'The Python interpreter, libraries and utilities - development files',
211
+ :vendor=>'Oracle Corporation',
212
+ :version=>'2.3.3'
213
+ }
214
+ ]
215
+ end
216
+
217
+ should 'return installed applications via #get_installed_applications' do
218
+ application_command = "pkginfo -il -c application | egrep -i '^$|(name|version|basedir|vendor|instdate):'"
219
+
220
+ @connector.stubs(:values_at).with(application_command).returns(@application_data)
221
+
222
+ @target.get_installed_applications
223
+ assert_equal(@expected_data, @target.installed_applications)
224
+ end
225
+ end
226
+
227
+ context 'for installed patches' do
228
+ setup do
229
+ @patch_dir_data = '143506-01|Jan 1 00:00:00 2013'
230
+
231
+ @patch_data = [
232
+ '143506-01|SUNWPython-devel',
233
+ '121671-01|SUNWPython'
234
+ ]
235
+
236
+ @expected_data = [
237
+ {
238
+ :date_installed=>DateTime.parse(@patch_dir_data.split('|')[1]),
239
+ :installed_by=>nil,
240
+ :patch_code=>@patch_dir_data.split('|')[0]
241
+ },
242
+ ]
243
+ end
244
+
245
+ should 'return installed patches via #get_installed_patches' do
246
+ patch_dir_command = %q{ls -ego /var/sadm/patch | grep -v '^total' | nawk '{print $NF "|" $4 " " $5 " " $6 " " $7}'}
247
+
248
+ @connector.stubs(:values_at).with(patch_dir_command).returns([@patch_dir_data])
249
+
250
+ @target.get_installed_patches
251
+ assert_equal(@expected_data, @target.installed_patches)
252
+ end
253
+ end
254
+
255
+ context 'for installed services' do
256
+ setup do
257
+ @expected_data = [
258
+ {:name=>'svc:/network/smtp:sendmail', :install_location=>nil, :start_mode=>nil},
259
+ {:name=>'svc:/network/ftp:default', :install_location=>nil, :start_mode=>nil}
260
+ ]
261
+ end
262
+
263
+ should 'return service information via #get_installed_services' do
264
+ @connector.stubs(:values_at).with("svcs -a | nawk '{print $NF}'").returns(@expected_data.collect{|svc| svc[:name]})
265
+
266
+ @target.get_installed_services
267
+ assert_equal(@expected_data, @target.installed_services)
268
+ end
269
+ end
270
+
271
+ # handled by UNIX core
272
+ #context 'for local users and groups' do
273
+ #end
274
+
275
+ # handled by UNIX core
276
+ #context 'for network identification' do
277
+ #end
278
+
279
+ context 'for network interfaces' do
280
+ setup do
281
+
282
+ @dns_server_command = "cat /etc/resolv.conf | grep ^nameserver | awk '{print $2}'"
283
+ @dns_server_data = ['192.168.1.1', '192.168.1.2']
284
+ @connector.stubs(:values_at).with(@dns_server_command).returns(@dns_server_data)
285
+
286
+ @connector.stubs(:values_at).with(@showrev_command).returns(['Application architecture: sparc'])
287
+
288
+ @kstat_command = %q{/usr/bin/kstat -c net -p | egrep "ifspeed|link_(up|duplex|autoneg)" | nawk '{print $1 "|" $2}'}
289
+
290
+ @prtpicl_ethernet_command = %q{/usr/sbin/prtpicl -c network -v | egrep ':model|:driver-name|:instance|:local-mac-address|:vendor-id|:device-id|\(network' | nawk '{if ($0 ~ /\(network/) print ""; else {first=$1; $1=""; print first "|" $0}}'}
291
+
292
+ @fcinfo_command = %q{/usr/local/bin/sudo /usr/sbin/fcinfo hba-port | egrep -i "wwn|device name|model|manufacturer|driver name|state|current speed" | nawk '{$1=$1; if(tolower($1) ~ /^node/) print $0 "\n"; else print $0;}'}
293
+
294
+ @mac_mapping_command = %q{/usr/bin/netstat -pn | grep SP | nawk '{print $1 "|" $2 "|" toupper($5)}'}
295
+
296
+ @ifconfig_command = %q{/sbin/ifconfig -a | egrep 'flags|inet|zone' | nawk '{if($2~/^flags/ && $1!~/^(lo|dman|sppp)/) {current_line=$0; getline; {if($1!~/^zone/) {$1=$1; print current_line "\n" $0 "\n"}}}}'}
297
+ end
298
+
299
+ context 'in a standard three-interface setup' do
300
+ setup do
301
+ @connector.stubs(:values_at).with(@fcinfo_command).returns([])
302
+ @connector.stubs(:values_at).with(@zoneadm_command).returns(['global'])
303
+
304
+ @expected_ethernet_data = []
305
+
306
+ # this interface is fully online... standard setup with multiple ipv4/ipv6 addresses
307
+ @expected_ethernet_data << @target.network_interface_template.merge({
308
+ :auto_negotiate=>false,
309
+ :current_speed_mbps=>1000,
310
+ :dns_servers=>['192.168.1.1', '192.168.1.2'],
311
+ :duplex=>'full',
312
+ :ip_addresses=>[
313
+ {:ip_address=>'192.168.1.5', :subnet=>'255.255.255.0'},
314
+ {:ip_address=>'fe80::a00::ffff:ffff:1000/10', :subnet=>nil}
315
+ ],
316
+ :mac_address=>'01:01:01:01:01:01',
317
+ :model=>'Unknown Ethernet Adapter',
318
+ :model_id=>'0x1234',
319
+ :mtu=>1500,
320
+ :name=>'e1000g0',
321
+ :status=>'up',
322
+ :type=>'ethernet',
323
+ :vendor=>'Unknown',
324
+ :vendor_id=>'0x1234'
325
+ })
326
+
327
+ # this interface has no physical connection but is configured to be up with ipv4 addresses...
328
+ # should report status as down with no ip or link data
329
+ @expected_ethernet_data << @target.network_interface_template.merge({
330
+ :dns_servers=>['192.168.1.1', '192.168.1.2'],
331
+ :mac_address=>'01:01:01:01:01:01',
332
+ :model=>'Unknown Ethernet Adapter',
333
+ :model_id=>'0x1234',
334
+ :name=>'nxge0',
335
+ :status=>'down',
336
+ :type=>'ethernet',
337
+ :vendor=>'Unknown',
338
+ :vendor_id=>'0x1234'
339
+ })
340
+
341
+ # this port has a physical connection but is not configured for use...
342
+ # should report status as down
343
+ @expected_ethernet_data << @expected_ethernet_data[1].merge({:name=>'ce0'})
344
+ end
345
+
346
+ should 'return ethernet information for both interfaces via #get_network_interfaces' do
347
+ @connector.stubs(:values_at).with(@prtpicl_fibre_command).returns([])
348
+
349
+ prtpicl_ethernet_data = %q{
350
+ :vendor-id|0x1234
351
+ :device-id|0x1234
352
+ :local-mac-address|01 01 01 01 01 01
353
+ :instance|0
354
+ :driver-name|e1000g
355
+
356
+ :vendor-id|0x1234
357
+ :device-id|0x1234
358
+ :local-mac-address|01 01 01 01 01 01
359
+ :instance|0
360
+ :driver-name|nxge
361
+
362
+ :vendor-id|0x1234
363
+ :device-id|0x1234
364
+ :local-mac-address|01 01 01 01 01 01
365
+ :instance|0
366
+ :driver-name|ce
367
+ }.strip.split(/\n/)
368
+ @connector.stubs(:values_at).with(@prtpicl_ethernet_command).returns(prtpicl_ethernet_data)
369
+
370
+ ifconfig_data = %q{
371
+ e1000g0: flags=123456<UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,FIXEDMTU> mtu 1500 index 2
372
+ inet 192.168.1.5 netmask ffffff00 broadcast 192.168.1.255
373
+
374
+ e1000g0:1: flags=123456<UP,MULTICAST,IPv6> mtu 1500 index 2
375
+ inet6 fe80::a00::ffff:ffff:1000/10
376
+
377
+ nxge1: flags=123456<UP,BROADCAST,MULTICAST,IPv4> mtu 1500 index 3
378
+ inet 192.168.1.6 netmask ffffff00 broadcast 192.168.1.255
379
+
380
+ nxge1:1 flags=123456<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3
381
+ inet 192.168.1.7
382
+ }.strip.split(/\n/)
383
+ @connector.stubs(:values_at).with(@ifconfig_command).returns(ifconfig_data)
384
+
385
+ kstat_data = %q{
386
+ e1000g:0:mac:ifspeed|1000000000
387
+ e1000g:0:mac:link_autoneg|0
388
+ e1000g:0:mac:link_duplex|2
389
+ e1000g:0:mac:link_up|1
390
+ nxge:0:mac:ifspeed|1000000000
391
+ nxge:0:mac:link_autoneg|1
392
+ nxge:0:mac:link_duplex|2
393
+ nxge:0:mac:link_up|0
394
+ ce:0:ce0:ifspeed|1000000000
395
+ ce:0:mac:link_autoneg|1
396
+ ce:0:mac:link_duplex|2
397
+ ce:0:mac:link_up|1
398
+ }.strip.split(/\n/)
399
+ @connector.stubs(:values_at).with(@kstat_command).returns(kstat_data)
400
+
401
+ mac_mapping_data = ['e1000g0|192.168.1.5|01:01:01:01:01:01', 'ce0|192.168.1.5|01:01:01:01:01:01']
402
+ @connector.stubs(:values_at).with(@mac_mapping_command).returns(mac_mapping_data)
403
+
404
+ @target.get_network_interfaces
405
+ assert_equal(@expected_ethernet_data, @target.network_interfaces)
406
+ end
407
+ end
408
+
409
+ context 'of a child zone' do
410
+ setup do
411
+ @connector.stubs(:values_at).with(@zoneadm_command).returns(['childzone'])
412
+
413
+ @expected_ethernet_data = [@target.network_interface_template.merge({
414
+ :current_speed_mbps=>1000,
415
+ :dns_servers=>['192.168.1.1', '192.168.1.2'],
416
+ :duplex=>'full',
417
+ :ip_addresses=>[{:ip_address=>'192.168.1.2', :subnet=>'255.255.255.0'}],
418
+ :mac_address=>'01:01:01:01:01:01',
419
+ :model=>'Virtual Ethernet Adapter',
420
+ :mtu=>1500,
421
+ :name=>'ce1',
422
+ :status=>'up',
423
+ :type=>'ethernet',
424
+ :vendor=>VENDOR_ORACLE
425
+ })]
426
+ end
427
+
428
+ should 'return ethernet information for an interface on a zone via #get_network_interfaces' do
429
+ @connector.stubs(:values_at).with(@fcinfo_command).returns([])
430
+
431
+ # a child zone may show the interfaces of the host via kstat, but not via ifconfig,
432
+ # so any active interfaces found in kstat should be ignored
433
+ ifconfig_data = %q{
434
+ ce1:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3
435
+ inet 192.168.1.2 netmask ffffff00 broadcast 192.168.1.1
436
+ }.strip.split(/\n/)
437
+ @connector.stubs(:values_at).with(@ifconfig_command).returns(ifconfig_data)
438
+
439
+ kstat_data = %q{
440
+ ce:1:ce1:ifspeed|1000000000
441
+ ce:1:ce1:link_duplex|2
442
+ ce:1:ce1:link_up|1
443
+ e1000g:0:e1000g0:ifspeed|1000000000
444
+ e1000g:0:mac:ifspeed|1000000000
445
+ e1000g:0:mac:link_autoneg|1
446
+ e1000g:0:mac:link_duplex|2
447
+ e1000g:0:mac:link_up|1
448
+ }.strip.split(/\n/)
449
+ @connector.stubs(:values_at).with(@kstat_command).returns(kstat_data)
450
+
451
+ mac_mapping_data = ['ce1|192.168.1.2|01:01:01:01:01:01']
452
+ @connector.stubs(:values_at).with(@mac_mapping_command).returns(mac_mapping_data)
453
+
454
+ @target.get_network_interfaces
455
+ assert_equal(@expected_ethernet_data, @target.network_interfaces)
456
+ end
457
+ end
458
+
459
+ context 'in a fibre channel setup' do
460
+ setup do
461
+ @expected_fibre_data = [@target.network_interface_template.merge({
462
+ :current_speed_mbps=>4000,
463
+ :model=>'375-2200-xx',
464
+ :name=>'/dev/cfg/c1',
465
+ :node_wwn=>'00000000aaaaaaaa',
466
+ :port_wwn=>'00000000aaaaaaaa',
467
+ :status=>'up',
468
+ :type=>'fibre',
469
+ :vendor=>'QLogic Corp.',
470
+ })]
471
+
472
+ @connector.stubs(:values_at).with(@kstat_command).returns([])
473
+ @connector.stubs(:values_at).with(@mac_mapping_command).returns([])
474
+ @connector.stubs(:values_at).with(@ifconfig_command).returns([])
475
+ @connector.stubs(:values_at).with(@zoneadm_command).returns(['global'])
476
+ end
477
+
478
+ should 'return fibre interface information via #get_network_interfaces' do
479
+ fcinfo_data = %q{
480
+ HBA Port WWN: 00000000aaaaaaaa
481
+ OS Device Name: /dev/cfg/c1
482
+ Manufacturer: QLogic Corp.
483
+ Model: 375-2200-xx
484
+ Driver Name: qlc
485
+ State: online
486
+ Current Speed: 4Gb
487
+ Node WWN: 00000000aaaaaaaa
488
+ }.strip.split(/\n/)
489
+ @connector.stubs(:values_at).with(@fcinfo_command).returns(fcinfo_data)
490
+
491
+ @target.get_network_interfaces
492
+ assert_equal(@expected_fibre_data, @target.network_interfaces)
493
+ end
494
+ end
495
+ end
496
+
497
+ context 'for operating system information' do
498
+ setup do
499
+ @os_data = '5.10 Generic_1234567-89'
500
+
501
+ @expected_data = {
502
+ :date_installed=>DateTime.parse('Jan 1 2013'),
503
+ :features=>[],
504
+ :kernel=>@os_data.split[1],
505
+ :license_key=>nil,
506
+ :name=>'Oracle Solaris',
507
+ :roles=>[],
508
+ :service_pack=>nil,
509
+ :version=>@os_data.split[0]
510
+ }
511
+ end
512
+
513
+ should 'return operating system information via #get_operating_system' do
514
+ @connector.stubs(:value_at).with("ls -l /var/sadm/system/logs/install_log | nawk '{print $6" "$7" "$8'}").returns('Jan 1 2013')
515
+ @connector.stubs(:value_at).with('uname -rv').returns(@os_data)
516
+
517
+ @target.get_operating_system
518
+ assert_equal(@expected_data, @target.operating_system)
519
+ end
520
+ end
521
+ end
522
+ end
523
+ end