squall 1.0.2 → 1.1.0
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.
- 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
|