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