squall 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/.gitignore +3 -0
  2. data/.rbenv-version +1 -0
  3. data/.rspec +1 -1
  4. data/.rvmrc +41 -1
  5. data/.travis.yml +13 -3
  6. data/README.md +122 -27
  7. data/Rakefile +5 -34
  8. data/lib/squall/data_store_zone.rb +58 -0
  9. data/lib/squall/firewall_rule.rb +66 -0
  10. data/lib/squall/hypervisor.rb +63 -11
  11. data/lib/squall/hypervisor_zone.rb +135 -0
  12. data/lib/squall/ip_address.rb +50 -3
  13. data/lib/squall/ip_address_join.rb +46 -0
  14. data/lib/squall/network.rb +21 -4
  15. data/lib/squall/network_zone.rb +73 -0
  16. data/lib/squall/payment.rb +59 -0
  17. data/lib/squall/role.rb +28 -11
  18. data/lib/squall/statistic.rb +3 -3
  19. data/lib/squall/{base.rb → support/base.rb} +8 -4
  20. data/lib/squall/{config.rb → support/config.rb} +4 -0
  21. data/lib/squall/{exception.rb → support/exception.rb} +0 -0
  22. data/lib/squall/{params.rb → support/params.rb} +0 -0
  23. data/lib/squall/support/version.rb +3 -0
  24. data/lib/squall/support/yaml.rb +5 -0
  25. data/lib/squall/template.rb +4 -0
  26. data/lib/squall/transaction.rb +4 -0
  27. data/lib/squall/user.rb +126 -30
  28. data/lib/squall/user_group.rb +56 -0
  29. data/lib/squall/virtual_machine.rb +176 -52
  30. data/lib/squall/whitelist.rb +74 -0
  31. data/lib/squall.rb +21 -12
  32. data/spec/spec_helper.rb +21 -16
  33. data/spec/squall/data_store_zone_spec.rb +97 -0
  34. data/spec/squall/firewall_rule_spec.rb +112 -0
  35. data/spec/squall/hypervisor_spec.rb +101 -48
  36. data/spec/squall/hypervisor_zone_spec.rb +190 -0
  37. data/spec/squall/ip_address_join_spec.rb +67 -0
  38. data/spec/squall/ip_address_spec.rb +68 -6
  39. data/spec/squall/network_spec.rb +0 -1
  40. data/spec/squall/network_zone_spec.rb +147 -0
  41. data/spec/squall/payment_spec.rb +98 -0
  42. data/spec/squall/role_spec.rb +31 -46
  43. data/spec/squall/statistic_spec.rb +7 -9
  44. data/spec/squall/{base_spec.rb → support/base_spec.rb} +5 -7
  45. data/spec/squall/{config_spec.rb → support/config_spec.rb} +0 -0
  46. data/spec/{params_spec.rb → squall/support/params_spec.rb} +0 -0
  47. data/spec/squall/template_spec.rb +0 -1
  48. data/spec/squall/transaction_spec.rb +0 -1
  49. data/spec/squall/user_group_spec.rb +74 -0
  50. data/spec/squall/user_spec.rb +142 -59
  51. data/spec/squall/virtual_machine_spec.rb +179 -67
  52. data/spec/squall/whitelist_spec.rb +113 -0
  53. data/spec/squall_spec.rb +4 -8
  54. data/spec/vcr_cassettes/data_store_zone/create.yml +40 -0
  55. data/spec/vcr_cassettes/data_store_zone/delete.yml +77 -0
  56. data/spec/vcr_cassettes/data_store_zone/edit.yml +77 -0
  57. data/spec/vcr_cassettes/data_store_zone/list.yml +40 -0
  58. data/spec/vcr_cassettes/data_store_zone/show.yml +77 -0
  59. data/spec/vcr_cassettes/firewall_rule/create.yml +75 -0
  60. data/spec/vcr_cassettes/firewall_rule/delete.yml +75 -0
  61. data/spec/vcr_cassettes/firewall_rule/edit.yml +75 -0
  62. data/spec/vcr_cassettes/firewall_rule/list.yml +40 -0
  63. data/spec/vcr_cassettes/hypervisor/add_data_store_join.yml +40 -0
  64. data/spec/vcr_cassettes/hypervisor/add_network_join.yml +40 -0
  65. data/spec/vcr_cassettes/hypervisor/create.yml +7 -44
  66. data/spec/vcr_cassettes/hypervisor/data_store_joins.yml +40 -0
  67. data/spec/vcr_cassettes/hypervisor/delete.yml +11 -11
  68. data/spec/vcr_cassettes/hypervisor/edit.yml +7 -46
  69. data/spec/vcr_cassettes/hypervisor/list.yml +7 -7
  70. data/spec/vcr_cassettes/hypervisor/network_joins.yml +40 -0
  71. data/spec/vcr_cassettes/hypervisor/reboot.yml +13 -13
  72. data/spec/vcr_cassettes/hypervisor/remove_data_store_join.yml +40 -0
  73. data/spec/vcr_cassettes/hypervisor/remove_network_join.yml +40 -0
  74. data/spec/vcr_cassettes/hypervisor/show.yml +13 -13
  75. data/spec/vcr_cassettes/hypervisor_zones/add_data_store_join.yml +40 -0
  76. data/spec/vcr_cassettes/hypervisor_zones/add_network_join.yml +40 -0
  77. data/spec/vcr_cassettes/hypervisor_zones/create.yml +40 -0
  78. data/spec/vcr_cassettes/hypervisor_zones/data_store_joins.yml +40 -0
  79. data/spec/vcr_cassettes/hypervisor_zones/delete.yml +77 -0
  80. data/spec/vcr_cassettes/hypervisor_zones/edit.yml +77 -0
  81. data/spec/vcr_cassettes/hypervisor_zones/hypervisors.yml +40 -0
  82. data/spec/vcr_cassettes/hypervisor_zones/list.yml +40 -0
  83. data/spec/vcr_cassettes/hypervisor_zones/network_joins.yml +40 -0
  84. data/spec/vcr_cassettes/hypervisor_zones/remove_data_store_join.yml +40 -0
  85. data/spec/vcr_cassettes/hypervisor_zones/remove_network_join.yml +40 -0
  86. data/spec/vcr_cassettes/hypervisor_zones/show.yml +77 -0
  87. data/spec/vcr_cassettes/ipaddress/create.yml +40 -0
  88. data/spec/vcr_cassettes/ipaddress/delete.yml +40 -0
  89. data/spec/vcr_cassettes/ipaddress/edit.yml +40 -0
  90. data/spec/vcr_cassettes/ipaddress/list.yml +17 -17
  91. data/spec/vcr_cassettes/ipaddress_join/assign.yml +77 -0
  92. data/spec/vcr_cassettes/ipaddress_join/delete.yml +77 -0
  93. data/spec/vcr_cassettes/ipaddress_join/list.yml +77 -0
  94. data/spec/vcr_cassettes/network/create.yml +15 -15
  95. data/spec/vcr_cassettes/network/delete.yml +6 -6
  96. data/spec/vcr_cassettes/network/edit.yml +18 -18
  97. data/spec/vcr_cassettes/network/list.yml +3 -3
  98. data/spec/vcr_cassettes/network_zones/attach.yml +114 -0
  99. data/spec/vcr_cassettes/network_zones/create.yml +40 -0
  100. data/spec/vcr_cassettes/network_zones/delete.yml +77 -0
  101. data/spec/vcr_cassettes/network_zones/detach.yml +114 -0
  102. data/spec/vcr_cassettes/network_zones/edit.yml +77 -0
  103. data/spec/vcr_cassettes/network_zones/list.yml +40 -0
  104. data/spec/vcr_cassettes/network_zones/show.yml +77 -0
  105. data/spec/vcr_cassettes/payment/create.yml +78 -0
  106. data/spec/vcr_cassettes/payment/delete.yml +77 -0
  107. data/spec/vcr_cassettes/payment/edit.yml +77 -0
  108. data/spec/vcr_cassettes/payment/list.yml +41 -0
  109. data/spec/vcr_cassettes/role/create.yml +7 -44
  110. data/spec/vcr_cassettes/role/delete.yml +6 -6
  111. data/spec/vcr_cassettes/role/edit.yml +13 -75
  112. data/spec/vcr_cassettes/role/list.yml +7 -7
  113. data/spec/vcr_cassettes/role/permissions.yml +7 -7
  114. data/spec/vcr_cassettes/role/show.yml +13 -13
  115. data/spec/vcr_cassettes/statistic/usage_statistics.yml +7 -7
  116. data/spec/vcr_cassettes/template/list.yml +3 -3
  117. data/spec/vcr_cassettes/template/make_public.yml +6 -6
  118. data/spec/vcr_cassettes/transaction/list.yml +3 -3
  119. data/spec/vcr_cassettes/transaction/show.yml +6 -6
  120. data/spec/vcr_cassettes/user/activate.yml +7 -7
  121. data/spec/vcr_cassettes/user/create.yml +7 -83
  122. data/spec/vcr_cassettes/user/data_store_zones.yml +79 -0
  123. data/spec/vcr_cassettes/user/delete.yml +11 -11
  124. data/spec/vcr_cassettes/user/edit.yml +40 -0
  125. data/spec/vcr_cassettes/user/edit_role.yml +9 -9
  126. data/spec/vcr_cassettes/user/generate_api_key.yml +7 -7
  127. data/spec/vcr_cassettes/user/hypervisors.yml +77 -0
  128. data/spec/vcr_cassettes/user/limits.yml +77 -0
  129. data/spec/vcr_cassettes/user/list.yml +8 -8
  130. data/spec/vcr_cassettes/user/monthly_bills.yml +40 -0
  131. data/spec/vcr_cassettes/user/network_zones.yml +79 -0
  132. data/spec/vcr_cassettes/user/show.yml +29 -29
  133. data/spec/vcr_cassettes/user/stats.yml +6 -6
  134. data/spec/vcr_cassettes/user/suspend.yml +7 -7
  135. data/spec/vcr_cassettes/user/virtual_machines.yml +18 -20
  136. data/spec/vcr_cassettes/user_group/create.yml +40 -0
  137. data/spec/vcr_cassettes/user_group/delete.yml +77 -0
  138. data/spec/vcr_cassettes/user_group/edit.yml +77 -0
  139. data/spec/vcr_cassettes/user_group/list.yml +40 -0
  140. data/spec/vcr_cassettes/virtual_machine/build.yml +7 -7
  141. data/spec/vcr_cassettes/virtual_machine/change_owner.yml +8 -8
  142. data/spec/vcr_cassettes/virtual_machine/change_password.yml +13 -13
  143. data/spec/vcr_cassettes/virtual_machine/console.yml +63 -0
  144. data/spec/vcr_cassettes/virtual_machine/create.yml +9 -11
  145. data/spec/vcr_cassettes/virtual_machine/delete.yml +11 -11
  146. data/spec/vcr_cassettes/virtual_machine/edit.yml +16 -18
  147. data/spec/vcr_cassettes/virtual_machine/list.yml +3 -3
  148. data/spec/vcr_cassettes/virtual_machine/migrate.yml +22 -24
  149. data/spec/vcr_cassettes/virtual_machine/reboot.yml +22 -22
  150. data/spec/vcr_cassettes/virtual_machine/resize.yml +13 -13
  151. data/spec/vcr_cassettes/virtual_machine/segregate.yml +114 -0
  152. data/spec/vcr_cassettes/virtual_machine/set_ssh_keys.yml +77 -0
  153. data/spec/vcr_cassettes/virtual_machine/set_vip.yml +77 -0
  154. data/spec/vcr_cassettes/virtual_machine/show.yml +6 -6
  155. data/spec/vcr_cassettes/virtual_machine/shutdown.yml +6 -6
  156. data/spec/vcr_cassettes/virtual_machine/startup.yml +6 -6
  157. data/spec/vcr_cassettes/virtual_machine/stats.yml +63 -0
  158. data/spec/vcr_cassettes/virtual_machine/stop.yml +22 -22
  159. data/spec/vcr_cassettes/virtual_machine/suspend.yml +13 -13
  160. data/spec/vcr_cassettes/virtual_machine/unlock.yml +13 -13
  161. data/spec/vcr_cassettes/virtual_machine/unsuspend.yml +6 -6
  162. data/spec/vcr_cassettes/whitelist/create.yml +77 -0
  163. data/spec/vcr_cassettes/whitelist/delete.yml +77 -0
  164. data/spec/vcr_cassettes/whitelist/edit.yml +77 -0
  165. data/spec/vcr_cassettes/whitelist/list.yml +40 -0
  166. data/spec/vcr_cassettes/whitelist/show.yml +77 -0
  167. data/squall.gemspec +3 -2
  168. metadata +247 -131
  169. data/Gemfile.lock +0 -100
  170. data/lib/squall/version.rb +0 -3
data/.gitignore CHANGED
@@ -3,8 +3,11 @@ pkg/*
3
3
  .bundle
4
4
  .idea
5
5
  *.swp
6
+ *.rbc
6
7
  test.rb
7
8
  *~
8
9
  coverage/
9
10
  doc/
10
11
  TODO
12
+ Gemfile.lock
13
+
data/.rbenv-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.2-p290
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
- --format documentation
1
+ --format p
2
2
  --color
data/.rvmrc CHANGED
@@ -1 +1,41 @@
1
- rvm 1.8.7@squall
1
+ #!/usr/bin/env bash
2
+
3
+ # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
+ # development environment upon cd'ing into the directory
5
+
6
+ # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
7
+ environment_id="ruby-1.8.7-p334@squall"
8
+
9
+ #
10
+ # First we attempt to load the desired environment directly from the environment
11
+ # file. This is very fast and efficicent compared to running through the entire
12
+ # CLI and selector. If you want feedback on which environment was used then
13
+ # insert the word 'use' after --create as this triggers verbose mode.
14
+ #
15
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
16
+ && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
17
+ then
18
+ \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
19
+
20
+ if [[ -s ".rvm/hooks/after_use" ]]
21
+ then
22
+ . ".rvm/hooks/after_use"
23
+ fi
24
+ else
25
+ # If the environment file has not yet been created, use the RVM CLI to select.
26
+ if ! rvm --create "$environment_id"
27
+ then
28
+ echo "Failed to create RVM environment ''."
29
+ fi
30
+ fi
31
+
32
+ #
33
+ # If you use an RVM gemset file to install a list of gems (*.gems), you can have
34
+ # it be automatically loaded. Uncomment the following and adjust the filename if
35
+ # necessary.
36
+ #
37
+ # filename=".gems"
38
+ # if [[ -s "$filename" ]] ; then
39
+ # rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
40
+ # fi
41
+
data/.travis.yml CHANGED
@@ -1,7 +1,17 @@
1
- script: "rake spec"
1
+ language: ruby
2
+ script: "bundle exec rake spec"
3
+ notifications:
4
+ email:
5
+ recipients:
6
+ - engineering@internal.site5.com
7
+ on_success: never
8
+ on_failure: always
2
9
  rvm:
3
10
  - 1.8.7
4
11
  - 1.9.2
12
+ - 1.9.3
5
13
  - ree
6
- - rbx
7
- - jruby
14
+ - rbx-head
15
+ - rbx-18mode
16
+ - jruby-18mode
17
+ - jruby-19mode
data/README.md CHANGED
@@ -1,69 +1,164 @@
1
- Squall
2
- =======
3
- [![Build Status](http://travis-ci.org/site5/squall.png)](http://travis-ci.org/site5/squall)
1
+ Squall [![Squall Build Status][Build Icon]][Build Status]
2
+ =========================================================
4
3
 
4
+ A Ruby library for working with the [OnApp REST API][].
5
5
 
6
- A Ruby library for working with the OnApp REST API
6
+ Squall has been tested on MRI 1.8.7, MRI 1.9.2, MRI 1.9.3 Preview 1,
7
+ Rubinius 2.0.0pre, and JRuby 1.6.2.
7
8
 
8
- [RDoc](http://rdoc.info/github/site5/squall/master/frames)
9
+ Documentation is available in [RDoc][] format.
9
10
 
10
- Confirmed to work with ruby 1.8.7, 1.9.2, Rubinis, REE and JRuby 1.6.0 with OnApp 2.1
11
+ [Build Status]: http://travis-ci.org/site5/squall
12
+ [Build Icon]: https://secure.travis-ci.org/site5/squall.png?branch=master
13
+ [OnApp REST API]: https://help.onapp.com/manual.php?m=2
14
+ [RDoc]: http://rdoc.info/github/site5/squall/master/frames
11
15
 
12
16
  Install
13
17
  -------
14
18
 
15
19
  gem install squall
20
+ bundle install
16
21
 
22
+ Configuration
23
+ -------------
17
24
 
18
- Usage
19
- -----
25
+ You have two main options for configuring Squall.
20
26
 
21
- Configure
27
+ Directly in a config block:
22
28
 
23
29
  require 'squall'
24
30
 
25
31
  Squall.config do |c|
26
- c.base_uri 'https://onappurl.com'
27
- c.username 'username'
28
- c.password 'topsecret'
32
+ c.base_uri 'https://onappurl.com' # Root level URI for OnApp instance
33
+ c.username 'username' # OnApp username
34
+ c.password 'topsecret' # OnApp password
35
+ c.debug true # Toggle HTTParty debugging (prints to $stderr)
29
36
  end
30
37
 
31
- Show the info for a VM
38
+ Squall can load configuration from a yaml file:
39
+
40
+ # .squall.yml
41
+ base_uri: 'https://onappurl.com'
42
+ username: 'username'
43
+ password: 'topsecret'
44
+ debug: false
45
+
46
+ To load it (by default it assumes ~/.squall.yml):
47
+
48
+ Squall.config_file(/[path]/[to]/.squall.yml)
49
+
50
+ It is also possible to change individual configuration settings on the fly.
51
+
52
+ Squall.configuration.debug(true)
53
+
54
+ Note: you will need to re-instantiate all modules after changing Squall's configuration.
55
+
56
+ Usage
57
+ -----
58
+
59
+ Show the info for a VM:
32
60
 
33
61
  vm = Squall::VirtualMachine.new
34
62
  vm.show 1
35
63
 
36
-
37
- Create a new VM
64
+ Create a new VM:
38
65
 
39
66
  vm = Squall::VirtualMachine.new
40
67
 
41
68
  params = {
42
- :label => 'testmachine',
43
- :hypervisor_id => 5,
44
- :hostname => 'testmachine',
45
- :memory => 512,
46
- :cpus => 1,
47
- :cpu_shares => 10,
48
- :primary_disk_size => 10
69
+ :label => 'testmachine',
70
+ :hypervisor_id => 5,
71
+ :hostname => 'testmachine',
72
+ :memory => 512,
73
+ :cpus => 1,
74
+ :cpu_shares => 10,
75
+ :primary_disk_size => 10,
76
+ :template_id => 1
49
77
  }
50
78
 
51
79
  vm.create params
52
80
 
81
+ Supported Methods
82
+ -----------------
83
+
84
+ This gem partially implements the OnApp API v2.3.
85
+
86
+ The following OnApp modules have been added:
87
+
88
+ * Data store zones
89
+ * Firewall rules
90
+ * Hypervisors
91
+ * Hypervisor zones
92
+ * IP addresses
93
+ * IP address joins
94
+ * Networks
95
+ * Network zones
96
+ * Users
97
+ * User groups
98
+ * Roles
99
+ * Statistics
100
+ * Templates
101
+ * Transactions
102
+ * Virtual machines
103
+ * Whitelists
104
+
105
+ The following still need to be added:
106
+
107
+ * Billing plans
108
+ * Currencies
109
+ * Network interfaces
110
+ * Disks
111
+ * Template groups
112
+ * Software licenses
113
+ * Resolvers
114
+ * VM autoscaling
115
+ * Load Balancers
116
+ * CDN edge servers
117
+ * CDN resources
118
+ * CDN edge groups
119
+ * Backups
120
+ * Autobackup Presets
121
+ * Schedules
122
+ * SSH keys
123
+ * Alerts
124
+ * Logs
125
+ * System configuration
126
+
127
+ Tests
128
+ -----
129
+
130
+ Squall uses rspec for tests. To run:
53
131
 
132
+ bundle exec rake # Runs all tests
133
+ bundle exec rspec spec/squall/[module]_spec.rb # Runs tests for a specific module
134
+
135
+ Squall uses [VCR](https://github.com/myronmarston/vcr) to cache server
136
+ responses to test against. To test via live http connections, pass RERECORD=1
137
+ into test command. NOTE: since OnApp does not currently support a test
138
+ environment this is not recommended unless you know what you're doing, as it
139
+ will destroy live data!
140
+
141
+ Known issues:
142
+
143
+ 1. VirtualMachine#change_user currently breaks the parser on an invalid
144
+ user_id because OnApp returns html instead of JSON
145
+ 2. VirtualMachine#create is currently broken in certain cases. See
146
+ <https://help.onapp.com/kb_article.php?s=0b397f5b851334cea54da9ddd829bf5f&ref=8181-TYFH-8069>
147
+ 3. FirewallRule#edit and #create break the parser by returning invalid JSON
54
148
 
55
149
  Note on Patches/Pull Requests
56
- =======
57
-
150
+ -----------------------------
151
+
58
152
  * Fork the project.
59
153
  * Make your feature addition or bug fix.
60
154
  * Add tests for it. This is important so I don't break it in a
61
155
  future version unintentionally.
62
156
  * Commit, do not mess with rakefile, version, or history.
63
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
157
+ (if you want to have your own version, that is fine but bump version in a
158
+ commit by itself I can ignore when I pull)
64
159
  * Send me a pull request. Bonus points for topic branches.
65
160
 
66
161
  Copyright
67
- =======
162
+ ---------
68
163
 
69
- Copyright (c) 2011 Site5 LLC. See LICENSE for details.
164
+ Copyright (c) 2012 Site5 LLC. See LICENSE for details.
data/Rakefile CHANGED
@@ -18,44 +18,15 @@ end
18
18
  RSpec::Core::RakeTask.new :spec
19
19
  Bundler::GemHelper.install_tasks
20
20
 
21
- desc "Sanitize sensitive info from cassettes"
22
- task :sanitize_cassettes do
23
- yaml = File.join(ENV['HOME'], '.squall.yml')
24
- if File.exists?(yaml)
25
- config = YAML::load_file(yaml)
26
- uri = URI.parse(config['base_uri']).host
27
- user = config['username']
28
- pass = config['password']
29
-
30
- path = File.join(File.dirname(__FILE__), 'spec', 'vcr_cassettes')
31
- files = Dir.glob("#{path}/**/*.yml")
32
- if files.any?
33
- files.each do |file|
34
- old = File.read(file)
35
- # if old.match(/#{uri}|#{user}|#{pass}/)
36
- puts "Sanitizing #{file}"
37
- old.gsub!(user, 'user')
38
- old.gsub!(pass, 'pass')
39
- old.gsub!(uri, 'www.example.com')
40
- old.gsub!(/_onapp_session=(.*?);/, "_onapp_session=WHAT;")
41
- old.gsub!(/- Basic .*/, "- Basic WHAT")
42
- File.open(file, 'w') do |f|
43
- f.write old
44
- end
45
- # end
46
- end
47
- else
48
- puts "Nothing to sanitize"
49
- end
50
- else
51
- puts "I can't sanitize without setting up WHM_HASH and WHM_HOST"
52
- end
53
- end
54
-
55
21
  desc "Run all specs with rcov"
56
22
  RSpec::Core::RakeTask.new(:rcov) do |t|
57
23
  t.rcov = true
58
24
  t.rcov_opts = %w{--exclude osx\/objc,gems\/,spec\/,features\/}
59
25
  end
60
26
 
27
+ desc "Open an irb session preloaded with this library"
28
+ task :console do
29
+ sh "irb -rubygems -r ./lib/squall.rb -I ./lib"
30
+ end
31
+
61
32
  task :default => [:spec]
@@ -0,0 +1,58 @@
1
+ module Squall
2
+ # OnApp DataStoreZone
3
+ class DataStoreZone < Base
4
+ # Returns a list of data store zones
5
+ def list
6
+ response = request(:get, "/data_store_zones.json")
7
+ response.collect { |i| i['data_store_group'] }
8
+ end
9
+
10
+ # Get the details for a data store zone
11
+ #
12
+ # ==== Params
13
+ #
14
+ # * +id+ - ID of the data store zone
15
+ def show(id)
16
+ response = request(:get, "/data_store_zones/#{id}.json")
17
+ response['data_store_group']
18
+ end
19
+
20
+ # Updates an existing data store zone
21
+ #
22
+ # ==== Params
23
+ #
24
+ # * +id+ - ID of the data store zone
25
+ # * +options+ - Params for the data store zone
26
+ #
27
+ # ==== Options
28
+ #
29
+ # * +label*+ - Label for the data store zone
30
+ def edit(id, options = {})
31
+ params.required(:label).validate!(options)
32
+ response = request(:put, "/data_store_zones/#{id}.json", :query => {:pack => options})
33
+ end
34
+
35
+ # Creates a new DataStoreZone
36
+ #
37
+ # ==== Params
38
+ #
39
+ # * +options+ - Params for the data store zone
40
+ #
41
+ # ==== Options
42
+ #
43
+ # * +label*+ - Label for the data store zone
44
+ def create(options = {})
45
+ params.required(:label).validate!(options)
46
+ response = request(:post, "/data_store_zones.json", :query => {:pack => options})
47
+ end
48
+
49
+ # Deletes an existing DataStoreZone
50
+ #
51
+ # ==== Params
52
+ #
53
+ # * +id+ - ID of the data store zone
54
+ def delete(id)
55
+ request(:delete, "/data_store_zones/#{id}.json")
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,66 @@
1
+ module Squall
2
+ # OnApp FirewallRule
3
+ class FirewallRule < Base
4
+
5
+ # Return a list of all firewall rules for a virtual machine
6
+ #
7
+ # ==== Params
8
+ #
9
+ # * +vm_id*+ - ID of the virtual machine
10
+ def list(vm_id)
11
+ response = request(:get, "/virtual_machines/#{vm_id}/firewall_rules.json")
12
+ response.collect { |firewall_rule| user['firewall_rule'] }
13
+ end
14
+
15
+ # Create a firewall rule for a virtual machine
16
+ #
17
+ # ==== Params
18
+ #
19
+ # * +vm_id*+ - ID of the virtual machine
20
+ #
21
+ # ==== Options
22
+ #
23
+ # * +command*+ - DROP or ACCEPT
24
+ # * +protocol*+ - TCP or UDP
25
+ # * +network_interface_id*+ - ID of the network interface
26
+ # * +address+ - IP address or range scope for rule. Leave blank to apply to all.
27
+ # * +port+ - Port address for rule
28
+ #
29
+ # ==== Example
30
+ #
31
+ # create :command => "DROP",
32
+ # :protocol => "TCP",
33
+ # :network_interface_id => 1
34
+ def create(vm_id, options={})
35
+ params.required(:command, :protocol, :network_interface_id).accepts(:address, :port).validate!(options)
36
+ request(:post, "/virtual_machines/#{vm_id}/firewall_rules.json", default_params(options))
37
+ end
38
+
39
+ # Edit a firewall rule
40
+ #
41
+ # ==== Params
42
+ #
43
+ # * +vm_id+ - ID of the virtual machine
44
+ # * +id+ - ID of the firewall rule
45
+ # * +options+ - Options for the firewall rule.
46
+ #
47
+ # ==== Options
48
+ #
49
+ # See #create
50
+ def edit(vm_id, id, options={})
51
+ params.accepts(:command, :protocol, :network_interface_id, :address, :port).validate!(options)
52
+ request(:put, "/virtual_machines/#{vm_id}/firewall_rules/#{id}.json", default_params(options))
53
+ end
54
+
55
+ # Delete a firewall rule
56
+ #
57
+ # ==== Params
58
+ #
59
+ # * +vm_id*+ - ID of the virtual machine
60
+ # * +id+ - ID of the firewall rule
61
+ def delete(vm_id, id)
62
+ request(:delete, "/virtual_machines/#{vm_id}/firewall_rules/#{id}.json")
63
+ end
64
+
65
+ end
66
+ end
@@ -2,17 +2,17 @@ module Squall
2
2
  # OnApp Hypervisor
3
3
  class Hypervisor < Base
4
4
 
5
- # Returns a list of all Hypervisors
5
+ # Returns a list of all hypervisors
6
6
  def list
7
7
  req = request(:get, '/settings/hypervisors.json')
8
8
  req.collect { |hv| hv['hypervisor'] }
9
9
  end
10
10
 
11
- # Returns the Hypervisor info as a Hash
11
+ # Returns the hypervisor info as a hash
12
12
  #
13
- # ==== Options
13
+ # ==== Params
14
14
  #
15
- # * +id+ - The id of the Hypervisor
15
+ # * +id+ - The id of the hypervisor
16
16
  def show(id)
17
17
  req = request(:get, "/settings/hypervisors/#{id}.json")
18
18
  req.first[1]
@@ -20,41 +20,93 @@ module Squall
20
20
 
21
21
  # Create a new Hypervisor
22
22
  #
23
+ # ==== Params
24
+ #
25
+ # * +options+ - Options for creating the hypervisor
26
+ #
23
27
  # ==== Options
24
28
  #
25
- # * +options+ - Params for creating the Hypervisor
29
+ # * +label*+ - Label for the hypervisor
30
+ # * +ip_address*+ - IP for the hypervisor
31
+ # * +hypervisor_type*+ - Type of the hypervisor
26
32
  #
27
33
  # ==== Example
28
34
  #
29
35
  # create :label => 'myhv', :ip_address => '127.0.0.1', :hypervisor_type => 'xen'
30
36
  def create(options = {})
31
- params.required(:label, :ip_address, :hypervisor_type).validate!(options)
37
+ params.required(:label, :ip_address, :hypervisor_type).accepts(:memory_overhead, :enabled, :hypervisor_group_id, :disable_failover).validate!(options)
32
38
  req = request(:post, '/settings/hypervisors.json', default_params(options))
33
39
  req.first[1]
34
40
  end
35
41
 
36
42
  # Edit a Hypervisor
37
43
  #
38
- # ==== Options
44
+ # ==== Params
39
45
  #
46
+ # * +id*+ - ID of the hypervisor
40
47
  # * +options+ - Params for editing the Hypervisor
48
+ #
49
+ # ==== Options
50
+ #
51
+ # See #create
52
+ #
41
53
  # ==== Example
42
54
  #
43
- # edit :label => 'myhv', :ip_address => '127.0.0.1'
55
+ # edit 1, :label => 'myhv', :ip_address => '127.0.0.1'
44
56
  def edit(id, options ={})
45
- params.accepts(:label, :ip_address).validate!(options)
57
+ params.accepts(:label, :ip_address, :hypervisor_type, :memory_overhead, :enabled, :hypervisor_group_id, :disable_failover).validate!(options)
46
58
  request(:put, "/settings/hypervisors/#{id}.json", default_params(options))
47
59
  end
48
60
 
49
- # Reboot a Hypervisor
61
+ # Reboot a hypervisor
62
+ #
63
+ # ==== Params
64
+ #
65
+ # * +id*+ - ID of the hypervisor
50
66
  def reboot(id)
51
67
  response = request(:get, "/settings/hypervisors/#{id}/rebooting.json")
52
68
  response['hypervisor']
53
69
  end
54
70
 
55
- # Delete a Hypervisor
71
+ # Delete a hypervisor
72
+ #
73
+ # ==== Params
74
+ #
75
+ # * +id*+ - ID of the hypervisor
56
76
  def delete(id)
57
77
  req = request(:delete, "/settings/hypervisors/#{id}.json")
58
78
  end
79
+
80
+ def virtual_machines(id)
81
+ response = request(:get, "/settings/hypervisors/#{id}/virtual_machines.json")
82
+ response.collect { |vm| vm['virtual_machine'] }
83
+ end
84
+
85
+ def data_store_joins(id)
86
+ response = request(:get, "/settings/hypervisors/#{id}/data_store_joins.json")
87
+ response.collect { |dsj| dsj['data_store_join'] }
88
+ end
89
+
90
+ def add_data_store_join(id, data_store_id)
91
+ request(:post, "/settings/hypervisors/#{id}/data_store_joins.json", :query => {:data_store_id => data_store_id})
92
+ end
93
+
94
+ def remove_data_store_join(id, data_store_join_id)
95
+ request(:delete, "/settings/hypervisors/#{id}/data_store_joins/#{data_store_join_id}.json")
96
+ end
97
+
98
+ def network_joins(id)
99
+ response = request(:get, "/settings/hypervisors/#{id}/network_joins.json")
100
+ response.collect { |nj| nj['network_join'] }
101
+ end
102
+
103
+ def add_network_join(id, options)
104
+ params.required(:network_id, :interface).validate!(options)
105
+ request(:post, "/settings/hypervisors/#{id}/network_joins.json", :query => {:network_join => options})
106
+ end
107
+
108
+ def remove_network_join(id, network_join_id)
109
+ request(:delete, "/settings/hypervisors/#{id}/network_joins/#{network_join_id}.json")
110
+ end
59
111
  end
60
112
  end