squall 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.rbenv-version +1 -0
- data/.rspec +1 -1
- data/.rvmrc +41 -1
- data/.travis.yml +13 -3
- data/README.md +122 -27
- data/Rakefile +5 -34
- data/lib/squall/data_store_zone.rb +58 -0
- data/lib/squall/firewall_rule.rb +66 -0
- data/lib/squall/hypervisor.rb +63 -11
- data/lib/squall/hypervisor_zone.rb +135 -0
- data/lib/squall/ip_address.rb +50 -3
- data/lib/squall/ip_address_join.rb +46 -0
- data/lib/squall/network.rb +21 -4
- data/lib/squall/network_zone.rb +73 -0
- data/lib/squall/payment.rb +59 -0
- data/lib/squall/role.rb +28 -11
- data/lib/squall/statistic.rb +3 -3
- data/lib/squall/{base.rb → support/base.rb} +8 -4
- data/lib/squall/{config.rb → support/config.rb} +4 -0
- data/lib/squall/{exception.rb → support/exception.rb} +0 -0
- data/lib/squall/{params.rb → support/params.rb} +0 -0
- data/lib/squall/support/version.rb +3 -0
- data/lib/squall/support/yaml.rb +5 -0
- data/lib/squall/template.rb +4 -0
- data/lib/squall/transaction.rb +4 -0
- data/lib/squall/user.rb +126 -30
- data/lib/squall/user_group.rb +56 -0
- data/lib/squall/virtual_machine.rb +176 -52
- data/lib/squall/whitelist.rb +74 -0
- data/lib/squall.rb +21 -12
- data/spec/spec_helper.rb +21 -16
- data/spec/squall/data_store_zone_spec.rb +97 -0
- data/spec/squall/firewall_rule_spec.rb +112 -0
- data/spec/squall/hypervisor_spec.rb +101 -48
- data/spec/squall/hypervisor_zone_spec.rb +190 -0
- data/spec/squall/ip_address_join_spec.rb +67 -0
- data/spec/squall/ip_address_spec.rb +68 -6
- data/spec/squall/network_spec.rb +0 -1
- data/spec/squall/network_zone_spec.rb +147 -0
- data/spec/squall/payment_spec.rb +98 -0
- data/spec/squall/role_spec.rb +31 -46
- data/spec/squall/statistic_spec.rb +7 -9
- data/spec/squall/{base_spec.rb → support/base_spec.rb} +5 -7
- data/spec/squall/{config_spec.rb → support/config_spec.rb} +0 -0
- data/spec/{params_spec.rb → squall/support/params_spec.rb} +0 -0
- data/spec/squall/template_spec.rb +0 -1
- data/spec/squall/transaction_spec.rb +0 -1
- data/spec/squall/user_group_spec.rb +74 -0
- data/spec/squall/user_spec.rb +142 -59
- data/spec/squall/virtual_machine_spec.rb +179 -67
- data/spec/squall/whitelist_spec.rb +113 -0
- data/spec/squall_spec.rb +4 -8
- data/spec/vcr_cassettes/data_store_zone/create.yml +40 -0
- data/spec/vcr_cassettes/data_store_zone/delete.yml +77 -0
- data/spec/vcr_cassettes/data_store_zone/edit.yml +77 -0
- data/spec/vcr_cassettes/data_store_zone/list.yml +40 -0
- data/spec/vcr_cassettes/data_store_zone/show.yml +77 -0
- data/spec/vcr_cassettes/firewall_rule/create.yml +75 -0
- data/spec/vcr_cassettes/firewall_rule/delete.yml +75 -0
- data/spec/vcr_cassettes/firewall_rule/edit.yml +75 -0
- data/spec/vcr_cassettes/firewall_rule/list.yml +40 -0
- data/spec/vcr_cassettes/hypervisor/add_data_store_join.yml +40 -0
- data/spec/vcr_cassettes/hypervisor/add_network_join.yml +40 -0
- data/spec/vcr_cassettes/hypervisor/create.yml +7 -44
- data/spec/vcr_cassettes/hypervisor/data_store_joins.yml +40 -0
- data/spec/vcr_cassettes/hypervisor/delete.yml +11 -11
- data/spec/vcr_cassettes/hypervisor/edit.yml +7 -46
- data/spec/vcr_cassettes/hypervisor/list.yml +7 -7
- data/spec/vcr_cassettes/hypervisor/network_joins.yml +40 -0
- data/spec/vcr_cassettes/hypervisor/reboot.yml +13 -13
- data/spec/vcr_cassettes/hypervisor/remove_data_store_join.yml +40 -0
- data/spec/vcr_cassettes/hypervisor/remove_network_join.yml +40 -0
- data/spec/vcr_cassettes/hypervisor/show.yml +13 -13
- data/spec/vcr_cassettes/hypervisor_zones/add_data_store_join.yml +40 -0
- data/spec/vcr_cassettes/hypervisor_zones/add_network_join.yml +40 -0
- data/spec/vcr_cassettes/hypervisor_zones/create.yml +40 -0
- data/spec/vcr_cassettes/hypervisor_zones/data_store_joins.yml +40 -0
- data/spec/vcr_cassettes/hypervisor_zones/delete.yml +77 -0
- data/spec/vcr_cassettes/hypervisor_zones/edit.yml +77 -0
- data/spec/vcr_cassettes/hypervisor_zones/hypervisors.yml +40 -0
- data/spec/vcr_cassettes/hypervisor_zones/list.yml +40 -0
- data/spec/vcr_cassettes/hypervisor_zones/network_joins.yml +40 -0
- data/spec/vcr_cassettes/hypervisor_zones/remove_data_store_join.yml +40 -0
- data/spec/vcr_cassettes/hypervisor_zones/remove_network_join.yml +40 -0
- data/spec/vcr_cassettes/hypervisor_zones/show.yml +77 -0
- data/spec/vcr_cassettes/ipaddress/create.yml +40 -0
- data/spec/vcr_cassettes/ipaddress/delete.yml +40 -0
- data/spec/vcr_cassettes/ipaddress/edit.yml +40 -0
- data/spec/vcr_cassettes/ipaddress/list.yml +17 -17
- data/spec/vcr_cassettes/ipaddress_join/assign.yml +77 -0
- data/spec/vcr_cassettes/ipaddress_join/delete.yml +77 -0
- data/spec/vcr_cassettes/ipaddress_join/list.yml +77 -0
- data/spec/vcr_cassettes/network/create.yml +15 -15
- data/spec/vcr_cassettes/network/delete.yml +6 -6
- data/spec/vcr_cassettes/network/edit.yml +18 -18
- data/spec/vcr_cassettes/network/list.yml +3 -3
- data/spec/vcr_cassettes/network_zones/attach.yml +114 -0
- data/spec/vcr_cassettes/network_zones/create.yml +40 -0
- data/spec/vcr_cassettes/network_zones/delete.yml +77 -0
- data/spec/vcr_cassettes/network_zones/detach.yml +114 -0
- data/spec/vcr_cassettes/network_zones/edit.yml +77 -0
- data/spec/vcr_cassettes/network_zones/list.yml +40 -0
- data/spec/vcr_cassettes/network_zones/show.yml +77 -0
- data/spec/vcr_cassettes/payment/create.yml +78 -0
- data/spec/vcr_cassettes/payment/delete.yml +77 -0
- data/spec/vcr_cassettes/payment/edit.yml +77 -0
- data/spec/vcr_cassettes/payment/list.yml +41 -0
- data/spec/vcr_cassettes/role/create.yml +7 -44
- data/spec/vcr_cassettes/role/delete.yml +6 -6
- data/spec/vcr_cassettes/role/edit.yml +13 -75
- data/spec/vcr_cassettes/role/list.yml +7 -7
- data/spec/vcr_cassettes/role/permissions.yml +7 -7
- data/spec/vcr_cassettes/role/show.yml +13 -13
- data/spec/vcr_cassettes/statistic/usage_statistics.yml +7 -7
- data/spec/vcr_cassettes/template/list.yml +3 -3
- data/spec/vcr_cassettes/template/make_public.yml +6 -6
- data/spec/vcr_cassettes/transaction/list.yml +3 -3
- data/spec/vcr_cassettes/transaction/show.yml +6 -6
- data/spec/vcr_cassettes/user/activate.yml +7 -7
- data/spec/vcr_cassettes/user/create.yml +7 -83
- data/spec/vcr_cassettes/user/data_store_zones.yml +79 -0
- data/spec/vcr_cassettes/user/delete.yml +11 -11
- data/spec/vcr_cassettes/user/edit.yml +40 -0
- data/spec/vcr_cassettes/user/edit_role.yml +9 -9
- data/spec/vcr_cassettes/user/generate_api_key.yml +7 -7
- data/spec/vcr_cassettes/user/hypervisors.yml +77 -0
- data/spec/vcr_cassettes/user/limits.yml +77 -0
- data/spec/vcr_cassettes/user/list.yml +8 -8
- data/spec/vcr_cassettes/user/monthly_bills.yml +40 -0
- data/spec/vcr_cassettes/user/network_zones.yml +79 -0
- data/spec/vcr_cassettes/user/show.yml +29 -29
- data/spec/vcr_cassettes/user/stats.yml +6 -6
- data/spec/vcr_cassettes/user/suspend.yml +7 -7
- data/spec/vcr_cassettes/user/virtual_machines.yml +18 -20
- data/spec/vcr_cassettes/user_group/create.yml +40 -0
- data/spec/vcr_cassettes/user_group/delete.yml +77 -0
- data/spec/vcr_cassettes/user_group/edit.yml +77 -0
- data/spec/vcr_cassettes/user_group/list.yml +40 -0
- data/spec/vcr_cassettes/virtual_machine/build.yml +7 -7
- data/spec/vcr_cassettes/virtual_machine/change_owner.yml +8 -8
- data/spec/vcr_cassettes/virtual_machine/change_password.yml +13 -13
- data/spec/vcr_cassettes/virtual_machine/console.yml +63 -0
- data/spec/vcr_cassettes/virtual_machine/create.yml +9 -11
- data/spec/vcr_cassettes/virtual_machine/delete.yml +11 -11
- data/spec/vcr_cassettes/virtual_machine/edit.yml +16 -18
- data/spec/vcr_cassettes/virtual_machine/list.yml +3 -3
- data/spec/vcr_cassettes/virtual_machine/migrate.yml +22 -24
- data/spec/vcr_cassettes/virtual_machine/reboot.yml +22 -22
- data/spec/vcr_cassettes/virtual_machine/resize.yml +13 -13
- data/spec/vcr_cassettes/virtual_machine/segregate.yml +114 -0
- data/spec/vcr_cassettes/virtual_machine/set_ssh_keys.yml +77 -0
- data/spec/vcr_cassettes/virtual_machine/set_vip.yml +77 -0
- data/spec/vcr_cassettes/virtual_machine/show.yml +6 -6
- data/spec/vcr_cassettes/virtual_machine/shutdown.yml +6 -6
- data/spec/vcr_cassettes/virtual_machine/startup.yml +6 -6
- data/spec/vcr_cassettes/virtual_machine/stats.yml +63 -0
- data/spec/vcr_cassettes/virtual_machine/stop.yml +22 -22
- data/spec/vcr_cassettes/virtual_machine/suspend.yml +13 -13
- data/spec/vcr_cassettes/virtual_machine/unlock.yml +13 -13
- data/spec/vcr_cassettes/virtual_machine/unsuspend.yml +6 -6
- data/spec/vcr_cassettes/whitelist/create.yml +77 -0
- data/spec/vcr_cassettes/whitelist/delete.yml +77 -0
- data/spec/vcr_cassettes/whitelist/edit.yml +77 -0
- data/spec/vcr_cassettes/whitelist/list.yml +40 -0
- data/spec/vcr_cassettes/whitelist/show.yml +77 -0
- data/squall.gemspec +3 -2
- metadata +247 -131
- data/Gemfile.lock +0 -100
- data/lib/squall/version.rb +0 -3
@@ -2,10 +2,9 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Squall::VirtualMachine do
|
4
4
|
before(:each) do
|
5
|
-
default_config
|
6
5
|
@virtual_machine = Squall::VirtualMachine.new
|
7
|
-
@valid = {:label => 'testmachine', :
|
8
|
-
:cpu_shares => 10, :primary_disk_size => 10}
|
6
|
+
@valid = {:label => 'testmachine', :hostname => 'testmachine', :memory => 512, :cpus => 1,
|
7
|
+
:cpu_shares => 10, :primary_disk_size => 10, :template_id => 1}
|
9
8
|
@keys = ["monthly_bandwidth_used", "cpus", "label", "created_at", "operating_system_distro",
|
10
9
|
"cpu_shares", "operating_system", "template_id", "allowed_swap", "local_remote_access_port",
|
11
10
|
"memory", "updated_at", "allow_resize_without_reboot", "recovery_mode", "hypervisor_id", "id",
|
@@ -52,54 +51,48 @@ describe Squall::VirtualMachine do
|
|
52
51
|
requires_attr(:label) { @virtual_machine.create }
|
53
52
|
end
|
54
53
|
|
55
|
-
it "requires hypervisor_id" do
|
56
|
-
requires_attr(:hypervisor_id) { @virtual_machine.create(:label => @valid[:label]) }
|
57
|
-
end
|
58
|
-
|
59
54
|
it "requires hostname" do
|
60
55
|
requires_attr(:hostname) {
|
61
|
-
@virtual_machine.create(:label => @valid[:label]
|
56
|
+
@virtual_machine.create(:label => @valid[:label])
|
62
57
|
}
|
63
58
|
end
|
64
59
|
|
65
60
|
it "requires memory" do
|
66
61
|
requires_attr(:memory) {
|
67
|
-
@virtual_machine.create(:label => @valid[:label],
|
62
|
+
@virtual_machine.create(:label => @valid[:label], :hostname => @valid[:hostname])
|
68
63
|
}
|
69
64
|
end
|
70
65
|
|
71
66
|
it "requires cpus" do
|
72
67
|
requires_attr(:cpus) {
|
73
|
-
@virtual_machine.create(:label => @valid[:label],
|
68
|
+
@virtual_machine.create(:label => @valid[:label], :hostname => @valid[:hostname],
|
74
69
|
:memory => @valid[:memory])
|
75
70
|
}
|
76
71
|
end
|
77
72
|
|
78
73
|
it "requires cpu_shares" do
|
79
74
|
requires_attr(:cpu_shares) {
|
80
|
-
@virtual_machine.create(:label => @valid[:label],
|
75
|
+
@virtual_machine.create(:label => @valid[:label], :hostname => @valid[:hostname],
|
81
76
|
:memory => @valid[:memory], :cpus => @valid[:cpu_shares])
|
82
77
|
}
|
83
78
|
end
|
84
79
|
|
85
80
|
it "requires primary_disk_size" do
|
86
81
|
requires_attr(:primary_disk_size) {
|
87
|
-
@virtual_machine.create(:label => @valid[:label],
|
88
|
-
:
|
82
|
+
@virtual_machine.create(:label => @valid[:label], :hostname => @valid[:hostname],
|
83
|
+
:memory => @valid[:memory], :cpus => @valid[:cpu_shares],
|
89
84
|
:cpu_shares => @valid[:cpu_shares])
|
90
85
|
}
|
91
86
|
end
|
92
87
|
|
93
88
|
it "raises error on unknown params" do
|
94
89
|
expect {
|
95
|
-
@virtual_machine.create(
|
96
|
-
|
97
|
-
}.to raise_error(ArgumentError, 'Missing required params: primary_disk_size')
|
90
|
+
@virtual_machine.create(@valid.merge(:what => 'what'))
|
91
|
+
}.to raise_error(ArgumentError, 'Unknown params: what')
|
98
92
|
end
|
99
93
|
|
100
94
|
it "allows all optional params" do
|
101
|
-
optional = [:
|
102
|
-
:swap_disk_size,
|
95
|
+
optional = [:swap_disk_size,
|
103
96
|
:primary_network_id,
|
104
97
|
:required_automatic_backup,
|
105
98
|
:rate_limit,
|
@@ -108,20 +101,22 @@ describe Squall::VirtualMachine do
|
|
108
101
|
:admin_note,
|
109
102
|
:note,
|
110
103
|
:allowed_hot_migrate,
|
111
|
-
:
|
104
|
+
:hypervisor_id,
|
112
105
|
:initial_root_password
|
113
106
|
]
|
114
107
|
|
115
108
|
@virtual_machine.should_receive(:request).exactly(optional.size).times.and_return Hash.new('virtual_machine' => [])
|
116
|
-
optional.each do |
|
117
|
-
@virtual_machine.create(@valid.merge(
|
109
|
+
optional.each do |param|
|
110
|
+
@virtual_machine.create(@valid.merge(param => "test"))
|
118
111
|
end
|
119
112
|
end
|
120
113
|
|
121
114
|
it "creates a virtual_machine" do
|
122
|
-
|
123
|
-
|
124
|
-
|
115
|
+
pending "broken in OnApp (triggering the Network Interfaces error): see README (and update when fixed)" do
|
116
|
+
virtual_machine = @virtual_machine.create(@valid)
|
117
|
+
@valid.each do |k,v|
|
118
|
+
virtual_machine[k].should == @valid[k.to_s]
|
119
|
+
end
|
125
120
|
end
|
126
121
|
end
|
127
122
|
end
|
@@ -140,20 +135,19 @@ describe Squall::VirtualMachine do
|
|
140
135
|
end
|
141
136
|
|
142
137
|
it "raises error on unknown params" do
|
143
|
-
expect { @virtual_machine.build(1, :asdf => 1) }.to raise_error(ArgumentError, 'Unknown params: asdf')
|
138
|
+
expect { @virtual_machine.build(1, :template_id => 1, :asdf => 1) }.to raise_error(ArgumentError, 'Unknown params: asdf')
|
144
139
|
@virtual_machine.success.should be_false
|
145
140
|
end
|
146
141
|
|
147
142
|
it "returns not found for invalid virtual_machines" do
|
148
|
-
expect { @virtual_machine.build(404) }.to raise_error(Squall::NotFound)
|
143
|
+
expect { @virtual_machine.build(404, :template_id => 1) }.to raise_error(Squall::NotFound)
|
149
144
|
@virtual_machine.success.should be_false
|
150
145
|
end
|
151
146
|
|
152
147
|
it "builds the VM" do
|
153
|
-
build = @virtual_machine.build(72)
|
148
|
+
build = @virtual_machine.build(72, :template_id => 1)
|
154
149
|
|
155
150
|
@virtual_machine.success.should be_true
|
156
|
-
build['label'].should == 'Testingagain'
|
157
151
|
end
|
158
152
|
end
|
159
153
|
|
@@ -226,9 +220,11 @@ describe Squall::VirtualMachine do
|
|
226
220
|
@virtual_machine.success.should be_false
|
227
221
|
end
|
228
222
|
|
229
|
-
|
230
|
-
|
231
|
-
|
223
|
+
pending "this should raise a 422 on OnApp's side, but it's currently raising a 500 which causes HTTParty to explode, see README (and update when fixed)" do
|
224
|
+
it "returns error on unknown user" do
|
225
|
+
expect { @virtual_machine.change_owner(1, 2) }.to raise_error(Squall::ServerError)
|
226
|
+
@virtual_machine.success.should be_false
|
227
|
+
end
|
232
228
|
end
|
233
229
|
|
234
230
|
it "changes the user" do
|
@@ -261,6 +257,24 @@ describe Squall::VirtualMachine do
|
|
261
257
|
@virtual_machine.success.should be_true
|
262
258
|
end
|
263
259
|
end
|
260
|
+
|
261
|
+
describe "#set_ssh_keys" do
|
262
|
+
use_vcr_cassette "virtual_machine/set_ssh_keys"
|
263
|
+
it "requires an id" do
|
264
|
+
expect { @virtual_machine.set_ssh_keys }.to raise_error(ArgumentError)
|
265
|
+
@virtual_machine.success.should be_false
|
266
|
+
end
|
267
|
+
|
268
|
+
it "404s on not found" do
|
269
|
+
expect { @virtual_machine.set_ssh_keys(404) }.to raise_error(Squall::NotFound)
|
270
|
+
@virtual_machine.success.should be_false
|
271
|
+
end
|
272
|
+
|
273
|
+
it "sets the SSH keys" do
|
274
|
+
result = @virtual_machine.set_ssh_keys(1)
|
275
|
+
@virtual_machine.success.should be_true
|
276
|
+
end
|
277
|
+
end
|
264
278
|
|
265
279
|
describe "#migrate" do
|
266
280
|
use_vcr_cassette "virtual_machine/migrate"
|
@@ -275,7 +289,7 @@ describe Squall::VirtualMachine do
|
|
275
289
|
end
|
276
290
|
|
277
291
|
it "accepts cold_migrate_on_rollback" do
|
278
|
-
hash = [:post, "/virtual_machines/1/migrate.json", {:query => {:destination => 1, :cold_migrate_on_rollback => 1} }]
|
292
|
+
hash = [:post, "/virtual_machines/1/migrate.json", {:query => {:virtual_machine => {:destination => 1, :cold_migrate_on_rollback => 1}} }]
|
279
293
|
@virtual_machine.should_receive(:request).with(*hash).once.and_return({'virtual_machine'=>{}})
|
280
294
|
@virtual_machine.migrate 1, :destination => 1, :cold_migrate_on_rollback => 1
|
281
295
|
end
|
@@ -285,18 +299,40 @@ describe Squall::VirtualMachine do
|
|
285
299
|
@virtual_machine.success.should be_false
|
286
300
|
end
|
287
301
|
|
288
|
-
it "
|
289
|
-
|
290
|
-
expect { @virtual_machine.migrate(1, :destination => 404) }.to raise_error(Squall::ServerError)
|
302
|
+
it "404s on unknown destination" do
|
303
|
+
expect { @virtual_machine.migrate(1, :destination => 404) }.to raise_error(Squall::NotFound)
|
291
304
|
@virtual_machine.success.should be_false
|
292
|
-
end
|
293
305
|
end
|
294
306
|
|
295
|
-
it "changes the
|
307
|
+
it "changes the hypervisor" do
|
296
308
|
pending "Broken in OnApp" do
|
297
309
|
result = @virtual_machine.migrate(1, :destination => 2)
|
298
310
|
@virtual_machine.success.should be_true
|
299
|
-
result['hypervisor_id'].should == 2
|
311
|
+
result['virtual_machine']['hypervisor_id'].should == 2
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
describe "#set_vip" do
|
317
|
+
use_vcr_cassette "virtual_machine/set_vip"
|
318
|
+
it "requires an id" do
|
319
|
+
expect { @virtual_machine.set_vip }.to raise_error(ArgumentError)
|
320
|
+
end
|
321
|
+
|
322
|
+
it "returns not found for invalid virtual_machines" do
|
323
|
+
expect { @virtual_machine.set_vip(404) }.to raise_error(Squall::NotFound)
|
324
|
+
end
|
325
|
+
|
326
|
+
it "deletes a virtual_machine" do
|
327
|
+
@virtual_machine.set_vip(1)
|
328
|
+
@virtual_machine.success.should be_true
|
329
|
+
end
|
330
|
+
|
331
|
+
it "sets the vip status to false if currently true" do
|
332
|
+
pending "No way to actually test this without being able to interact with server state" do
|
333
|
+
result = @virtual_machine.set_vip(1)
|
334
|
+
result['virtual_machine']['vip'].should be_false
|
335
|
+
flunk("currently untestable, so make sure it doesn't pass by accident")
|
300
336
|
end
|
301
337
|
end
|
302
338
|
end
|
@@ -312,7 +348,7 @@ describe Squall::VirtualMachine do
|
|
312
348
|
end
|
313
349
|
|
314
350
|
it "deletes a virtual_machine" do
|
315
|
-
virtual_machine = @virtual_machine.delete(
|
351
|
+
virtual_machine = @virtual_machine.delete(1)
|
316
352
|
@virtual_machine.success.should be_true
|
317
353
|
end
|
318
354
|
end
|
@@ -326,24 +362,41 @@ describe Squall::VirtualMachine do
|
|
326
362
|
it "returns not found for invalid virtual_machines" do
|
327
363
|
expect { @virtual_machine.resize(404, :memory => 1) }.to raise_error(Squall::NotFound)
|
328
364
|
end
|
329
|
-
|
330
|
-
it "
|
331
|
-
@virtual_machine.
|
332
|
-
|
365
|
+
|
366
|
+
it "accepts memory" do
|
367
|
+
hash = [:post, "/virtual_machines/1/resize.json", @virtual_machine.default_params(:memory => 1)]
|
368
|
+
@virtual_machine.should_receive(:request).with(*hash).once.and_return({'virtual_machine'=>{}})
|
369
|
+
@virtual_machine.resize 1, :memory => 1
|
333
370
|
end
|
334
|
-
|
335
|
-
it "accepts
|
336
|
-
hash = [:post, "/virtual_machines/1/resize.json", @virtual_machine.default_params(:
|
371
|
+
|
372
|
+
it "accepts cpus" do
|
373
|
+
hash = [:post, "/virtual_machines/1/resize.json", @virtual_machine.default_params(:cpus => 1)]
|
374
|
+
@virtual_machine.should_receive(:request).with(*hash).once.and_return({'virtual_machine'=>{}})
|
375
|
+
@virtual_machine.resize 1, :cpus => 1
|
376
|
+
end
|
377
|
+
|
378
|
+
it "accepts cpu_shares" do
|
379
|
+
hash = [:post, "/virtual_machines/1/resize.json", @virtual_machine.default_params(:cpu_shares => 1)]
|
380
|
+
@virtual_machine.should_receive(:request).with(*hash).once.and_return({'virtual_machine'=>{}})
|
381
|
+
@virtual_machine.resize 1, :cpu_shares => 1
|
382
|
+
end
|
383
|
+
|
384
|
+
it "accepts allow_cold_resize" do
|
385
|
+
hash = [:post, "/virtual_machines/1/resize.json", @virtual_machine.default_params(:allow_cold_resize => 1)]
|
337
386
|
@virtual_machine.should_receive(:request).with(*hash).once.and_return({'virtual_machine'=>{}})
|
338
|
-
@virtual_machine.resize 1, :
|
387
|
+
@virtual_machine.resize 1, :allow_cold_resize => 1
|
339
388
|
end
|
340
389
|
|
341
390
|
it "resizes a virtual_machine" do
|
342
|
-
virtual_machine = @virtual_machine.resize(
|
391
|
+
virtual_machine = @virtual_machine.resize(1, :memory => 1000)
|
343
392
|
@virtual_machine.success.should be_true
|
344
393
|
|
345
394
|
virtual_machine['memory'].should == 1000
|
346
395
|
end
|
396
|
+
|
397
|
+
it "requires at least one option" do
|
398
|
+
expect { @virtual_machine.resize(1) }.to raise_error(ArgumentError)
|
399
|
+
end
|
347
400
|
end
|
348
401
|
|
349
402
|
describe "#suspend" do
|
@@ -362,22 +415,6 @@ describe Squall::VirtualMachine do
|
|
362
415
|
end
|
363
416
|
end
|
364
417
|
|
365
|
-
describe "#unsuspend" do
|
366
|
-
use_vcr_cassette "virtual_machine/unsuspend"
|
367
|
-
it "requires an id" do
|
368
|
-
expect { @virtual_machine.unsuspend }.to raise_error(ArgumentError)
|
369
|
-
end
|
370
|
-
|
371
|
-
it "returns not found for invalid virtual_machines" do
|
372
|
-
expect { @virtual_machine.unsuspend(404) }.to raise_error(Squall::NotFound)
|
373
|
-
end
|
374
|
-
|
375
|
-
it "unsuspends a virtual_machine" do
|
376
|
-
virtual_machine = @virtual_machine.unsuspend(1)
|
377
|
-
virtual_machine['suspended'].should be_false
|
378
|
-
end
|
379
|
-
end
|
380
|
-
|
381
418
|
describe "#unlock" do
|
382
419
|
use_vcr_cassette "virtual_machine/unlock"
|
383
420
|
it "requires an id" do
|
@@ -427,7 +464,6 @@ describe Squall::VirtualMachine do
|
|
427
464
|
it "will shutdown a virtual_machine" do
|
428
465
|
virtual_machine = @virtual_machine.shutdown(1)
|
429
466
|
@virtual_machine.success.should be_true
|
430
|
-
virtual_machine['id'].should == 1
|
431
467
|
end
|
432
468
|
end
|
433
469
|
|
@@ -446,7 +482,6 @@ describe Squall::VirtualMachine do
|
|
446
482
|
it "will stop a virtual_machine" do
|
447
483
|
virtual_machine = @virtual_machine.stop(1)
|
448
484
|
@virtual_machine.success.should be_true
|
449
|
-
virtual_machine['id'].should == 1
|
450
485
|
end
|
451
486
|
end
|
452
487
|
|
@@ -465,7 +500,84 @@ describe Squall::VirtualMachine do
|
|
465
500
|
it "will reboot a virtual_machine" do
|
466
501
|
virtual_machine = @virtual_machine.reboot(1)
|
467
502
|
@virtual_machine.success.should be_true
|
468
|
-
|
503
|
+
end
|
504
|
+
|
505
|
+
it "reboots in recovery" do
|
506
|
+
hash = [:post, "/virtual_machines/1/reboot.json", {:query => {:mode => :recovery}}]
|
507
|
+
@virtual_machine.should_receive(:request).with(*hash).once.and_return({'virtual_machine'=>{}})
|
508
|
+
@virtual_machine.reboot 1, true
|
509
|
+
end
|
510
|
+
end
|
511
|
+
|
512
|
+
describe "#segregate" do
|
513
|
+
use_vcr_cassette "virtual_machine/segregate"
|
514
|
+
it "requires an id" do
|
515
|
+
expect { @virtual_machine.segregate }.to raise_error(ArgumentError)
|
516
|
+
@virtual_machine.success.should be_false
|
517
|
+
end
|
518
|
+
|
519
|
+
it "requires a target_vm_id" do
|
520
|
+
expect { @virtual_machine.segregate 1 }.to raise_error(ArgumentError)
|
521
|
+
@virtual_machine.success.should be_false
|
522
|
+
end
|
523
|
+
|
524
|
+
it "404s on not found" do
|
525
|
+
expect { @virtual_machine.segregate(404, 1) }.to raise_error(Squall::NotFound)
|
526
|
+
@virtual_machine.success.should be_false
|
527
|
+
end
|
528
|
+
|
529
|
+
it "returns 404 on unknown target vm id" do
|
530
|
+
expect { @virtual_machine.segregate(1, 404) }.to raise_error(Squall::NotFound)
|
531
|
+
@virtual_machine.success.should be_false
|
532
|
+
end
|
533
|
+
|
534
|
+
it "changes the user" do
|
535
|
+
result = @virtual_machine.segregate(1, 2)
|
536
|
+
@virtual_machine.success.should be_true
|
537
|
+
end
|
538
|
+
end
|
539
|
+
|
540
|
+
describe "#console" do
|
541
|
+
use_vcr_cassette "virtual_machine/console"
|
542
|
+
it "requires an id" do
|
543
|
+
expect { @virtual_machine.console }.to raise_error(ArgumentError)
|
544
|
+
@virtual_machine.success.should be_false
|
545
|
+
end
|
546
|
+
|
547
|
+
it "returns not found for invalid virtual_machines" do
|
548
|
+
pending "broken on OnApp (returning 500)" do
|
549
|
+
expect { @virtual_machine.console(404) }.to raise_error(Squall::NotFound)
|
550
|
+
@virtual_machine.success.should be_false
|
551
|
+
end
|
552
|
+
end
|
553
|
+
|
554
|
+
it "will reboot a virtual_machine" do
|
555
|
+
pending "broken on OnApp (returning 500)" do
|
556
|
+
virtual_machine = @virtual_machine.console(1)
|
557
|
+
@virtual_machine.success.should be_true
|
558
|
+
end
|
559
|
+
end
|
560
|
+
end
|
561
|
+
|
562
|
+
describe "#stats" do
|
563
|
+
use_vcr_cassette "virtual_machine/stats"
|
564
|
+
it "requires an id" do
|
565
|
+
expect { @virtual_machine.stats }.to raise_error(ArgumentError)
|
566
|
+
@virtual_machine.success.should be_false
|
567
|
+
end
|
568
|
+
|
569
|
+
it "returns not found for invalid virtual_machines" do
|
570
|
+
pending "broken on OnApp (returning 500)" do
|
571
|
+
expect { @virtual_machine.stats(404) }.to raise_error(Squall::NotFound)
|
572
|
+
@virtual_machine.success.should be_false
|
573
|
+
end
|
574
|
+
end
|
575
|
+
|
576
|
+
it "will stop a virtual_machine" do
|
577
|
+
pending "broken on OnApp (returning 500)" do
|
578
|
+
virtual_machine = @virtual_machine.stats(1)
|
579
|
+
@virtual_machine.success.should be_true
|
580
|
+
end
|
469
581
|
end
|
470
582
|
end
|
471
583
|
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Squall::Whitelist do
|
4
|
+
before(:each) do
|
5
|
+
@whitelist = Squall::Whitelist.new
|
6
|
+
@valid = {:ip => "192.168.1.1"}
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#list" do
|
10
|
+
use_vcr_cassette "whitelist/list"
|
11
|
+
|
12
|
+
it "requires user id" do
|
13
|
+
expect { @whitelist.list }.to raise_error(ArgumentError)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns a user's whitelists" do
|
17
|
+
whitelists = @whitelist.list(1)
|
18
|
+
whitelists.should be_an(Array)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "contains the whitelists data" do
|
22
|
+
whitelists = @whitelist.list(1)
|
23
|
+
whitelists.all? {|w| w.is_a?(Hash) }.should be_true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#show" do
|
28
|
+
use_vcr_cassette "whitelist/show"
|
29
|
+
it "requires an id" do
|
30
|
+
expect { @whitelist.show(1) }.to raise_error(ArgumentError)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "returns not found for invalid whitelists" do
|
34
|
+
expect { @whitelist.show(1, 404) }.to raise_error(Squall::NotFound)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns a whitelist" do
|
38
|
+
whitelist = @whitelist.show(1, 2)
|
39
|
+
whitelist.should be_a(Hash)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#create" do
|
44
|
+
use_vcr_cassette "whitelist/create"
|
45
|
+
it "requires amount" do
|
46
|
+
invalid = @valid.reject{|k,v| k == :ip }
|
47
|
+
requires_attr(:ip) { @whitelist.create(1, invalid) }
|
48
|
+
end
|
49
|
+
|
50
|
+
it "allows all optional params" do
|
51
|
+
optional = [:description]
|
52
|
+
@whitelist.should_receive(:request).exactly(optional.size).times.and_return Hash.new("whitelist" => {})
|
53
|
+
optional.each do |param|
|
54
|
+
@whitelist.create(1, @valid.merge(param => "test"))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it "raises error on unknown params" do
|
59
|
+
expect { @whitelist.create(1, @valid.merge(:what => 'what')) }.to raise_error(ArgumentError, 'Unknown params: what')
|
60
|
+
end
|
61
|
+
|
62
|
+
it "raises an error for an invalid user id" do
|
63
|
+
expect { @whitelist.create(404, @valid) }.to raise_error(Squall::NotFound)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "creates a whitelist for a user" do
|
67
|
+
@whitelist.create(1, @valid)
|
68
|
+
@whitelist.success.should be_true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#edit" do
|
73
|
+
use_vcr_cassette "whitelist/edit"
|
74
|
+
|
75
|
+
it "allows select params" do
|
76
|
+
optional = [:ip, :description]
|
77
|
+
@whitelist.should_receive(:request).exactly(optional.size).times.and_return Hash.new()
|
78
|
+
optional.each do |param|
|
79
|
+
@whitelist.edit(1, 1, param => "test")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it "raises error on unknown params" do
|
84
|
+
expect { @whitelist.edit(1, 1, :what => 'what') }.to raise_error(ArgumentError, 'Unknown params: what')
|
85
|
+
end
|
86
|
+
|
87
|
+
it "edits a whitelist" do
|
88
|
+
@whitelist.edit(1, 1, :description => "This is actually a different computer.")
|
89
|
+
@whitelist.success.should be_true
|
90
|
+
end
|
91
|
+
|
92
|
+
it "raises an error for an invalid whitelist id" do
|
93
|
+
expect { @whitelist.edit(1, 404, @valid) }.to raise_error(Squall::NotFound)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#delete" do
|
98
|
+
use_vcr_cassette "whitelist/delete"
|
99
|
+
it "requires an id" do
|
100
|
+
expect { @whitelist.delete }.to raise_error(ArgumentError)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "deletes a whitelist" do
|
104
|
+
@whitelist.delete(1, 1)
|
105
|
+
@whitelist.success.should be_true
|
106
|
+
end
|
107
|
+
|
108
|
+
it "returns NotFound for missing user" do
|
109
|
+
expect { @whitelist.delete(1, 404) }.to raise_error(Squall::NotFound)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
data/spec/squall_spec.rb
CHANGED
@@ -14,12 +14,14 @@ describe Squall do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "returns the config after yield" do
|
17
|
+
Squall.reset_config
|
17
18
|
Squall.config { |c| c }.should == {}
|
18
19
|
Squall.config.should == {}
|
19
20
|
end
|
20
21
|
|
21
22
|
|
22
23
|
it "returns the config without a block" do
|
24
|
+
Squall.reset_config
|
23
25
|
Squall.config.should == {}
|
24
26
|
end
|
25
27
|
|
@@ -32,7 +34,6 @@ describe Squall do
|
|
32
34
|
|
33
35
|
describe "#reset" do
|
34
36
|
it "resets the configuration to defaults" do
|
35
|
-
default_config
|
36
37
|
Squall.config.should_not be_empty
|
37
38
|
Squall.reset_config
|
38
39
|
Squall.config.should be_empty
|
@@ -41,15 +42,10 @@ describe Squall do
|
|
41
42
|
|
42
43
|
describe "#config_file" do
|
43
44
|
it "defaults to ~/.squall" do
|
44
|
-
|
45
|
-
config = {'username' => 'test', 'password' => 'pass', 'base_uri' => 'http://example.com'}
|
46
|
-
|
45
|
+
File.should_receive(:join).with(ENV['HOME'], '.squall.yml').and_return("/path/to/file")
|
47
46
|
File.stub(:exists?).and_return(true)
|
48
|
-
YAML.
|
49
|
-
|
50
|
-
Squall.configuration_file.should be_nil
|
47
|
+
YAML.stub(:load_file).and_return({})
|
51
48
|
Squall.config_file
|
52
|
-
Squall.configuration_file.should == file
|
53
49
|
end
|
54
50
|
|
55
51
|
it "returns an error if the file doesn't exist" do
|
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :post
|
5
|
+
uri: http://<USER>:<PASS>@<URL>:80/data_store_zones.json?pack[label]=My%20zone
|
6
|
+
body:
|
7
|
+
headers:
|
8
|
+
content-type:
|
9
|
+
- application/json
|
10
|
+
authorization:
|
11
|
+
- Basic <REDACTED>
|
12
|
+
response: !ruby/struct:VCR::Response
|
13
|
+
status: !ruby/struct:VCR::ResponseStatus
|
14
|
+
code: 201
|
15
|
+
message: Created
|
16
|
+
headers:
|
17
|
+
x-ua-compatible:
|
18
|
+
- IE=Edge,chrome=1
|
19
|
+
location:
|
20
|
+
- http://<URL>/data_store_zones/30
|
21
|
+
x-powered-by:
|
22
|
+
- Phusion Passenger (mod_rails/mod_rack) 3.0.1
|
23
|
+
content-type:
|
24
|
+
- application/json; charset=utf-8
|
25
|
+
x-runtime:
|
26
|
+
- "0.044737"
|
27
|
+
server:
|
28
|
+
- Apache/2.2.3 (CentOS)
|
29
|
+
date:
|
30
|
+
- Tue, 14 Feb 2012 14:59:58 GMT
|
31
|
+
set-cookie:
|
32
|
+
- <REDACTED>
|
33
|
+
status:
|
34
|
+
- "201"
|
35
|
+
cache-control:
|
36
|
+
- no-cache
|
37
|
+
transfer-encoding:
|
38
|
+
- chunked
|
39
|
+
body: "{\"data_store_group\":{\"label\":\"My zone\",\"created_at\":\"2012-02-14T14:59:58Z\",\"updated_at\":\"2012-02-14T14:59:58Z\",\"id\":30}}"
|
40
|
+
http_version: "1.1"
|
@@ -0,0 +1,77 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :delete
|
5
|
+
uri: http://<USER>:<PASS>@<URL>:80/data_store_zones/1.json
|
6
|
+
body:
|
7
|
+
headers:
|
8
|
+
content-type:
|
9
|
+
- application/json
|
10
|
+
authorization:
|
11
|
+
- Basic <REDACTED>
|
12
|
+
response: !ruby/struct:VCR::Response
|
13
|
+
status: !ruby/struct:VCR::ResponseStatus
|
14
|
+
code: 200
|
15
|
+
message: OK
|
16
|
+
headers:
|
17
|
+
x-ua-compatible:
|
18
|
+
- IE=Edge,chrome=1
|
19
|
+
x-powered-by:
|
20
|
+
- Phusion Passenger (mod_rails/mod_rack) 3.0.1
|
21
|
+
etag:
|
22
|
+
- "\"99914b932bd37a50b983c5e7c90ae93b\""
|
23
|
+
content-type:
|
24
|
+
- application/json; charset=utf-8
|
25
|
+
date:
|
26
|
+
- Tue, 14 Feb 2012 15:05:56 GMT
|
27
|
+
server:
|
28
|
+
- Apache/2.2.3 (CentOS)
|
29
|
+
x-runtime:
|
30
|
+
- "0.036527"
|
31
|
+
set-cookie:
|
32
|
+
- <REDACTED>
|
33
|
+
cache-control:
|
34
|
+
- max-age=0, private, must-revalidate
|
35
|
+
status:
|
36
|
+
- "200"
|
37
|
+
transfer-encoding:
|
38
|
+
- chunked
|
39
|
+
body: "{}"
|
40
|
+
http_version: "1.1"
|
41
|
+
- !ruby/struct:VCR::HTTPInteraction
|
42
|
+
request: !ruby/struct:VCR::Request
|
43
|
+
method: :delete
|
44
|
+
uri: http://<USER>:<PASS>@<URL>:80/data_store_zones/404.json
|
45
|
+
body:
|
46
|
+
headers:
|
47
|
+
content-type:
|
48
|
+
- application/json
|
49
|
+
authorization:
|
50
|
+
- Basic <REDACTED>
|
51
|
+
response: !ruby/struct:VCR::Response
|
52
|
+
status: !ruby/struct:VCR::ResponseStatus
|
53
|
+
code: 404
|
54
|
+
message: Not Found
|
55
|
+
headers:
|
56
|
+
x-ua-compatible:
|
57
|
+
- IE=Edge,chrome=1
|
58
|
+
x-powered-by:
|
59
|
+
- Phusion Passenger (mod_rails/mod_rack) 3.0.1
|
60
|
+
content-type:
|
61
|
+
- application/json; charset=utf-8
|
62
|
+
x-runtime:
|
63
|
+
- "0.037065"
|
64
|
+
server:
|
65
|
+
- Apache/2.2.3 (CentOS)
|
66
|
+
date:
|
67
|
+
- Tue, 14 Feb 2012 15:05:56 GMT
|
68
|
+
set-cookie:
|
69
|
+
- <REDACTED>
|
70
|
+
status:
|
71
|
+
- "404"
|
72
|
+
cache-control:
|
73
|
+
- no-cache
|
74
|
+
transfer-encoding:
|
75
|
+
- chunked
|
76
|
+
body: "{\"errors\":[\"Resource not found\"]}"
|
77
|
+
http_version: "1.1"
|