nifty-cloud-sdk 1.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +112 -0
- data/Gemfile +4 -0
- data/INSTALL +30 -0
- data/LICENSE.txt +58 -0
- data/README.rdoc +375 -0
- data/Rakefile +61 -0
- data/lib/NIFTY.rb +405 -0
- data/lib/NIFTY/Cloud.rb +24 -0
- data/lib/NIFTY/Cloud/availability_zones.rb +23 -0
- data/lib/NIFTY/Cloud/certificates.rb +283 -0
- data/lib/NIFTY/Cloud/images.rb +134 -0
- data/lib/NIFTY/Cloud/instances.rb +372 -0
- data/lib/NIFTY/Cloud/keypairs.rb +76 -0
- data/lib/NIFTY/Cloud/load_balancers.rb +433 -0
- data/lib/NIFTY/Cloud/security_groups.rb +357 -0
- data/lib/NIFTY/Cloud/volumes.rb +140 -0
- data/lib/NIFTY/config.rb +41 -0
- data/lib/NIFTY/exceptions.rb +32 -0
- data/lib/NIFTY/responses.rb +19 -0
- data/lib/NIFTY/version.rb +3 -0
- data/nifty-cloud-sdk.gemspec +28 -0
- data/sample/availability_zones/describe-availability-zones.rb +37 -0
- data/sample/certificate/create-ssl-certificate.rb +41 -0
- data/sample/certificate/delete-ssl-certificate.rb +28 -0
- data/sample/certificate/describe-ssl-certificate-attribute.rb +58 -0
- data/sample/certificate/describe-ssl-certificates.rb +49 -0
- data/sample/certificate/download-ssl-certificate.rb +31 -0
- data/sample/certificate/modify-ssl-certificate-attribute.rb +29 -0
- data/sample/certificate/register-corporate-info-for-certificate.rb +57 -0
- data/sample/certificate/upload-ssl-certificate.rb +32 -0
- data/sample/images/create-image.rb +33 -0
- data/sample/images/delete-image.rb +26 -0
- data/sample/images/describe-images.rb +70 -0
- data/sample/images/modify-image-attribute.rb +33 -0
- data/sample/instances/cancel_copy_instances.rb +26 -0
- data/sample/instances/copy-instances.rb +41 -0
- data/sample/instances/describe-instance-attribute.rb +78 -0
- data/sample/instances/describe-instances.rb +100 -0
- data/sample/instances/modify-instance-attribute.rb +30 -0
- data/sample/instances/reboot-instances.rb +29 -0
- data/sample/instances/run-instances.rb +104 -0
- data/sample/instances/start-instances.rb +36 -0
- data/sample/instances/stop-instances.rb +35 -0
- data/sample/instances/terminate-instances.rb +34 -0
- data/sample/keypairs/create-key-pair.rb +31 -0
- data/sample/keypairs/delete-key-pair.rb +28 -0
- data/sample/keypairs/describe-key-pairs.rb +31 -0
- data/sample/load_balancers/configure-health-check.rb +41 -0
- data/sample/load_balancers/create-load-balancer.rb +35 -0
- data/sample/load_balancers/delete-load-balancer.rb +28 -0
- data/sample/load_balancers/deregister-instances-from-load-balancer.rb +35 -0
- data/sample/load_balancers/describe-instance-health.rb +36 -0
- data/sample/load_balancers/describe-load-balancers.rb +89 -0
- data/sample/load_balancers/register-instances-with-load-balancer.rb +33 -0
- data/sample/load_balancers/register-port-with-load-balancer.rb +37 -0
- data/sample/load_balancers/set-filter-for-load-balancer.rb +38 -0
- data/sample/load_balancers/update-load-balancer.rb +33 -0
- data/sample/security_groups/authorize-security-group-ingress.rb +36 -0
- data/sample/security_groups/create-security-group.rb +29 -0
- data/sample/security_groups/delete-security-group.rb +28 -0
- data/sample/security_groups/deregister-instances-from-security-group.rb +31 -0
- data/sample/security_groups/describe-security-activities.rb +33 -0
- data/sample/security_groups/describe-security-groups.rb +59 -0
- data/sample/security_groups/register-instances-with-security-group.rb +31 -0
- data/sample/security_groups/revoke-security-group-ingress.rb +36 -0
- data/sample/security_groups/update-security-group.rb +30 -0
- data/sample/volumes/attach-volumes.rb +34 -0
- data/sample/volumes/create-volume.rb +38 -0
- data/sample/volumes/delete-volume.rb +28 -0
- data/sample/volumes/describe-volumes.rb +44 -0
- data/sample/volumes/detach-volume.rb +35 -0
- data/test/test_Cloud.rb +186 -0
- data/test/test_Cloud_availability_zones.rb +50 -0
- data/test/test_Cloud_certificates.rb +627 -0
- data/test/test_Cloud_images.rb +284 -0
- data/test/test_Cloud_instances.rb +941 -0
- data/test/test_Cloud_keypairs.rb +177 -0
- data/test/test_Cloud_load_balancers.rb +1183 -0
- data/test/test_Cloud_responses.rb +43 -0
- data/test/test_Cloud_security_groups.rb +699 -0
- data/test/test_Cloud_volumes.rb +325 -0
- data/test/test_helper.rb +23 -0
- 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
|