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/lib/squall.rb
CHANGED
|
@@ -1,40 +1,51 @@
|
|
|
1
1
|
require 'httparty'
|
|
2
2
|
|
|
3
|
-
require 'squall/version'
|
|
4
|
-
require 'squall/exception'
|
|
3
|
+
require 'squall/support/version'
|
|
4
|
+
require 'squall/support/exception'
|
|
5
|
+
require 'squall/support/yaml'
|
|
5
6
|
|
|
6
7
|
module Squall
|
|
7
|
-
|
|
8
|
+
# Support
|
|
9
|
+
autoload :Params, 'squall/support/params'
|
|
10
|
+
autoload :Config, 'squall/support/config'
|
|
11
|
+
autoload :Base, 'squall/support/base'
|
|
12
|
+
# Api
|
|
8
13
|
autoload :Hypervisor, 'squall/hypervisor'
|
|
9
|
-
autoload :Config, 'squall/config'
|
|
10
|
-
autoload :Base, 'squall/base'
|
|
11
14
|
autoload :User, 'squall/user'
|
|
12
15
|
autoload :Role, 'squall/role'
|
|
13
16
|
autoload :Network, 'squall/network'
|
|
14
17
|
autoload :IpAddress, 'squall/ip_address'
|
|
18
|
+
autoload :IpAddressJoin, 'squall/ip_address_join'
|
|
15
19
|
autoload :Template, 'squall/template'
|
|
16
20
|
autoload :VirtualMachine, 'squall/virtual_machine'
|
|
17
21
|
autoload :Statistic, 'squall/statistic'
|
|
18
22
|
autoload :Transaction, 'squall/transaction'
|
|
23
|
+
autoload :Payment, 'squall/payment'
|
|
24
|
+
autoload :UserGroup, 'squall/user_group'
|
|
25
|
+
autoload :Whitelist, 'squall/whitelist'
|
|
26
|
+
autoload :FirewallRule, 'squall/firewall_rule'
|
|
27
|
+
autoload :DataStoreZone, 'squall/data_store_zone'
|
|
28
|
+
autoload :NetworkZone, 'squall/network_zone'
|
|
29
|
+
autoload :HypervisorZone, 'squall/hypervisor_zone'
|
|
19
30
|
|
|
20
31
|
extend self
|
|
21
32
|
|
|
22
33
|
# Config
|
|
23
34
|
attr_accessor :configuration
|
|
24
35
|
|
|
25
|
-
# Config
|
|
36
|
+
# Config
|
|
26
37
|
attr_accessor :configuration_file
|
|
27
38
|
|
|
28
|
-
# The path to your squall.yml
|
|
29
39
|
self.configuration ||= Squall::Config.new
|
|
30
40
|
|
|
31
41
|
# Specificy the config via block
|
|
32
|
-
#
|
|
42
|
+
#
|
|
33
43
|
# ==== Attributes
|
|
34
44
|
#
|
|
35
45
|
# * +base_uri+ - URL of your OnApp instance
|
|
36
46
|
# * +username+ - API username
|
|
37
47
|
# * +password+ - API Password
|
|
48
|
+
# * +debug+ - Toggle debug mode to log HTTParty
|
|
38
49
|
#
|
|
39
50
|
# ==== Example
|
|
40
51
|
#
|
|
@@ -67,11 +78,9 @@ module Squall
|
|
|
67
78
|
else
|
|
68
79
|
raise ArgumentError, "Config file doesn't exist '#{file}'"
|
|
69
80
|
end
|
|
81
|
+
settings = YAML::load_file(file)
|
|
70
82
|
config do |c|
|
|
71
|
-
|
|
72
|
-
c.base_uri conf['base_uri']
|
|
73
|
-
c.username conf['username']
|
|
74
|
-
c.password conf['password']
|
|
83
|
+
settings.each { |k, v| c.send(k, v) }
|
|
75
84
|
end
|
|
76
85
|
end
|
|
77
86
|
|
data/spec/spec_helper.rb
CHANGED
|
@@ -6,32 +6,37 @@ require 'squall'
|
|
|
6
6
|
VCR.config do |c|
|
|
7
7
|
c.cassette_library_dir = 'spec/vcr_cassettes'
|
|
8
8
|
c.stub_with :fakeweb
|
|
9
|
-
|
|
9
|
+
if ENV['RERECORD']
|
|
10
|
+
c.default_cassette_options = {:record => :all}
|
|
11
|
+
else
|
|
12
|
+
c.default_cassette_options = {:record => :none}
|
|
13
|
+
end
|
|
14
|
+
c.filter_sensitive_data("Basic <REDACTED>") { |i| [i.request.headers['authorization']].flatten.first }
|
|
15
|
+
c.filter_sensitive_data("<REDACTED>") { |i| [i.response.headers['set-cookie']].flatten.first }
|
|
16
|
+
c.filter_sensitive_data("<URL>") { URI.parse(Squall.config[:base_uri]).host }
|
|
17
|
+
c.filter_sensitive_data("<USER>") { Squall.config[:username] }
|
|
18
|
+
c.filter_sensitive_data("<PASS>") { Squall.config[:password] }
|
|
10
19
|
end
|
|
11
20
|
|
|
12
21
|
RSpec.configure do |c|
|
|
13
22
|
c.extend VCR::RSpec::Macros
|
|
23
|
+
c.before(:each) do
|
|
24
|
+
configure_for_tests
|
|
25
|
+
end
|
|
14
26
|
c.after(:each) do
|
|
15
27
|
Squall.reset_config
|
|
16
28
|
end
|
|
17
29
|
end
|
|
18
30
|
|
|
19
|
-
def
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
config = YAML::load_file(yaml)
|
|
23
|
-
uri = config['base_uri']
|
|
24
|
-
user = config['username']
|
|
25
|
-
pass = config['password']
|
|
31
|
+
def configure_for_tests
|
|
32
|
+
if ENV['RERECORD']
|
|
33
|
+
Squall.config_file
|
|
26
34
|
else
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
c.base_uri uri
|
|
33
|
-
c.username user
|
|
34
|
-
c.password pass
|
|
35
|
+
Squall.config do |c|
|
|
36
|
+
c.username "test"
|
|
37
|
+
c.password "test"
|
|
38
|
+
c.base_uri "http://example.com"
|
|
39
|
+
end
|
|
35
40
|
end
|
|
36
41
|
end
|
|
37
42
|
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Squall::DataStoreZone do
|
|
4
|
+
before(:each) do
|
|
5
|
+
@data_store_zone = Squall::DataStoreZone.new
|
|
6
|
+
@valid = {:label => "My zone"}
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "#list" do
|
|
10
|
+
use_vcr_cassette "data_store_zone/list"
|
|
11
|
+
|
|
12
|
+
it "returns all data store zones" do
|
|
13
|
+
data_store_zones = @data_store_zone.list
|
|
14
|
+
data_store_zones.should be_an(Array)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "contains the data store zone data" do
|
|
18
|
+
data_store_zones = @data_store_zone.list
|
|
19
|
+
data_store_zones.all? {|w| w.is_a?(Hash) }.should be_true
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe "#show" do
|
|
24
|
+
use_vcr_cassette "data_store_zone/show"
|
|
25
|
+
it "requires an id" do
|
|
26
|
+
expect { @data_store_zone.show }.to raise_error(ArgumentError)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "returns not found for invalid data store zone id" do
|
|
30
|
+
expect { @data_store_zone.show(404) }.to raise_error(Squall::NotFound)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "returns a data store zone" do
|
|
34
|
+
data_store_zone = @data_store_zone.show(1)
|
|
35
|
+
data_store_zone.should be_a(Hash)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe "#create" do
|
|
40
|
+
use_vcr_cassette "data_store_zone/create"
|
|
41
|
+
it "requires label" do
|
|
42
|
+
invalid = @valid.reject{|k,v| k == :label }
|
|
43
|
+
requires_attr(:label) { @data_store_zone.create(invalid) }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "raises error on unknown params" do
|
|
47
|
+
expect { @data_store_zone.create(@valid.merge(:what => 'what')) }.to raise_error(ArgumentError, 'Unknown params: what')
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "creates a data store zone" do
|
|
51
|
+
@data_store_zone.create(@valid)
|
|
52
|
+
@data_store_zone.success.should be_true
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe "#edit" do
|
|
57
|
+
use_vcr_cassette "data_store_zone/edit"
|
|
58
|
+
|
|
59
|
+
it "allows select params" do
|
|
60
|
+
optional = [:label]
|
|
61
|
+
@data_store_zone.should_receive(:request).exactly(optional.size).times.and_return Hash.new()
|
|
62
|
+
optional.each do |param|
|
|
63
|
+
@data_store_zone.edit(1, param => "test")
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "raises error on unknown params" do
|
|
68
|
+
expect { @data_store_zone.edit(1, @valid.merge(:what => 'what')) }.to raise_error(ArgumentError, 'Unknown params: what')
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "edits a data store zone" do
|
|
72
|
+
@data_store_zone.edit(1, :label => "Updated zone")
|
|
73
|
+
@data_store_zone.success.should be_true
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "raises an error for an invalid data store zone id" do
|
|
77
|
+
expect { @data_store_zone.edit(404, @valid) }.to raise_error(Squall::NotFound)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe "#delete" do
|
|
82
|
+
use_vcr_cassette "data_store_zone/delete"
|
|
83
|
+
it "requires an id" do
|
|
84
|
+
expect { @data_store_zone.delete }.to raise_error(ArgumentError)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "deletes a data store zone" do
|
|
88
|
+
@data_store_zone.delete(1)
|
|
89
|
+
@data_store_zone.success.should be_true
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "returns NotFound for invalid data store zone id" do
|
|
93
|
+
expect { @data_store_zone.delete(404) }.to raise_error(Squall::NotFound)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Squall::FirewallRule do
|
|
4
|
+
before(:each) do
|
|
5
|
+
@firewall_rule = Squall::FirewallRule.new
|
|
6
|
+
@valid = {:command => "DROP", :protocol => "TCP", :network_interface_id => 1}
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "#list" do
|
|
10
|
+
use_vcr_cassette "firewall_rule/list"
|
|
11
|
+
|
|
12
|
+
it "requires vm id" do
|
|
13
|
+
expect { @firewall_rule.list }.to raise_error(ArgumentError)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "returns a list of firewall rules for a vm" do
|
|
17
|
+
firewall_rules = @firewall_rule.list(1)
|
|
18
|
+
firewall_rules.should be_an(Array)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "contains first firewall_rule's data" do
|
|
22
|
+
firewall_rules = @firewall_rule.list(1)
|
|
23
|
+
firewall_rules.all?.should be_true
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "#create" do
|
|
28
|
+
use_vcr_cassette "firewall_rule/create"
|
|
29
|
+
it "requires command" do
|
|
30
|
+
invalid = @valid.reject{|k,v| k == :command }
|
|
31
|
+
requires_attr(:command) { @firewall_rule.create(1, invalid) }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "requires protocol" do
|
|
35
|
+
invalid = @valid.reject{|k,v| k == :protocol }
|
|
36
|
+
requires_attr(:protocol) { @firewall_rule.create(1, invalid) }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "requires network_interface_id" do
|
|
40
|
+
invalid = @valid.reject{|k,v| k == :network_interface_id }
|
|
41
|
+
requires_attr(:network_interface_id) { @firewall_rule.create(1, invalid) }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "allows all optional params" do
|
|
45
|
+
optional = [:network_interface_id, :address, :port]
|
|
46
|
+
@firewall_rule.should_receive(:request).exactly(optional.size).times.and_return Hash.new("firewall_rule" => {})
|
|
47
|
+
optional.each do |param|
|
|
48
|
+
@firewall_rule.create(1, @valid.merge(param => "test"))
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "raises error on unknown params" do
|
|
53
|
+
expect { @firewall_rule.create(1, @valid.merge(:what => 'what')) }.to raise_error(ArgumentError, 'Unknown params: what')
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "raises an error for an invalid vm id" do
|
|
57
|
+
expect { @firewall_rule.create(404, @valid) }.to raise_error(Squall::NotFound)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "creates a firewall rule for a virtual machine" do
|
|
61
|
+
@firewall_rule.create(1, @valid)
|
|
62
|
+
@firewall_rule.success.should be_true
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
describe "#edit" do
|
|
67
|
+
use_vcr_cassette "firewall_rule/edit"
|
|
68
|
+
|
|
69
|
+
it "allows select params" do
|
|
70
|
+
optional = [:command, :protocol, :network_interface_id, :address, :port]
|
|
71
|
+
@firewall_rule.should_receive(:request).exactly(optional.size).times.and_return Hash.new()
|
|
72
|
+
optional.each do |param|
|
|
73
|
+
@firewall_rule.edit(1, 1, param => "test")
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "raises error on unknown params" do
|
|
78
|
+
expect { @firewall_rule.edit(1, 1, :what => 'what') }.to raise_error(ArgumentError, 'Unknown params: what')
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "edits a firewall rule" do
|
|
82
|
+
pending "broken in OnApp: returning invalid JSON" do
|
|
83
|
+
@firewall_rule.edit(1, 1, :port => 1000)
|
|
84
|
+
@firewall_rule.success.should be_true
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "raises an error for an invalid firewall rule id" do
|
|
89
|
+
expect { @firewall_rule.edit(1, 404, @valid) }.to raise_error(Squall::NotFound)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
describe "#delete" do
|
|
94
|
+
use_vcr_cassette "firewall_rule/delete"
|
|
95
|
+
|
|
96
|
+
it "requires an id" do
|
|
97
|
+
expect { @firewall_rule.delete }.to raise_error(ArgumentError)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it "deletes a firewall rule" do
|
|
101
|
+
pending "broken in OnApp: returning invalid JSON" do
|
|
102
|
+
@firewall_rule.delete(1, 1)
|
|
103
|
+
@firewall_rule.success.should be_true
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "returns NotFound for missing virtual machine" do
|
|
108
|
+
expect { @firewall_rule.delete(1, 404) }.to raise_error(Squall::NotFound)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
end
|
|
@@ -2,24 +2,23 @@ require 'spec_helper'
|
|
|
2
2
|
|
|
3
3
|
describe Squall::Hypervisor do
|
|
4
4
|
before(:each) do
|
|
5
|
-
default_config
|
|
6
5
|
@hv = Squall::Hypervisor.new
|
|
6
|
+
@valid = {:label => 'A new hypervisor', :ip_address => '127.126.126.126', :hypervisor_type => 'xen'}
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
describe "#list" do
|
|
10
10
|
use_vcr_cassette 'hypervisor/list'
|
|
11
|
+
|
|
11
12
|
it "returns hypervisors" do
|
|
12
13
|
hvs = @hv.list
|
|
13
|
-
hvs.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
first.keys.should include(*keys)
|
|
20
|
-
first['label'].should == 'Testing'
|
|
21
|
-
first['hypervisor_type'].should == 'xen'
|
|
14
|
+
hvs.should be_an(Array)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "contains hypervisor data" do
|
|
18
|
+
hvs = @hv.list
|
|
19
|
+
hvs.all?.should be_true
|
|
22
20
|
end
|
|
21
|
+
|
|
23
22
|
end
|
|
24
23
|
|
|
25
24
|
describe "#show" do
|
|
@@ -29,55 +28,38 @@ describe Squall::Hypervisor do
|
|
|
29
28
|
end
|
|
30
29
|
|
|
31
30
|
it "returns not found for invalid hvs" do
|
|
32
|
-
expect { @hv.show(
|
|
31
|
+
expect { @hv.show(404) }.to raise_error(Squall::NotFound)
|
|
33
32
|
end
|
|
34
33
|
|
|
35
34
|
it "returns a hv" do
|
|
36
|
-
|
|
37
|
-
hv
|
|
35
|
+
@hv.show(1)
|
|
36
|
+
@hv.success.should be_true
|
|
38
37
|
end
|
|
39
38
|
end
|
|
40
39
|
|
|
41
40
|
describe "#create" do
|
|
42
41
|
use_vcr_cassette "hypervisor/create"
|
|
43
42
|
it "requires label" do
|
|
44
|
-
|
|
43
|
+
invalid = @valid.reject{|k,v| k == :label }
|
|
44
|
+
requires_attr(:label) { @hv.create(invalid) }
|
|
45
45
|
@hv.success.should be_false
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
it "requires ip_address" do
|
|
49
|
-
|
|
49
|
+
invalid = @valid.reject{|k,v| k == :ip_address }
|
|
50
|
+
requires_attr(:ip_address) { @hv.create(invalid) }
|
|
50
51
|
@hv.success.should be_false
|
|
51
52
|
end
|
|
52
53
|
|
|
53
54
|
it "requires hypervisor_type" do
|
|
54
|
-
|
|
55
|
-
@hv.
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# The API allows you to commit this value but subsequent
|
|
59
|
-
# saves do not work because of this missing value.
|
|
60
|
-
it "requires memory_overhead" do
|
|
61
|
-
pending "Broken in OnApp"
|
|
62
|
-
requires_attr(:memory_overhead) { @hv.create(:label => 'Brand New', :ip_address => '222.222.222.222', :hypervisor_type => 'xen') }
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
it "raises error on duplicate account" do
|
|
66
|
-
expect {
|
|
67
|
-
@hv.create(:label => 'Testing', :ip_address => '123.123.123.123', :hypervisor_type => 'xen')
|
|
68
|
-
}.to raise_error(Squall::RequestError)
|
|
69
|
-
@hv.errors['label'].should include("has already been taken")
|
|
70
|
-
@hv.errors['ip_address'].should include("has already been taken")
|
|
55
|
+
invalid = @valid.reject{|k,v| k == :hypervisor_type }
|
|
56
|
+
requires_attr(:hypervisor_type) { @hv.create(invalid) }
|
|
71
57
|
@hv.success.should be_false
|
|
72
58
|
end
|
|
73
59
|
|
|
74
60
|
it "creates a hypervisor" do
|
|
75
|
-
|
|
61
|
+
@hv.create(@valid)
|
|
76
62
|
@hv.success.should be_true
|
|
77
|
-
|
|
78
|
-
create['label'].should == 'Brand new'
|
|
79
|
-
create['ip_address'].should == '126.126.126.126'
|
|
80
|
-
create['hypervisor_type'].should == 'xen'
|
|
81
63
|
end
|
|
82
64
|
end
|
|
83
65
|
|
|
@@ -89,17 +71,12 @@ describe Squall::Hypervisor do
|
|
|
89
71
|
end
|
|
90
72
|
|
|
91
73
|
it "raises an error with unknown param " do
|
|
92
|
-
expect { @hv.edit(
|
|
74
|
+
expect { @hv.edit(1, :blah => 1)}.to raise_error(ArgumentError)
|
|
93
75
|
@hv.success.should be_false
|
|
94
76
|
end
|
|
95
77
|
|
|
96
|
-
it "edits the
|
|
97
|
-
edit = @hv.edit(
|
|
98
|
-
@hv.success.should be_true
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
it "edits the ip_address" do
|
|
102
|
-
edit = @hv.edit(3, :ip_address => '120.120.120.120')
|
|
78
|
+
it "edits the hypervisor" do
|
|
79
|
+
edit = @hv.edit(1, :label => 'A new label')
|
|
103
80
|
@hv.success.should be_true
|
|
104
81
|
end
|
|
105
82
|
end
|
|
@@ -119,8 +96,6 @@ describe Squall::Hypervisor do
|
|
|
119
96
|
it "reboots the hypervisor" do
|
|
120
97
|
reboot = @hv.reboot(1)
|
|
121
98
|
@hv.success.should be_true
|
|
122
|
-
|
|
123
|
-
reboot['label'].should == 'Testing'
|
|
124
99
|
end
|
|
125
100
|
end
|
|
126
101
|
|
|
@@ -136,8 +111,86 @@ describe Squall::Hypervisor do
|
|
|
136
111
|
end
|
|
137
112
|
|
|
138
113
|
it "returns a hv" do
|
|
139
|
-
@hv.delete(
|
|
114
|
+
@hv.delete(1)
|
|
115
|
+
@hv.success.should be_true
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
describe "#data_store_joins" do
|
|
120
|
+
use_vcr_cassette "hypervisor/data_store_joins"
|
|
121
|
+
|
|
122
|
+
it "returns a list of data store joins" do
|
|
123
|
+
joins = @hv.data_store_joins(1)
|
|
124
|
+
joins.should be_an(Array)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "contains the data store join data" do
|
|
128
|
+
joins = @hv.data_store_joins(1)
|
|
129
|
+
joins.all? {|w| w.is_a?(Hash) }.should be_true
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
describe "#add_data_store_join" do
|
|
135
|
+
use_vcr_cassette "hypervisor/add_data_store_join"
|
|
136
|
+
|
|
137
|
+
it "adds the data store to the hypervisor zone" do
|
|
138
|
+
@hv.add_data_store_join(1, 1)
|
|
139
|
+
@hv.success.should be_true
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
describe "#remove_data_store_join" do
|
|
145
|
+
use_vcr_cassette "hypervisor/remove_data_store_join"
|
|
146
|
+
|
|
147
|
+
it "removes the data store from the hypervisor zone" do
|
|
148
|
+
@hv.remove_data_store_join(1, 1)
|
|
149
|
+
@hv.success.should be_true
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
describe "#network_joins" do
|
|
155
|
+
use_vcr_cassette "hypervisor/network_joins"
|
|
156
|
+
|
|
157
|
+
it "returns a list of network joins" do
|
|
158
|
+
joins = @hv.network_joins(1)
|
|
159
|
+
joins.should be_an(Array)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it "contains the network join data" do
|
|
163
|
+
joins = @hv.network_joins(1)
|
|
164
|
+
joins.all? {|w| w.is_a?(Hash) }.should be_true
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
describe "#add_network_join" do
|
|
170
|
+
use_vcr_cassette "hypervisor/add_network_join"
|
|
171
|
+
|
|
172
|
+
it "requires network id" do
|
|
173
|
+
requires_attr(:network_id) { @hv.add_network_join(1, :interface => "interface") }
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
it "requires interface" do
|
|
177
|
+
requires_attr(:interface) { @hv.add_network_join(1, :network_id => 1) }
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
it "adds the network to the hypervisor zone" do
|
|
181
|
+
@hv.add_network_join(1, :network_id => 1, :interface => "interface")
|
|
182
|
+
@hv.success.should be_true
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
describe "#remove_network_join" do
|
|
188
|
+
use_vcr_cassette "hypervisor/remove_network_join"
|
|
189
|
+
|
|
190
|
+
it "removes the network from the hypervisor zone" do
|
|
191
|
+
@hv.remove_network_join(1, 1)
|
|
140
192
|
@hv.success.should be_true
|
|
141
193
|
end
|
|
194
|
+
|
|
142
195
|
end
|
|
143
196
|
end
|