boris 1.0.0.beta.1

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