nifty-cloud-sdk 1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/CHANGELOG +112 -0
  2. data/Gemfile +4 -0
  3. data/INSTALL +30 -0
  4. data/LICENSE.txt +58 -0
  5. data/README.rdoc +375 -0
  6. data/Rakefile +61 -0
  7. data/lib/NIFTY.rb +405 -0
  8. data/lib/NIFTY/Cloud.rb +24 -0
  9. data/lib/NIFTY/Cloud/availability_zones.rb +23 -0
  10. data/lib/NIFTY/Cloud/certificates.rb +283 -0
  11. data/lib/NIFTY/Cloud/images.rb +134 -0
  12. data/lib/NIFTY/Cloud/instances.rb +372 -0
  13. data/lib/NIFTY/Cloud/keypairs.rb +76 -0
  14. data/lib/NIFTY/Cloud/load_balancers.rb +433 -0
  15. data/lib/NIFTY/Cloud/security_groups.rb +357 -0
  16. data/lib/NIFTY/Cloud/volumes.rb +140 -0
  17. data/lib/NIFTY/config.rb +41 -0
  18. data/lib/NIFTY/exceptions.rb +32 -0
  19. data/lib/NIFTY/responses.rb +19 -0
  20. data/lib/NIFTY/version.rb +3 -0
  21. data/nifty-cloud-sdk.gemspec +28 -0
  22. data/sample/availability_zones/describe-availability-zones.rb +37 -0
  23. data/sample/certificate/create-ssl-certificate.rb +41 -0
  24. data/sample/certificate/delete-ssl-certificate.rb +28 -0
  25. data/sample/certificate/describe-ssl-certificate-attribute.rb +58 -0
  26. data/sample/certificate/describe-ssl-certificates.rb +49 -0
  27. data/sample/certificate/download-ssl-certificate.rb +31 -0
  28. data/sample/certificate/modify-ssl-certificate-attribute.rb +29 -0
  29. data/sample/certificate/register-corporate-info-for-certificate.rb +57 -0
  30. data/sample/certificate/upload-ssl-certificate.rb +32 -0
  31. data/sample/images/create-image.rb +33 -0
  32. data/sample/images/delete-image.rb +26 -0
  33. data/sample/images/describe-images.rb +70 -0
  34. data/sample/images/modify-image-attribute.rb +33 -0
  35. data/sample/instances/cancel_copy_instances.rb +26 -0
  36. data/sample/instances/copy-instances.rb +41 -0
  37. data/sample/instances/describe-instance-attribute.rb +78 -0
  38. data/sample/instances/describe-instances.rb +100 -0
  39. data/sample/instances/modify-instance-attribute.rb +30 -0
  40. data/sample/instances/reboot-instances.rb +29 -0
  41. data/sample/instances/run-instances.rb +104 -0
  42. data/sample/instances/start-instances.rb +36 -0
  43. data/sample/instances/stop-instances.rb +35 -0
  44. data/sample/instances/terminate-instances.rb +34 -0
  45. data/sample/keypairs/create-key-pair.rb +31 -0
  46. data/sample/keypairs/delete-key-pair.rb +28 -0
  47. data/sample/keypairs/describe-key-pairs.rb +31 -0
  48. data/sample/load_balancers/configure-health-check.rb +41 -0
  49. data/sample/load_balancers/create-load-balancer.rb +35 -0
  50. data/sample/load_balancers/delete-load-balancer.rb +28 -0
  51. data/sample/load_balancers/deregister-instances-from-load-balancer.rb +35 -0
  52. data/sample/load_balancers/describe-instance-health.rb +36 -0
  53. data/sample/load_balancers/describe-load-balancers.rb +89 -0
  54. data/sample/load_balancers/register-instances-with-load-balancer.rb +33 -0
  55. data/sample/load_balancers/register-port-with-load-balancer.rb +37 -0
  56. data/sample/load_balancers/set-filter-for-load-balancer.rb +38 -0
  57. data/sample/load_balancers/update-load-balancer.rb +33 -0
  58. data/sample/security_groups/authorize-security-group-ingress.rb +36 -0
  59. data/sample/security_groups/create-security-group.rb +29 -0
  60. data/sample/security_groups/delete-security-group.rb +28 -0
  61. data/sample/security_groups/deregister-instances-from-security-group.rb +31 -0
  62. data/sample/security_groups/describe-security-activities.rb +33 -0
  63. data/sample/security_groups/describe-security-groups.rb +59 -0
  64. data/sample/security_groups/register-instances-with-security-group.rb +31 -0
  65. data/sample/security_groups/revoke-security-group-ingress.rb +36 -0
  66. data/sample/security_groups/update-security-group.rb +30 -0
  67. data/sample/volumes/attach-volumes.rb +34 -0
  68. data/sample/volumes/create-volume.rb +38 -0
  69. data/sample/volumes/delete-volume.rb +28 -0
  70. data/sample/volumes/describe-volumes.rb +44 -0
  71. data/sample/volumes/detach-volume.rb +35 -0
  72. data/test/test_Cloud.rb +186 -0
  73. data/test/test_Cloud_availability_zones.rb +50 -0
  74. data/test/test_Cloud_certificates.rb +627 -0
  75. data/test/test_Cloud_images.rb +284 -0
  76. data/test/test_Cloud_instances.rb +941 -0
  77. data/test/test_Cloud_keypairs.rb +177 -0
  78. data/test/test_Cloud_load_balancers.rb +1183 -0
  79. data/test/test_Cloud_responses.rb +43 -0
  80. data/test/test_Cloud_security_groups.rb +699 -0
  81. data/test/test_Cloud_volumes.rb +325 -0
  82. data/test/test_helper.rb +23 -0
  83. metadata +275 -0
@@ -0,0 +1,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
+