right_agent 0.17.2 → 1.0.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 (33) hide show
  1. data/lib/right_agent.rb +0 -1
  2. data/lib/right_agent/agent_config.rb +1 -1
  3. data/lib/right_agent/minimal.rb +8 -7
  4. data/lib/right_agent/monkey_patches.rb +4 -2
  5. data/lib/right_agent/monkey_patches/ruby_patch.rb +9 -9
  6. data/lib/right_agent/monkey_patches/ruby_patch/linux_patch/file_patch.rb +2 -2
  7. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/file_patch.rb +21 -51
  8. data/lib/right_agent/packets.rb +5 -1
  9. data/lib/right_agent/platform.rb +727 -299
  10. data/lib/right_agent/platform/unix/darwin/platform.rb +102 -0
  11. data/lib/right_agent/platform/unix/linux/platform.rb +305 -0
  12. data/lib/right_agent/platform/unix/platform.rb +226 -0
  13. data/lib/right_agent/platform/windows/mingw/platform.rb +447 -0
  14. data/lib/right_agent/platform/windows/mswin/platform.rb +236 -0
  15. data/lib/right_agent/platform/windows/platform.rb +1808 -0
  16. data/right_agent.gemspec +13 -8
  17. data/spec/platform/spec_helper.rb +216 -0
  18. data/spec/platform/unix/darwin/platform_spec.rb +181 -0
  19. data/spec/platform/unix/linux/platform_spec.rb +540 -0
  20. data/spec/platform/unix/spec_helper.rb +149 -0
  21. data/spec/platform/windows/mingw/platform_spec.rb +222 -0
  22. data/spec/platform/windows/mswin/platform_spec.rb +259 -0
  23. data/spec/platform/windows/spec_helper.rb +720 -0
  24. metadata +45 -30
  25. data/lib/right_agent/platform/darwin.rb +0 -285
  26. data/lib/right_agent/platform/linux.rb +0 -537
  27. data/lib/right_agent/platform/windows.rb +0 -1384
  28. data/spec/platform/darwin_spec.rb +0 -13
  29. data/spec/platform/linux_spec.rb +0 -38
  30. data/spec/platform/linux_volume_manager_spec.rb +0 -201
  31. data/spec/platform/platform_spec.rb +0 -80
  32. data/spec/platform/windows_spec.rb +0 -13
  33. data/spec/platform/windows_volume_manager_spec.rb +0 -318
@@ -1,13 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- describe 'RightScale::Platform' do
4
- subject { RightScale::Platform }
5
-
6
- context 'under Darwin' do
7
- context :installer do
8
- context :install do
9
- specify { lambda { subject.installer.install([]) }.should raise_exception }
10
- end
11
- end
12
- end
13
- end if RightScale::Platform.darwin?
@@ -1,38 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- describe RightScale::Platform do
4
- subject { RightScale::Platform }
5
-
6
- context 'under Linux' do
7
- context :installer do
8
- context :install do
9
- it 'should succeed if no packages are specified' do
10
- packages = []
11
- flexmock(subject.installer).should_receive(:run_installer_command).and_return('ok')
12
- subject.installer.install(packages).should == true
13
- end
14
-
15
- it 'should succeed if all packages install successfully' do
16
- packages = ['syslog-ng']
17
- flexmock(subject.installer).should_receive(:run_installer_command).and_return('ok')
18
- subject.installer.install(packages).should == true
19
- end
20
-
21
- it 'should fail if one more packages are not found' do
22
- if subject.installer.yum?
23
- failure_message = "No package l33th4x0r available."
24
- elsif subject.installer.aptitude?
25
- failure_message = "E: Couldn't find package l33th4x0r"
26
- elsif subject.installer.zypper?
27
- failure_message = "Package 'l33h4x0r' not found."
28
- end
29
- packages = ['syslog-ng', 'l33th4x0r']
30
-
31
- flexmock(subject.installer).should_receive(:run_installer_command).and_return(failure_message)
32
-
33
- lambda { subject.installer.install(packages) }.should raise_error
34
- end
35
- end
36
- end
37
- end
38
- end if RightScale::Platform.linux?
@@ -1,201 +0,0 @@
1
- #
2
- # Copyright (c) 2009-2011 RightScale Inc
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining
5
- # a copy of this software and associated documentation files (the
6
- # "Software"), to deal in the Software without restriction, including
7
- # without limitation the rights to use, copy, modify, merge, publish,
8
- # distribute, sublicense, and/or sell copies of the Software, and to
9
- # permit persons to whom the Software is furnished to do so, subject to
10
- # the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be
13
- # included in all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
-
23
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
24
-
25
- if RightScale::Platform.linux?
26
- describe RightScale::Platform do
27
- before(:all) do
28
- @platform = RightScale::Platform
29
- end
30
-
31
- context :volume_manager do
32
- context :parse_volumes do
33
- it 'can parse volumes from blkid output' do
34
- blkid_resp = <<EOF
35
- /dev/xvdh1: SEC_TYPE="msdos" LABEL="METADATA" UUID="681B-8C5D" TYPE="vfat"
36
- /dev/xvdb1: LABEL="SWAP-xvdb1" UUID="d51fcca0-6b10-4934-a572-f3898dfd8840" TYPE="swap"
37
- /dev/xvda1: UUID="f4746f9c-0557-4406-9267-5e918e87ca2e" TYPE="ext3"
38
- /dev/xvda2: UUID="14d88b9e-9fe6-4974-a8d6-180acdae4016" TYPE="ext3"
39
- EOF
40
- volume_hash_ary = [
41
- {:device => "/dev/xvdh1", :sec_type => "msdos", :label => "METADATA", :uuid => "681B-8C5D", :type => "vfat", :filesystem => "vfat"},
42
- {:device => "/dev/xvdb1", :label => "SWAP-xvdb1", :uuid => "d51fcca0-6b10-4934-a572-f3898dfd8840", :type => "swap", :filesystem => "swap"},
43
- {:device => "/dev/xvda1", :uuid => "f4746f9c-0557-4406-9267-5e918e87ca2e", :type => "ext3", :filesystem => "ext3"},
44
- {:device => "/dev/xvda2", :uuid => "14d88b9e-9fe6-4974-a8d6-180acdae4016", :type => "ext3", :filesystem => "ext3"}
45
- ]
46
-
47
- @platform.volume_manager.parse_volumes(blkid_resp).should == volume_hash_ary
48
- end
49
-
50
- it 'can parse volumes with hyphens or underscores (lvm use case)' do
51
- blkid_resp = <<EOF
52
- /dev/vg-rightscale-data_storage1/lvol0: UUID="ee34706d-866f-476e-9da4-6a18745456a4" TYPE="xfs"
53
- EOF
54
-
55
- volume_hash_ary = [
56
- {:device => '/dev/vg-rightscale-data_storage1/lvol0', :uuid => 'ee34706d-866f-476e-9da4-6a18745456a4', :type => 'xfs', :filesystem => "xfs"}
57
- ]
58
-
59
- @platform.volume_manager.parse_volumes(blkid_resp).should == volume_hash_ary
60
- end
61
-
62
- it 'can parse volumes with periods' do
63
- blkid_resp = <<EOF
64
- /dev/please.dont.do.this: UUID="ee34706d-866f-476e-9da4-6a18745456a4" TYPE="xfs"
65
- EOF
66
-
67
- volume_hash_ary = [
68
- {:device => '/dev/please.dont.do.this', :uuid => 'ee34706d-866f-476e-9da4-6a18745456a4', :type => 'xfs', :filesystem => "xfs"}
69
- ]
70
-
71
- @platform.volume_manager.parse_volumes(blkid_resp).should == volume_hash_ary
72
- end
73
-
74
- it 'raises a parser error when blkid output is malformed' do
75
- blkid_resp = 'foobarbz'
76
-
77
- lambda { @platform.volume_manager.parse_volumes(blkid_resp) }.should raise_error(RightScale::Platform::VolumeManager::ParserError)
78
- end
79
-
80
- it 'returns an empty list of volumes when blkid output is empty' do
81
- blkid_resp = ''
82
-
83
- @platform.volume_manager.parse_volumes(blkid_resp).should == []
84
- end
85
-
86
- it 'can filter results with only one condition' do
87
- blkid_resp = <<EOF
88
- /dev/xvdh1: SEC_TYPE="msdos" LABEL="METADATA" UUID="681B-8C5D" TYPE="vfat"
89
- /dev/xvdb1: LABEL="SWAP-xvdb1" UUID="d51fcca0-6b10-4934-a572-f3898dfd8840" TYPE="swap"
90
- /dev/xvda1: UUID="f4746f9c-0557-4406-9267-5e918e87ca2e" TYPE="ext3"
91
- /dev/xvda2: UUID="14d88b9e-9fe6-4974-a8d6-180acdae4016" TYPE="ext3"
92
- EOF
93
- volume_hash_ary = [
94
- {:device => "/dev/xvdh1", :sec_type => "msdos", :label => "METADATA", :uuid => "681B-8C5D", :type => "vfat", :filesystem => "vfat"}
95
- ]
96
-
97
- condition = {:uuid => "681B-8C5D"}
98
-
99
- @platform.volume_manager.parse_volumes(blkid_resp, condition).should == volume_hash_ary
100
- end
101
-
102
- it 'can filter results with many conditions' do
103
- blkid_resp = <<EOF
104
- /dev/xvdh1: SEC_TYPE="msdos" LABEL="METADATA" UUID="681B-8C5D" TYPE="vfat"
105
- /dev/xvdb1: LABEL="SWAP-xvdb1" UUID="d51fcca0-6b10-4934-a572-f3898dfd8840" TYPE="swap"
106
- /dev/xvda1: UUID="f4746f9c-0557-4406-9267-5e918e87ca2e" TYPE="ext3"
107
- /dev/xvda2: UUID="14d88b9e-9fe6-4974-a8d6-180acdae4016" TYPE="ext3"
108
- EOF
109
- volume_hash_ary = [
110
- {:device => "/dev/xvda1", :uuid => "f4746f9c-0557-4406-9267-5e918e87ca2e", :type => "ext3", :filesystem => "ext3"},
111
- {:device => "/dev/xvda2", :uuid => "14d88b9e-9fe6-4974-a8d6-180acdae4016", :type => "ext3", :filesystem => "ext3"}
112
- ]
113
-
114
- condition = {:filesystem => "ext3"}
115
-
116
- @platform.volume_manager.parse_volumes(blkid_resp, condition).should == volume_hash_ary
117
- end
118
- end
119
-
120
- context :mount_volume do
121
- it 'mounts the specified volume if it is not already mounted' do
122
- mount_resp = <<EOF
123
- /dev/xvda2 on / type ext3 (rw,noatime,errors=remount-ro)
124
- proc on /proc type proc (rw,noexec,nosuid,nodev)
125
- EOF
126
-
127
- flexmock(@platform.volume_manager).should_receive(:blocking_popen).with('mount').once.and_return([0, mount_resp])
128
- flexmock(@platform.volume_manager).should_receive(:blocking_popen).with('mount -t vfat /dev/xvdh1 /var/spool/softlayer').once.and_return([0, '']);
129
-
130
- @platform.volume_manager.mount_volume({:device => "/dev/xvdh1", :filesystem => "vfat"}, "/var/spool/softlayer")
131
- end
132
-
133
- it 'does not attempt to re-mount the volume' do
134
- mount_resp = <<EOF
135
- /dev/xvda2 on / type ext3 (rw,noatime,errors=remount-ro)
136
- proc on /proc type proc (rw,noexec,nosuid,nodev)
137
- /dev/xvdh1 on /var/spool/softlayer type vfat (rw) [METADATA]
138
- EOF
139
- flexmock(@platform.volume_manager).should_receive(:blocking_popen).with('mount').once.and_return([0, mount_resp])
140
- flexmock(@platform.volume_manager).should_receive(:blocking_popen).with('mount -t vfat /dev/xvdh1 /var/spool/softlayer').never.and_return([0, '']);
141
-
142
- @platform.volume_manager.mount_volume({:device => "/dev/xvdh1", :filesystem => "vfat"}, "/var/spool/softlayer")
143
- end
144
-
145
- it 'raises argument error when the volume parameter is not a hash' do
146
- lambda { @platform.volume_manager.mount_volume("", "") }.should raise_error(ArgumentError)
147
- end
148
-
149
- it 'raises argument error when the volume parameter is a hash but does not contain :device' do
150
- lambda { @platform.volume_manager.mount_volume({}, "") }.should raise_error(ArgumentError)
151
- end
152
-
153
- it 'raises volume error when the device is already mounted to a different mountpoint' do
154
- mount_resp = <<EOF
155
- /dev/xvda2 on / type ext3 (rw,noatime,errors=remount-ro)
156
- proc on /proc type proc (rw,noexec,nosuid,nodev)
157
- none on /sys type sysfs (rw,noexec,nosuid,nodev)
158
- none on /sys/kernel/debug type debugfs (rw)
159
- none on /sys/kernel/security type securityfs (rw)
160
- none on /dev type devtmpfs (rw,mode=0755)
161
- none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
162
- none on /dev/shm type tmpfs (rw,nosuid,nodev)
163
- none on /var/run type tmpfs (rw,nosuid,mode=0755)
164
- none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)
165
- none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
166
- /dev/xvda1 on /boot type ext3 (rw,noatime)
167
- /dev/xvdh1 on /mnt type vfat (rw) [METADATA]
168
- EOF
169
-
170
- mount_popen_mock = flexmock(:read => mount_resp)
171
- flexmock(IO).should_receive(:popen).with('mount',Proc).and_yield(mount_popen_mock)
172
-
173
- lambda { @platform.volume_manager.mount_volume({:device => "/dev/xvdh1"}, "/var/spool/softlayer")}.should raise_error(RightScale::Platform::VolumeManager::VolumeError)
174
- end
175
-
176
- it 'raises volume error when a different device is already mounted to the specified mountpoint' do
177
- mount_resp = <<EOF
178
- /dev/xvda2 on / type ext3 (rw,noatime,errors=remount-ro)
179
- proc on /proc type proc (rw,noexec,nosuid,nodev)
180
- none on /sys type sysfs (rw,noexec,nosuid,nodev)
181
- none on /sys/kernel/debug type debugfs (rw)
182
- none on /sys/kernel/security type securityfs (rw)
183
- none on /dev type devtmpfs (rw,mode=0755)
184
- none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
185
- none on /dev/shm type tmpfs (rw,nosuid,nodev)
186
- none on /var/run type tmpfs (rw,nosuid,mode=0755)
187
- none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)
188
- none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
189
- /dev/xvda1 on /boot type ext3 (rw,noatime)
190
- /dev/xvdh2 on /var/spool/softlayer type vfat (rw) [METADATA]
191
- EOF
192
-
193
- mount_popen_mock = flexmock(:read => mount_resp)
194
- flexmock(IO).should_receive(:popen).with('mount',Proc).and_yield(mount_popen_mock)
195
-
196
- lambda { @platform.volume_manager.mount_volume({:device => "/dev/xvdh1"}, "/var/spool/softlayer")}.should raise_error(RightScale::Platform::VolumeManager::VolumeError)
197
- end
198
- end
199
- end
200
- end
201
- end
@@ -1,80 +0,0 @@
1
- #
2
- # Copyright (c) 2009-2011 RightScale Inc
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining
5
- # a copy of this software and associated documentation files (the
6
- # "Software"), to deal in the Software without restriction, including
7
- # without limitation the rights to use, copy, modify, merge, publish,
8
- # distribute, sublicense, and/or sell copies of the Software, and to
9
- # permit persons to whom the Software is furnished to do so, subject to
10
- # the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be
13
- # included in all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
-
23
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
24
-
25
- describe RightScale::Platform do
26
- subject { RightScale::Platform }
27
-
28
- context :shell do
29
- context :uptime do
30
- it 'should be positive' do
31
- subject.shell.uptime.should > 0
32
- end
33
-
34
- it 'should be strictly increasing' do
35
- u0 = subject.shell.uptime
36
- sleep(1)
37
- u1 = subject.shell.uptime
38
-
39
- (u1 - u0).should >= 0
40
- end
41
- end
42
-
43
- context :booted_at do
44
- it 'should be some time in the past' do
45
- Time.at(subject.shell.booted_at).to_i.should < Time.now.to_i
46
- end
47
-
48
- it 'should be constant' do
49
- b0 = subject.shell.booted_at
50
- sleep(1)
51
- b1 = subject.shell.booted_at
52
-
53
- b0.should == b1
54
- end
55
- end
56
- end
57
-
58
- context 'cloud-family queries' do
59
- # PLEASE NOTE: we are unable to use the magic RSpec "subject" because
60
- # we are dispatching calls to a Singleton and we must partially mock its
61
- # calls, and both __send__ and flexmock partial-mocking gets confused by
62
- # the fact that #subject returns a Proc, not the actual subject. Do not
63
- # attempt to use the pretty RSpec feature within this context. You have
64
- # been warned!
65
- before(:each) do
66
- @subject = subject.instance
67
- @subject.instance_variable_set(:@ec2, nil)
68
- @subject.instance_variable_set(:@rackspace, nil)
69
- @subject.instance_variable_set(:@eucalyptus, nil)
70
- end
71
-
72
- ['ec2', 'rackspace', 'eucalyptus'].each do |cloud|
73
- it "should detect #{cloud}" do
74
- query = "#{cloud}?".to_sym
75
- flexmock(@subject).should_receive(:read_cloud_file).once.and_return(cloud)
76
- @subject.__send__(query).should be_true
77
- end
78
- end
79
- end
80
- end
@@ -1,13 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- describe RightScale::Platform do
4
- subject { RightScale::Platform }
5
-
6
- context 'under Windows' do
7
- context :installer do
8
- context :install do
9
- specify { lambda { subject.installer.install([]) }.should raise_exception }
10
- end
11
- end
12
- end
13
- end if RightScale::Platform.windows?
@@ -1,318 +0,0 @@
1
- #
2
- # Copyright (c) 2012 RightScale Inc
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining
5
- # a copy of this software and associated documentation files (the
6
- # "Software"), to deal in the Software without restriction, including
7
- # without limitation the rights to use, copy, modify, merge, publish,
8
- # distribute, sublicense, and/or sell copies of the Software, and to
9
- # permit persons to whom the Software is furnished to do so, subject to
10
- # the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be
13
- # included in all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
-
23
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
24
-
25
- if RightScale::Platform.windows?
26
- module OsInfoExtensions
27
- def set_osinfo(osinfo)
28
- @os_info = osinfo
29
- end
30
-
31
- def get_osinfo
32
- @os_info
33
- end
34
- end
35
-
36
- describe RightScale::Platform do
37
- before(:all) do
38
- @platform = RightScale::Platform
39
- end
40
-
41
- context :volume_manager do
42
- context :is_attachable_volume_path do
43
- it 'allows paths with hyphens and underscores' do
44
- @platform.volume_manager.is_attachable_volume_path?('C:\\Some_crazy-path').should == true
45
- end
46
-
47
- it 'allows paths with periods' do
48
- @platform.volume_manager.is_attachable_volume_path?('C:\\Some.crazy.path').should == true
49
- end
50
-
51
- it 'allows paths with tildes' do
52
- @platform.volume_manager.is_attachable_volume_path?('C:\\~Some~crazy~path').should == true
53
- end
54
- end
55
-
56
- context :parse_volumes do
57
- it 'can parse volumes from diskpart output' do
58
- list_vol_resp = <<EOF
59
- Volume ### Ltr Label Fs Type Size Status Info
60
- ---------- --- ----------- ----- ---------- ------- --------- --------
61
- Volume 0 C 2008Boot NTFS Partition 80 GB Healthy System
62
- * Volume 1 D NTFS Partition 4094 MB Healthy
63
- Volume 2 NTFS Partition 4094 MB Healthy
64
- EOF
65
-
66
- volume_hash_ary = [
67
- {:index => 0, :device => "C:", :label => "2008Boot", :filesystem => "NTFS", :type => "Partition", :total_size => 85899345920, :status => "Healthy", :info => "System"},
68
- {:index => 1, :device => "D:", :label => nil, :filesystem => "NTFS", :type => "Partition", :total_size => 4292870144, :status => "Healthy", :info => nil},
69
- {:index => 2, :device => nil, :label => nil, :filesystem => "NTFS", :type => "Partition", :total_size => 4292870144, :status => "Healthy", :info => nil}
70
- ]
71
-
72
- @platform.volume_manager.send(:parse_volumes, list_vol_resp).should == volume_hash_ary
73
- end
74
-
75
- it 'can parse volumes from diskpart output with mounted paths' do
76
- list_vol_resp = <<EOF
77
- Volume ### Ltr Label Fs Type Size Status Info
78
- ---------- --- ----------- ----- ---------- ------- --------- --------
79
- Volume 0 C NTFS Partition 80 GB Healthy System
80
- * Volume 1 FAT32 Partition 1023 MB Healthy
81
- C:\\Program Files\\RightScale\\Mount\\Softlayer\\
82
- EOF
83
-
84
- volume_hash_ary = [
85
- {:index => 0, :device => "C:", :label => nil, :filesystem => "NTFS", :type => "Partition", :total_size => 85899345920, :status => "Healthy", :info => "System"},
86
- {:index => 1, :device => "C:\\Program Files\\RightScale\\Mount\\Softlayer\\", :label => nil, :filesystem => "FAT32", :type => "Partition", :total_size => 1072693248, :status => "Healthy", :info => nil}
87
- ]
88
-
89
- @platform.volume_manager.send(:parse_volumes, list_vol_resp).should == volume_hash_ary
90
- end
91
-
92
- it 'raises a parser error when diskpart output is malformed' do
93
- list_vol_resp = "foobarbaz"
94
-
95
- lambda { @platform.volume_manager.send(:parse_volumes, list_vol_resp) }.should raise_error(RightScale::Platform::VolumeManager::ParserError)
96
- end
97
-
98
- it 'can filter results with only one condition' do
99
- list_vol_resp = <<EOF
100
- Volume ### Ltr Label Fs Type Size Status Info
101
- ---------- --- ----------- ----- ---------- ------- --------- --------
102
- Volume 0 C 2008Boot NTFS Partition 80 GB Healthy System
103
- * Volume 1 D NTFS Partition 4094 MB Healthy
104
- Volume 2 NTFS Partition 4094 MB Healthy
105
- EOF
106
-
107
- volume_hash_ary = [
108
- {:index => 1, :device => "D:", :label => nil, :filesystem => "NTFS", :type => "Partition", :total_size => 4292870144, :status => "Healthy", :info => nil}
109
- ]
110
-
111
- condition = {:device => "D:"}
112
-
113
- @platform.volume_manager.send(:parse_volumes, list_vol_resp, condition).should == volume_hash_ary
114
- end
115
-
116
- it 'can filter results with many conditions' do
117
- list_vol_resp = <<EOF
118
- Volume ### Ltr Label Fs Type Size Status Info
119
- ---------- --- ----------- ----- ---------- ------- --------- --------
120
- Volume 0 C 2008Boot NTFS Partition 80 GB Healthy System
121
- * Volume 1 D NTFS Partition 4094 MB Healthy
122
- Volume 2 NTFS Partition 4094 MB Healthy
123
- EOF
124
-
125
- volume_hash_ary = [
126
- {:index => 1, :device => "D:", :label => nil, :filesystem => "NTFS", :type => "Partition", :total_size => 4292870144, :status => "Healthy", :info => nil}
127
- ]
128
-
129
- condition = {:device => "D:", :filesystem => "NTFS", :type => "Partition"}
130
-
131
- @platform.volume_manager.send(:parse_volumes, list_vol_resp, condition).should == volume_hash_ary
132
- end
133
- end
134
-
135
- context :assign_device do
136
- it 'assigns a device to a drive letter when a drive letter is specified' do
137
- script = <<EOF
138
- rescan
139
- list volume
140
- select volume "0"
141
- attribute volume clear readonly noerr
142
-
143
- assign letter=S
144
- EOF
145
-
146
- mount_resp = ''
147
- flexmock(@platform.volume_manager).should_receive(:run_script).with(script).once.and_return([0, mount_resp])
148
-
149
- @platform.volume_manager.assign_device('0', 'S:')
150
- end
151
-
152
- it 'assigns a device to a path when a mount point is specified' do
153
- osinfo = flexmock(:major => 6)
154
-
155
- @platform.volume_manager.extend(OsInfoExtensions)
156
- old_osinfo = @platform.volume_manager.get_osinfo
157
- @platform.volume_manager.set_osinfo(osinfo)
158
-
159
- script = <<EOF
160
- rescan
161
- list volume
162
- select volume "0"
163
- attribute volume clear readonly noerr
164
-
165
- assign mount="C:\\Program Files\\RightScale\\Mount\\Softlayer"
166
- EOF
167
-
168
- flexmock(@platform.volume_manager).should_receive(:run_script).with(script).once.and_return([0, ''])
169
-
170
- @platform.volume_manager.assign_device('0', "C:\\Program Files\\RightScale\\Mount\\Softlayer")
171
- @platform.volume_manager.set_osinfo(old_osinfo)
172
- end
173
-
174
- it 'raises an exception when an invalid drive letter is specified' do
175
- lambda{@platform.volume_manager.assign_device('0', 'C:')}.should raise_error(RightScale::Platform::VolumeManager::ArgumentError)
176
- end
177
-
178
- it 'raises an exception when an invalid path is specified' do
179
- lambda{@platform.volume_manager.assign_device('0', 'This is not a path')}.should raise_error(RightScale::Platform::VolumeManager::ArgumentError)
180
- end
181
-
182
- it 'raises an exception when a mount path is specified and OS is pre 2008' do
183
- osinfo = flexmock(:major => 5)
184
-
185
- @platform.volume_manager.extend(OsInfoExtensions)
186
- old_osinfo = @platform.volume_manager.get_osinfo
187
- @platform.volume_manager.set_osinfo(osinfo)
188
-
189
- lambda{@platform.volume_manager.assign_device(0, "C:\\Somepath")}.should raise_error(RightScale::Platform::VolumeManager::ArgumentError)
190
- @platform.volume_manager.set_osinfo(old_osinfo)
191
- end
192
-
193
- it 'does not assign the device if the device is already assigned' do
194
- script = <<EOF
195
- rescan
196
- list volume
197
- select volume "0"
198
- attribute volume clear readonly noerr
199
-
200
- assign mount="C:\\Program Files\\RightScale\\Mount\\Softlayer"
201
- EOF
202
-
203
- flexmock(@platform.volume_manager).should_receive(:run_script).with(script).once.and_return([0, ''])
204
-
205
- @platform.volume_manager.assign_device('0', "C:\\Program Files\\RightScale\\Mount\\Softlayer")
206
- flexmock(@platform.volume_manager).should_receive(:volumes).once.and_return({:index => '0', :device => "C:\\Program Files\\RightScale\\Mount\\Softlayer"})
207
- @platform.volume_manager.assign_device('0', "C:\\Program Files\\RightScale\\Mount\\Softlayer", :idempotent => true)
208
- end
209
-
210
- it 'does not clear readonly flag if :clear_readonly option is set to false' do
211
- script = <<EOF
212
- rescan
213
- list volume
214
- select volume "0"
215
-
216
-
217
- assign mount="C:\\Program Files\\RightScale\\Mount\\Softlayer"
218
- EOF
219
-
220
- flexmock(@platform.volume_manager).should_receive(:run_script).with(script).once.and_return([0, ''])
221
- @platform.volume_manager.assign_device('0', "C:\\Program Files\\RightScale\\Mount\\Softlayer", {:clear_readonly => false})
222
- end
223
-
224
- it 'removes all previous assignments if :remove_all option is set to true' do
225
- script = <<EOF
226
- rescan
227
- list volume
228
- select volume "0"
229
- attribute volume clear readonly noerr
230
- remove all noerr
231
- assign mount="C:\\Program Files\\RightScale\\Mount\\Softlayer"
232
- EOF
233
-
234
- flexmock(@platform.volume_manager).should_receive(:run_script).with(script).once.and_return([0, ''])
235
- @platform.volume_manager.assign_device('0', "C:\\Program Files\\RightScale\\Mount\\Softlayer", :remove_all => true)
236
- end
237
- end
238
-
239
- context :format_disk do
240
- it 'formats and assigns a drive to a drive letter when a drive letter is specified' do
241
- osinfo = flexmock(:major => 6)
242
- @platform.volume_manager.extend(OsInfoExtensions)
243
- old_osinfo = @platform.volume_manager.get_osinfo
244
- @platform.volume_manager.set_osinfo(osinfo)
245
-
246
- script = <<EOF
247
- rescan
248
- list disk
249
- select disk 0
250
- attribute disk clear readonly noerr
251
- online disk noerr
252
- clean
253
- create partition primary
254
- assign letter=S
255
- format FS=NTFS quick
256
- EOF
257
-
258
- flexmock(@platform.volume_manager).should_receive(:run_script).with(script).once.and_return([0,''])
259
- @platform.volume_manager.format_disk(0, 'S:')
260
- @platform.volume_manager.set_osinfo(old_osinfo)
261
- end
262
-
263
- it 'formats and assigns a drive to a path when a mount point is specified' do
264
- osinfo = flexmock(:major => 6)
265
- @platform.volume_manager.extend(OsInfoExtensions)
266
- old_osinfo = @platform.volume_manager.get_osinfo
267
- @platform.volume_manager.set_osinfo(osinfo)
268
-
269
- script = <<EOF
270
- rescan
271
- list disk
272
- select disk 0
273
- attribute disk clear readonly noerr
274
- online disk noerr
275
- clean
276
- create partition primary
277
- assign mount="C:\\Somepath"
278
- format FS=NTFS quick
279
- EOF
280
-
281
- flexmock(@platform.volume_manager).should_receive(:run_script).with(script).once.and_return([0,''])
282
- @platform.volume_manager.format_disk(0, 'C:\\Somepath')
283
- @platform.volume_manager.set_osinfo(old_osinfo)
284
- end
285
-
286
- it 'raises an exception when a mount path is specified and OS is pre 2008' do
287
- osinfo = flexmock(:major => 5)
288
-
289
- @platform.volume_manager.extend(OsInfoExtensions)
290
- old_osinfo = @platform.volume_manager.get_osinfo
291
- @platform.volume_manager.set_osinfo(osinfo)
292
-
293
- lambda{@platform.volume_manager.format_disk(0, "C:\\Somepath")}.should raise_error(RightScale::Platform::VolumeManager::ArgumentError)
294
- @platform.volume_manager.set_osinfo(old_osinfo)
295
- end
296
-
297
- end
298
-
299
- context :online_disk do
300
- it 'does not online the disk if the disk is already online' do
301
- script = <<EOF
302
- rescan
303
- list disk
304
- select disk 0
305
- attribute disk clear readonly noerr
306
- online disk noerr
307
- EOF
308
-
309
- flexmock(@platform.volume_manager).should_receive(:run_script).with(script).once.and_return([0, ''])
310
-
311
- @platform.volume_manager.online_disk(0)
312
- flexmock(@platform.volume_manager).should_receive(:disks).once.and_return({:index => 0, :status => "Online"})
313
- @platform.volume_manager.online_disk(0, :idempotent => true)
314
- end
315
- end
316
- end
317
- end
318
- end