squall 0.0.3 → 1.0.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 (100) hide show
  1. data/.gitignore +10 -0
  2. data/.rspec +2 -0
  3. data/.rvmrc +1 -0
  4. data/.travis.yml +7 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock +100 -0
  7. data/LICENSE +1 -1
  8. data/README.md +69 -0
  9. data/Rakefile +48 -42
  10. data/lib/squall/base.rb +96 -0
  11. data/lib/squall/config.rb +26 -0
  12. data/lib/squall/exception.rb +13 -0
  13. data/lib/squall/hypervisor.rb +46 -16
  14. data/lib/squall/ip_address.rb +13 -0
  15. data/lib/squall/network.rb +42 -0
  16. data/lib/squall/params.rb +50 -0
  17. data/lib/squall/role.rb +56 -0
  18. data/lib/squall/statistic.rb +10 -0
  19. data/lib/squall/template.rb +22 -0
  20. data/lib/squall/transaction.rb +16 -0
  21. data/lib/squall/user.rb +87 -0
  22. data/lib/squall/version.rb +3 -0
  23. data/lib/squall/virtual_machine.rb +169 -41
  24. data/lib/squall.rb +76 -20
  25. data/spec/params_spec.rb +195 -0
  26. data/spec/spec_helper.rb +47 -0
  27. data/spec/squall/base_spec.rb +135 -0
  28. data/spec/squall/config_spec.rb +44 -0
  29. data/spec/squall/hypervisor_spec.rb +143 -0
  30. data/spec/squall/ip_address_spec.rb +32 -0
  31. data/spec/squall/network_spec.rb +121 -0
  32. data/spec/squall/role_spec.rb +123 -0
  33. data/spec/squall/statistic_spec.rb +23 -0
  34. data/spec/squall/template_spec.rb +59 -0
  35. data/spec/squall/transaction_spec.rb +42 -0
  36. data/spec/squall/user_spec.rb +195 -0
  37. data/spec/squall/virtual_machine_spec.rb +471 -0
  38. data/spec/squall_spec.rb +67 -0
  39. data/spec/vcr_cassettes/hypervisor/create.yml +77 -0
  40. data/spec/vcr_cassettes/hypervisor/delete.yml +77 -0
  41. data/spec/vcr_cassettes/hypervisor/edit.yml +79 -0
  42. data/spec/vcr_cassettes/hypervisor/list.yml +40 -0
  43. data/spec/vcr_cassettes/hypervisor/reboot.yml +77 -0
  44. data/spec/vcr_cassettes/hypervisor/show.yml +77 -0
  45. data/spec/vcr_cassettes/ipaddress/list.yml +77 -0
  46. data/spec/vcr_cassettes/network/create.yml +196 -0
  47. data/spec/vcr_cassettes/network/delete.yml +77 -0
  48. data/spec/vcr_cassettes/network/edit.yml +233 -0
  49. data/spec/vcr_cassettes/network/list.yml +40 -0
  50. data/spec/vcr_cassettes/role/create.yml +77 -0
  51. data/spec/vcr_cassettes/role/delete.yml +77 -0
  52. data/spec/vcr_cassettes/role/edit.yml +139 -0
  53. data/spec/vcr_cassettes/role/list.yml +40 -0
  54. data/spec/vcr_cassettes/role/permissions.yml +40 -0
  55. data/spec/vcr_cassettes/role/show.yml +77 -0
  56. data/spec/vcr_cassettes/statistic/usage_statistics.yml +40 -0
  57. data/spec/vcr_cassettes/template/download.yml +40 -0
  58. data/spec/vcr_cassettes/template/list.yml +40 -0
  59. data/spec/vcr_cassettes/template/make_public.yml +77 -0
  60. data/spec/vcr_cassettes/transaction/list.yml +40 -0
  61. data/spec/vcr_cassettes/transaction/show.yml +77 -0
  62. data/spec/vcr_cassettes/user/activate.yml +40 -0
  63. data/spec/vcr_cassettes/user/create.yml +116 -0
  64. data/spec/vcr_cassettes/user/delete.yml +77 -0
  65. data/spec/vcr_cassettes/user/edit_role.yml +116 -0
  66. data/spec/vcr_cassettes/user/generate_api_key.yml +40 -0
  67. data/spec/vcr_cassettes/user/list.yml +40 -0
  68. data/spec/vcr_cassettes/user/show.yml +77 -0
  69. data/spec/vcr_cassettes/user/stats.yml +40 -0
  70. data/spec/vcr_cassettes/user/suspend.yml +40 -0
  71. data/spec/vcr_cassettes/user/virtual_machines.yml +79 -0
  72. data/spec/vcr_cassettes/virtual_machine/build.yml +77 -0
  73. data/spec/vcr_cassettes/virtual_machine/change_owner.yml +108 -0
  74. data/spec/vcr_cassettes/virtual_machine/change_password.yml +77 -0
  75. data/spec/vcr_cassettes/virtual_machine/create.yml +40 -0
  76. data/spec/vcr_cassettes/virtual_machine/delete.yml +77 -0
  77. data/spec/vcr_cassettes/virtual_machine/edit.yml +77 -0
  78. data/spec/vcr_cassettes/virtual_machine/list.yml +40 -0
  79. data/spec/vcr_cassettes/virtual_machine/migrate.yml +116 -0
  80. data/spec/vcr_cassettes/virtual_machine/reboot.yml +77 -0
  81. data/spec/vcr_cassettes/virtual_machine/resize.yml +77 -0
  82. data/spec/vcr_cassettes/virtual_machine/show.yml +77 -0
  83. data/spec/vcr_cassettes/virtual_machine/shutdown.yml +77 -0
  84. data/spec/vcr_cassettes/virtual_machine/startup.yml +77 -0
  85. data/spec/vcr_cassettes/virtual_machine/stop.yml +77 -0
  86. data/spec/vcr_cassettes/virtual_machine/suspend.yml +77 -0
  87. data/spec/vcr_cassettes/virtual_machine/unlock.yml +77 -0
  88. data/spec/vcr_cassettes/virtual_machine/unsuspend.yml +77 -0
  89. data/squall.gemspec +25 -62
  90. metadata +224 -42
  91. data/.document +0 -5
  92. data/README.rdoc +0 -17
  93. data/VERSION.yml +0 -5
  94. data/lib/squall/client.rb +0 -87
  95. data/test/fixtures/virtual_machines.json +0 -1
  96. data/test/fixtures/virtual_machines_1.json +0 -1
  97. data/test/helper.rb +0 -31
  98. data/test/test_client.rb +0 -152
  99. data/test/test_squall.rb +0 -12
  100. data/test/test_virtual_machine.rb +0 -98
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
4
+ .idea
5
+ *.swp
6
+ test.rb
7
+ *~
8
+ coverage/
9
+ doc/
10
+ TODO
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm 1.8.7@squall
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ script: "rake spec"
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - ree
6
+ - rbx
7
+ - jruby
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,100 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ squall (1.0.0)
5
+ httparty (~> 0.7.4)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ Saikuro (1.1.0)
11
+ abstract (1.0.0)
12
+ activesupport (3.0.6)
13
+ arrayfields (4.7.4)
14
+ awesome_print (0.3.2)
15
+ chronic (0.3.0)
16
+ churn (0.0.13)
17
+ chronic (>= 0.2.3)
18
+ hirb
19
+ json_pure
20
+ main
21
+ ruby_parser (~> 2.0.4)
22
+ sexp_processor (~> 3.0.3)
23
+ colored (1.2)
24
+ crack (0.1.8)
25
+ diff-lcs (1.1.2)
26
+ erubis (2.6.6)
27
+ abstract (>= 1.0.0)
28
+ fakeweb (1.3.0)
29
+ fattr (2.2.0)
30
+ flay (1.4.2)
31
+ ruby_parser (~> 2.0)
32
+ sexp_processor (~> 3.0)
33
+ flog (2.5.1)
34
+ ruby_parser (~> 2.0)
35
+ sexp_processor (~> 3.0)
36
+ haml (3.0.25)
37
+ hirb (0.4.3)
38
+ httparty (0.7.7)
39
+ crack (= 0.1.8)
40
+ i18n (0.5.0)
41
+ json_pure (1.5.1)
42
+ main (4.4.0)
43
+ arrayfields (>= 4.7.4)
44
+ fattr (>= 2.1.0)
45
+ metric_fu (2.1.1)
46
+ Saikuro (>= 1.1.0)
47
+ activesupport (>= 2.0.0)
48
+ chronic (~> 0.3.0)
49
+ churn (>= 0.0.7)
50
+ flay (>= 1.2.1)
51
+ flog (>= 2.3.0)
52
+ rails_best_practices (>= 0.6.4)
53
+ rcov (>= 0.8.3.3)
54
+ reek (>= 1.2.6)
55
+ roodi (>= 2.1.0)
56
+ syntax
57
+ rails_best_practices (0.7.5)
58
+ activesupport
59
+ colored (~> 1.2)
60
+ erubis (~> 2.6.6)
61
+ haml (~> 3.0.18)
62
+ i18n
63
+ ruby-progressbar (~> 0.0.9)
64
+ ruby_parser (~> 2.0.4)
65
+ rcov (0.9.9)
66
+ reek (1.2.8)
67
+ ruby2ruby (~> 1.2)
68
+ ruby_parser (~> 2.0)
69
+ sexp_processor (~> 3.0)
70
+ roodi (2.1.0)
71
+ ruby_parser
72
+ rspec (2.5.0)
73
+ rspec-core (~> 2.5.0)
74
+ rspec-expectations (~> 2.5.0)
75
+ rspec-mocks (~> 2.5.0)
76
+ rspec-core (2.5.1)
77
+ rspec-expectations (2.5.0)
78
+ diff-lcs (~> 1.1.2)
79
+ rspec-mocks (2.5.0)
80
+ ruby-progressbar (0.0.9)
81
+ ruby2ruby (1.2.5)
82
+ ruby_parser (~> 2.0)
83
+ sexp_processor (~> 3.0)
84
+ ruby_parser (2.0.6)
85
+ sexp_processor (~> 3.0)
86
+ sexp_processor (3.0.5)
87
+ syntax (1.0.0)
88
+ vcr (1.8.0)
89
+
90
+ PLATFORMS
91
+ ruby
92
+
93
+ DEPENDENCIES
94
+ awesome_print
95
+ fakeweb (~> 1.3)
96
+ metric_fu (~> 2.1)
97
+ rcov (~> 0.9)
98
+ rspec (~> 2.5)
99
+ squall!
100
+ vcr (~> 1.8)
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Justin Mazzi
1
+ Copyright (c) 2011 Site5 LLC
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md ADDED
@@ -0,0 +1,69 @@
1
+ Squall
2
+ =======
3
+ [![Build Status](http://travis-ci.org/site5/squall.png)](http://travis-ci.org/site5/squall)
4
+
5
+
6
+ A Ruby library for working with the OnApp REST API
7
+
8
+ [RDoc](http://rdoc.info/github/site5/squall/master/frames)
9
+
10
+ Confirmed to work with ruby 1.8.7, 1.9.2, Rubinis, REE and JRuby 1.6.0 with OnApp 2.1
11
+
12
+ Install
13
+ -------
14
+
15
+ gem install squall
16
+
17
+
18
+ Usage
19
+ -----
20
+
21
+ Configure
22
+
23
+ require 'squall'
24
+
25
+ Squall.config do |c|
26
+ c.base_uri 'https://onappurl.com'
27
+ c.username 'username'
28
+ c.password 'topsecret'
29
+ end
30
+
31
+ Show the info for a VM
32
+
33
+ vm = Squall::VirtualMachine.new
34
+ vm.show 1
35
+
36
+
37
+ Create a new VM
38
+
39
+ vm = Squall::VirtualMachine.new
40
+
41
+ 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
49
+ }
50
+
51
+ vm.create params
52
+
53
+
54
+
55
+ Note on Patches/Pull Requests
56
+ =======
57
+
58
+ * Fork the project.
59
+ * Make your feature addition or bug fix.
60
+ * Add tests for it. This is important so I don't break it in a
61
+ future version unintentionally.
62
+ * 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)
64
+ * Send me a pull request. Bonus points for topic branches.
65
+
66
+ Copyright
67
+ =======
68
+
69
+ Copyright (c) 2011 Site5 LLC. See LICENSE for details.
data/Rakefile CHANGED
@@ -1,55 +1,61 @@
1
- require 'rubygems'
2
- require 'rake'
3
-
1
+ require 'bundler'
2
+ require 'uri'
4
3
  begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "squall"
8
- gem.summary = %Q{A Ruby library for working with the OnApp REST API}
9
- gem.description = %Q{A Ruby library for working with the OnApp REST API}
10
- gem.email = "jmazzi@site5.com"
11
- gem.homepage = "http://www.site5.com"
12
- gem.authors = ["Justin Mazzi"]
13
- gem.add_dependency 'rest-client'
14
- gem.add_dependency 'json'
15
- gem.add_development_dependency 'fakeweb'
16
- gem.add_development_dependency 'redgreen'
17
- end
18
- Jeweler::GemcutterTasks.new
4
+ require 'rspec/core/rake_task'
19
5
  rescue LoadError
20
- puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
- end
22
-
23
- require 'rake/testtask'
24
- Rake::TestTask.new(:test) do |test|
25
- test.libs << 'lib' << 'test'
26
- test.pattern = 'test/**/test_*.rb'
27
- test.verbose = true
6
+ puts "Please install rspec (bundle install)"
7
+ exit
28
8
  end
29
9
 
30
10
  begin
31
- require 'rcov/rcovtask'
32
- Rcov::RcovTask.new do |test|
33
- test.libs << 'test'
34
- test.pattern = 'test/**/test_*.rb'
35
- test.verbose = true
11
+ require 'metric_fu'
12
+ MetricFu::Configuration.run do |config|
13
+ config.rcov[:rcov_opts] << "-Ispec"
36
14
  end
37
15
  rescue LoadError
38
- task :rcov do
39
- abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
40
- end
41
16
  end
42
17
 
43
- task :test => :check_dependencies
18
+ RSpec::Core::RakeTask.new :spec
19
+ Bundler::GemHelper.install_tasks
44
20
 
45
- task :default => :test
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']
46
29
 
47
- require 'rake/rdoctask'
48
- Rake::RDocTask.new do |rdoc|
49
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
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
50
54
 
51
- rdoc.rdoc_dir = 'rdoc'
52
- rdoc.title = "squall #{version}"
53
- rdoc.rdoc_files.include('README*')
54
- rdoc.rdoc_files.include('lib/**/*.rb')
55
+ desc "Run all specs with rcov"
56
+ RSpec::Core::RakeTask.new(:rcov) do |t|
57
+ t.rcov = true
58
+ t.rcov_opts = %w{--exclude osx\/objc,gems\/,spec\/,features\/}
55
59
  end
60
+
61
+ task :default => [:spec]
@@ -0,0 +1,96 @@
1
+ module Squall
2
+ # All OnApp API classes subclass Base to get access to
3
+ # HTTParty methods and other convenience methods
4
+ class Base
5
+ # Params instance
6
+ attr_reader :params
7
+
8
+ # Returns true/false for successful/unsuccessful requests
9
+ attr_reader :success
10
+
11
+ # HTTParty class methods
12
+ include HTTParty
13
+
14
+ def initialize
15
+ self.class.base_uri Squall::config[:base_uri]
16
+ self.class.basic_auth Squall::config[:username], Squall::config[:password]
17
+ self.class.format :json
18
+ self.class.headers 'Content-Type' => 'application/json'
19
+ # self.class.debug_output
20
+ end
21
+
22
+ # Returns a Params.new
23
+ def params
24
+ @params = Squall::Params.new
25
+ end
26
+
27
+ # Sets the default URL params for requests and merges +options+
28
+ #
29
+ # ==== Options
30
+ #
31
+ # * +options+
32
+ #
33
+ # ==== Example
34
+ #
35
+ # default_params(:something => 1)
36
+ def default_params(*options)
37
+ options.empty? ? {} : {:query => { key_for_class => options.first}}
38
+ end
39
+
40
+ # Returns an array of Request errors
41
+ def errors
42
+ return [] if @success
43
+ err = {}
44
+ @result.each do |k,v|
45
+ err[k] ||= []
46
+ err[k].push v.respond_to?(:first) ? v.first : v
47
+ end
48
+ err
49
+ end
50
+
51
+ # Peforms an HTTP Request
52
+ #
53
+ # ==== Options
54
+ # * +request_method+ - The HTTP verb for the #request. (:get/:post/:delete etc)
55
+ # * +path+ - URL path
56
+ # * +options+ - HTTP query params
57
+ #
58
+ # ==== Example
59
+ #
60
+ # request :get, '/something.json' # GET /seomthing.json
61
+ # request :put, '/something.json', :something => 1 # PUT /something.json?something=1
62
+ def request(request_method, path, options = {})
63
+ check_config
64
+ @result = self.class.send(request_method, path, options)
65
+ @success = (200..207).include?(@result.code)
66
+ case @result.code
67
+ when (200..207)
68
+ @result
69
+ when 404
70
+ raise NotFound, @result
71
+ when 422
72
+ raise RequestError, @result
73
+ else
74
+ raise ServerError, @result
75
+ end
76
+ end
77
+
78
+ # Raises an error if a request is made without first calling Squall.config
79
+ def check_config
80
+ raise NoConfig, "Squall.config must be specified" if Squall.config.empty?
81
+ end
82
+
83
+ # Sets the default param container for request. It is derived from the
84
+ # class name. Given the class name *Sandwich* and a param *bread* the
85
+ # resulting params would be 'bob[bread]=wheat'
86
+ def key_for_class
87
+ word = self.class.name.split("::").last.to_s.dup
88
+ word.gsub!(/::/, '/')
89
+ word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
90
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
91
+ word.tr!("-", "_")
92
+ word.downcase!
93
+ word.to_sym
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,26 @@
1
+ module Squall
2
+ # Holds the configuration for Squall
3
+ class Config
4
+ attr_accessor :config
5
+
6
+ def initialize
7
+ @config = {}
8
+ end
9
+
10
+ def [](v)
11
+ @config[v]
12
+ end
13
+
14
+ def base_uri(value)
15
+ @config[:base_uri] = value
16
+ end
17
+
18
+ def username(value)
19
+ @config[:username] = value
20
+ end
21
+
22
+ def password(value)
23
+ @config[:password] = value
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ module Squall
2
+ # HTTP 404 not found
3
+ class NotFound < StandardError;end
4
+
5
+ # HTTP 500 error
6
+ class RequestError < StandardError;end
7
+
8
+ # HTTP 422
9
+ class ServerError < StandardError;end
10
+
11
+ # Config missing
12
+ class NoConfig < StandardError;end
13
+ end
@@ -1,30 +1,60 @@
1
1
  module Squall
2
- class Hypervisor < Client
3
-
4
- URI_PREFIX = 'settings/hypervisors'
2
+ # OnApp Hypervisor
3
+ class Hypervisor < Base
5
4
 
5
+ # Returns a list of all Hypervisors
6
6
  def list
7
- if get(URI_PREFIX)
8
- @message.collect { |res| res['hypervisor'] }
9
- else
10
- []
11
- end
7
+ req = request(:get, '/settings/hypervisors.json')
8
+ req.collect { |hv| hv['hypervisor'] }
12
9
  end
13
10
 
11
+ # Returns the Hypervisor info as a Hash
12
+ #
13
+ # ==== Options
14
+ #
15
+ # * +id+ - The id of the Hypervisor
14
16
  def show(id)
15
- get("#{URI_PREFIX}/#{id}") ? @response['hypervisor'] : false
17
+ req = request(:get, "/settings/hypervisors/#{id}.json")
18
+ req.first[1]
19
+ end
20
+
21
+ # Create a new Hypervisor
22
+ #
23
+ # ==== Options
24
+ #
25
+ # * +options+ - Params for creating the Hypervisor
26
+ #
27
+ # ==== Example
28
+ #
29
+ # create :label => 'myhv', :ip_address => '127.0.0.1', :hypervisor_type => 'xen'
30
+ def create(options = {})
31
+ params.required(:label, :ip_address, :hypervisor_type).validate!(options)
32
+ req = request(:post, '/settings/hypervisors.json', default_params(options))
33
+ req.first[1]
16
34
  end
17
35
 
18
- def create(params = {})
19
- required = { :ip_address, :label }
20
- required_options!(required, params)
21
- post(URI_PREFIX, { :hypervisor => params })
22
- @response.code == 201
36
+ # Edit a Hypervisor
37
+ #
38
+ # ==== Options
39
+ #
40
+ # * +options+ - Params for editing the Hypervisor
41
+ # ==== Example
42
+ #
43
+ # edit :label => 'myhv', :ip_address => '127.0.0.1'
44
+ def edit(id, options ={})
45
+ params.accepts(:label, :ip_address).validate!(options)
46
+ request(:put, "/settings/hypervisors/#{id}.json", default_params(options))
23
47
  end
24
48
 
25
- def destroy(id)
26
- delete("#{URI_PREFIX}/#{id}")
49
+ # Reboot a Hypervisor
50
+ def reboot(id)
51
+ response = request(:get, "/settings/hypervisors/#{id}/rebooting.json")
52
+ response['hypervisor']
27
53
  end
28
54
 
55
+ # Delete a Hypervisor
56
+ def delete(id)
57
+ req = request(:delete, "/settings/hypervisors/#{id}.json")
58
+ end
29
59
  end
30
60
  end
@@ -0,0 +1,13 @@
1
+ module Squall
2
+ # OnApp IpAddress
3
+ class IpAddress < Base
4
+ # Returns a list of IpAddresses
5
+ #
6
+ # ==== Options
7
+ # * +network_id+ - required
8
+ def list(network_id)
9
+ response = request(:get, "/settings/networks/#{network_id}/ip_addresses.json")
10
+ response.collect { |ip| ip['ip_address'] }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,42 @@
1
+ module Squall
2
+ # OnApp Network
3
+ class Network < Base
4
+ # Returns a list of Networks
5
+ def list
6
+ response = request(:get, '/settings/networks.json')
7
+ response.collect { |network| network['network'] }
8
+ end
9
+
10
+ # Edit a Network
11
+ #
12
+ # ==== Options
13
+ #
14
+ # * +options+ - Params for editing the Network
15
+ # ==== Example
16
+ #
17
+ # edit :label => 'mynetwork', :network_group_id => 1, :vlan => 2, :identifier => 'something'
18
+ def edit(id, options = {})
19
+ params.accepts(:label, :network_group_id, :vlan, :identifier).validate!(options)
20
+ response = request(:put, "/settings/networks/#{id}.json", default_params(options))
21
+ end
22
+
23
+ # Create a Network
24
+ #
25
+ # ==== Options
26
+ #
27
+ # * +options+ - Params for creating the Network
28
+ # ==== Example
29
+ #
30
+ # create :label => 'mynetwork', :network_group_id => 1, :vlan => 2, :identifier => 'something'
31
+ def create(options = {})
32
+ params.accepts(:label, :vlan, :identifier).required(:label).validate!(options)
33
+ response = request(:post, '/settings/networks.json', default_params(options))
34
+ response.first[1]
35
+ end
36
+
37
+ # Delete a network
38
+ def delete(id)
39
+ request(:delete, "/settings/networks/#{id}.json")
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,50 @@
1
+ module Squall
2
+ class Params
3
+ # Required
4
+ attr_accessor :valid
5
+
6
+ # Optional
7
+ attr_accessor :optional
8
+
9
+ def initialize
10
+ @valid = []
11
+ @optional = []
12
+ end
13
+
14
+ def required(*options)
15
+ @valid = options.flatten.map { |o| o.to_sym}
16
+ @valid.uniq!
17
+ @optional.concat @valid
18
+ @optional.uniq!
19
+ self
20
+ end
21
+
22
+ def accepts(*options)
23
+ @optional.concat options.flatten.map { |o| o.to_sym}
24
+ @optional.uniq!
25
+ self
26
+ end
27
+
28
+ def validate!(*options)
29
+ validate_required!(*options) unless @valid.empty?
30
+ validate_optionals!(*options) unless @optional.empty?
31
+ end
32
+
33
+ def validate_required!(*options)
34
+ options = options.first.keys if options.first.respond_to?(:keys)
35
+ options.map! { |o| o.respond_to?(:to_sym) ? o.to_sym : o }
36
+ delta = (@valid - options)
37
+ raise ArgumentError, "Missing required params: #{delta.join(',')}" if delta.any?
38
+ true
39
+ end
40
+
41
+ def validate_optionals!(*options)
42
+ options = options.first.keys if options.first.respond_to?(:keys)
43
+ options.map! { |o| o.respond_to?(:to_sym) ? o.to_sym : o }
44
+ options.each do |key|
45
+ raise ArgumentError, "Unknown params: #{key}" unless @optional.include?(key)
46
+ end
47
+ true
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,56 @@
1
+ module Squall
2
+ # OnApp Role
3
+ class Role < Base
4
+ # Return a list of Roles
5
+ def list
6
+ response = request(:get, '/roles.json')
7
+ response.collect { |role| role['role']}
8
+ end
9
+
10
+ # Returns a Hash of the given Role
11
+ def show(id)
12
+ response = request(:get, "/roles/#{id}.json")
13
+ response.first[1]
14
+ end
15
+
16
+ # Edit a Role
17
+ #
18
+ # ==== Options
19
+ #
20
+ # * +options+ - Params for editing the Role
21
+ # ==== Example
22
+ #
23
+ # edit :label => 'myrole', :permission => [1,3]
24
+ # edit :label => 'myrole', :permission => 1
25
+ def edit(id, options = {})
26
+ params.accepts(:label, :permission).validate!(options)
27
+ response = request(:put, "/roles/#{id}.json", default_params(options))
28
+ end
29
+
30
+ # Delete a Role
31
+ def delete(id)
32
+ request(:delete, "/roles/#{id}.json")
33
+ end
34
+
35
+ # Returns a list of permissions available
36
+ def permissions
37
+ response = request(:get, '/permissions.json')
38
+ response.collect { |perm| perm['permission'] }
39
+ end
40
+
41
+ # Create a new Role
42
+ #
43
+ # ==== Options
44
+ #
45
+ # * +options+ - Params for creating the Role
46
+ #
47
+ # ==== Example
48
+ #
49
+ # create :label => 'mypriv', :identifier => 'magic'
50
+ def create(options = {})
51
+ params.required(:label, :identifier).validate!(options)
52
+ response = request(:post, '/roles.json', default_params(options))
53
+ response.first[1]
54
+ end
55
+ end
56
+ end