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/lib/squall/user.rb CHANGED
@@ -4,84 +4,180 @@ module Squall
4
4
  # Return a list of all users
5
5
  def list
6
6
  response = request(:get, '/users.json')
7
- response.collect { |user| user['user']}
7
+ response.collect { |user| user['user'] }
8
8
  end
9
9
 
10
10
 
11
11
  # Create a new User
12
12
  #
13
- # ==== Options
13
+ # ==== Params
14
14
  #
15
15
  # * +options+ - Params for creating the User
16
16
  #
17
+ # ==== Options
18
+ #
19
+ # * +login*+ - Login name
20
+ # * +email*+ - Email address
21
+ # * +first_name*+ - First name
22
+ # * +last_name*+ - Last name
23
+ # * +password*+ - Password
24
+ # * +passwor_confirmation*+ - Password
25
+ # * +role+ - Role to be assigned to user
26
+ # * +time_zone+ - Time zone for user. If not provided it will be set automatically.
27
+ # * +locale+ - Locale for user. If not provided it will be set automatically.
28
+ # * +status+ - User's status: +active+, +suspended+, +deleted+
29
+ # * +billing_plan_id+ - ID of billing plan to be applied to user's account
30
+ # * +role_ids+ - Array of IDs of roles to be assigned to the user
31
+ # * +suspend_after_hours+ - Number of hours after which the account will be automatically suspended
32
+ # * +suspend_at+ - Time after which the account will automatically be suspended, formatted as +YYYYMMDD ThhmmssZ+
33
+ #
17
34
  # ==== Example
18
35
  #
19
- # create :login => 'bob',
20
- # :email => 'something@example.com',
21
- # :password => 'secret',
22
- # :first_name => 'Bob',
23
- # :last_name => 'Smith',
24
- # :group_id => 1
36
+ # create :login => 'bob',
37
+ # :email => 'something@example.com',
38
+ # :password => 'secret',
39
+ # :password_confirmation => 'secret'
40
+ # :first_name => 'Bob',
41
+ # :last_name => 'Smith'
25
42
  def create(options = {})
26
- params.required(:login, :email, :password).accepts(:first_name, :last_name, :group_id).validate!(options)
43
+ params.required(:login, :email,:first_name, :last_name, :password, :password_confirmation).accepts(:role, :time_zone, :locale, :status, :billing_plan_id, :role_ids, :suspend_after_hours, :suspend_at).validate!(options)
27
44
  request(:post, '/users.json', default_params(options))
28
45
  end
29
46
 
30
- # Return a Hash of the given User
47
+ # Edit a user
48
+ #
49
+ # ==== Params
50
+ #
51
+ # * +id*+ - ID of user
52
+ # * +options+ - Params for creating the user
53
+ #
54
+ # ==== Options
55
+ #
56
+ # See #create
57
+ def edit(id, options={})
58
+ params.accepts(:email, :password, :password_confirmation, :first_name, :last_name, :user_group_id, :billing_plan_id, :role_ids, :suspend_at).validate!(options)
59
+ request(:put, "/users/#{id}.json", default_params(options))
60
+ end
61
+
62
+ # Return a Hash of the given user
63
+ #
64
+ # ==== Params
65
+ #
66
+ # * +id*+ - ID of user
31
67
  def show(id)
32
68
  response = request(:get, "/users/#{id}.json")
33
- response.first[1]
69
+ response["user"]
34
70
  end
35
71
 
36
- # Create a new API Key for a User
72
+ # Create a new API Key for a user
73
+ #
74
+ # ==== Params
75
+ #
76
+ # * +id*+ - ID of user
37
77
  def generate_api_key(id)
38
- request(:post, "/users/#{id}/make_new_api_key.json")
78
+ response = request(:post, "/users/#{id}/make_new_api_key.json")
79
+ response["user"]
39
80
  end
40
81
 
41
- # Suspend a User
82
+ # Suspend a user
83
+ #
84
+ # ==== Params
85
+ #
86
+ # * +id*+ - ID of user
42
87
  def suspend(id)
43
88
  response = request(:get, "/users/#{id}/suspend.json")
44
- response.first[1]
89
+ response["user"]
45
90
  end
46
91
 
47
92
  # Activate a user
93
+ #
94
+ # ==== Params
95
+ #
96
+ # * +id*+ - ID of user
48
97
  def activate(id)
49
98
  response = request(:get, "/users/#{id}/activate_user.json")
50
- response.first[1]
99
+ response["user"]
51
100
  end
52
101
  alias_method :unsuspend, :activate
53
102
 
54
103
  # Delete a user
104
+ #
105
+ # ==== Params
106
+ #
107
+ # * +id*+ - ID of user
108
+ #
109
+ # Note: this does not delete remove a user from the database. First, their status will be set to "Deleted." If you call this method again, the user will be completely removed.
55
110
  def delete(id)
56
- response = request(:delete, "/users/#{id}.json")
57
- success
111
+ request(:delete, "/users/#{id}.json")
58
112
  end
59
113
 
60
- # Get the stats for a User
114
+ # Get the stats for each of a User's VirtualMachines
115
+ #
116
+ # ==== Params
117
+ #
118
+ # * +id*+ - ID of user
61
119
  def stats(id)
62
- response = request(:get, "/users/#{id}/vm_stats.json")
63
- response.first['vm_stats']
120
+ request(:get, "/users/#{id}/vm_stats.json")
121
+ end
122
+
123
+ # Get a list of bills for the User
124
+ #
125
+ # ==== Params
126
+ #
127
+ # * +id*+ - ID of user
128
+ def monthly_bills(id)
129
+ response = request(:get, "/users/#{id}/monthly_bills.json")
64
130
  end
65
131
 
66
132
  # Return a list of VirtualMachines for a User
133
+ #
134
+ # ==== Params
135
+ #
136
+ # * +id*+ - ID of user
67
137
  def virtual_machines(id)
68
138
  response = request(:get, "/users/#{id}/virtual_machines.json")
69
139
  response.collect { |vm| vm['virtual_machine']}
70
140
  end
71
141
 
72
- # Edit a role for a user
142
+ # Return a list of Hypervisors for a User's VirtualMachines
73
143
  #
74
- # ==== Options
144
+ # ==== Params
75
145
  #
76
- # * +id+ - id of the User
77
- # * +roles+ - A single Role id or Array of Roles
146
+ # * +id*+ - ID of user
147
+ def hypervisors(id)
148
+ response = request(:get, "/users/#{id}/hypervisors.json")
149
+ response.collect { |vm| vm['hypervisor']}
150
+ end
151
+
152
+ # Return a list of data store zones associated with user
78
153
  #
79
- # ==== Example
154
+ # ==== Params
155
+ #
156
+ # * +id*+ - ID of user
157
+ def data_store_zones(id)
158
+ response = request(:get, "/users/#{id}/data_store_zones.json")
159
+ response.collect { |vm| vm['data-store-group']}
160
+ end
161
+
162
+ # Return a list of network zones associated with user
163
+ #
164
+ # ==== Params
80
165
  #
81
- # edit_role 1, 2 # Role 2
82
- # edit_role 1, [1,2] # Role 1 & 2
83
- def edit_role(id, *roles)
84
- request(:put, "/users/#{id}.json", default_params(:role_ids => roles))
166
+ # * +id*+ - ID of user
167
+ def network_zones(id)
168
+ response = request(:get, "/users/#{id}/network_zones.json")
169
+ response.collect { |vm| vm['network_group']}
85
170
  end
171
+
172
+ # Return a description of resources available to a user for creating a virtual machine
173
+ #
174
+ # ==== Params
175
+ #
176
+ # * +id*+ - ID of user
177
+ def limits(id)
178
+ response = request(:get, "/users/#{id}/limits.json")
179
+ response["limits"]
180
+ end
181
+
86
182
  end
87
183
  end
@@ -0,0 +1,56 @@
1
+ module Squall
2
+ # OnApp UserGroup
3
+ class UserGroup < Base
4
+
5
+ # Return a list of all user groups
6
+ def list
7
+ response = request(:get, "/user_groups.json")
8
+ response.collect { |user_group| user_group['user_group'] }
9
+ end
10
+
11
+ # Create a user group
12
+ #
13
+ # ==== Params
14
+ #
15
+ # * +options+ - Params for creating the user groups
16
+ #
17
+ # ==== Options
18
+ #
19
+ # * +label*+ - Label for the user group
20
+ #
21
+ # ==== Example
22
+ #
23
+ # create :label => "My new user group"
24
+ def create(options={})
25
+ params.required(:label).validate!(options)
26
+ request(:post, "/user_groups.json", default_params(options))
27
+ end
28
+
29
+ # Edit a user group
30
+ #
31
+ # ==== Params
32
+ #
33
+ # * +id*+ - ID of the user group
34
+ # * +options+ - Params for creating the user groups
35
+ #
36
+ # ==== Options
37
+ #
38
+ # See #create
39
+ #
40
+ # * +options+ - Params for editing the user group.
41
+ def edit(id, options={})
42
+ params.accepts(:label).validate!(options)
43
+ request(:put, "/user_groups/#{id}.json", default_params(options))
44
+ end
45
+
46
+ # Delete a user group
47
+ #
48
+ # ==== Params
49
+ #
50
+ # * +id*+ - ID of the user group
51
+ def delete(id)
52
+ request(:delete, "/user_groups/#{id}.json")
53
+ end
54
+
55
+ end
56
+ end
@@ -1,40 +1,66 @@
1
1
  module Squall
2
2
  # OnApp VirtualMachine
3
3
  class VirtualMachine < Base
4
- # Return a list of VirtualMachines
4
+ # Return a list of virtual machines
5
5
  def list
6
6
  response = request(:get, '/virtual_machines.json')
7
7
  response.collect { |v| v['virtual_machine'] }
8
8
  end
9
9
 
10
- # Return a Hash for the given VirtualMachine
10
+ # Return a Hash for the given virtual machines
11
+ #
12
+ # ==== Params
13
+ #
14
+ # * +id*+ - ID of the virtual machine
11
15
  def show(id)
12
16
  response = request(:get, "/virtual_machines/#{id}.json")
13
17
  response.first[1]
14
18
  end
15
19
 
16
- # Create a new VirtualMachine
20
+ # Create a new virtual machine
21
+ #
22
+ # ==== Params
23
+ #
24
+ # * +options+ - Params for creating the virtual machine
17
25
  #
18
26
  # ==== Options
19
27
  #
20
- # * +options+ - Params for creating the VirtualMachine
28
+ # * +label*+ - Label for the virtual machine
29
+ # * +hostname*+ - Hostname for the virtual machine
30
+ # * +memory*+ - Amount of RAM assigned to this virtual machine
31
+ # * +cpus*+ - Number of CPUs assigned to the virtual machine
32
+ # * +cpu_shares*+ - CPU priority for this virtual machine
33
+ # * +primary_disk_size*+ - Disk space for this virtual machine
34
+ # * +template_id*+ - ID for a template from which the virtual machine will be built
35
+ # * +hypervisor_id+ - ID for a hypervisor where virtual machine will be built. If not provided the virtual machine will be assigned to the first available hypervisor
36
+ # * +swap_disk_size+ - Swap space (does not apply to Windows virtual machines)
37
+ # * +primary_network_id+ - ID of the primary network
38
+ # * +required_automatic_backup+ - Set to '1' if automatic backups are required
39
+ # * +rate_limit+ - Max port speed
40
+ # * +required_ip_address_assignment+ - Set to '1' if you wish to assign an IP address automatically
41
+ # * +required_virtual_machine_build+ - Set to '1' to build virtual machine automatically
42
+ # * +admin_note+ - Comment that can only be set by admin of virtual machine
43
+ # * +note+ - Comment that can be set by the user of the virtual machine
44
+ # * +allowed_hot_migrate+ - Set to '1' to allow hot migration
45
+ # * +initial_root_password+ - Root password for the virtual machine. 6-31 characters consisting of letters, numbers, '-' and '_'
21
46
  #
22
47
  # ==== Example
23
48
  #
24
49
  # params = {
25
- # :label => 'testmachine',
50
+ # :label => 'testmachine',
26
51
  # :hypervisor_id => 5,
27
- # :hostname => 'testmachine',
28
- # :memory => 512,
52
+ # :hostname => 'testmachine',
53
+ # :memory => 512,
29
54
  # :cpus => 1,
30
- # :cpu_shares => 10,
31
- # :primary_disk_size => 10
55
+ # :cpu_shares => 10,
56
+ # :primary_disk_size => 10,
57
+ # :template_id => 1
32
58
  # }
33
59
  #
34
60
  # create params
35
61
  def create(options = {})
36
- required = [:label, :hypervisor_id, :hostname, :memory, :cpus, :cpu_shares, :primary_disk_size]
37
- optional = [:cpu_shares,
62
+ required = [:label, :hostname, :memory, :cpus, :cpu_shares, :primary_disk_size, :template_id]
63
+ optional = [:hypervisor_id,
38
64
  :swap_disk_size,
39
65
  :primary_network_id,
40
66
  :required_automatic_backup,
@@ -44,7 +70,6 @@ module Squall
44
70
  :admin_note,
45
71
  :note,
46
72
  :allowed_hot_migrate,
47
- :template_id,
48
73
  :initial_root_password
49
74
  ]
50
75
  params.required(required).accepts(optional).validate! options
@@ -52,37 +77,33 @@ module Squall
52
77
  response['virtual_machine']
53
78
  end
54
79
 
55
- # Build a VirtualMachine
80
+ # Build a virtual machine
81
+ #
82
+ # ==== Params
83
+ #
84
+ # * +id*+ - ID of the virtual machine
85
+ # * +options+ - Params for creating the virtual machine
56
86
  #
57
87
  # ==== Options
58
88
  #
59
- # * +id+
60
- # * +options+ - :template_id, :required_startup
89
+ # * +template_id*+ - ID of the template to be used to build the virtual machine
90
+ # * +required_startup+ - Set to '1' to startup virtual machine after building
61
91
  def build(id, options = {})
62
- params.accepts(:template_id, :required_startup).validate! options
92
+ params.required(:template_id).accepts(:required_startup).validate! options
63
93
  response = request(:post, "/virtual_machines/#{id}/build.json", default_params(options))
64
94
  response.first[1]
65
95
  end
66
96
 
67
- # Edit a new VirtualMachine
97
+ # Edit a virtual machine
68
98
  #
69
- # ==== Options
99
+ # ==== Params
70
100
  #
71
- # * +options+ - Params for editing the VirtualMachine
101
+ # * +id*+ - ID of the virtual machine
102
+ # * +options+ - Params for creating the virtual machine
72
103
  #
73
- # ==== Example
74
- #
75
- # params = {
76
- # :label => 'testmachine',
77
- # :hypervisor_id => 5,
78
- # :hostname => 'testmachine',
79
- # :memory => 512,
80
- # :cpus => 1,
81
- # :cpu_shares => 10,
82
- # :primary_disk_size => 10
83
- # }
104
+ # ==== Options
84
105
  #
85
- # edit params
106
+ # See #create
86
107
  def edit(id, options = {})
87
108
  optional = [:label,
88
109
  :hypervisor_id,
@@ -108,79 +129,182 @@ module Squall
108
129
  request(:put, "/virtual_machines/#{id}.json", default_params(options))
109
130
  end
110
131
 
111
- # Change the owner of a VirtualMachine
132
+ # Change the owner of a virtual machine
112
133
  #
113
- # ==== Options
114
- # * +id+ - id of the VirtualMachine
115
- # * +user_id+ - id of the target User
134
+ # ==== Params
135
+ #
136
+ # * +id*+ - ID of the virtual machine
137
+ # * +user_id*+ - ID of the target User
116
138
  def change_owner(id, user_id)
117
139
  response = request(:post, "/virtual_machines/#{id}/change_owner.json", :query => { :user_id => user_id })
118
140
  response['virtual_machine']
119
141
  end
120
142
 
121
143
  # Change the password
144
+ #
145
+ # ==== Params
146
+ #
147
+ # * +id*+ - ID of the virtual machine
148
+ # * +password*+ - New password
122
149
  def change_password(id, password)
123
150
  response = request(:post, "/virtual_machines/#{id}/reset_password.json", :query => { :new_password => password })
124
151
  response['virtual_machine']
125
152
  end
126
153
 
127
- # Migrate a VirtualMachine to a new Hypervisor
154
+ # Assigns SSH keys of all administrators and a owner to a virtual machine
128
155
  #
129
- # ==== Options
156
+ # ==== Params
157
+ #
158
+ # * +id*+ - ID of the virtual machine
159
+ def set_ssh_keys(id)
160
+ response = request(:post, "/virtual_machines/#{id}/set_ssh_keys.json")
161
+ response['virtual_machine']
162
+ end
163
+
164
+ # Migrate a virtual machine to a new hypervisor
165
+ #
166
+ # ==== Params
130
167
  #
131
- # * +id+
168
+ # * +id*+ - ID of the virtual machine
132
169
  # * +options+ - :destination, :cold_migrate_on_rollback
170
+ #
171
+ # ==== Options
172
+ #
173
+ # * +destination*+ - ID of a hypervisor to which to migrate the virtual machine
174
+ # * +cold_migrate_on_rollback+ - Set to '1' to switch to cold migration if migration fails
133
175
  def migrate(id, options = {})
134
- params.required(:destination).accepts(:cold_migrate_on_rollback).validate! options
135
- response = request(:post, "/virtual_machines/#{id}/migrate.json", :query => options )
176
+ params.required(:destination).accepts(:cold_migrate_on_rollback).validate! options
177
+ response = request(:post, "/virtual_machines/#{id}/migrate.json", :query => {:virtual_machine => options} )
178
+ end
179
+
180
+ # Toggle the VIP status of the virtual machine
181
+ #
182
+ # ==== Params
183
+ #
184
+ # * +id*+ - ID of the virtual machine
185
+ def set_vip(id)
186
+ response = request(:post, "/virtual_machines/#{id}/set_vip.json")
187
+ response['virtual_machine']
136
188
  end
137
189
 
138
- # Delete a VirtualMachine
190
+ # Delete a virtual machine
191
+ #
192
+ # ==== Params
193
+ #
194
+ # * +id*+ - ID of the virtual machine
139
195
  def delete(id)
140
196
  request(:delete, "/virtual_machines/#{id}.json")
141
197
  end
142
198
 
143
- # Resize a VirtualMachine's memory
199
+ # Resize a virtual machine's memory
200
+ #
201
+ # ==== Params
202
+ #
203
+ # * +id*+ - ID of the virtual machine
204
+ # * +options+ - Options for resizing
205
+ #
206
+ # * ==== Options
207
+ #
208
+ # * +memory*+ - Amount of RAM assigned to this virtual machine
209
+ # * +cpus*+ - Number of CPUs assigned to the virtual machine
210
+ # * +cpu_shares*+ - CPU priority for this virtual machine
211
+ # * +allow_cold_resize*+ - Set to '1' to allow cold resize
144
212
  def resize(id, options = {})
145
- params.required(:memory).accepts(:allow_migration).validate! options
213
+ raise ArgumentError, "You must specify at least one of the following attributes to resize: :memory, :cpus, :cpu_shares, :allow_cold_resize" if options.empty?
214
+ params.accepts(:memory, :cpus, :cpu_shares, :allow_cold_resize).validate! options
146
215
  response = request(:post, "/virtual_machines/#{id}/resize.json", default_params(options))
147
216
  response['virtual_machine']
148
217
  end
149
218
 
150
- # Suspend/Unsuspend a VirtualMachine
219
+ # Suspend/Unsuspend a virtual machine
220
+ #
221
+ # ==== Params
222
+ #
223
+ # * +id*+ - ID of the virtual machine
151
224
  def suspend(id)
152
225
  response = request(:post, "/virtual_machines/#{id}/suspend.json")
153
226
  response['virtual_machine']
154
227
  end
155
- alias_method :unsuspend, :suspend
156
228
 
157
- # Unlock a VirtualMachine
229
+ # Unlock a virtual machine
230
+ #
231
+ # ==== Params
232
+ #
233
+ # * +id*+ - ID of the virtual machine
158
234
  def unlock(id)
159
235
  response = request(:post, "/virtual_machines/#{id}/unlock.json")
160
236
  response['virtual_machine']
161
237
  end
162
238
 
163
- # Boot a VirtualMachine
239
+ # Boot a virtual machine
240
+ #
241
+ # ==== Params
242
+ #
243
+ # * +id*+ - ID of the virtual machine
164
244
  def startup(id)
165
245
  response = request(:post, "/virtual_machines/#{id}/startup.json")
166
246
  response['virtual_machine']
167
247
  end
168
248
 
169
- # Shutdown a VirtualMachine
249
+ # Shutdown a virtual machine
250
+ #
251
+ # ==== Params
252
+ #
253
+ # * +id*+ - ID of the virtual machine
170
254
  def shutdown(id)
171
255
  response = request(:post, "/virtual_machines/#{id}/shutdown.json")
172
256
  response['virtual_machine']
173
257
  end
174
258
 
175
- # Stop a VirtualMachine
259
+ # Stop a virtual machine
260
+ #
261
+ # ==== Params
262
+ #
263
+ # * +id*+ - ID of the virtual machine
176
264
  def stop(id)
177
265
  response = request(:post, "/virtual_machines/#{id}/stop.json")
178
266
  response['virtual_machine']
179
267
  end
180
268
 
181
- # Reboot a VirtualMachine
182
- def reboot(id)
183
- response = request(:post, "/virtual_machines/#{id}/reboot.json")
269
+ # Reboot a virtual machine
270
+ #
271
+ # ==== Params
272
+ #
273
+ # * +id*+ - ID of the virtual machine
274
+ # * +recovery+ - Set to true to reboot in recovery, defaults to false
275
+ def reboot(id, recovery=false)
276
+ response = request(:post, "/virtual_machines/#{id}/reboot.json", {:query => recovery ? {:mode => :recovery} : nil})
277
+ response['virtual_machine']
278
+ end
279
+
280
+ # Segregate a virtual machine from another virtual machine
281
+ #
282
+ # ==== Params
283
+ #
284
+ # * +id*+ - ID of the virtual machine
285
+ # * +target_vm_id+* - ID of another virtual machine from which it should be segregated
286
+ def segregate(id, target_vm_id)
287
+ response = request(:post, "/virtual_machines/#{id}/strict_vm.json", default_params(:strict_virtual_machine_id => target_vm_id))
288
+ response['virtual_machine']
289
+ end
290
+
291
+ # Open a console for a virtual machine
292
+ #
293
+ # ==== Params
294
+ #
295
+ # * +id*+ - ID of the virtual machine
296
+ def console(id)
297
+ response = request(:post, "/virtual_machines/#{id}/console.json")
298
+ response['virtual_machine']
299
+ end
300
+
301
+ # Get billing statistics for a virtual machine
302
+ #
303
+ # ==== Params
304
+ #
305
+ # * +id*+ - ID of the virtual machine
306
+ def stats(id)
307
+ response = request(:post, "/virtual_machines/#{id}/vm_stats.json")
184
308
  response['virtual_machine']
185
309
  end
186
310
  end
@@ -0,0 +1,74 @@
1
+ module Squall
2
+ # OnApp Whitelist
3
+ class Whitelist < Base
4
+
5
+ # Return a list of all whitelists
6
+ #
7
+ # ==== Params
8
+ #
9
+ # * +user_id*+ - ID of the user to display whitelists for
10
+ def list(user_id)
11
+ response = request(:get, "/users/#{user_id}/user_white_lists.json")
12
+ response.collect { |user| user['user_white_list'] }
13
+ end
14
+
15
+ # Get the details for a whitelist
16
+ #
17
+ # ==== Params
18
+ #
19
+ # * +user_id*+ - ID of the user
20
+ # * +id*+ - ID of the whitelist
21
+ def show(user_id, id)
22
+ response = request(:get, "/users/#{user_id}/user_white_lists/#{id}.json")
23
+ response['user_white_list']
24
+ end
25
+
26
+ # Create a whitelist for a user
27
+ #
28
+ # ==== Params
29
+ #
30
+ # * +user_id*+ - ID of the user
31
+ # * +options+ - Params for creating the whitelist
32
+ #
33
+ # ==== Options
34
+ #
35
+ # * +ip*+ - IP to be whitelisted
36
+ # * +description+ - Description of the whitelist
37
+ #
38
+ # ==== Example
39
+ #
40
+ # create :ip => 192.168.1.1,
41
+ # :description => "Computer that someone I trust uses"
42
+ def create(user_id, options={})
43
+ params.required(:ip).accepts(:description).validate!(options)
44
+ request(:post, "/users/#{user_id}/user_white_lists.json", :query => {:user_white_list => options})
45
+ end
46
+
47
+ # Edit a whitelist
48
+ #
49
+ # ==== Params
50
+ #
51
+ # * +user_id*+ - ID of the user
52
+ # * +id*+ - ID of whitelist
53
+ # * +options+ - Params for editing the whitelist
54
+ #
55
+ # ==== Options
56
+ #
57
+ # See #create
58
+ def edit(user_id, id, options={})
59
+ params.accepts(:ip, :description).validate!(options)
60
+ request(:put, "/users/#{user_id}/user_white_lists/#{id}.json", :query => {:user_white_list => options})
61
+ end
62
+
63
+ # Delete a whitelist
64
+ #
65
+ # ==== Params
66
+ #
67
+ # * +user_id*+ - ID of the user
68
+ # * +id*+ - ID of whitelist
69
+ def delete(user_id, id)
70
+ request(:delete, "/users/#{user_id}/user_white_lists/#{id}.json")
71
+ end
72
+
73
+ end
74
+ end