nifty-cloud-sdk 1.7

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