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.
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