nifty-cloud-sdk 1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/CHANGELOG +112 -0
  2. data/Gemfile +4 -0
  3. data/INSTALL +30 -0
  4. data/LICENSE.txt +58 -0
  5. data/README.rdoc +375 -0
  6. data/Rakefile +61 -0
  7. data/lib/NIFTY.rb +405 -0
  8. data/lib/NIFTY/Cloud.rb +24 -0
  9. data/lib/NIFTY/Cloud/availability_zones.rb +23 -0
  10. data/lib/NIFTY/Cloud/certificates.rb +283 -0
  11. data/lib/NIFTY/Cloud/images.rb +134 -0
  12. data/lib/NIFTY/Cloud/instances.rb +372 -0
  13. data/lib/NIFTY/Cloud/keypairs.rb +76 -0
  14. data/lib/NIFTY/Cloud/load_balancers.rb +433 -0
  15. data/lib/NIFTY/Cloud/security_groups.rb +357 -0
  16. data/lib/NIFTY/Cloud/volumes.rb +140 -0
  17. data/lib/NIFTY/config.rb +41 -0
  18. data/lib/NIFTY/exceptions.rb +32 -0
  19. data/lib/NIFTY/responses.rb +19 -0
  20. data/lib/NIFTY/version.rb +3 -0
  21. data/nifty-cloud-sdk.gemspec +28 -0
  22. data/sample/availability_zones/describe-availability-zones.rb +37 -0
  23. data/sample/certificate/create-ssl-certificate.rb +41 -0
  24. data/sample/certificate/delete-ssl-certificate.rb +28 -0
  25. data/sample/certificate/describe-ssl-certificate-attribute.rb +58 -0
  26. data/sample/certificate/describe-ssl-certificates.rb +49 -0
  27. data/sample/certificate/download-ssl-certificate.rb +31 -0
  28. data/sample/certificate/modify-ssl-certificate-attribute.rb +29 -0
  29. data/sample/certificate/register-corporate-info-for-certificate.rb +57 -0
  30. data/sample/certificate/upload-ssl-certificate.rb +32 -0
  31. data/sample/images/create-image.rb +33 -0
  32. data/sample/images/delete-image.rb +26 -0
  33. data/sample/images/describe-images.rb +70 -0
  34. data/sample/images/modify-image-attribute.rb +33 -0
  35. data/sample/instances/cancel_copy_instances.rb +26 -0
  36. data/sample/instances/copy-instances.rb +41 -0
  37. data/sample/instances/describe-instance-attribute.rb +78 -0
  38. data/sample/instances/describe-instances.rb +100 -0
  39. data/sample/instances/modify-instance-attribute.rb +30 -0
  40. data/sample/instances/reboot-instances.rb +29 -0
  41. data/sample/instances/run-instances.rb +104 -0
  42. data/sample/instances/start-instances.rb +36 -0
  43. data/sample/instances/stop-instances.rb +35 -0
  44. data/sample/instances/terminate-instances.rb +34 -0
  45. data/sample/keypairs/create-key-pair.rb +31 -0
  46. data/sample/keypairs/delete-key-pair.rb +28 -0
  47. data/sample/keypairs/describe-key-pairs.rb +31 -0
  48. data/sample/load_balancers/configure-health-check.rb +41 -0
  49. data/sample/load_balancers/create-load-balancer.rb +35 -0
  50. data/sample/load_balancers/delete-load-balancer.rb +28 -0
  51. data/sample/load_balancers/deregister-instances-from-load-balancer.rb +35 -0
  52. data/sample/load_balancers/describe-instance-health.rb +36 -0
  53. data/sample/load_balancers/describe-load-balancers.rb +89 -0
  54. data/sample/load_balancers/register-instances-with-load-balancer.rb +33 -0
  55. data/sample/load_balancers/register-port-with-load-balancer.rb +37 -0
  56. data/sample/load_balancers/set-filter-for-load-balancer.rb +38 -0
  57. data/sample/load_balancers/update-load-balancer.rb +33 -0
  58. data/sample/security_groups/authorize-security-group-ingress.rb +36 -0
  59. data/sample/security_groups/create-security-group.rb +29 -0
  60. data/sample/security_groups/delete-security-group.rb +28 -0
  61. data/sample/security_groups/deregister-instances-from-security-group.rb +31 -0
  62. data/sample/security_groups/describe-security-activities.rb +33 -0
  63. data/sample/security_groups/describe-security-groups.rb +59 -0
  64. data/sample/security_groups/register-instances-with-security-group.rb +31 -0
  65. data/sample/security_groups/revoke-security-group-ingress.rb +36 -0
  66. data/sample/security_groups/update-security-group.rb +30 -0
  67. data/sample/volumes/attach-volumes.rb +34 -0
  68. data/sample/volumes/create-volume.rb +38 -0
  69. data/sample/volumes/delete-volume.rb +28 -0
  70. data/sample/volumes/describe-volumes.rb +44 -0
  71. data/sample/volumes/detach-volume.rb +35 -0
  72. data/test/test_Cloud.rb +186 -0
  73. data/test/test_Cloud_availability_zones.rb +50 -0
  74. data/test/test_Cloud_certificates.rb +627 -0
  75. data/test/test_Cloud_images.rb +284 -0
  76. data/test/test_Cloud_instances.rb +941 -0
  77. data/test/test_Cloud_keypairs.rb +177 -0
  78. data/test/test_Cloud_load_balancers.rb +1183 -0
  79. data/test/test_Cloud_responses.rb +43 -0
  80. data/test/test_Cloud_security_groups.rb +699 -0
  81. data/test/test_Cloud_volumes.rb +325 -0
  82. data/test/test_helper.rb +23 -0
  83. metadata +275 -0
@@ -0,0 +1,372 @@
1
+ module NIFTY
2
+ module Cloud
3
+ class Base < NIFTY::Base
4
+ INSTANCE_TYPE = ['mini', 'small', 'small2', 'small4', 'medium', 'medium4', 'medium8', 'large', 'large8', 'large16']
5
+ ACCOUNTING_TYPE = ['1', '2']
6
+ BOOLEAN = ['true', 'false']
7
+ IP_TYPE = ['static', 'dynamic']
8
+ INSTANCES_DESCRIBE_ATTRIBUTE = [
9
+ 'instanceType', 'disableApiTermination', 'blockDeviceMapping', 'accountingType',
10
+ 'loadbalancing', 'copyInfo', 'autoscaling', 'ipType', 'groupId', 'description']
11
+ INSTANCES_MODIFY_ATTRIBUTE = ['instanceType', 'disableApiTermination', 'instanceName', 'description', 'ipType', 'groupId']
12
+ INSTANCES_IGNORED_PARAMS = Regexp.union(/MinCount/,
13
+ /MaxCount/,
14
+ /AddisionalInfo/,
15
+ /UserData/,
16
+ /AddressingType/,
17
+ /Placement.GroupName/,
18
+ /KernelId/,
19
+ /RamdiskId/,
20
+ /BlockDeviceMapping.*/,
21
+ /Monitoring\.Enabled/,
22
+ /SubnetId/,
23
+ /InstanceInitiatedShutdownBehavior/)
24
+
25
+ # API「DescribeInstanceAttribute」を実行し、指定したサーバーの詳細情報を取得します。1回のリクエストで、指定したサーバーのどれか1つの詳細情報を取得できます。
26
+ # サーバーを指定するためには、サーバー名が必要です。削除済みのサーバーを指定した、管理外のサーバーを指定したなど、
27
+ # 無効なサーバーを指定した場合は、エラーが返されます。
28
+ #
29
+ # @option options [String] :instance_id サーバー名(必須)
30
+ # @option options [String] :attribute 取得対象の項目名
31
+ # 許可値: instanceType | disableApiTermination | blockDeviceMapping | accountingType | loadbalancing | copyInfo | autoscaling | ipType | groupId | description
32
+ # @return [Hash] レスポンスXML解析結果
33
+ #
34
+ # @example
35
+ # describe_instance_attribute(:instance_id => 'server01', :attribute => 'instanceType')
36
+ #
37
+ def describe_instance_attribute( options = {} )
38
+ raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
39
+ raise ArgumentError, "Invalid :attribute provided." unless blank?(options[:attribute]) || INSTANCES_DESCRIBE_ATTRIBUTE.include?(options[:attribute].to_s)
40
+
41
+ params = {'Action' => 'DescribeInstanceAttribute'}
42
+ params.merge!(opts_to_prms(options, [:instance_id, :attribute]))
43
+
44
+ return response_generator(params)
45
+ end
46
+
47
+
48
+ # API「DescribeInstances」を実行し、指定したサーバーの情報を取得します。1 回のリクエストで、複数のサーバー情報を取得できます。
49
+ # サーバーを指定するためには、サーバー名が必要です。サーバーを指定しない場合は、取得可能なすべてのサーバー情報を取
50
+ # 得します。削除済みのサーバーを指定した、管理外のサーバーを指定したなど、無効なID を指定した場合は、エラーが返されます。
51
+ #
52
+ # @option options [Array<String>] :instance_id サーバー名
53
+ # @return [Hash] レスポンスXML解析結果
54
+ #
55
+ # @example
56
+ # describe_instances(:instance_id => 'server01')
57
+ #
58
+ def describe_instances( options = {} )
59
+ params = {'Action' => 'DescribeInstances'}
60
+ params.merge!(pathlist('InstanceId', options[:instance_id]))
61
+
62
+ return response_generator(params)
63
+ end
64
+
65
+
66
+ # API「ModifyInstanceAttribute」を実行し、指定したサーバーの詳細情報を更新します。1 回のリクエストで、1 つのサーバーの情報を更新できます。
67
+ # サーバーを指定するためには、サーバー名が必要です。削除済みのサーバーを指定した、管理外のサーバーを指定したなど、
68
+ # 無効なサーバーを指定した場合は、エラーが返されます。
69
+ # なお、起動済みのサーバーを指定した場合は、エラーが返されます。サーバーのステータスは、API「DescribeInstances」のレスポン
70
+ # ス値「instanceState」で確認できます。
71
+ #
72
+ # @option options [String] :instance_id サーバー名(必須)
73
+ # @option options [String] :attribute 更新対象の項目名(必須)
74
+ # 許可値: instanceType(サーバータイプを更新) | disableApiTermination(API からのサーバー削除可否を更新) | instanceName(サーバー名を更新) |
75
+ # description(メモ情報を更新) | ipType(IP アドレスの固定化タイプを更新) | groupId(ファイアウォールグループを更新)
76
+ #
77
+ # @option options [String] :value 更新値(必須)
78
+ # 許可値: (:attribute= instanceType) mini | small | small2 | small4 | medium | medium4 | medium8 | large | large8 | large16
79
+ # (:attribute= disableApiTermination) true | false
80
+ # (:attribute= ipType) static | dynamic
81
+ # @return [Hash] レスポンスXML解析結果
82
+ #
83
+ # @example
84
+ # modify_instance_attribute(:instance_id => 'server01', :attribute => 'instanceType', :value => 'mini')
85
+ #
86
+ def modify_instance_attribute( options = {} )
87
+ raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
88
+ raise ArgumentError, "No :attribute provided." if blank?(options[:attribute])
89
+ raise ArgumentError, "Invalid :attribute provided." unless INSTANCES_MODIFY_ATTRIBUTE.include?(options[:attribute].to_s)
90
+ raise ArgumentError, "No :value provided." if blank?(options[:value])
91
+ raise ArgumentError, "Invalid :value provided." if options[:attribute] == 'instanceType' && !INSTANCE_TYPE.include?(options[:value].to_s)
92
+ raise ArgumentError, "Invalid :value provided." if options[:attribute] == 'disableApiTermination' && !BOOLEAN.include?(options[:value].to_s)
93
+ raise ArgumentError, "Invalid :value provided." if options[:attribute] == 'ipType' && !IP_TYPE.include?(options[:value].to_s)
94
+
95
+ params = {'Action' => 'ModifyInstanceAttribute'}
96
+ params.merge!(opts_to_prms(options, [:instance_id, :attribute, :value]))
97
+
98
+ return response_generator(params)
99
+ end
100
+
101
+
102
+ # API「RebootInstances」を実行し、指定したサーバーを再起動します。
103
+ # サーバーを指定するためには、サーバー名が必要です。削除済みのサーバーを指定した、管理外のサーバーを指定したなど、
104
+ # 無効なサーバーを指定した場合は、エラーが返されます。
105
+ # サーバーの再起動には、時間がかかることがあります。サーバーのステータスは、API「DescribeInstances」のレスポンス値
106
+ # 「instanceState」で確認できます。
107
+ #
108
+ # @option options [Array<String>] :instance_id サーバー名(必須)
109
+ # @option options [Boolean] :force 強制オプション
110
+ # 許可値: true(強制実行) | false(強制実行しない)
111
+ # @return [Hash] レスポンスXML解析結果
112
+ #
113
+ # @example
114
+ # reboot_instances(:instance_id => ['server01', 'server02'], :force => false)
115
+ #
116
+ def reboot_instances( options={} )
117
+ raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
118
+ raise ArgumentError, "Invalid :force provided." unless blank?(options[:force]) || BOOLEAN.include?(options[:force].to_s)
119
+
120
+ params = {
121
+ 'Action' => 'RebootInstances',
122
+ 'Force' => options[:force].to_s
123
+ }
124
+ params.merge!(pathlist('InstanceId', options[:instance_id]))
125
+
126
+ return response_generator(params)
127
+ end
128
+
129
+
130
+ # API「RunInstances」を実行し、サーバーを新規作成します。1 回のリクエストで、1 つのサーバーを作成できます。
131
+ # サーバーの作成には、時間がかかることがあります。このAPI のレスポンス「instanceState」を確認し「pending」が返ってきた、
132
+ # タイムアウトした場合は、API「DescribeInstances」のレスポンス値「instanceState」でサーバーのステータスを確認できます。
133
+ # 処理が失敗した場合、サーバーは作成されず、エラーが返されます。
134
+ # またファイアウォール機能を提供していない環境でファイアウォールグループを指定して実行した場合は、エラーが返されます。
135
+ #
136
+ # @option options [String] :image_id OSイメージID名(必須)
137
+ # @option options [String] :key_name SSHキー名
138
+ # @option options [Array<String>] :security_group 適用するファイアフォールグループ名
139
+ # @option options [String] :instance_type サーバータイプ
140
+ # 許可値: mini | small | small2 | small4 | medium | medium4 | medium8 | large | large8 | large16
141
+ # @option options [Boolean] :disable_api_termination APIからのサーバー削除の可否
142
+ # 許可値: true(削除不可) | false(削除可)
143
+ # @option options [String] :accounting_type 利用料金タイプ
144
+ # 許可値: 1(月額課金) | 2(従量課金)
145
+ # @option options [String] :instance_id サーバー名
146
+ # @option options [String] :admin 管理者アカウント
147
+ # @option options [String] :password 管理者アカウントパスワード
148
+ # 許可値: 半角英数字
149
+ # @option options [String] :ip_type IPアドレスタイプ
150
+ # 許可値: static | dynamic
151
+ # @return [Hash] レスポンスXML解析結果
152
+ #
153
+ # @example
154
+ # run_instances(:image_id => 1, :key_name => 'foo', :security_group => ['gr1', 'gr2'], :instance_type => 'mini',
155
+ # :instance_id => 'server01', :password => 'pass', :ip_type => 'static')
156
+ #
157
+ def run_instances( options={} )
158
+ options = {:base64_encoded => false}.merge(options)
159
+
160
+ raise ArgumentError, "No :image_id provided." if blank?(options[:image_id])
161
+ raise ArgumentError, "Invalid :image_id provided." unless options[:image_id].to_s.to_i > 0
162
+ raise ArgumentError, "Invalid :key_name provided." unless blank?(options[:key_name]) || ALPHANUMERIC =~ options[:key_name].to_s
163
+ #raise ArgumentError, "No :security_group provided." if blank?(options[:security_group])
164
+ raise ArgumentError, "Invalid :security_group provided." unless blank?(options[:security_group]) || GROUP_NAME =~ options[:security_group].to_s
165
+ raise ArgumentError, "No :password provided." if options[:image_id].to_s.to_i < 10000 && blank?(options[:password])
166
+ raise ArgumentError, "Invalid :password provided." unless blank?(options[:password]) || ALPHANUMERIC =~ options[:password].to_s
167
+ raise ArgumentError, "Invalid :instance_type provided." unless blank?(options[:instance_type]) || INSTANCE_TYPE.include?(options[:instance_type].to_s)
168
+ raise ArgumentError, "Invalid :disable_api_termination provided." unless blank?(options[:disable_api_termination]) ||
169
+ BOOLEAN.include?(options[:disable_api_termination].to_s)
170
+ raise ArgumentError, "Invalid :accounting_type provided." unless blank?(options[:accounting_type]) || ACCOUNTING_TYPE.include?(options[:accounting_type].to_s)
171
+ raise ArgumentError, "Invalid :ip_type provided." unless blank?(options[:ip_type]) || IP_TYPE.include?(options[:ip_type].to_s)
172
+ raise ArgumentError, ":base64_encoded must be 'true' or 'false'." unless [true, false].include?(options[:base64_encoded])
173
+
174
+ user_data = extract_user_data(options)
175
+ options[:user_data] = user_data
176
+
177
+ params = {
178
+ 'Action' => 'RunInstances',
179
+ 'Monitoring.Enabled' => options[:monitoring_enabled].to_s
180
+ }
181
+ params.merge!(pathlist('SecurityGroup', options[:security_group]))
182
+ params.merge!(pathhashlist('BlockDeviceMapping', options[:block_device_mapping],
183
+ {:device_name => 'DeviceName', :virtual_name => 'VirtualName', :ebs_snapshot_id => 'Ebs.SnapshotId',
184
+ :ebs_volume_size => 'Ebs.VolumeSize', :ebs_delete_on_termination => 'Ebs.DeleteOnTermination',
185
+ :ebs_no_device => 'Ebs.NoDevice' })) unless blank?(options[:block_device_mapping])
186
+ params.merge!(opts_to_prms(options, [:image_id, :min_count, :max_count, :key_name, :additional_info, :user_data, :addressing_type,
187
+ :instance_type, :kernel_id, :ramdisk_id, :subnet_id, :disable_api_termination, :instance_initiated_shutdown_behavior,
188
+ :accounting_type, :instance_id, :admin, :password, :ip_type]))
189
+ params.merge!(opts_to_prms(options, [:availability_zone, :group_name], 'Placement'))
190
+
191
+ params.reject! {|k, v| INSTANCES_IGNORED_PARAMS =~ k } if @@ignore_amz_params
192
+
193
+ return response_generator(params)
194
+ end
195
+
196
+
197
+ # API「StartInstances」を実行し、指定したサーバーを起動します。
198
+ # サーバーを指定するためには、サーバー名が必要です。削除済みのサーバーを指定した、管理外のサーバーを指定したなど、
199
+ # 無効なサーバーを指定した場合は、エラーが返されます。
200
+ # サーバーの起動には、時間がかかることがあります。このAPI のレスポンス「currentState.name」を確認して「pending」が返ってきた場
201
+ # 合は、API「DescribeInstances」のレスポンス値「instanceState」でサーバーのステータスを確認できます。
202
+ #
203
+ # @option options [Array<String>] :instance_id サーバー名(必須)
204
+ # @option options [Array<String>] :instance_type サーバータイプ
205
+ # 許可値: mini | small | small2 | small4 | medium | medium4 | medium8 | large | large8 | large16
206
+ # @option options [Array<String>] :accounting_type 利用料金タイプ
207
+ # @return [Hash] レスポンスXML解析結果
208
+ #
209
+ # @example
210
+ # start_instances(:instance_id => ['server01', 'server02'], :instance_type => ['mini', 'small'], :accounting_type => 2)
211
+ #
212
+ def start_instances( options={} )
213
+ raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
214
+ [options[:instance_type]].flatten.each do |p|
215
+ raise ArgumentError, "Invalid :instance_type provided." unless INSTANCE_TYPE.include?(p.to_s)
216
+ end unless blank?(options[:instance_type])
217
+ [options[:accounting_type]].flatten.each do |p|
218
+ raise ArgumentError, "Invalid :accounting_type provided." unless ACCOUNTING_TYPE.include?(p.to_s)
219
+ end unless blank?(options[:accounting_type])
220
+
221
+ params = {'Action' => 'StartInstances'}
222
+ params.merge!(pathlist('InstanceId', options[:instance_id]))
223
+ params.merge!(pathlist('InstanceType', options[:instance_type]))
224
+ params.merge!(pathlist('AccountingType', options[:accounting_type]))
225
+
226
+ return response_generator(params)
227
+ end
228
+
229
+
230
+ # API「StopInstances」を実行し、指定したサーバーを停止します。
231
+ # サーバーを指定するためには、サーバー名が必要です。削除済みのサーバーを指定した、管理外のサーバーを指定したなど、
232
+ # 無効なサーバーを指定した場合は、エラーが返されます。
233
+ # サーバーの停止には、時間がかかることがあります。このAPI のレスポンス「currentState.name」を確認して「pending」が返ってきた
234
+ # 場合は、API「DescribeInstances」のレスポンス値「instanceState」でサーバーのステータスを確認できます。
235
+ # なお、強制オプションに「true」を指定して実行した際に、サーバーが停止できない状態などのエラーが返されることがあります。
236
+ # 強制オプションに「true」を指定して実行した場合には、システムチェックや修復を行うことをおすすめします。
237
+ #
238
+ # @option options [Array<String>] :instance_id サーバー名(必須)
239
+ # @option options [Boolean] :force 強制オプション
240
+ # 許可値: true | false
241
+ # @return [Hash] レスポンスXML解析結果
242
+ #
243
+ # @example
244
+ # stop_instances(:instance_id => ['server01', 'server02'], :force => false)
245
+ #
246
+ def stop_instances( options={} )
247
+ raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
248
+ raise ArgumentError, "Invalid :force provided." unless blank?(options[:force]) || BOOLEAN.include?(options[:force].to_s)
249
+
250
+ params = {
251
+ 'Action' => 'StopInstances',
252
+ 'Force' => options[:force].to_s
253
+ }
254
+ params.merge!(pathlist('InstanceId', options[:instance_id]))
255
+
256
+ return response_generator(params)
257
+ end
258
+
259
+
260
+ # API「TerminateInstances」を実行し、指定したサーバーを削除します。
261
+ # サーバーを指定するためには、サーバー名が必要です。削除済みのサーバーを指定した、管理外のサーバーを指定したなど、
262
+ # 無効なサーバーを指定した場合は、エラーが返されます。
263
+ # サーバーの削除には、時間がかかることがあります。このAPI のレスポンス「currentState.name」を確認して「pending」が返ってきた
264
+ # 場合は、API「DescribeInstances」のレスポンス値「instanceState」でサーバーのステータスを確認できます。
265
+ # また、API「DescribeInstances」のレスポンスに該当情報がない場合は、削除処理は成功しています。
266
+ #
267
+ # @option options [Array<String>] :instance_id サーバー名(必須)
268
+ # @return [Hash] レスポンスXML解析結果
269
+ #
270
+ # @example
271
+ # terminate_instances(:instance_id => ['server01', 'server02'])
272
+ #
273
+ def terminate_instances( options={} )
274
+ raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
275
+
276
+ params = {'Action' => 'TerminateInstances'}
277
+ params.merge!(pathlist('InstanceId', options[:instance_id]))
278
+
279
+ return response_generator(params)
280
+ end
281
+
282
+
283
+ # API「CopyInstances」を実行し、指定したサーバーのコピーを作成します。
284
+ # 停止中のサーバーのみ指定ができます。コピー後のサーバー名は、指定したコピー後のサーバー名の後ろに「-連番」が付加され
285
+ # た名称になります。
286
+ # サーバーを指定するためには、サーバー名が必要です。停止中以外のサーバーを指定した、管理外のサーバーを指定したなど、
287
+ # 無効なサーバーを指定した場合は、エラーが返されます。
288
+ # またファイアウォール機能を提供していない環境でファイアウォールグループを指定して実行した場合は、エラーが返されます。
289
+ #
290
+ # @option options [String] :instance_id コピー元のサーバー名(必須)
291
+ # @option options [String] :instance_name コピー後のサーバー名(必須)
292
+ # @option options [String] :instance_type サーバータイプ
293
+ # 許可値: mini | small | small2 | small4 | medium | medium4 | medium8 | large | large8 | large16
294
+ # @option options [String] :accounting_type 利用料金タイプ
295
+ # 許可値: 1(月額課金) | 2(従量課金)
296
+ # @option options [Array<Hash>] :load_balancers ロードバランサー設定
297
+ # <Hash> options [String] :load_balancer_name - ロードバランサー名
298
+ # [Integer] :load_balancer_port - 待ち受けポート
299
+ # [Integer] :instance_port - 宛先ポート
300
+ # @option options [Array<String>] :security_group ファイアウォールグループ名
301
+ # @option options [Integer] :copy_count コピー台数
302
+ # @return [Hash] レスポンスXML解析結果
303
+ #
304
+ # @example
305
+ # copy_instances(:instance_id => 'server01', :instance_name => 'copyserver', :instance_type => 'mini', :accounting_type => 2,
306
+ # :load_balancers => [{:load_balancer_name => 'lb1'}, {:load_balancer_port => 80, :instance_port => 80}],
307
+ # :security_group => ['gr1', 'gr2'], :copy_count => 1)
308
+ #
309
+ def copy_instances( options={} )
310
+ raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
311
+ raise ArgumentError, "No :instance_name provided." if blank?(options[:instance_name])
312
+ raise ArgumentError, "Invalid :instance_type provided." unless blank?(options[:instance_type]) || INSTANCE_TYPE.include?(options[:instance_type].to_s)
313
+ raise ArgumentError, "Invalid :accounting_type provided." unless blank?(options[:accounting_type]) || ACCOUNTING_TYPE.include?(options[:accounting_type].to_s)
314
+ raise ArgumentError, "Invalid :ip_type provided." unless blank?(options[:ip_type]) || IP_TYPE.include?(options[:ip_type].to_s)
315
+ unless blank?(options[:load_balancers])
316
+ [options[:load_balancers]].flatten.each do |opt|
317
+ raise ArgumentError, "expected each element of arr_of_hashes to be a Hash" unless opt.is_a?(Hash)
318
+ unless blank?(opt[:load_balancer_name]) && blank?(opt[:load_balancer_port]) && blank?(opt[:instance_port])
319
+ raise ArgumentError, "No :load_balancer_name provided." if blank?(opt[:load_balancer_name])
320
+ raise ArgumentError, "Invalid :load_balancer_name provided." unless LOAD_BALANCER_NAME =~ opt[:load_balancer_name].to_s
321
+ raise ArgumentError, "No :load_balancer_port provided." if blank?(opt[:load_balancer_port])
322
+ raise ArgumentError, "Invalid :load_balancer_port provided." unless valid_port?(opt[:load_balancer_port])
323
+ raise ArgumentError, "No :instance_port provided." if blank?(opt[:instance_port])
324
+ raise ArgumentError, "Invalid :instance_port provided." unless valid_port?(opt[:instance_port])
325
+ end
326
+ end
327
+ end
328
+ #raise ArgumentError, "No :security_group provided." if blank?(options[:security_group])
329
+ raise ArgumentError, "Invalid :security_group provided." unless blank?(options[:security_group]) || GROUP_NAME =~ options[:security_group].to_s
330
+ raise ArgumentError, "Invalid :copy_count provided." unless blank?(options[:copy_count]) || options[:copy_count].to_s.to_i >= 1
331
+
332
+ params = {
333
+ 'Action' => 'CopyInstances',
334
+ 'CopyInstance.ipType' => options[:ip_type].to_s
335
+ }
336
+ params.merge!(pathhashlist('CopyInstance.LoadBalancers',
337
+ options[:load_balancers],
338
+ {:load_balancer_name => 'LoadBalancerName',
339
+ :load_balancer_port => 'LoadBalancerPort',
340
+ :instance_port => 'InstancePort'})) unless blank?(options[:load_balancers])
341
+ params.merge!(pathlist('CopyInstance.SecurityGroup', options[:security_group]))
342
+ params.merge!(opts_to_prms(options, [:instance_id, :copy_count]))
343
+ params.merge!(opts_to_prms(options, [:instance_name, :instance_type, :accounting_type], 'CopyInstance'))
344
+
345
+ return response_generator(params)
346
+ end
347
+
348
+
349
+ # API「CancelCopyInstances」を実行し、指定したサーバーの作成(コピーによる作成)をキャンセルします。
350
+ # 作成待ちのサーバーのみ指定ができます。
351
+ # サーバーを指定するためには、サーバー名が必要です。作成待ち以外のサーバーを指定した、管理外のサーバーを指定したなど、
352
+ # 無効なサーバーを指定した場合は、エラーが返されます。
353
+ #
354
+ # @option options [String] :instance_id キャンセル対象のサーバー名(必須)
355
+ # @return [Hash] レスポンスXML解析結果
356
+ #
357
+ # @example
358
+ # cancel_copy_instances(:instance_id => 'server01')
359
+ #
360
+ def cancel_copy_instances( options={} )
361
+ raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
362
+
363
+ params = {
364
+ 'Action' => 'CancelCopyInstances',
365
+ 'InstanceId' => options[:instance_id].to_s
366
+ }
367
+
368
+ return response_generator(params)
369
+ end
370
+ end # end of Base class
371
+ end # end of Cloud module
372
+ end # end of NIFTY module
@@ -0,0 +1,76 @@
1
+ module NIFTY
2
+ module Cloud
3
+ class Base < NIFTY::Base
4
+ ALPHANUMERIC = /^[a-zA-Z0-9]+$/
5
+
6
+ # API「CreateKeyPair」を実行し、SSH キーを新規作成します。
7
+ # SSHキーには、SSHキー名およびパスワードを設定します。SSHキー名には、同じユーザーが作るキーのうち、一意となる文字列を
8
+ # 指定します。設定したパスワードが使用可能文字ルールに適合しない場合は、エラーが返されます。
9
+ #
10
+ # @option options [String] :key_name SSHキー名(必須)
11
+ # @option options [String] :password パスワード(必須)
12
+ # 使用可能文字 : 半角英数字のみ
13
+ # @return [Hash] レスポンスXML解析結果
14
+ #
15
+ # @example
16
+ # create_keypair(:key_name => 'key', :password => 'pass')
17
+ #
18
+ def create_key_pair( options = {} )
19
+ options = { :key_name => "" }.merge(options)
20
+ raise ArgumentError, "No :key_name provided." if blank?(options[:key_name])
21
+ raise ArgumentError, "Invalid :key_name provided." unless ALPHANUMERIC =~ options[:key_name].to_s
22
+ raise ArgumentError, "No :password provided." if blank?(options[:password])
23
+ raise ArgumentError, "Invalid :password provided." unless ALPHANUMERIC =~ options[:password].to_s
24
+
25
+ params = {'Action' => 'CreateKeyPair'}
26
+ params.merge!(opts_to_prms(options, [:key_name, :password]))
27
+
28
+ return response_generator(params)
29
+ end
30
+
31
+ # API「DeleteKeyPair」を実行し、SSH キーの情報を削除します。
32
+ # SSHキーを指定するためには、SSHキー名が必要です。削除済みのSSHキーを指定した、管理外のSSHキーを指定したなど、
33
+ # 無効なSSH キーを指定した場合は、エラーが返されます。
34
+ #
35
+ # @option options [String] :key_name 削除対象のSSHキー名(必須)
36
+ # @return [Hash] レスポンスXML解析結果
37
+ #
38
+ # @example
39
+ # delete_keypair(:key_name => 'key')
40
+ #
41
+ def delete_key_pair( options = {} )
42
+ options = { :key_name => "" }.merge(options)
43
+ raise ArgumentError, "No :key_name provided." if blank?(options[:key_name])
44
+ raise ArgumentError, "Invalid :key_name provided." unless ALPHANUMERIC =~ options[:key_name].to_s
45
+
46
+ params = {
47
+ 'Action' => 'DeleteKeyPair',
48
+ 'KeyName' => options[:key_name].to_s
49
+ }
50
+
51
+ return response_generator(params)
52
+ end
53
+
54
+
55
+ # API「DescribeKeyPairs」を実行し、指定したSSH キーの情報を取得します。
56
+ # SSHキーを指定するためには、SSHキー名が必要です。SSHキーを指定しない場合は、取得できるすべてのSSHキー情報を取得します。
57
+ # 削除済みのSSH キーを指定した、管理外のSSH キーを指定したなど、無効なSSH キーを指定した場合は、エラーが返されます。
58
+ #
59
+ # @option options [Array<String>] :key_name SSHキー名
60
+ # @return [Hash] レスポンスXML解析結果
61
+ #
62
+ # @example
63
+ # describe_keypairs(:key_name => ['key1', 'key2'])
64
+ #
65
+ def describe_key_pairs( options = {} )
66
+ raise ArgumentError, "Invalid :key_name provided." unless blank?(options[:key_name]) || ALPHANUMERIC =~ options[:key_name].to_s
67
+
68
+ params = {'Action' => 'DescribeKeyPairs'}
69
+ params.merge!(pathlist('KeyName', options[:key_name]))
70
+
71
+ return response_generator(params)
72
+ end
73
+ end
74
+ end
75
+ end
76
+
@@ -0,0 +1,433 @@
1
+ module NIFTY
2
+ module Cloud
3
+ class Base < NIFTY::Base
4
+ LOAD_BALANCER_PROTOCOL = ['HTTP', 'HTTPS', 'FTP']
5
+ BALANCING_TYPE = ['1', '2']
6
+ NETWORK_VOLUMES = ['10', '20', '30', '40', '100', '200']
7
+ IP_VERSION = ['v4', 'v6']
8
+ FILTER_TYPE = ['1', '2']
9
+ LOAD_BALANCER_NAME = /^[a-zA-Z0-9]{1,15}$/
10
+ LOAD_BALANCERS_IGNORED_PARAMS = Regexp.union(/AvailabilityZones .member.*/,
11
+ /HealthCheck .Timeout/)
12
+
13
+ # API「ConfigureHealthCheck」を実行し、指定したロードバランサーのヘルスチェックの設定を変更します。
14
+ # ロードバランサーを指定するためには、ロードバランサー名・ポート番号が必要です。削除済みのロードバランサーを指定した、
15
+ # 管理外のロードバランサーを指定したなど、無効なロードバランサーを指定した場合は、エラーが返されます。
16
+ # ヘルスチェックの実行結果は、API「DescribeInstanceHealth」で確認できます。
17
+ #
18
+ # @option options [String] :load_balancer_name 対象のロードバランサー名(必須)
19
+ # @option options [Integer] :load_balancer_port 対象の待ち受けポート(必須)
20
+ # @option options [Integer] :load_balancer_port 対象の宛先ポート(必須)
21
+ # @option options [String] :target PING プロトコル+":"+宛先ポート(必須)
22
+ # 許可値: TCP:宛先ポート | ICMP
23
+ # @option options [Integer] :interval ヘルスチェック間隔(必須)
24
+ # 許可値: 10 - 300
25
+ # @option options [Integer] :unhealthy_threshold ヘルスチェック回数の閾値(必須)
26
+ # 許可値: 1 - 10
27
+ # @option options [Integer] :healthy_threshold ヘルスチェックの復旧判断
28
+ # 許可値: 1
29
+ # @return [Hash] レスポンスXML解析結果
30
+ #
31
+ # @example
32
+ # configure_health_check(:load_balancer_name => 'bl1', :load_balancer_port => 80, :instance_port => 80, target => 'TCP:80',
33
+ # :interval => 300, :unhealthy_threshold => 10, :healthy_threshold => 1)
34
+ #
35
+ def configure_health_check( options={} )
36
+ raise ArgumentError, "No :load_balancer_name provided." if blank?(options[:load_balancer_name])
37
+ raise ArgumentError, "Invalid :load_balancer_name provided." unless LOAD_BALANCER_NAME =~ options[:load_balancer_name].to_s
38
+ raise ArgumentError, "No :load_balancer_port provided." if blank?(options[:load_balancer_port])
39
+ raise ArgumentError, "Invalid :load_balancer_port provided." unless valid_port?(options[:load_balancer_port])
40
+ raise ArgumentError, "No :instance_port provided." if blank?(options[:instance_port])
41
+ raise ArgumentError, "Invalid :instance_port provided." unless valid_port?(options[:instance_port])
42
+ raise ArgumentError, "No :target provided." if blank?(options[:target])
43
+ raise ArgumentError, "Invalid :target provided." unless /^(TCP:(\d{1,5})|ICMP)$/ =~ options[:target]
44
+ raise ArgumentError, "Invalid :target provided." unless options[:target].to_s == 'ICMP' || valid_port?($2)
45
+ raise ArgumentError, "No :interval provided." if blank?(options[:interval])
46
+ raise ArgumentError, "Invalid :interval provided." unless ('10'..'300').to_a.include?(options[:interval].to_s)
47
+ raise ArgumentError, "No :unhealthy_threshold provided." if blank?(options[:unhealthy_threshold])
48
+ raise ArgumentError, "Invalid :unhealthy_threshold provided." unless ('1'..'10').to_a.include?(options[:unhealthy_threshold].to_s)
49
+ raise ArgumentError, "Invalid :healthy_threshold provided." unless blank?(options[:healthy_threshold]) || '1' == options[:healthy_threshold].to_s
50
+
51
+ params = {'Action' => 'ConfigureHealthCheck'}
52
+ params.merge!(opts_to_prms(options, [:load_balancer_name, :load_balancer_port, :instance_port]))
53
+ params.merge!(opts_to_prms(options, [:target, :interval, :timeout, :unhealthy_threshold, :healthy_threshold], 'HealthCheck'))
54
+
55
+ params.reject! {|k, v| LOAD_BALANCERS_IGNORED_PARAMS =~ k } if @@ignore_amz_params
56
+
57
+ return response_generator(params)
58
+ end
59
+
60
+
61
+ # API「CreateLoadBalancer」を実行し、ロードバランサーの定義を作成します。
62
+ # ロードバランサーの定義を作成します。1 回のリクエストで、1 つのポート定義を作成できます。
63
+ # すでに存在するロードバランサー名を指定した、存在するポート番号を指定した場合は、エラーが返されます。
64
+ # ロードバランサーの定義の作成に成功した場合は、以下のAPI を実行する必要があります。
65
+ # ・ API「RegisterInstancesWithLoadBalancer」(サーバー設定)
66
+ # ・ API「ConfigureHealthCheck」(ヘルスチェック設定)
67
+ # フィルターの設定は、「すべてのアクセスを許可する」になっています。変更を行う場合は以下のAPI を実行する必要があります。
68
+ # ・ API「SetFilterForLoadBalancer」(フィルター設定)
69
+ #
70
+ # @option options [String] :load_balancer_name ロードバランサー名(必須)
71
+ # 使用可能文字: 半角英数字(15文字まで)
72
+ # @option options [Array<Hash>] :listeners ロードバランサー設定
73
+ # <Hash> options [String] :protocol - プロトコル(:load_balancer_portといずれか必須)
74
+ # 許可値: HTTP | HTTPS | FTP
75
+ # [Integer] :load_balancer_port - 待ち受けポート(:protocolといずれか必須)
76
+ # [Integer] :instance_port - 宛先ポート
77
+ # [String] :balancing_type - ロードバランス方式
78
+ # 許可値: 1(Round-Robin) | 2(Least-Connection)
79
+ # @option options [Integer] :network_volume 最大ネットワーク流量
80
+ # 許可値: 10 | 20 | 30 | 40 | 100 | 200 (単位: Mbps)
81
+ # @option options [String] :ip_version グローバルIP アドレスのバージョン
82
+ # 許可値: v4
83
+ # @return [Hash] レスポンスXML解析結果
84
+ #
85
+ # @example
86
+ # create_load_balancer(:load_balancer_name => 'lb1', :listeners => {:protocol => 'http'}, :network_volume => 10)
87
+ #
88
+ def create_load_balancer( options={} )
89
+ raise ArgumentError, "No :load_balancer_name provided." if blank?(options[:load_balancer_name])
90
+ raise ArgumentError, "Invalid :load_balancer_name provided." unless LOAD_BALANCER_NAME =~ options[:load_balancer_name].to_s
91
+ raise ArgumentError, "No :listeners provided." if blank?(options[:listeners])
92
+ [options[:listeners]].flatten.each do |member|
93
+ raise ArgumentError, "expected each element of arr_of_hashes to be a Hash" unless member.is_a?(Hash)
94
+ raise ArgumentError, ":protocol or :load_balancer_port must be provided." if blank?(member[:protocol])&& blank?(member[:load_balancer_port])
95
+ raise ArgumentError, "Invalid :protocol provided." unless blank?(member[:protocol]) || LOAD_BALANCER_PROTOCOL.include?(member[:protocol].to_s.upcase)
96
+ raise ArgumentError, "Invalid :load_balancer_port provided." unless blank?(member[:load_balancer_port]) || valid_port?(member[:load_balancer_port])
97
+ raise ArgumentError, "Invalid :instance_port provided." unless blank?(member[:instance_port]) || valid_port?(member[:instance_port])
98
+ raise ArgumentError, "Invalid :balancing_type provided." unless blank?(member[:balancing_type]) || BALANCING_TYPE.include?(member[:balancing_type].to_s)
99
+ end
100
+ raise ArgumentError, "Invalid :network_volume provided." unless blank?(options[:network_volume]) || NETWORK_VOLUMES.include?(options[:network_volume].to_s)
101
+ raise ArgumentError, "Invalid :ip_version provided." unless blank?(options[:ip_version]) || IP_VERSION.include?(options[:ip_version].to_s)
102
+ params = {'Action' => 'CreateLoadBalancer'}
103
+ params.merge!(opts_to_prms(options, [:load_balancer_name, :network_volume, :ip_version]))
104
+ params.merge!(pathhashlist('Listeners.member', options[:listeners],
105
+ {:protocol => 'Protocol',
106
+ :load_balancer_port => 'LoadBalancerPort',
107
+ :instance_port => 'InstancePort',
108
+ :balancing_type => 'BalancingType'}))
109
+ params.merge!(pathlist('AvailabilityZones.member', options[:availability_zones]))
110
+
111
+ params.reject! {|k, v| LOAD_BALANCERS_IGNORED_PARAMS =~ k } if @@ignore_amz_params
112
+
113
+ return response_generator(params)
114
+ end
115
+
116
+
117
+ # API「DeleteLoadBalancer」を実行し、指定したロードバランサーのポート定義を削除します。
118
+ # 関連するフィルター設定・サーバー設定・ヘルスチェック設定もあわせて削除します。
119
+ # ロードバランサーを指定するためには、ロードバランサー名が必要です。削除済みのロードバランサーを指定した、
120
+ # 管理外のロードバランサーを指定したなど、無効なロードバランサーを指定した場合は、エラーが返されます。
121
+ #
122
+ # @option options [String] :load_balancer_name 削除対象のロードバランサー名(必須)
123
+ # @option options [Integer] :load_balancer_port 削除対象の待ち受けポート(必須)
124
+ # @option options [Integer] :instance_port 削除対象の宛先ポート(必須)
125
+ # @return [Hash] レスポンスXML解析結果
126
+ #
127
+ # @example
128
+ # delete_load_balancer(:load_balancer_name => 'lb1', :load_balancer_port => 80, instance_port => 80)
129
+ #
130
+ def delete_load_balancer( options={} )
131
+ raise ArgumentError, "No :load_balancer_name provided." if blank?(options[:load_balancer_name])
132
+ raise ArgumentError, "Invalid :load_balancer_name provided." unless LOAD_BALANCER_NAME =~ options[:load_balancer_name].to_s
133
+ raise ArgumentError, "No :load_balancer_port provided." if blank?(options[:load_balancer_port])
134
+ raise ArgumentError, "Invalid :load_balancer_port provided." unless valid_port?(options[:load_balancer_port])
135
+ raise ArgumentError, "No :instance_port provided." if blank?(options[:instance_port])
136
+ raise ArgumentError, "Invalid :instance_port provided." unless valid_port?(options[:instance_port])
137
+
138
+ params = {'Action' => 'DeleteLoadBalancer'}
139
+ params.merge!(opts_to_prms(options, [:load_balancer_name, :load_balancer_port, :instance_port]))
140
+
141
+ return response_generator(params)
142
+ end
143
+
144
+
145
+ # API「DeregisterInstancesFromLoadBalancer」を実行し、指定したロードバランサーから、指定したサーバーを解除します。
146
+ # ロードバランサーを指定するためには、ロードバランサー名・ポート番号が必要です。削除済みのロードバランサーを指定した、
147
+ # 管理外のロードバランサーを指定したなど、無効なロードバランサーを指定した場合は、エラーが返されます。
148
+ # またサーバーを指定するためには、サーバー名が必要です。該当するロードバランサーに設定されていないサーバーを指定した、
149
+ # 削除済みのサーバーを指定した、管理外のサーバーを指定したなど、無効なサーバーを指定した場合は、エラーが返されます。
150
+ #
151
+ # @option options [String] :load_balancer_name 対象のロードバランサー名(必須)
152
+ # @option options [Integer] :load_balancer_port 対象の待ち受けポート(必須)
153
+ # @option options [Integer] :instance_port 対象の宛先ポート(必須)
154
+ # @option options [Array<String>] :instances サーバー名(必須)
155
+ # @return [Hash] レスポンスXML解析結果
156
+ #
157
+ # @example
158
+ # deregister_instances_from_load_balancer(:load_balancer_name => 'lb1', :load_balancer_port => 80, instance_port => 80, :instances => ['server01'])
159
+ #
160
+ def deregister_instances_from_load_balancer( options={} )
161
+ raise ArgumentError, "No :load_balancer_name provided" if blank?(options[:load_balancer_name])
162
+ raise ArgumentError, "Invalid :load_balancer_name provided." unless LOAD_BALANCER_NAME =~ options[:load_balancer_name].to_s
163
+ raise ArgumentError, "No :load_balancer_port provided." if blank?(options[:load_balancer_port])
164
+ raise ArgumentError, "Invalid :load_balancer_port provided." unless valid_port?(options[:load_balancer_port])
165
+ raise ArgumentError, "No :instance_port provided." if blank?(options[:instance_port])
166
+ raise ArgumentError, "Invalid :instance_port provided." unless valid_port?(options[:instance_port])
167
+ raise ArgumentError, "No :instances provided." if blank?(options[:instances])
168
+
169
+ params = {'Action' => 'DeregisterInstancesFromLoadBalancer'}
170
+ params.merge!(opts_to_prms(options, [:load_balancer_name, :load_balancer_port, :instance_port]))
171
+ params.merge!(pathhashlist('Instances.member', [options[:instances]].flatten.collect{|e| {:instances => e}}, {:instances => 'InstanceId'}))
172
+
173
+ return response_generator(params)
174
+ end
175
+
176
+
177
+ # API「DescribeInstanceHealth」を実行し、指定したロードバランサーに設定されている、サーバーのヘルスチェック結果を取得します。ヘルスチェックは、API
178
+ # 「ConfigureHealthCheck」で設定します。
179
+ # ロードバランサーを指定するためには、ロードバランサー名が必要です。削除済みのロードバランサーを指定した、管理外のロードバランサーを指定したなど、
180
+ # 無効なロードバランサーを指定した場合は、エラーが返されます。
181
+ # またサーバーを指定するためには、サーバー名が必要です。サーバーを指定しない場合は、指定したロードバランサーに設定されているすべてのサーバーを対象として、
182
+ # ヘルスチェック結果を取得します。
183
+ # 削除済みのサーバーを指定した、管理外のサーバーを指定したなど、無効なサーバーを指定した場合は、エラーが返されます。
184
+ #
185
+ # @option options [String] :load_balancer_name 対象のロードバランサー名(必須)
186
+ # @option options [Integer] :load_balancer_port 対象の待ち受けポート(必須)
187
+ # @option options [Integer] :instance_port 対象の宛先ポート(必須)
188
+ # @option options [Array<String>] :instances サーバー名
189
+ # @return [Hash] レスポンスXML解析結果
190
+ #
191
+ # @example
192
+ # describe_instance_health(:load_balancer_name => 'bl1', :load_balancer_port => 80, :instance_port => 80, :instances => ['server01'])
193
+ #
194
+ def describe_instance_health( options={} )
195
+ raise ArgumentError, "No :load_balancer_name provided" if blank?(options[:load_balancer_name])
196
+ raise ArgumentError, "Invalid :load_balancer_name provided." unless LOAD_BALANCER_NAME =~ options[:load_balancer_name].to_s
197
+ raise ArgumentError, "No :load_balancer_port provided." if blank?(options[:load_balancer_port])
198
+ raise ArgumentError, "Invalid :load_balancer_port provided." unless valid_port?(options[:load_balancer_port])
199
+ raise ArgumentError, "No :instance_port provided." if blank?(options[:instance_port])
200
+ raise ArgumentError, "Invalid :instance_port provided." unless valid_port?(options[:instance_port])
201
+
202
+ params = {'Action' => 'DescribeInstanceHealth'}
203
+ params.merge!(opts_to_prms(options, [:load_balancer_name, :load_balancer_port, :instance_port]))
204
+ params.merge!(pathhashlist('Instances.member', [options[:instances]].flatten.collect{|e| {:instances => e}},
205
+ {:instances => 'InstanceId'})) if options.has_key?(:instances)
206
+
207
+ return response_generator(params)
208
+ end
209
+
210
+
211
+ # API「DescribeLoadBalancers」を実行し、指定したロードバランサーの情報を取得します。
212
+ # ロードバランサーを指定するためには、ロードバランサー名が必要です。ロードバランサーを指定しない場合は、取得可能なすべての
213
+ # ロードバランサー情報を取得します。
214
+ # 削除済みのロードバランサーを指定した、管理外のロードバランサーを指定したなど、無効なロードバランサーを指定した場合は、エラーが返されます。
215
+ #
216
+ # @option options [Array<String>] :load_balancer_name ロードバランサー名
217
+ # @option options [Array<Integer>] :load_balancer_port 待ち受けポート
218
+ # @option options [Array<Integer>] :instance_port 宛先ポート
219
+ # @return [Hash] レスポンスXML解析結果
220
+ #
221
+ # @example
222
+ # describe_load_balancers(:load_balancer_name => ['lb1'], :load_balancer_port => [80], :instance_port => [80])
223
+ #
224
+ def describe_load_balancers( options={} )
225
+ [options[:load_balancer_name]].flatten.each do |o|
226
+ raise ArgumentError, "Invalid :load_balancer_name provided." unless LOAD_BALANCER_NAME =~ o.to_s
227
+ end unless blank?(options[:load_balancer_name])
228
+ [options[:load_balancer_port]].flatten.each do |o|
229
+ raise ArgumentError, "Invalid :load_balancer_port provided." unless valid_port?(o)
230
+ end unless blank?(options[:load_balancer_port])
231
+ [options[:instance_port]].flatten.each do |o|
232
+ raise ArgumentError, "Invalid :instance_port provided." unless valid_port?(o)
233
+ end unless blank?(options[:instance_port])
234
+
235
+ params = {'Action' => 'DescribeLoadBalancers'}
236
+ params.merge!(pathlist('LoadBalancerNames.member', options[:load_balancer_name]))
237
+ params.merge!(pathlist('LoadBalancerNames.LoadBalancerPort', options[:load_balancer_port]))
238
+ params.merge!(pathlist('LoadBalancerNames.InstancePort', options[:instance_port]))
239
+
240
+ return response_generator(params)
241
+ end
242
+
243
+
244
+ # API「RegisterInstancesWithLoadBalancer」を実行し、
245
+ # 指定したロードバランサーにサーバーを追加します。
246
+ # ロードバランサーを指定するためには、ロードバランサー名・ポート番号が必要です。削除済みのロードバランサーを指定した、
247
+ # 管理外のロードバランサーを指定したなど、無効なロードバランサーを指定した場合は、エラーが返されます。
248
+ # またサーバーを指定するためには、サーバー名が必要です。IP アドレスを固定化しているサーバーを指定できます。IP アドレス
249
+ # を固定化していないサーバーを指定した、ほかのロードバランサーに設定されているサーバーを指定した、削除済みのサーバーを指定した、
250
+ # 管理外のサーバーを指定したなど、無効なサーバーを指定した場合は、エラーが返されます。
251
+ #
252
+ # @option options [String] :load_balancer_name 対象のロードバランサー名(必須)
253
+ # @option options [Integer] :load_balancer_port 対象の待ち受けポート(必須)
254
+ # @option options [Integer] :instance_port 対象の宛先ポート(必須)
255
+ # @option options [Array<String>] :instances サーバー名(必須)
256
+ # @return [Hash] レスポンスXML解析結果
257
+ #
258
+ # @example
259
+ # register_instances_with_load_balancer(:load_balancer_name => 'lb1', :load_balancer_port => 80, instance_port => 80, :instances => ['server01'])
260
+ #
261
+ def register_instances_with_load_balancer( options={} )
262
+ raise ArgumentError, "No :load_balancer_name provided." if blank?(options[:load_balancer_name])
263
+ raise ArgumentError, "Invalid :load_balancer_name provided." unless LOAD_BALANCER_NAME =~ options[:load_balancer_name].to_s
264
+ raise ArgumentError, "No :load_balancer_port provided." if blank?(options[:load_balancer_port])
265
+ raise ArgumentError, "Invalid :load_balancer_port provided." unless valid_port?(options[:load_balancer_port])
266
+ raise ArgumentError, "No :instance_port provided." if blank?(options[:instance_port])
267
+ raise ArgumentError, "Invalid :instance_port provided." unless valid_port?(options[:instance_port])
268
+ raise ArgumentError, "No :instances provided." if blank?(options[:instances])
269
+
270
+ params = {'Action' => 'RegisterInstancesWithLoadBalancer'}
271
+ params.merge!(opts_to_prms(options, [:load_balancer_name, :load_balancer_port, :instance_port]))
272
+ params.merge!(pathhashlist('Instances.member', [options[:instances]].flatten.collect{|e| {:instances => e}}, {:instances => 'InstanceId'}))
273
+
274
+ return response_generator(params)
275
+ end
276
+
277
+
278
+ # API「RegisterPortWithLoadBalancer」を実行し、指定したロードバランサーにポートを追加します。
279
+ # ロードバランサーを指定するためには、ロードバランサー名が必要です。削除済みのロードバランサーを指定した、
280
+ # 管理外のロードバランサーを指定したなど、無効なロードバランサーを指定した場合は、エラーが返されます。
281
+ # ポートの追加に成功した場合は、以下のAPI を実行する必要があります。
282
+ # ・ API「RegisterInstancesWithLoadBalancer」(サーバー設定)
283
+ # ・ API「ConfigureHealthCheck」(ヘルスチェック設定)
284
+ # フィルターの設定は、「すべてのアクセスを許可する」になっています。変更を行う場合は以下のAPI を実行する必要があります。
285
+ # API「SetFilterForLoadBalancer」(フィルター設定)
286
+ #
287
+ # @option options [String] :load_balancer_name 対象のロードバランサー名(必須)
288
+ # @option options [Array<Hash>] :listeners ロードバランサー設定
289
+ # <Hash> option [String] :protocol - 追加するプロトコル(:load_balancer_portといずれか必須)
290
+ # 許可値: HTTP | HTTPS | FTP
291
+ # [Integer] :load_balancer_port - 追加する待ち受けポート(:protocolといずれか必須)
292
+ # [Integer] :instance_port - 追加する宛先ポート
293
+ # [String] :balancing_type - 追加するロードバランス方式
294
+ # 許可値: 1(Round-Robin) | 2(Least-Connection)
295
+ # @return [Hash] レスポンスXML解析結果
296
+ #
297
+ # @example
298
+ # register_port_with_load_balancer(:load_balancer_name => 'lb1', :listeners => {:protocol => 'http', :balancing_type => 1})
299
+ #
300
+ def register_port_with_load_balancer( options={} )
301
+ raise ArgumentError, "No :load_balancer_name provided." if blank?(options[:load_balancer_name])
302
+ raise ArgumentError, "Invalid :load_balancer_name provided." unless LOAD_BALANCER_NAME =~ options[:load_balancer_name].to_s
303
+ raise ArgumentError, "No :listeners provided." if blank?(options[:listeners])
304
+ [options[:listeners]].flatten.each do |member|
305
+ raise ArgumentError, "expected each element of arr_of_hashes to be a Hash" unless member.is_a?(Hash)
306
+ raise ArgumentError, ":protocol or :load_balancer_port must be provided." if blank?(member[:protocol])&&
307
+ blank?(member[:load_balancer_port])
308
+ raise ArgumentError, "Invalid :protocol provided." unless LOAD_BALANCER_PROTOCOL.include?(member[:protocol].to_s.upcase) || blank?(member[:protocol])
309
+ raise ArgumentError, "Invalid :load_balancer_port provided." unless valid_port?(member[:load_balancer_port]) ||
310
+ blank?(member[:load_balancer_port])
311
+ raise ArgumentError, "Invalid :instance_port provided." unless blank?(member[:instance_port]) ||
312
+ valid_port?(member[:instance_port])
313
+ raise ArgumentError, "Invalid :balancing_type provided." unless blank?(member[:balancing_type]) ||
314
+ BALANCING_TYPE.include?(member[:balancing_type].to_s)
315
+ end
316
+
317
+ params = {'Action' => 'RegisterPortWithLoadBalancer'}
318
+ params.merge!(opts_to_prms(options, [:load_balancer_name, :network_volume, :ip_version]))
319
+ params.merge!(pathhashlist('Listeners.member', options[:listeners],
320
+ {:protocol => 'Protocol',
321
+ :load_balancer_port => 'LoadBalancerPort',
322
+ :instance_port => 'InstancePort',
323
+ :balancing_type => 'BalancingType'}))
324
+
325
+ return response_generator(params)
326
+ end
327
+
328
+
329
+ # API「SetFilterForLoadBalancer」を実行し、指定したロードバランサーにアクセスフィルターを設定します。
330
+ # ロードバランサーを指定するためには、ロードバランサー名・ポート番号が必要です。削除済みのロードバランサーを指定した、
331
+ # 管理外のロードバランサーを指定したなど、無効なロードバランサーを指定した場合は、エラーが返されます。
332
+ #
333
+ # @option options [String] :load_balancer_name 対象のロードバランサー名(必須)
334
+ # @option options [Integer] :load_balancer_port 対象の待ち受けポート(必須)
335
+ # @option options [Integer] :instance_port 対象の宛先ポート(必須)
336
+ # @option options [Array<Hash>] :ip_addresses IPアドレス設定
337
+ # <Hash> options [String] :ip_address - アクセス元IPアドレス
338
+ # 許可値: 特定のIPアドレス(IPv4/IPv6)
339
+ # [Boolean] :add_on_filter - 追加フラグ
340
+ # 許可値: true(IPアドレスを追加) | false(IPアドレスを削除)
341
+ # @option options [String] :filter_type 指定したアクセス元IP アドレスへの対処
342
+ # 許可値: 1 | 2
343
+ # @return [Hash] レスポンスXML解析結果
344
+ #
345
+ # @example
346
+ # set_filter_for_load_balancer(:load_balancer_name => 'lb1', :load_balancer_port => 80, :instance_port => 80,
347
+ # :ipaddresses => {:ip_address => '111.111.111.111'}, :filter_type => 1)
348
+ #
349
+ def set_filter_for_load_balancer( options={} )
350
+ raise ArgumentError, "No :load_balancer_name provided." if blank?(options[:load_balancer_name])
351
+ raise ArgumentError, "Invalid :load_balancer_name provided." unless LOAD_BALANCER_NAME =~ options[:load_balancer_name].to_s
352
+ raise ArgumentError, "No :load_balancer_port provided." if blank?(options[:load_balancer_port])
353
+ raise ArgumentError, "Invalid :load_balancer_port provided." unless valid_port?(options[:load_balancer_port])
354
+ raise ArgumentError, "No :instance_port provided." if blank?(options[:instance_port])
355
+ raise ArgumentError, "Invalid :instance_port provided." unless valid_port?(options[:instance_port])
356
+ raise ArgumentError, "Invalid :filter_type provided." unless blank?(options[:filter_type]) || FILTER_TYPE.include?(options[:filter_type].to_s)
357
+
358
+ params = {'Action' => 'SetFilterForLoadBalancer'}
359
+ params.merge!(opts_to_prms(options, [:load_balancer_name, :load_balancer_port, :instance_port, :filter_type]))
360
+
361
+ unless blank?(options[:ip_addresses])
362
+ [options[:ip_addresses]].flatten.each do |member|
363
+ raise ArgumentError, "expected each element of arr_of_hashes to be a Hash" unless member.is_a?(Hash)
364
+ begin IPAddr.new(member[:ip_address].to_s) rescue raise ArgumentError, "Invalid :ip_address provided." end unless blank?(member[:ip_address])
365
+ raise ArgumentError, "Invalid :add_on_filter provided." unless blank?(member[:add_on_filter]) || BOOLEAN.include?(member[:add_on_filter].to_s)
366
+ end
367
+ params.merge!(pathhashlist('IPAddresses.member', options[:ip_addresses],
368
+ { :ip_address => 'IPAddress', :add_on_filter => 'AddOnFilter'}))
369
+ end
370
+
371
+ return response_generator(params)
372
+ end
373
+
374
+ # API「UpdateLoadBalancer」を実行し、指定したロードバランサーの定義を変更します。
375
+ # ポート定義を更新する場合は、ポート番号もあわせて指定します。
376
+ # 削除済みのロードバランサー名・待ち受けポートを指定した、管理外のロードバランサー名を指定した場合は、エラーが返されます。
377
+ #
378
+ # @option options [String] :load_balancer_name 変更対象のロードバランサー名(必須)
379
+ # @option options [Array<Hash>] :listener_update ロードバランサー設定
380
+ # <Hash> options [Integer] :load_balancer_port - 変更対象の待ち受けポート(ポート定義・ロードバランス方式を変更する場合必須)
381
+ # [Integer] :instance_port - 変更対象の宛先ポート(ポート定義・ロードバランス方式を変更する場合必須)
382
+ # [String] :listener_protocol - プロトコルの更新値
383
+ # 許可値: HTTP | HTTPS | FTP
384
+ # [Integer] :listener_load_balancer_port - 待ち受けポートの更新値
385
+ # [Integer] :listener_instance_port - 宛先ポートの更新値
386
+ # [String] :listener_balancing_type - ロードバランス方式の更新値
387
+ # 許可値: 1(Round-Robin) | 2(Least-Connection)
388
+ # @option options [String] :network_volume_update 最大ネットワーク流量の更新値
389
+ # 許可値: 10 | 20 | 30 | 40 | 100 | 200 (単位: Mbps)
390
+ # @return [Hash] レスポンスXML解析結果
391
+ #
392
+ # @example
393
+ # update_load_balancer(:load_balancer_name => 'lb1', :listener_update => {:listener_protocol => 'https', :balancing_type => 2}, :network_volume_update => 20)
394
+ #
395
+ def update_load_balancer( options={} )
396
+ raise ArgumentError, "No :load_balancer_name provided." if blank?(options[:load_balancer_name])
397
+ raise ArgumentError, "Invalid :load_balancer_name provided." unless LOAD_BALANCER_NAME =~ options[:load_balancer_name].to_s
398
+ raise ArgumentError, "No :load_balancer_port provided." if blank?(options[:load_balancer_port]) && (!blank?(options[:listener_load_balancer_port]) ||
399
+ !blank?(options[:listener_instance_port]) ||
400
+ !blank?(options[:listener_protocol]) ||
401
+ !blank?(options[:listener_balancing_type]) ||
402
+ !blank?(options[:instance_port]))
403
+ raise ArgumentError, "Invalid :load_balancer_port provided." unless blank?(options[:load_balancer_port]) ||
404
+ valid_port?(options[:load_balancer_port])
405
+ raise ArgumentError, "No :instance_port provided." if blank?(options[:instance_port]) && !blank?(options[:load_balancer_port])
406
+ raise ArgumentError, "Invalid :instance_port provided." unless blank?(options[:instance_port]) ||
407
+ valid_port?(options[:instance_port])
408
+ raise ArgumentError, "Invalid :listener_protocol provided." unless blank?(options[:listener_protocol]) ||
409
+ LOAD_BALANCER_PROTOCOL.include?(options[:listener_protocol].to_s.upcase)
410
+ raise ArgumentError, "Invalid :listener_load_balancer_port provided." unless blank?(options[:listener_load_balancer_port]) ||
411
+ valid_port?(options[:listener_load_balancer_port])
412
+ raise ArgumentError, "Invalid :listener_instance_port provided." unless blank?(options[:listener_instance_port]) ||
413
+ valid_port?(options[:listener_instance_port])
414
+ raise ArgumentError, "Invalid :listener_balancing_type provided." unless blank?(options[:listener_balancing_type]) ||
415
+ BALANCING_TYPE.include?(options[:listener_balancing_type].to_s)
416
+ raise ArgumentError, "Invalid :network_volume_update provided." unless blank?(options[:network_volume_update]) ||
417
+ NETWORK_VOLUMES.include?(options[:network_volume_update].to_s)
418
+
419
+ params = {
420
+ 'Action' => 'UpdateLoadBalancer',
421
+ 'ListenerUpdate.Listener.Protocol' => options[:listener_protocol].to_s,
422
+ 'ListenerUpdate.Listener.LoadBalancerPort' => options[:listener_load_balancer_port].to_s,
423
+ 'ListenerUpdate.Listener.InstancePort' => options[:listener_instance_port].to_s,
424
+ 'ListenerUpdate.Listener.BalancingType' => options[:listener_balancing_type].to_s
425
+ }
426
+ params.merge!(opts_to_prms(options, [:load_balancer_name, :network_volume_update]))
427
+ params.merge!(opts_to_prms(options, [:load_balancer_port, :instance_port], 'ListenerUpdate'))
428
+
429
+ return response_generator(params)
430
+ end
431
+ end
432
+ end
433
+ end