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
data/spec/squall/role_spec.rb
CHANGED
@@ -2,22 +2,14 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Squall::Role do
|
4
4
|
before(:each) do
|
5
|
-
default_config
|
6
5
|
@role = Squall::Role.new
|
7
|
-
@keys = ["label", "created_at", "updated_at", "id", "permissions", "identifier"]
|
8
6
|
end
|
9
7
|
|
10
8
|
describe "#list" do
|
11
9
|
use_vcr_cassette "role/list"
|
12
10
|
it "returns roles" do
|
13
11
|
roles = @role.list
|
14
|
-
roles.
|
15
|
-
end
|
16
|
-
|
17
|
-
it "contains the role of a user" do
|
18
|
-
role = @role.list.first
|
19
|
-
role.keys.should include(*@keys)
|
20
|
-
role['label'].should == "Administrator"
|
12
|
+
roles.all?{|r| r.first == "role"}
|
21
13
|
end
|
22
14
|
end
|
23
15
|
|
@@ -27,14 +19,13 @@ describe Squall::Role do
|
|
27
19
|
expect { @role.show }.to raise_error(ArgumentError)
|
28
20
|
end
|
29
21
|
|
30
|
-
it "returns
|
31
|
-
expect { @role.show(
|
22
|
+
it "returns 404 for invalid id" do
|
23
|
+
expect { @role.show(404) }.to raise_error(Squall::NotFound)
|
32
24
|
end
|
33
25
|
|
34
26
|
it "returns a role" do
|
35
27
|
role = @role.show(1)
|
36
|
-
role.
|
37
|
-
role['label'].should == "Administrator"
|
28
|
+
role.should be_a(Hash)
|
38
29
|
end
|
39
30
|
end
|
40
31
|
|
@@ -44,21 +35,23 @@ describe Squall::Role do
|
|
44
35
|
expect { @role.edit }.to raise_error(ArgumentError)
|
45
36
|
end
|
46
37
|
|
47
|
-
it "returns
|
48
|
-
expect { @role.edit(
|
38
|
+
it "returns 404 for invalid id" do
|
39
|
+
expect { @role.edit(404) }.to raise_error(Squall::NotFound)
|
49
40
|
end
|
50
41
|
|
51
|
-
it "allows
|
52
|
-
|
42
|
+
it "allows all optional params" do
|
43
|
+
optional = [:label, :permission_ids]
|
44
|
+
optional.each do |param|
|
45
|
+
args = [:put, '/roles/1.json', @role.default_params(param => 1)]
|
46
|
+
@role.should_receive(:request).with(*args).once.and_return([])
|
47
|
+
@role.edit(1, param => 1 )
|
48
|
+
end
|
53
49
|
end
|
54
50
|
|
55
51
|
it "updates the role" do
|
56
52
|
pending "OnApp is returning an empty response" do
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
new_role = @role.edit(3, :label => 'New')
|
61
|
-
new_role['label'].should == 'New'
|
53
|
+
role = @role.edit(1, :label => 'New')
|
54
|
+
role['label'].should == 'New'
|
62
55
|
end
|
63
56
|
end
|
64
57
|
end
|
@@ -81,43 +74,35 @@ describe Squall::Role do
|
|
81
74
|
|
82
75
|
describe "#permissions" do
|
83
76
|
use_vcr_cassette "role/permissions"
|
77
|
+
|
84
78
|
it "returns permissions" do
|
85
79
|
permissions = @role.permissions
|
86
|
-
permissions.
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
keys.each do |key|
|
93
|
-
first[key].should_not be_nil
|
94
|
-
first[key].to_s.size.should be >= 1
|
95
|
-
end
|
80
|
+
permissions.should be_an(Array)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "contains role data" do
|
84
|
+
permissions = @role.permissions
|
85
|
+
permissions.all?.should be_true
|
96
86
|
end
|
87
|
+
|
97
88
|
end
|
98
89
|
|
99
90
|
describe "#create" do
|
100
91
|
use_vcr_cassette "role/create"
|
101
|
-
it "requires login" do
|
102
|
-
requires_attr(:label) { @role.create }
|
103
|
-
end
|
104
92
|
|
105
93
|
it "requires label" do
|
106
|
-
requires_attr(:
|
94
|
+
requires_attr(:label) { @role.create }
|
107
95
|
end
|
108
|
-
|
109
|
-
it "
|
110
|
-
|
111
|
-
|
112
|
-
}.to raise_error(Squall::RequestError)
|
113
|
-
@role.errors['identifier'].should include("has already been taken")
|
96
|
+
|
97
|
+
it "allows permission_ids" do
|
98
|
+
@role.should_receive(:request).once.and_return Hash.new('role' => [])
|
99
|
+
@role.create(:label => "test", :permission_ids => 1)
|
114
100
|
end
|
115
101
|
|
116
102
|
it "creates a role" do
|
117
|
-
|
118
|
-
role
|
119
|
-
role['
|
120
|
-
role['identifier'].should == value[:identifier]
|
103
|
+
response = @role.create({:label => 'Test Create', :permission_ids => 1})
|
104
|
+
response["role"]['label'].should == 'Test Create'
|
105
|
+
response["role"]['permissions'].should_not be_empty
|
121
106
|
end
|
122
107
|
end
|
123
108
|
end
|
@@ -2,22 +2,20 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Squall::Statistic do
|
4
4
|
before(:each) do
|
5
|
-
default_config
|
6
5
|
@statistic = Squall::Statistic.new
|
7
6
|
end
|
8
7
|
|
9
8
|
describe "#usage_statistic" do
|
10
9
|
use_vcr_cassette "statistic/usage_statistics"
|
11
10
|
|
12
|
-
it "requires an id" do
|
13
|
-
expect { @statistic.daily_stats }.to raise_error(ArgumentError)
|
14
|
-
@statistic.success.should be_false
|
15
|
-
end
|
16
|
-
|
17
11
|
it "returns the daily statistics" do
|
18
|
-
result = @statistic.daily_stats
|
19
|
-
result
|
20
|
-
|
12
|
+
result = @statistic.daily_stats
|
13
|
+
result.should be_an(Array)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "contains the statistic data" do
|
17
|
+
result = @statistic.daily_stats
|
18
|
+
result.all?.should be_true
|
21
19
|
end
|
22
20
|
end
|
23
21
|
end
|
@@ -9,17 +9,16 @@ end
|
|
9
9
|
|
10
10
|
describe Squall::Base do
|
11
11
|
before(:each) do
|
12
|
-
default_config
|
13
12
|
@base = Squall::Base.new
|
14
13
|
end
|
15
14
|
|
16
15
|
describe "#initialize" do
|
17
16
|
it "sets the base_uri" do
|
18
|
-
@base.class.base_uri.
|
17
|
+
@base.class.base_uri.should_not be_nil
|
19
18
|
end
|
20
19
|
|
21
20
|
it "sets credentials" do
|
22
|
-
@base.class.default_options[:basic_auth].should include(:username
|
21
|
+
@base.class.default_options[:basic_auth].should include(:username, :password)
|
23
22
|
end
|
24
23
|
|
25
24
|
it "uses JSON" do
|
@@ -34,11 +33,10 @@ describe Squall::Base do
|
|
34
33
|
describe "#request" do
|
35
34
|
it "200-207 returns success" do
|
36
35
|
(200..207).each do |i|
|
37
|
-
mock_request(:get, "/#{i}", :status => [i, "OK"], :body => "
|
36
|
+
mock_request(:get, "/#{i}", :status => [i, "OK"], :body => "{\"something\":[\"OK\"]}")
|
38
37
|
base = Squall::Base.new
|
39
38
|
base.request(:get, "/#{i}")
|
40
39
|
base.success.should be_true
|
41
|
-
base.result.should match(/OK/)
|
42
40
|
end
|
43
41
|
end
|
44
42
|
|
@@ -68,13 +66,13 @@ describe Squall::Base do
|
|
68
66
|
|
69
67
|
describe "#errors" do
|
70
68
|
it "is empty on success" do
|
71
|
-
mock_request(:get, '/200_errors', :status => [200, "OK"], :body =>
|
69
|
+
mock_request(:get, '/200_errors', :status => [200, "OK"], :body => "{\"something\":[\"errors\"]}")
|
72
70
|
@base.request(:get, '/200_errors')
|
73
71
|
@base.errors.should be_empty
|
74
72
|
end
|
75
73
|
|
76
74
|
it "returns an error hash" do
|
77
|
-
mock_request(:get, '/500_errors', :status => [500, "Internal Server Error"], :body =>
|
75
|
+
mock_request(:get, '/500_errors', :status => [500, "Internal Server Error"], :body => "{\"something\":[\"errors\"]}")
|
78
76
|
expect { @base.request(:get, '/500_errors') }.to raise_error(Squall::ServerError)
|
79
77
|
@base.errors.should_not be_empty
|
80
78
|
end
|
File without changes
|
File without changes
|
@@ -2,7 +2,6 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Squall::Template do
|
4
4
|
before(:each) do
|
5
|
-
default_config
|
6
5
|
@template = Squall::Template.new
|
7
6
|
@keys = ["label", "operating_system_distro", "operating_system_arch", "created_at",
|
8
7
|
"operating_system_tail", "operating_system", "updated_at", "operating_system_edition",
|
@@ -2,7 +2,6 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Squall::Transaction do
|
4
4
|
before(:each) do
|
5
|
-
default_config
|
6
5
|
@transaction = Squall::Transaction.new
|
7
6
|
@keys = ["pid", "created_at", "updated_at", "actor", "priority",
|
8
7
|
"parent_type", "action", "id", "user_id", "dependent_transaction_id",
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Squall::UserGroup do
|
4
|
+
before(:each) do
|
5
|
+
@keys = ["amount"]
|
6
|
+
@user_group = Squall::UserGroup.new
|
7
|
+
@valid = {:label => "My new group"}
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#list" do
|
11
|
+
use_vcr_cassette "user_group/list"
|
12
|
+
|
13
|
+
it "returns a list of user groups" do
|
14
|
+
user_groups = @user_group.list
|
15
|
+
user_groups.should be_an(Array)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "contains first user group's data" do
|
19
|
+
user_group = @user_group.list.first
|
20
|
+
user_group.should be_a(Hash)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#create" do
|
25
|
+
use_vcr_cassette "user_group/create"
|
26
|
+
it "requires label" do
|
27
|
+
invalid = @valid.reject{|k,v| k == :label }
|
28
|
+
requires_attr(:label) { @user_group.create(invalid) }
|
29
|
+
end
|
30
|
+
|
31
|
+
it "raises error on unknown params" do
|
32
|
+
expect { @user_group.create(@valid.merge(:what => 'what')) }.to raise_error(ArgumentError, 'Unknown params: what')
|
33
|
+
end
|
34
|
+
|
35
|
+
it "creates a user group" do
|
36
|
+
@user_group.create(@valid)
|
37
|
+
@user_group.success.should be_true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "#edit" do
|
42
|
+
use_vcr_cassette "user_group/edit"
|
43
|
+
|
44
|
+
it "raises error on unknown params" do
|
45
|
+
expect { @user_group.edit(1, :what => 'what') }.to raise_error(ArgumentError, 'Unknown params: what')
|
46
|
+
end
|
47
|
+
|
48
|
+
it "edits a user group" do
|
49
|
+
@user_group.edit(1, @valid)
|
50
|
+
@user_group.success.should be_true
|
51
|
+
end
|
52
|
+
|
53
|
+
it "raises an error for an invalid user group id" do
|
54
|
+
expect { @user_group.edit(404, @valid) }.to raise_error(Squall::NotFound)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#delete" do
|
59
|
+
use_vcr_cassette "user_group/delete"
|
60
|
+
it "requires an id" do
|
61
|
+
expect { @user_group.delete }.to raise_error(ArgumentError)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "deletes a user group" do
|
65
|
+
@user_group.delete(1)
|
66
|
+
@user_group.success.should be_true
|
67
|
+
end
|
68
|
+
|
69
|
+
it "returns NotFound for missing user" do
|
70
|
+
expect { @user_group.delete(404) }.to raise_error(Squall::NotFound)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
data/spec/squall/user_spec.rb
CHANGED
@@ -2,46 +2,83 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Squall::User do
|
4
4
|
before(:each) do
|
5
|
-
default_config
|
6
5
|
@keys = ["total_amount", "activated_at", "created_at", "memory_available", "remember_token_expires_at",
|
7
6
|
"used_disk_size", "deleted_at", "updated_at", "used_ip_addresses", "activation_code", "used_cpu_shares",
|
8
7
|
"used_cpus", "group_id", "id", "used_memory", "payment_amount", "last_name", "remember_token",
|
9
8
|
"disk_space_available", "time_zone", "outstanding_amount", "login", "roles", "email", "first_name"]
|
10
9
|
@user = Squall::User.new
|
11
|
-
@valid = {:login => '
|
12
|
-
:
|
10
|
+
@valid = {:login => 'johndoe', :email => 'johndoe@example.com', :password => 'CD2480A3413F',
|
11
|
+
:password_confirmation => 'CD2480A3413F', :first_name => 'John', :last_name => 'Doe' }
|
13
12
|
end
|
14
13
|
|
15
14
|
describe "#create" do
|
16
15
|
use_vcr_cassette "user/create"
|
17
16
|
it "requires login" do
|
18
|
-
|
17
|
+
invalid = @valid.reject{|k,v| k == :login }
|
18
|
+
requires_attr(:login) { @user.create(invalid) }
|
19
19
|
end
|
20
20
|
|
21
21
|
it "requires email" do
|
22
|
-
|
22
|
+
invalid = @valid.reject{|k,v| k == :email }
|
23
|
+
requires_attr(:email) { @user.create(invalid) }
|
23
24
|
end
|
24
25
|
|
25
26
|
it "requires password" do
|
26
|
-
|
27
|
-
|
28
|
-
}
|
27
|
+
invalid = @valid.reject{|k,v| k == :password }
|
28
|
+
requires_attr(:password) { @user.create(invalid) }
|
29
29
|
end
|
30
|
-
|
31
|
-
it "
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
30
|
+
|
31
|
+
it "requires password confirmation" do
|
32
|
+
invalid = @valid.reject{|k,v| k == :password_confirmation }
|
33
|
+
requires_attr(:password_confirmation) { @user.create(invalid) }
|
34
|
+
end
|
35
|
+
|
36
|
+
it "requires first name" do
|
37
|
+
invalid = @valid.reject{|k,v| k == :first_name }
|
38
|
+
requires_attr(:first_name) { @user.create(invalid) }
|
39
|
+
end
|
40
|
+
|
41
|
+
it "requires last name" do
|
42
|
+
invalid = @valid.reject{|k,v| k == :last_name }
|
43
|
+
requires_attr(:last_name) { @user.create(invalid) }
|
44
|
+
end
|
45
|
+
|
46
|
+
it "allows all optional params" do
|
47
|
+
optional = [:role, :time_zone, :locale, :status, :billing_plan_id, :role_ids, :suspend_after_hours, :suspend_at]
|
48
|
+
@user.should_receive(:request).exactly(optional.size).times.and_return Hash.new("user" => {})
|
49
|
+
optional.each do |param|
|
50
|
+
@user.create(@valid.merge(param => "test"))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it "raises error on unknown params" do
|
55
|
+
expect { @user.create(@valid.merge(:what => 'what')) }.to raise_error(ArgumentError, 'Unknown params: what')
|
37
56
|
end
|
38
57
|
|
39
58
|
it "creates a user" do
|
40
59
|
user = @user.create(@valid)
|
41
|
-
user
|
42
|
-
|
43
|
-
|
44
|
-
|
60
|
+
@user.success.should be_true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#edit" do
|
65
|
+
use_vcr_cassette "user/edit"
|
66
|
+
|
67
|
+
it "allows select params" do
|
68
|
+
optional = [:email, :password, :password_confirmation, :first_name, :last_name, :user_group_id, :billing_plan_id, :role_ids, :suspend_at]
|
69
|
+
@user.should_receive(:request).exactly(optional.size).times.and_return Hash.new()
|
70
|
+
optional.each do |param|
|
71
|
+
@user.edit(1, param => "test")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it "raises error on unknown params" do
|
76
|
+
expect { @user.edit(1, :what => 'what') }.to raise_error(ArgumentError, 'Unknown params: what')
|
77
|
+
end
|
78
|
+
|
79
|
+
it "edits a user" do
|
80
|
+
user = @user.edit(1, :first_name => "Test")
|
81
|
+
@user.success.should be_true
|
45
82
|
end
|
46
83
|
end
|
47
84
|
|
@@ -49,13 +86,12 @@ describe Squall::User do
|
|
49
86
|
use_vcr_cassette "user/list"
|
50
87
|
it "returns a user list" do
|
51
88
|
users = @user.list
|
52
|
-
users.
|
89
|
+
users.should be_an(Array)
|
53
90
|
end
|
54
91
|
|
55
92
|
it "contains first users data" do
|
56
93
|
user = @user.list.first
|
57
|
-
user.
|
58
|
-
user['email'].should == "user@example.com"
|
94
|
+
user.should be_a(Hash)
|
59
95
|
end
|
60
96
|
end
|
61
97
|
|
@@ -66,12 +102,12 @@ describe Squall::User do
|
|
66
102
|
end
|
67
103
|
|
68
104
|
it "returns not found for invalid users" do
|
69
|
-
expect { @user.show(
|
105
|
+
expect { @user.show(404) }.to raise_error(Squall::NotFound)
|
70
106
|
end
|
71
107
|
|
72
108
|
it "returns a user" do
|
73
109
|
user = @user.show(1)
|
74
|
-
user
|
110
|
+
user.should be_a(Hash)
|
75
111
|
end
|
76
112
|
end
|
77
113
|
|
@@ -82,10 +118,8 @@ describe Squall::User do
|
|
82
118
|
end
|
83
119
|
|
84
120
|
it "generates a new key" do
|
85
|
-
|
86
|
-
|
87
|
-
user['api_key'].should == '7d97e98f8af710c7e7fe703abc8f639e0ee507c4'
|
88
|
-
end
|
121
|
+
user = @user.generate_api_key(1)
|
122
|
+
user.should be_a(Hash)
|
89
123
|
end
|
90
124
|
end
|
91
125
|
|
@@ -96,7 +130,7 @@ describe Squall::User do
|
|
96
130
|
end
|
97
131
|
|
98
132
|
it "suspends a user" do
|
99
|
-
user = @user.suspend(
|
133
|
+
user = @user.suspend(1)
|
100
134
|
user['status'].should == "suspended"
|
101
135
|
end
|
102
136
|
end
|
@@ -108,7 +142,7 @@ describe Squall::User do
|
|
108
142
|
end
|
109
143
|
|
110
144
|
it "activates a user" do
|
111
|
-
user = @user.activate(
|
145
|
+
user = @user.activate(1)
|
112
146
|
user['status'].should == "active"
|
113
147
|
end
|
114
148
|
|
@@ -123,13 +157,13 @@ describe Squall::User do
|
|
123
157
|
expect { @user.delete }.to raise_error(ArgumentError)
|
124
158
|
end
|
125
159
|
|
126
|
-
it "
|
127
|
-
|
128
|
-
|
160
|
+
it "deletes a user" do
|
161
|
+
@user.delete(1)
|
162
|
+
@user.success.should be_true
|
129
163
|
end
|
130
164
|
|
131
165
|
it "returns NotFound for missing user" do
|
132
|
-
expect { @user.delete(
|
166
|
+
expect { @user.delete(404) }.to raise_error(Squall::NotFound)
|
133
167
|
end
|
134
168
|
end
|
135
169
|
|
@@ -141,10 +175,19 @@ describe Squall::User do
|
|
141
175
|
|
142
176
|
it "returns stats" do
|
143
177
|
stats = @user.stats(1)
|
144
|
-
stats
|
145
|
-
|
146
|
-
|
147
|
-
|
178
|
+
stats.should be_an(Array)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe "#monthly_bills" do
|
183
|
+
use_vcr_cassette "user/monthly_bills"
|
184
|
+
it "requires an id" do
|
185
|
+
expect { @user.monthly_bills }.to raise_error(ArgumentError)
|
186
|
+
end
|
187
|
+
|
188
|
+
it "returns an array of bills for the user" do
|
189
|
+
stats = @user.monthly_bills(1)
|
190
|
+
stats.should be_an(Array)
|
148
191
|
end
|
149
192
|
end
|
150
193
|
|
@@ -155,41 +198,81 @@ describe Squall::User do
|
|
155
198
|
end
|
156
199
|
|
157
200
|
it "404s on not found" do
|
158
|
-
|
159
|
-
expect { @user.virtual_machines(500) }.to raise_error(Squall::NotFound)
|
160
|
-
end
|
201
|
+
expect { @user.virtual_machines(404) }.to raise_error(Squall::NotFound)
|
161
202
|
end
|
162
203
|
|
163
204
|
it "returns the virtual_machines" do
|
164
205
|
virtual_machines = @user.virtual_machines(1)
|
165
|
-
virtual_machines.
|
166
|
-
keys = ["monthly_bandwidth_used", "cpus", "label", "created_at", "operating_system_distro", "cpu_shares",
|
167
|
-
"operating_system", "template_id", "allowed_swap", "local_remote_access_port", "memory", "updated_at",
|
168
|
-
"allow_resize_without_reboot", "recovery_mode", "hypervisor_id", "id", "xen_id", "user_id", "total_disk_size",
|
169
|
-
"booted", "hostname", "template_label", "identifier", "initial_root_password", "min_disk_size",
|
170
|
-
"remote_access_password", "built", "locked", "ip_addresses"]
|
171
|
-
virtual_machines.first.should include(*keys)
|
206
|
+
virtual_machines.should be_an(Array)
|
172
207
|
end
|
173
208
|
end
|
209
|
+
|
210
|
+
describe "#hypervisors" do
|
211
|
+
use_vcr_cassette "user/hypervisors"
|
212
|
+
it "requires an id" do
|
213
|
+
expect { @user.hypervisors }.to raise_error(ArgumentError)
|
214
|
+
end
|
174
215
|
|
175
|
-
|
176
|
-
|
216
|
+
it "404s on not found" do
|
217
|
+
expect { @user.hypervisors(404) }.to raise_error(Squall::NotFound)
|
218
|
+
end
|
219
|
+
|
220
|
+
it "returns the virtual_machines" do
|
221
|
+
hypervisors = @user.hypervisors(1)
|
222
|
+
hypervisors.should be_an(Array)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
describe "#data_store_zones" do
|
227
|
+
use_vcr_cassette "user/data_store_zones"
|
177
228
|
it "requires an id" do
|
178
|
-
expect { @user.
|
229
|
+
expect { @user.data_store_zones }.to raise_error(ArgumentError)
|
179
230
|
end
|
180
231
|
|
181
232
|
it "404s on not found" do
|
182
|
-
|
233
|
+
pending "Broken on OnApp: returns success despite non-existent user" do
|
234
|
+
expect { @user.data_store_zones(2532564353245) }.to raise_error(Squall::NotFound)
|
235
|
+
end
|
183
236
|
end
|
184
237
|
|
185
|
-
it "
|
186
|
-
@user.
|
187
|
-
|
238
|
+
it "returns the virtual_machines" do
|
239
|
+
data_store_zones = @user.data_store_zones(1)
|
240
|
+
data_store_zones.should be_an(Array)
|
188
241
|
end
|
242
|
+
end
|
189
243
|
|
190
|
-
|
191
|
-
|
192
|
-
|
244
|
+
describe "#network_zones" do
|
245
|
+
use_vcr_cassette "user/network_zones"
|
246
|
+
it "requires an id" do
|
247
|
+
expect { @user.network_zones }.to raise_error(ArgumentError)
|
248
|
+
end
|
249
|
+
|
250
|
+
it "404s on not found" do
|
251
|
+
pending "Broken on OnApp: returns success despite non-existent user" do
|
252
|
+
expect { @user.network_zones(2532564353245) }.to raise_error(Squall::NotFound)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
it "returns the network_zones" do
|
257
|
+
network_zones = @user.network_zones(1)
|
258
|
+
network_zones.should be_an(Array)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
describe "#limits" do
|
263
|
+
use_vcr_cassette "user/limits"
|
264
|
+
it "requires an id" do
|
265
|
+
expect { @user.limits }.to raise_error(ArgumentError)
|
266
|
+
end
|
267
|
+
|
268
|
+
it "404s on not found" do
|
269
|
+
expect { @user.limits(438768534623) }.to raise_error(Squall::NotFound)
|
270
|
+
end
|
271
|
+
|
272
|
+
it "returns the limits" do
|
273
|
+
limits = @user.limits(1)
|
274
|
+
limits.should be_a(Hash)
|
193
275
|
end
|
194
276
|
end
|
195
|
-
|
277
|
+
|
278
|
+
end
|