nifty-cloud-sdk 1.7

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