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,357 @@
|
|
1
|
+
module NIFTY
|
2
|
+
module Cloud
|
3
|
+
class Base < NIFTY::Base
|
4
|
+
FILTER_NAME = ['description', 'group-name']
|
5
|
+
IP_PROTOCOL = ['TCP', 'UDP', 'ICMP', 'SSH', 'HTTP', 'HTTPS', 'SMTP', 'POP3', 'IMAP']
|
6
|
+
IN_OUT = ['IN', 'OUT']
|
7
|
+
DATE_FORMAT = %r!^(\d{8}|\d{4}-\d{2}-\d{2}|\d{4}/\d{2}/\d{2})$!
|
8
|
+
GROUP_NAME = Regexp.union(/^[a-zA-Z0-9]+$/, 'default(Linux)', 'default(Windows)')
|
9
|
+
SECURITY_GROUPS_IGNORED_PARAMS = Regexp.union(/UserId/,
|
10
|
+
/IpPermissions\.\d+\.ToPort/,
|
11
|
+
/IpPermissions\.\d+\.Groups\.\d+\.UserId/)
|
12
|
+
|
13
|
+
# API「AuthorizeSecurityGroupIngress」を実行し、指定したファイアウォールグループへ許可ルールを追加します。
|
14
|
+
# 許可ルールの上限数を超える場合は、エラーが返されます。
|
15
|
+
# ファイアウォールグループを指定するためには、ファイアウォールグループ名が必要です。削除済みのファイアウォールグループを指定した、
|
16
|
+
# 管理外のファイアウォールグループを指定したなど、無効なファイアウォールグループを指定した場合は、エラーが返されます。
|
17
|
+
#
|
18
|
+
# @option options [String] :group_name 対象のファイアウォールグループ名(必須)
|
19
|
+
# @option options [Array<Hash>] :ip_permissions IP許可設定
|
20
|
+
# <Hash> options [String] :protocol - 許可プロトコル名
|
21
|
+
# 許可値: TCP | UDP | ICMP | SSH | HTTP | HTTPS
|
22
|
+
# [Integer] :from_port - 許可ポート(:protocolがTCP、UDPの場合は必須)
|
23
|
+
# [String] :in_out - Incoming/Outgoing 指定
|
24
|
+
# 許可値: IN(Incoming) | OUT(Outgoing)
|
25
|
+
# [Array<String>] :group_name - 許可するファイアウォールグループ名(:cidr_ipとどちらか必須)
|
26
|
+
# [Array<String>] :cidr_ip - 許可するIP アドレス(CIDR指定可) (:group_nameとどちらか必須)
|
27
|
+
# @return [Hash] レスポンスXML解析結果
|
28
|
+
#
|
29
|
+
# @example
|
30
|
+
# authorize_security_group_ingress(:group_name => 'gr1', :ip_permissions => [{:protocol => 'TCP',
|
31
|
+
# :from_port => 80,
|
32
|
+
# :in_out => 'IN',
|
33
|
+
# :group_name => ['gr1', 'gr2'],
|
34
|
+
# :cidr_ip => ['111.171.200.1/22', '111.111.111.112']} ])
|
35
|
+
#
|
36
|
+
def authorize_security_group_ingress( options = {} )
|
37
|
+
raise ArgumentError, "No :group_name provided." if blank?(options[:group_name])
|
38
|
+
raise ArgumentError, "Invalid :group_name provided." unless GROUP_NAME =~ options[:group_name].to_s
|
39
|
+
raise ArgumentError, "No :ip_permissions provided." if blank?(options[:ip_permissions])
|
40
|
+
[options[:ip_permissions]].flatten.each do |opt|
|
41
|
+
raise ArgumentError, "expected each element of arr_of_hashes to be a Hash" unless opt.is_a?(Hash)
|
42
|
+
raise ArgumentError, "Invalid :ip_protocol provided." unless blank?(opt[:ip_protocol]) || IP_PROTOCOL.include?(opt[:ip_protocol].to_s.upcase)
|
43
|
+
raise ArgumentError, "No :from_port provided." if /TCP|UDP/ =~ opt[:ip_protocol] && blank?(opt[:from_port])
|
44
|
+
raise ArgumentError, "Invalid :from_port provided." unless blank?(opt[:from_port]) || valid_port?(opt[:from_port])
|
45
|
+
raise ArgumentError, "Invalid :to_port provided." unless blank?(opt[:to_port]) || valid_port?(opt[:to_port])
|
46
|
+
raise ArgumentError, "Invalid :in_out provided." unless blank?(opt[:in_out]) || IN_OUT.include?(opt[:in_out].to_s.upcase)
|
47
|
+
raise ArgumentError, ":group_name or :cidr_ip must be provided." if blank?(opt[:group_name]) && blank?(opt[:cidr_ip])
|
48
|
+
raise ArgumentError, "Invalid :group_name provided." unless blank?(opt[:group_name]) || GROUP_NAME =~ opt[:group_name].to_s
|
49
|
+
[opt[:cidr_ip]].flatten.each do |ip|
|
50
|
+
begin IPAddr.new(ip.to_s) rescue raise ArgumentError, "Invalid :cidr_ip provided." end
|
51
|
+
end unless blank?(opt[:cidr_ip])
|
52
|
+
|
53
|
+
opt[:user_id] = [opt[:user_id]].flatten unless blank?(opt[:user_id])
|
54
|
+
opt[:group_name] = [opt[:group_name]].flatten unless blank?(opt[:group_name])
|
55
|
+
opt[:cidr_ip] = [opt[:cidr_ip]].flatten unless blank?(opt[:cidr_ip])
|
56
|
+
end unless blank?(options[:ip_permissions])
|
57
|
+
|
58
|
+
params = {'Action' => 'AuthorizeSecurityGroupIngress'}
|
59
|
+
params.merge!(opts_to_prms(options, [:user_id, :group_name]))
|
60
|
+
unless blank?(options[:ip_permissions])
|
61
|
+
params.merge!(pathhashlist('IpPermissions', options[:ip_permissions],
|
62
|
+
{ :ip_protocol => 'IpProtocol',
|
63
|
+
:from_port => 'FromPort',
|
64
|
+
:to_port => 'ToPort',
|
65
|
+
:in_out => 'InOut',
|
66
|
+
:user_id => 'Groups',
|
67
|
+
:group_name => 'Groups',
|
68
|
+
:cidr_ip => 'IpRanges'},
|
69
|
+
{ :user_id => 'UserId',
|
70
|
+
:group_name => 'GroupName',
|
71
|
+
:cidr_ip => 'CidrIp'}))
|
72
|
+
end
|
73
|
+
|
74
|
+
params.reject! {|k, v| SECURITY_GROUPS_IGNORED_PARAMS =~ k } if @@ignore_amz_params
|
75
|
+
|
76
|
+
return response_generator(params)
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
# API「CreateSecurityGroup」を実行し、ファイアウォールグループを新規作成します。
|
81
|
+
# ファイアウォールの有償版に申し込んでいない場合は、エラーが返されます。
|
82
|
+
# すでに存在するファイアウォールグループ名を指定した、作成可能なファイアウォールグループの上限数を超える場合は、エラーが返されます。
|
83
|
+
# ファイアウォールの有償版を申し込むには、コントロールパネルで設定する必要があります。
|
84
|
+
#
|
85
|
+
# @option options [String] :group_name ファイアウォールグループ名(必須)
|
86
|
+
# 使用可能文字: 半角英数字
|
87
|
+
# @option options [String] :group_description ファイアウォールグループのメモ
|
88
|
+
# @return [Hash] レスポンスXML解析結果
|
89
|
+
#
|
90
|
+
# @example
|
91
|
+
# create_security_group(:group_name => 'group01', :group_description => 'Security Group memo.')
|
92
|
+
#
|
93
|
+
def create_security_group( options={} )
|
94
|
+
raise ArgumentError, "No :group_name provided." if blank?(options[:group_name])
|
95
|
+
raise ArgumentError, "Invalid :group_name provided." unless ALPHANUMERIC =~ options[:group_name].to_s
|
96
|
+
|
97
|
+
params = {'Action' => 'CreateSecurityGroup'}
|
98
|
+
params.merge!(opts_to_prms(options, [:group_name, :group_description]))
|
99
|
+
|
100
|
+
return response_generator(params)
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
# API「DeleteSecurityGroup」を実行し、指定したファイアウォールグループを削除します。
|
105
|
+
# 指定したファイアウォールグループを適用しているサーバーが存在する場合、エラーが返されます。同様に、適用しているオートスケール設定が存在する場合、
|
106
|
+
# エラーが返されます。
|
107
|
+
# ファイアウォールグループを指定するためには、ファイアウォールグループ名が必要です。
|
108
|
+
# 削除済みのファイアウォールグループを指定した、管理外のファイアウォールグループを指定したなど、無効なファイアウォールグループを指定した場合は、
|
109
|
+
# エラーが返されます。
|
110
|
+
#
|
111
|
+
# @option options [String] :group_name 対象のファイアウォールグループ名(必須)
|
112
|
+
# @return [Hash] レスポンスXML解析結果
|
113
|
+
#
|
114
|
+
# @example
|
115
|
+
# delete_security_group(:group_name => 'group01')
|
116
|
+
#
|
117
|
+
def delete_security_group( options={} )
|
118
|
+
raise ArgumentError, "No :group_name provided" if blank?(options[:group_name])
|
119
|
+
raise ArgumentError, "Invalid :group_name provided." unless ALPHANUMERIC =~ options[:group_name].to_s
|
120
|
+
|
121
|
+
params = {
|
122
|
+
'Action' => 'DeleteSecurityGroup',
|
123
|
+
'GroupName' => options[:group_name].to_s
|
124
|
+
}
|
125
|
+
|
126
|
+
return response_generator(params)
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
# API「DeregisterInstancesFromSecurityGroup」を実行し、指定したファイアウォールグループから、指定したサーバーをはずします。
|
131
|
+
# ファイアウォールグループを指定するためには、ファイアウォールグループ名が必要です。削除済みのファイアウォールグループを指定した、
|
132
|
+
# 管理外のファイアウォールグループを指定したなど、無効なファイアウォールグループを指定した場合は、エラーが返されます。
|
133
|
+
# またサーバーを指定するためには、サーバー名が必要です。指定したファイアウォールグループに適用されていないサーバーを指定した、
|
134
|
+
# 削除済みのサーバーを指定した、管理外のサーバーを指定したなど、無効なサーバーを指定した場合は、エラーが返されます。
|
135
|
+
#
|
136
|
+
# @option options [String] :group_name ファイアウォールグループ名(必須)
|
137
|
+
# @option options [Array<String>] :instance_id サーバー名(必須)
|
138
|
+
# @return [Hash] レスポンスXML解析結果
|
139
|
+
#
|
140
|
+
# @example
|
141
|
+
# deregister_instances_from_security_group(:group_name => 'group01', :instance_id => ['server01', 'server02'])
|
142
|
+
#
|
143
|
+
def deregister_instances_from_security_group( options={} )
|
144
|
+
raise ArgumentError, "No :group_name provided." if blank?(options[:group_name])
|
145
|
+
raise ArgumentError, "Invalid :group_name provided." unless GROUP_NAME =~ options[:group_name].to_s
|
146
|
+
raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
|
147
|
+
|
148
|
+
params = {
|
149
|
+
'Action' => 'DeregisterInstancesFromSecurityGroup',
|
150
|
+
'GroupName' => options[:group_name].to_s
|
151
|
+
}
|
152
|
+
params.merge!(pathlist('InstanceId', options[:instance_id]))
|
153
|
+
|
154
|
+
return response_generator(params)
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
# API「DescribeSecurityActivities」を実行し、指定したファイアウォールグループのログ情報を取得します。
|
159
|
+
# ファイアウォールグループを指定するためには、ファイアウォールグループ名が必要です。削除済みのファイアウォールグループを指定した、
|
160
|
+
# 管理外のファイアウォールグループを指定したなど、無効なファイアウォールグループを指定した場合は、エラーが返されます。
|
161
|
+
#
|
162
|
+
# @option options [String] :group_name ファイアウォールグループ名(必須)
|
163
|
+
# @option options [String] :activity_date 取得するログの絞り込み条件(日)
|
164
|
+
# 形式: yyyymmdd | yyyy-mm-dd | yyyy/mm/dd
|
165
|
+
# @option options [Boolean] :range_all 指定日内のログを全件取得
|
166
|
+
# 許可値: true(全件取得) | false(件数指())
|
167
|
+
# @option options [Integer] :range_start_number 取得開始件数
|
168
|
+
# 許可値: 1 - 取得可能な最大件数
|
169
|
+
# @option options [Integer] :range_end_number 取得終了件数
|
170
|
+
# 許可値: 1 - 取得可能な最大件数
|
171
|
+
# @return [Hash] レスポンスXML解析結果
|
172
|
+
#
|
173
|
+
# @example
|
174
|
+
# describe_security_activities(:group_name => 'group01', :activity_date => '2011-06-08', :range_all => false,
|
175
|
+
# :range_start_number => 1, :range_end_number => 10)
|
176
|
+
#
|
177
|
+
def describe_security_activities( options={} )
|
178
|
+
raise ArgumentError, "No :group_name provided." if blank?(options[:group_name])
|
179
|
+
raise ArgumentError, "Invalid :group_name provided." unless GROUP_NAME =~ options[:group_name].to_s
|
180
|
+
raise ArgumentError, "Invalid :activity_date provided." unless blank?(options[:activity_date]) || DATE_FORMAT =~ options[:activity_date].to_s
|
181
|
+
raise ArgumentError, "Invalid :range_all provided." unless blank?(options[:range_all]) || BOOLEAN.include?(options[:range_all].to_s)
|
182
|
+
raise ArgumentError, "Invalid :range_start_number provided." unless blank?(options[:range_start_number]) || options[:range_start_number].to_s.to_i >= 1
|
183
|
+
raise ArgumentError, "Invalid :range_end_number provided." unless blank?(options[:range_end_number]) || (options[:range_end_number]).to_s.to_i >= 1
|
184
|
+
raise ArgumentError, "Invalid :range_end_number provided." unless blank?(options[:range_start_number]) || blank?(options[:range_end_number]) ||
|
185
|
+
options[:range_start_number] <= options[:range_end_number]
|
186
|
+
|
187
|
+
params = {
|
188
|
+
'Action' => 'DescribeSecurityActivities',
|
189
|
+
'GroupName' => options[:group_name].to_s,
|
190
|
+
'ActivityDate' => options[:activity_date].to_s,
|
191
|
+
'Range.All' => options[:range_all].to_s,
|
192
|
+
'Range.StartNumber' => options[:range_start_number].to_s,
|
193
|
+
'Range.EndNumber' => options[:range_end_number].to_s
|
194
|
+
}
|
195
|
+
|
196
|
+
return response_generator(params)
|
197
|
+
end
|
198
|
+
|
199
|
+
|
200
|
+
# API「DescribeSecurityGroups」を実行し、指定したファイアウォールグループの設定情報を取得します。
|
201
|
+
# ファイアウォールグループを指定するためには、ファイアウォールグループ名が必要です。指定しない場合は、取得可能なすべての
|
202
|
+
# ファイアウォールグループの設定情報を取得します。
|
203
|
+
#
|
204
|
+
# @option options [String] :group_name ファイアウォールグループ名
|
205
|
+
# @option options [Array<Hash>] :filter フィルター設定
|
206
|
+
# <Hash> options [String] 絞り込み条件の項目名
|
207
|
+
# 許可値: description | group-name
|
208
|
+
# [String] 絞り込み条件の値 (前方一致)
|
209
|
+
# @return [Hash] レスポンスXML解析結果
|
210
|
+
#
|
211
|
+
# @example
|
212
|
+
# describe_security_groups(:group_name => 'group01', :filter => [ {'description' => 'filter1'}, {'group-name' => ['filter1', 'filter2']} ])
|
213
|
+
#
|
214
|
+
def describe_security_groups( options={} )
|
215
|
+
[options[:group_name]].flatten.each do |e|
|
216
|
+
raise ArgumentError, "Invalid :group_name provided." unless GROUP_NAME =~ options[:group_name].to_s
|
217
|
+
end unless blank?(options[:group_name])
|
218
|
+
|
219
|
+
params = {'Action' => 'DescribeSecurityGroups'}
|
220
|
+
params.merge!(pathlist("GroupName", options[:group_name]))
|
221
|
+
unless blank?(options[:filter])
|
222
|
+
[options[:filter]].flatten.each do |opt|
|
223
|
+
raise ArgumentError, "expected each element of arr_of_hashes to be a Hash" unless opt.is_a?(Hash)
|
224
|
+
raise ArgumentError, "Invalid :name provided." unless blank?(opt[:name]) || FILTER_NAME.include?(opt[:name].to_s)
|
225
|
+
|
226
|
+
opt[:value] = [opt[:value]].flatten unless blank?(opt[:value])
|
227
|
+
end
|
228
|
+
|
229
|
+
params.merge!(pathhashlist('Filter', options[:filter], {:name => 'Name', :value => 'Value'}))
|
230
|
+
end
|
231
|
+
|
232
|
+
return response_generator(params)
|
233
|
+
end
|
234
|
+
|
235
|
+
|
236
|
+
# API「RegisterInstancesWithSecurityGroup」を実行し、指定したファイアウォールグループを、指定したサーバーへ適用します。
|
237
|
+
# ファイアウォールグループを指定するためには、ファイアウォールグループ名が必要です。削除済みのファイアウォールグループを指定した、
|
238
|
+
# 管理外のファイアウォールグループを指定したなど、無効なファイアウォールグループを指定した場合は、エラーが返されます。
|
239
|
+
# またサーバーを指定するためには、サーバー名が必要です。すでにファイアウォールグループに適用されているサーバーを指定した、
|
240
|
+
# 削除済みのサーバーを指定した、管理外のサーバーを指定したなど、無効なサーバーを指定した場合は、エラーが返されます。
|
241
|
+
#
|
242
|
+
# @option options [String] :group_name ファイアウォールグループ名(必須)
|
243
|
+
# @option options [Array<String>] :instance_id サーバー名(必須)
|
244
|
+
# @return [Hash] レスポンスXML解析結果
|
245
|
+
#
|
246
|
+
# @example
|
247
|
+
# register_instances_with_security_group(:group_name => 'group01', :instance_id => ['server02', 'server03'])
|
248
|
+
#
|
249
|
+
def register_instances_with_security_group( options={} )
|
250
|
+
raise ArgumentError, "No :group_name provided." if blank?(options[:group_name])
|
251
|
+
raise ArgumentError, "Invalid :group_name provided." unless GROUP_NAME =~ options[:group_name].to_s
|
252
|
+
raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
|
253
|
+
|
254
|
+
params = {
|
255
|
+
'Action' => 'RegisterInstancesWithSecurityGroup',
|
256
|
+
'GroupName' => options[:group_name]
|
257
|
+
}
|
258
|
+
params.merge!(pathlist('InstanceId', options[:instance_id]))
|
259
|
+
|
260
|
+
return response_generator(params)
|
261
|
+
end
|
262
|
+
|
263
|
+
|
264
|
+
# API「RevokeSecurityGroupIngress」を実行し、指定したファイアウォールグループから許可ルールを削除します。
|
265
|
+
# ファイアウォールグループを指定するためには、ファイアウォールグループ名が必要です。削除済みのファイアウォールグループを指定した、
|
266
|
+
# 管理外のファイアウォールグループを指定したなど、無効なファイアウォールグループを指定した場合は、エラーが返されます。
|
267
|
+
# また許可ルールを指定するためには、設定されている 許可プロトコル名・許可ポート・許可するファイアウォールグループまたは許可するIPアドレスが必要です。
|
268
|
+
# 該当する許可ルールが存在しない場合は、エラーが返されます。
|
269
|
+
#
|
270
|
+
# @option options [String] :group_name 対象のファイアウォールグループ名(必須)
|
271
|
+
# @option options [Array<Hash>] :ip_permissions IP許可設定
|
272
|
+
# <Hash> options [String] :protocol - 許可プロトコル名
|
273
|
+
# 許可値: TCP | UDP | ICMP | SSH | HTTP | HTTPS
|
274
|
+
# [Integer] :from_port - 許可ポート(:protocolがTCP、UDPの場合は必須)
|
275
|
+
# [String] :in_out - Incoming/Outgoing 指定
|
276
|
+
# 許可値: IN(Incoming) | OUT(Outgoing)
|
277
|
+
# [Array<String>] :group_name - 許可するファイアウォールグループ名(:cidr_ipとどちらか必須)
|
278
|
+
# [Array<String>] :cidr_ip - 許可するIP アドレス(CIDR指定可) (:group_nameとどちらか必須)
|
279
|
+
# @return [Hash] レスポンスXML解析結果
|
280
|
+
#
|
281
|
+
# @example
|
282
|
+
# revoke_security_group_ingress(:group_name => 'gr1', :ip_permissions => [{:protocol => 'TCP',
|
283
|
+
# :from_port => 80,
|
284
|
+
# :in_out => 'IN',
|
285
|
+
# :group_name => ['gr1', 'gr2'],
|
286
|
+
# :cidr_ip => ['111.171.200.1/22', '111.111.111.112']} ])
|
287
|
+
#
|
288
|
+
def revoke_security_group_ingress( options={} )
|
289
|
+
raise ArgumentError, "No :group_name provided." if blank?(options[:group_name])
|
290
|
+
raise ArgumentError, "Invalid :group_name provided." unless GROUP_NAME =~ options[:group_name].to_s
|
291
|
+
raise ArgumentError, "No :ip_permissions provided." if blank?(options[:ip_permissions])
|
292
|
+
[options[:ip_permissions]].flatten.each do |opt|
|
293
|
+
raise ArgumentError, "expected each element of arr_of_hashes to be a Hash" unless opt.is_a?(Hash)
|
294
|
+
raise ArgumentError, "Invalid :ip_protocol provided." unless blank?(opt[:ip_protocol]) || IP_PROTOCOL.include?(opt[:ip_protocol].to_s.upcase)
|
295
|
+
raise ArgumentError, "No :from_port provided." if /TCP|UDP/ =~ opt[:ip_protocol] && blank?(opt[:from_port])
|
296
|
+
raise ArgumentError, "Invalid :from_port provided." unless blank?(opt[:from_port]) || valid_port?(opt[:from_port])
|
297
|
+
raise ArgumentError, "Invalid :to_port provided." unless blank?(opt[:to_port]) || valid_port?(opt[:to_port])
|
298
|
+
raise ArgumentError, "Invalid :in_out provided." unless blank?(opt[:in_out]) || IN_OUT.include?(opt[:in_out].to_s.upcase)
|
299
|
+
raise ArgumentError, ":group_name or :cidr_ip must be provided." if blank?(opt[:group_name]) && blank?(opt[:cidr_ip])
|
300
|
+
raise ArgumentError, "Invalid :group_name provided." unless blank?(opt[:group_name]) || GROUP_NAME =~ opt[:group_name].to_s
|
301
|
+
[opt[:cidr_ip]].flatten.each do |ip|
|
302
|
+
begin IPAddr.new(ip.to_s) rescue raise ArgumentError, "Invalid :cidr_ip provided." end
|
303
|
+
end unless blank?(opt[:cidr_ip])
|
304
|
+
|
305
|
+
opt[:user_id] = [opt[:user_id]].flatten unless blank?(opt[:user_id])
|
306
|
+
opt[:group_name] = [opt[:group_name]].flatten unless blank?(opt[:group_name])
|
307
|
+
opt[:cidr_ip] = [opt[:cidr_ip]].flatten unless blank?(opt[:cidr_ip])
|
308
|
+
end unless blank?(options[:ip_permissions])
|
309
|
+
|
310
|
+
params = {'Action' => 'RevokeSecurityGroupIngress'}
|
311
|
+
params.merge!(opts_to_prms(options, [:user_id, :group_name]))
|
312
|
+
unless blank?(options[:ip_permissions])
|
313
|
+
params.merge!(pathhashlist('IpPermissions', [options[:ip_permissions]].flatten,
|
314
|
+
{ :ip_protocol => 'IpProtocol',
|
315
|
+
:from_port => 'FromPort',
|
316
|
+
:to_port => 'ToPort',
|
317
|
+
:in_out => 'InOut',
|
318
|
+
:user_id => 'Groups',
|
319
|
+
:group_name => 'Groups',
|
320
|
+
:cidr_ip => 'IpRanges'},
|
321
|
+
{ :user_id => 'UserId',
|
322
|
+
:group_name => 'GroupName',
|
323
|
+
:cidr_ip => 'CidrIp'}))
|
324
|
+
end
|
325
|
+
|
326
|
+
params.reject! {|k, v| SECURITY_GROUPS_IGNORED_PARAMS =~ k } if @@ignore_amz_params
|
327
|
+
|
328
|
+
return response_generator(params)
|
329
|
+
end
|
330
|
+
|
331
|
+
|
332
|
+
# API「UpdateSecurityGroup」を実行し、ファイアウォールグループの設定情報を更新します。
|
333
|
+
# ファイアウォールグループを指定するためには、ファイアウォールグループ名が必要です。削除済みのファイアウォールグループを指定した、
|
334
|
+
# 管理外のファイアウォールグループを指定したなど、無効なファイアウォールグループを指定した場合は、エラーが返されます。
|
335
|
+
#
|
336
|
+
# @option options [String] :group_name ファイアウォールグループ名(必須)
|
337
|
+
# @option options [String] :group_name_update ファイアウォールグループ名の変更
|
338
|
+
# @option options [String] :group_description_update ファイアウォールグループのメモの変更
|
339
|
+
# @return [Hash] レスポンスXML解析結果
|
340
|
+
#
|
341
|
+
# @example
|
342
|
+
# update_security_group(:group_name => 'group01', :group_name_update => 'group02', :group_description_update => 'Security Group memo.Updated.')
|
343
|
+
#
|
344
|
+
def update_security_group( options={} )
|
345
|
+
raise ArgumentError, "No :group_name provided." if blank?(options[:group_name])
|
346
|
+
raise ArgumentError, "Invalid :group_name provided." unless GROUP_NAME =~ options[:group_name].to_s
|
347
|
+
raise ArgumentError, "Invalid :group_name_update provided." unless blank?(options[:group_name_update]) || ALPHANUMERIC =~ options[:group_name_update].to_s
|
348
|
+
|
349
|
+
params = {'Action' => 'UpdateSecurityGroup'}
|
350
|
+
params.merge!(opts_to_prms(options, [:group_name, :group_name_update, :group_description_update]))
|
351
|
+
|
352
|
+
return response_generator(params)
|
353
|
+
end
|
354
|
+
end
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
@@ -0,0 +1,140 @@
|
|
1
|
+
module NIFTY
|
2
|
+
module Cloud
|
3
|
+
class Base < NIFTY::Base
|
4
|
+
VOLUMES_CREATE_SIZE = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '15', '20']
|
5
|
+
VOLUMES_CREATE_DISK_TYPE = ['1', '2', '3', '4', '5', '6']
|
6
|
+
VOLUMES_IGNORED_PARAMS = Regexp.union(/SnapshotId/,
|
7
|
+
/AvailabilityZone/,
|
8
|
+
/Device/,
|
9
|
+
/Force/)
|
10
|
+
|
11
|
+
# API「AttachVolume」を実行し、指定したディスクをサーバーへ接続します。
|
12
|
+
# ディスクを指定するためには、ディスク名が必要です。接続済み・削除済みのディスクを指定した、管理外のディスクを指定したなど、
|
13
|
+
# 無効なディスクを指定した場合は、エラーが返されます。
|
14
|
+
# またサーバーを指定するためには、サーバー名が必要です。接続済み・削除済みのサーバーを指定した、管理外のサーバーを指定したなど、
|
15
|
+
# 無効なサーバーを指定した場合は、エラーが返されます。
|
16
|
+
#
|
17
|
+
# @option options [String] :volume_id サーバーに接続するディスク名(必須)
|
18
|
+
# @option options [String] :instance_id 接続先のサーバー名(必須)
|
19
|
+
# @return [Hash] レスポンスXML解析結果
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
# attach_volume(:volume_id => 'vol1', :instance_id => 'server01')
|
23
|
+
#
|
24
|
+
def attach_volume( options = {} )
|
25
|
+
raise ArgumentError, "No :volume_id provided." if blank?(options[:volume_id])
|
26
|
+
raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
|
27
|
+
|
28
|
+
params = { 'Action' => 'AttachVolume' }
|
29
|
+
params.merge!(opts_to_prms(options, [:volume_id, :instance_id, :device]))
|
30
|
+
|
31
|
+
params.reject! {|k, v| VOLUMES_IGNORED_PARAMS =~ k } if @@ignore_amz_params
|
32
|
+
|
33
|
+
return response_generator(params)
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
# API「CreateVolume」を実行し、ディスクを新規作成します。
|
38
|
+
# サーバーを指定するためには、サーバー名が必要です。削除済みのサーバーを指定した、管理外のサーバーを指定した、停止済み
|
39
|
+
# 以外のサーバーを指定したなど、無効なサーバーを指定した場合は、エラーが返されます。同様に、ディスクサイズおよびディスク
|
40
|
+
# タイプに規定外の値を指定した、すでに存在するディスク名を指定したなどの場合は、エラーが返されます。
|
41
|
+
#
|
42
|
+
# @option options [String] :size ディスクサイズ(必須)
|
43
|
+
# 許可値: (低速) 1(100) | 2(200) | 3(300) | 4(400) | 5(500) | 10(1000) | 15(1500) | 20(2000)
|
44
|
+
# (高速) 1(100) | 2(200) | 3(300) | 4(400) | 5(500) | 6(600) | 7(700) | 8(800) | 9(900) | 10(1000) (単位: GB)
|
45
|
+
# @option options [String] :volume_id ディスク名
|
46
|
+
# @option options [String] :disk_type ディスクタイプ
|
47
|
+
# 許可値: 1(disk100) | 2(disk40) | 3(disk100A) | 4(disk100B) | 5(disk40A) | 6(disk40B)
|
48
|
+
# @option options [String] :instance_id サーバー名(必須)
|
49
|
+
# @return [Hash] レスポンスXML解析結果
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# create_volume(:size => 1, :volume_id => 'vol1', :disk_type => 1, :instance_id => 'server01')
|
53
|
+
#
|
54
|
+
def create_volume( options = {} )
|
55
|
+
raise ArgumentError, "No :size provided." if blank?(options[:size])
|
56
|
+
raise ArgumentError, "No :instance_id provided." if blank?(options[:instance_id])
|
57
|
+
raise ArgumentError, "Invalid :size provided." unless blank?(options[:size]) || VOLUMES_CREATE_SIZE.include?(options[:size].to_s)
|
58
|
+
raise ArgumentError, "Invalid :disk_type provided." unless blank?(options[:disk_type]) || VOLUMES_CREATE_DISK_TYPE.include?(options[:disk_type].to_s)
|
59
|
+
|
60
|
+
params = {'Action' => 'CreateVolume'}
|
61
|
+
params.merge!(opts_to_prms(options, [:size, :snapshot_id, :availability_zone, :volume_id, :disk_type, :instance_id]))
|
62
|
+
|
63
|
+
params.reject! {|k, v| VOLUMES_IGNORED_PARAMS =~ k } if @@ignore_amz_params
|
64
|
+
|
65
|
+
return response_generator(params)
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
# API「DeleteVolume」を実行し、指定したディスクを削除します。
|
70
|
+
# ディスクを指定するためには、ディスク名が必要です。接続済み・削除済みのディスクを指定した、管理外のディスクを指定したなど、
|
71
|
+
# 無効なディスクを指定した場合は、エラーが返されます。
|
72
|
+
# 削除には、時間がかかることがあります。
|
73
|
+
# なお、サーバーに接続しているディスクを指定した場合には、エラーが返されます。ディスクの接続ステータスは、API
|
74
|
+
# 「DescribeVolumes」のレスポンス「attachmentSet.status」で確認できます。
|
75
|
+
#
|
76
|
+
# @option options [String] :volume_id 削除対象のディスク名(必須)
|
77
|
+
# @return [Hash] レスポンスXML解析結果
|
78
|
+
#
|
79
|
+
# @example
|
80
|
+
# delete_volume(:volume_id => 'vol1')
|
81
|
+
#
|
82
|
+
def delete_volume( options = {} )
|
83
|
+
raise ArgumentError, "No :volume_id provided." if blank?(options[:volume_id])
|
84
|
+
|
85
|
+
params = {
|
86
|
+
'Action' => 'DeleteVolume',
|
87
|
+
'VolumeId' => options[:volume_id].to_s
|
88
|
+
}
|
89
|
+
|
90
|
+
return response_generator(params)
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
# API「DescribeVolumes」を実行し、指定したディスクの情報を取得します。
|
95
|
+
# ディスクを指定するためには、ディスク名が必要です。削除済みのディスクを指定した、管理外のディスクを指定したなど、
|
96
|
+
# 無効なディスクを指定した場合は、エラーが返されます。
|
97
|
+
# ディスクを指定しない場合、取得できるすべてのディスク情報を取得します。
|
98
|
+
#
|
99
|
+
# @option options [Array<String>] :volume_id ディスク名
|
100
|
+
# @return [Hash] レスポンスXML解析結果
|
101
|
+
#
|
102
|
+
# @example
|
103
|
+
# describe_volumes(:volume_id => ['vol1', 'vol2'])
|
104
|
+
#
|
105
|
+
def describe_volumes( options = {} )
|
106
|
+
params = {'Action' => 'DescribeVolumes'}
|
107
|
+
params.merge!(pathlist("VolumeId", options[:volume_id]))
|
108
|
+
|
109
|
+
return response_generator(params)
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
# API「DetachVolume」を実行し、指定したディスクとサーバーの接続を解除します。
|
114
|
+
# ディスクを指定するためには、ディスク名が必要です。解除済み・削除済みのディスクを指定した、管理外のディスクを指定したなど、
|
115
|
+
# 無効なディスクを指定した場合は、エラーが返されます。
|
116
|
+
# またサーバーを指定するためには、サーバー名が必要です。解除済み・削除済みのサーバーを指定した、管理外のサーバーを指定したなど、
|
117
|
+
# 無効なサーバーを指定した場合は、エラーが返されます。サーバー名を指定せずに解除すると、指定したディスクのすべての接続情報を解除します。
|
118
|
+
#
|
119
|
+
# @option options [String] :volume_id 接続解除対象のディスク名(必須)
|
120
|
+
# @option options [String] :instance_id 接続解除されるサーバー名
|
121
|
+
# @return [Hash] レスポンスXML解析結果
|
122
|
+
#
|
123
|
+
# @example
|
124
|
+
# detach_volume(:volume_id => 'vol1', :instance_id => 'server01')
|
125
|
+
#
|
126
|
+
def detach_volume( options = {} )
|
127
|
+
raise ArgumentError, "No :volume_id provided." if blank?(options[:volume_id])
|
128
|
+
raise ArgumentError, "Invalid :force provided." unless blank?(options[:force]) || BOOLEAN.include?(options[:force].to_s)
|
129
|
+
|
130
|
+
params = { 'Action' => 'DetachVolume' }
|
131
|
+
params.merge!(opts_to_prms(options,[:volume_id, :instance_id, :device, :force]))
|
132
|
+
|
133
|
+
params.reject! {|k, v| VOLUMES_IGNORED_PARAMS =~ k } if @@ignore_amz_params
|
134
|
+
|
135
|
+
return response_generator(params)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|