wakame-vdc-agents 10.11.0
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.
- data/LICENSE +202 -0
- data/NOTICE +1 -0
- data/Rakefile +142 -0
- data/bin/hva +972 -0
- data/bin/nsa +147 -0
- data/bin/sta +182 -0
- data/config/hva.conf.example +10 -0
- data/config/initializers/isono.rb +43 -0
- data/config/initializers/passenger.rb +6 -0
- data/config/initializers/sequel.rb +21 -0
- data/config/nsa.conf.example +9 -0
- data/config/path_resolver.rb +12 -0
- data/lib/dcmgr.rb +115 -0
- data/lib/dcmgr/endpoints/core_api.rb +1004 -0
- data/lib/dcmgr/endpoints/core_api_mock.rb +816 -0
- data/lib/dcmgr/endpoints/errors.rb +55 -0
- data/lib/dcmgr/endpoints/metadata.rb +129 -0
- data/lib/dcmgr/logger.rb +44 -0
- data/lib/dcmgr/models/account.rb +104 -0
- data/lib/dcmgr/models/account_resource.rb +16 -0
- data/lib/dcmgr/models/base.rb +69 -0
- data/lib/dcmgr/models/base_new.rb +371 -0
- data/lib/dcmgr/models/frontend_system.rb +38 -0
- data/lib/dcmgr/models/host_pool.rb +102 -0
- data/lib/dcmgr/models/image.rb +46 -0
- data/lib/dcmgr/models/instance.rb +255 -0
- data/lib/dcmgr/models/instance_netfilter_group.rb +16 -0
- data/lib/dcmgr/models/instance_nic.rb +68 -0
- data/lib/dcmgr/models/instance_spec.rb +21 -0
- data/lib/dcmgr/models/ip_lease.rb +42 -0
- data/lib/dcmgr/models/netfilter_group.rb +88 -0
- data/lib/dcmgr/models/netfilter_rule.rb +21 -0
- data/lib/dcmgr/models/network.rb +32 -0
- data/lib/dcmgr/models/physical_host.rb +67 -0
- data/lib/dcmgr/models/request_log.rb +25 -0
- data/lib/dcmgr/models/ssh_key_pair.rb +55 -0
- data/lib/dcmgr/models/storage_pool.rb +134 -0
- data/lib/dcmgr/models/tag.rb +126 -0
- data/lib/dcmgr/models/tag_mapping.rb +28 -0
- data/lib/dcmgr/models/volume.rb +130 -0
- data/lib/dcmgr/models/volume_snapshot.rb +47 -0
- data/lib/dcmgr/node_modules/hva_collector.rb +134 -0
- data/lib/dcmgr/node_modules/sta_collector.rb +72 -0
- data/lib/dcmgr/scheduler.rb +12 -0
- data/lib/dcmgr/scheduler/find_last.rb +16 -0
- data/lib/dcmgr/scheduler/find_random.rb +16 -0
- data/lib/dcmgr/stm/instance.rb +25 -0
- data/lib/dcmgr/stm/snapshot_context.rb +33 -0
- data/lib/dcmgr/stm/volume_context.rb +65 -0
- data/lib/dcmgr/web/base.rb +21 -0
- data/lib/sinatra/accept_media_types.rb +128 -0
- data/lib/sinatra/lazy_auth.rb +56 -0
- data/lib/sinatra/rabbit.rb +278 -0
- data/lib/sinatra/respond_to.rb +272 -0
- data/lib/sinatra/sequel_transaction.rb +27 -0
- data/lib/sinatra/static_assets.rb +83 -0
- data/lib/sinatra/url_for.rb +44 -0
- metadata +270 -0
@@ -0,0 +1,816 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'sinatra/base'
|
4
|
+
require 'sinatra/rabbit'
|
5
|
+
|
6
|
+
require 'json'
|
7
|
+
require 'extlib/hash'
|
8
|
+
|
9
|
+
require 'dcmgr/endpoints/errors'
|
10
|
+
|
11
|
+
module Dcmgr
|
12
|
+
module Endpoints
|
13
|
+
class Mock
|
14
|
+
def self.loadfile(path, ext='json')
|
15
|
+
root_path = File.expand_path('../../')
|
16
|
+
controller,action = path.split('/')
|
17
|
+
file = action + '.' + ext
|
18
|
+
dir_path = File.join(root_path,'fixtures','mock',controller)
|
19
|
+
readfile = File.join(dir_path,file)
|
20
|
+
data = ''
|
21
|
+
open(readfile) {|f| data = f.read }
|
22
|
+
data
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class CoreAPI < Sinatra::Base
|
27
|
+
register Sinatra::Rabbit
|
28
|
+
|
29
|
+
disable :sessions
|
30
|
+
disable :show_exceptions
|
31
|
+
|
32
|
+
before do
|
33
|
+
@params = parsed_request_body if request.post?
|
34
|
+
request.env['dcmgr.frotend_system.id'] = 1
|
35
|
+
request.env['HTTP_X_VDC_REQUESTER_TOKEN']='u-xxxxxx'
|
36
|
+
request.env['HTTP_X_VDC_ACCOUNT_UUID']='a-00000000'
|
37
|
+
end
|
38
|
+
|
39
|
+
before do
|
40
|
+
@account = Models::Account[request.env['HTTP_X_VDC_ACCOUNT_UUID']]
|
41
|
+
@requester_token = request.env['HTTP_X_VDC_REQUESTER_TOKEN']
|
42
|
+
#@frontend = Models::FrontendSystem[request.env['dcmgr.frotend_system.id']]
|
43
|
+
|
44
|
+
#raise InvalidRequestCredentials if !(@account && @frontend)
|
45
|
+
raise DisabledAccount if @account.disable?
|
46
|
+
end
|
47
|
+
|
48
|
+
def find_by_uuid(model_class, uuid)
|
49
|
+
if model_class.is_a?(Symbol)
|
50
|
+
model_class = Models.const_get(model_class)
|
51
|
+
end
|
52
|
+
model_class[uuid] || raise(UnknownUUIDResource, uuid.to_s)
|
53
|
+
end
|
54
|
+
|
55
|
+
def find_account(account_uuid)
|
56
|
+
find_by_uuid(:Account, account_uuid)
|
57
|
+
end
|
58
|
+
|
59
|
+
def find_user(user_uuid)
|
60
|
+
find_by_uuid(:User, user_uuid)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns deserialized hash from HTTP body. Serialization fromat
|
64
|
+
# is guessed from content type header. The query string params
|
65
|
+
# is returned if none of content type header is in HTTP headers.
|
66
|
+
# This method is called only when the request method is POST.
|
67
|
+
def parsed_request_body
|
68
|
+
# @mime_types should be defined by sinatra/respond_to.rb plugin.
|
69
|
+
if @mime_types.nil?
|
70
|
+
# use query string as requested params if Content-Type
|
71
|
+
# header was not sent.
|
72
|
+
# ActiveResource library tells the one level nested hash which has
|
73
|
+
# {'something key'=>real_params} so that dummy key is assinged here.
|
74
|
+
hash = {:dummy=>@params}
|
75
|
+
else
|
76
|
+
mime = @mime_types.first
|
77
|
+
case mime.to_s
|
78
|
+
when 'application/json', 'text/json'
|
79
|
+
require 'json'
|
80
|
+
hash = JSON.load(request.body)
|
81
|
+
hash = hash.to_mash
|
82
|
+
when 'application/yaml', 'text/yaml'
|
83
|
+
require 'yaml'
|
84
|
+
hash = YAML.load(request.body)
|
85
|
+
hash = hash.to_mash
|
86
|
+
else
|
87
|
+
raise "Unsupported body document type: #{mime.to_s}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
return hash.values.first
|
91
|
+
end
|
92
|
+
|
93
|
+
# I am not going to use error(ex, &blk) hook since it works only
|
94
|
+
# when matches the Exception class exactly. I expect to match
|
95
|
+
# whole subclasses of APIError so that override handle_exception!().
|
96
|
+
def handle_exception!(boom)
|
97
|
+
if boom.kind_of?(APIError)
|
98
|
+
@env['sinatra.error'] = boom
|
99
|
+
error(boom.status_code, boom.class.to_s)
|
100
|
+
else
|
101
|
+
super
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def pagenate(data,start,limit)
|
106
|
+
return data unless data.kind_of?(Array)
|
107
|
+
if !start.nil? && !limit.nil?
|
108
|
+
start = start.to_i
|
109
|
+
limit = limit.to_i
|
110
|
+
from = start
|
111
|
+
to = (from + limit -1)
|
112
|
+
data = data[from..to]
|
113
|
+
end
|
114
|
+
data
|
115
|
+
end
|
116
|
+
|
117
|
+
collection :accounts do
|
118
|
+
operation :index do
|
119
|
+
control do
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
operation :show do
|
124
|
+
control do
|
125
|
+
a = find_account(params[:id])
|
126
|
+
respond_to { |f|
|
127
|
+
f.json { a.to_hash_document.to_json }
|
128
|
+
}
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
operation :create do
|
133
|
+
description 'Register a new account'
|
134
|
+
control do
|
135
|
+
a = Models::Account.create()
|
136
|
+
respond_to { |f|
|
137
|
+
f.json { a.to_hash_document.to_json }
|
138
|
+
}
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
operation :destroy do
|
143
|
+
description 'Unregister the account.'
|
144
|
+
# Associated resources all have to be destroied prior to
|
145
|
+
# removing the account.
|
146
|
+
#param :id, :string, :required
|
147
|
+
control do
|
148
|
+
a = find_account(params[:id])
|
149
|
+
a.destroy
|
150
|
+
|
151
|
+
respond_to { |f|
|
152
|
+
f.json { {} }
|
153
|
+
}
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
operation :enable, :method=>:get, :member=>true do
|
158
|
+
description 'Enable the account for all operations'
|
159
|
+
control do
|
160
|
+
a = find_account(params[:id])
|
161
|
+
a.enabled = Models::Account::ENABLED
|
162
|
+
a.save
|
163
|
+
|
164
|
+
respond_to { |f|
|
165
|
+
f.json { {} }
|
166
|
+
}
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
operation :disable, :method=>:get, :member=>true do
|
171
|
+
description 'Disable the account for all operations'
|
172
|
+
control do
|
173
|
+
a = find_account(params[:id])
|
174
|
+
a.enabled = Models::Account::DISABLED
|
175
|
+
a.save
|
176
|
+
|
177
|
+
respond_to { |f|
|
178
|
+
f.json { {} }
|
179
|
+
}
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
operation :add_tag, :method=>:get, :member=>true do
|
184
|
+
description 'Add a tag belongs to the account'
|
185
|
+
#param :tag_name, :string, :required
|
186
|
+
control do
|
187
|
+
a = find_account(params[:id])
|
188
|
+
|
189
|
+
tag_class = Models::Tags.find_tag_class(params[:tag_name])
|
190
|
+
raise "UnknownTagClass: #{params[:tag_name]}" if tag_class.nil?
|
191
|
+
|
192
|
+
a.add_tag(tag_class.new(:name=>params[:name]))
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
operation :remove_tag, :method=>:get, :member=>true do
|
197
|
+
description 'Unlink the associated tag of the account'
|
198
|
+
#param :tag_id, :string, :required
|
199
|
+
control do
|
200
|
+
a = find_account(params[:id])
|
201
|
+
t = a.tags_dataset.filter(:uuid=>params[:tag_id]).first
|
202
|
+
if t
|
203
|
+
a.remove_tag(t)
|
204
|
+
else
|
205
|
+
raise "Unknown or disassociated tag for #{a.cuuid}: #{params[:tag_id]}"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
collection :tags do
|
212
|
+
operation :create do
|
213
|
+
description 'Register new tag to the account'
|
214
|
+
#param :tag_name, :string, :required
|
215
|
+
#param :type_id, :fixnum, :optional
|
216
|
+
#param :account_id, :string, :optional
|
217
|
+
control do
|
218
|
+
tag_class = Models::Tag.find_tag_class(params[:tag_name])
|
219
|
+
|
220
|
+
tag_class.create
|
221
|
+
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
operation :show do
|
226
|
+
#param :account_id, :string, :optional
|
227
|
+
control do
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
operation :destroy do
|
232
|
+
description 'Create a new user'
|
233
|
+
control do
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
operation :update do
|
238
|
+
control do
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
collection :instances do
|
244
|
+
operation :create do
|
245
|
+
description 'Runs a new instance'
|
246
|
+
# param :image_id, :required
|
247
|
+
# param :host_pool_id :required
|
248
|
+
# param :instance_spec_id, :required
|
249
|
+
control do
|
250
|
+
i = {
|
251
|
+
:memory_size => 256,
|
252
|
+
:image_id => "wmi-640cbf3r",
|
253
|
+
:created_at => "Wed Oct 27 16:58:24 +0900 2010",
|
254
|
+
:network => {"ipaddr"=>"192.168.1.241"},
|
255
|
+
:id => "i-umwcbev3",
|
256
|
+
:volume => {},
|
257
|
+
:host_pool_id => "hp-hb4f6f84",
|
258
|
+
:cpu_cores => 1,
|
259
|
+
:status => "init",
|
260
|
+
:state => "init"
|
261
|
+
}
|
262
|
+
|
263
|
+
respond_to { |f|
|
264
|
+
f.json { i.to_json }
|
265
|
+
}
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
operation :show do
|
270
|
+
#param :account_id, :string, :optional
|
271
|
+
control do
|
272
|
+
i = Modles::Instance[params[:id]]
|
273
|
+
respond_to { |f|
|
274
|
+
f.json { i.to_hash_document.to_json }
|
275
|
+
}
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
operation :destroy do
|
280
|
+
description 'Shutdown the instance'
|
281
|
+
control do
|
282
|
+
i = find_by_uuid(:Instance, params[:id])
|
283
|
+
|
284
|
+
respond_to { |f|
|
285
|
+
f.json { i.to_hash_document.to_json }
|
286
|
+
}
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
operation :update do
|
291
|
+
description 'Change vcpu cores or memory size on the instance'
|
292
|
+
control do
|
293
|
+
i = find_by_uuid(:Instance, params[:id])
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
operation :reboot, :method=>:get, :member=>true do
|
298
|
+
description 'Reboots the instance'
|
299
|
+
control do
|
300
|
+
i = find_by_uuid(:Instance, params[:id])
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
operation :resume, :method=>:get, :member=>true do
|
305
|
+
description 'Resume the suspending instance'
|
306
|
+
control do
|
307
|
+
i = find_by_uuid(:Instance, params[:id])
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
operation :suspend, :method=>:get, :member=>true do
|
312
|
+
description 'Suspend the instance'
|
313
|
+
control do
|
314
|
+
i = find_by_uuid(:Instance, params[:id])
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
collection :host_pools do
|
320
|
+
operation :create do
|
321
|
+
description 'Register a new physical host'
|
322
|
+
# param :
|
323
|
+
control do
|
324
|
+
raise OperationNotPermitted unless @account.is_a?(Models::Account::SystemAccount::DatacenterAccount)
|
325
|
+
input = parsed_request_body
|
326
|
+
|
327
|
+
hp = Models::HostPool.create(:cpu_cores=>input[:cpu_cores],
|
328
|
+
:memory_size=>input[:memory_size],
|
329
|
+
:arch=>input[:arch],
|
330
|
+
:hypervisor=>input[:hypervisor]
|
331
|
+
)
|
332
|
+
respond_to { |f|
|
333
|
+
f.json{ hp.to_hash_document.to_json }
|
334
|
+
}
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
operation :show do
|
339
|
+
description 'Show status of the host'
|
340
|
+
#param :account_id, :string, :optional
|
341
|
+
control do
|
342
|
+
raise OperationNotPermitted unless @account.is_a?(Models::Account::SystemAccount::DatacenterAccount)
|
343
|
+
|
344
|
+
hp = find_by_uuid(:HostPool, params[:id])
|
345
|
+
respond_to { |f|
|
346
|
+
f.json { hp.to_hash_document.to_json }
|
347
|
+
}
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
operation :destroy do
|
352
|
+
description 'Unregister the existing host'
|
353
|
+
control do
|
354
|
+
raise OperationNotPermitted unless @account.is_a?(Models::Account::SystemAccount::DatacenterAccount)
|
355
|
+
|
356
|
+
hp = find_by_uuid(:HostPool, params[:id])
|
357
|
+
if hp.depend_resources?
|
358
|
+
raise ""
|
359
|
+
end
|
360
|
+
hp.destroy
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
operation :update do
|
365
|
+
description 'Update parameters for the host'
|
366
|
+
# param :cpu_cores, :optional
|
367
|
+
# param :memory_size, :optional
|
368
|
+
control do
|
369
|
+
raise OperationNotPermitted unless @account.is_a?(Models::Account::SystemAccount::DatacenterAccount)
|
370
|
+
|
371
|
+
hp = find_by_uuid(:HostPool, params[:id])
|
372
|
+
if params[:cpu_cores]
|
373
|
+
hp.offering_cpu_cores = params[:cpu_cores].to_i
|
374
|
+
end
|
375
|
+
if params[:memory_size]
|
376
|
+
hp.offering_memory_size = params[:memory_size].to_i
|
377
|
+
end
|
378
|
+
|
379
|
+
hp.save
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
end
|
384
|
+
|
385
|
+
collection :images do
|
386
|
+
operation :index do
|
387
|
+
description 'Show list of machine images'
|
388
|
+
control do
|
389
|
+
start = params[:start].to_i
|
390
|
+
start = start < 1 ? 0 : start
|
391
|
+
limit = params[:limit].to_i
|
392
|
+
limit = limit < 1 ? 10 : limit
|
393
|
+
|
394
|
+
partial_ds = (1..30).collect { |i| {
|
395
|
+
:created_at => "Mon Oct 18 18:33:58 +0900 2010",
|
396
|
+
:updated_at => "Mon Oct 18 18:33:58 +0900 2010",
|
397
|
+
:uuid => "wmi-640cbf"+sprintf('%02d',i),
|
398
|
+
:arch => "x86",
|
399
|
+
:account_id => "a-00000000",
|
400
|
+
:id => "wmi-640cbf"+sprintf('%02d',i),
|
401
|
+
:boot_dev_type => 2,
|
402
|
+
:description => "",
|
403
|
+
:source => {
|
404
|
+
:uri => "http://localhost/vdc/tmpmz0N86.qcow2",
|
405
|
+
:type => "http"
|
406
|
+
},
|
407
|
+
:state => "init"
|
408
|
+
}}
|
409
|
+
|
410
|
+
total = partial_ds.count
|
411
|
+
partial_ds = pagenate(partial_ds,params[:start],params[:limit])
|
412
|
+
|
413
|
+
res = [{
|
414
|
+
:owner_total => total,
|
415
|
+
:start => start,
|
416
|
+
:limit => limit,
|
417
|
+
:results=> partial_ds
|
418
|
+
}]
|
419
|
+
|
420
|
+
respond_to { |f|
|
421
|
+
f.json {res.to_json}
|
422
|
+
}
|
423
|
+
end
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
collection :volumes do
|
428
|
+
operation :index do
|
429
|
+
description 'Show lists of the volume'
|
430
|
+
# param start, fixnum, optional
|
431
|
+
# param limit, fixnum, optional
|
432
|
+
control do
|
433
|
+
start = params[:start].to_i
|
434
|
+
start = start < 1 ? 0 : start
|
435
|
+
limit = params[:limit].to_i
|
436
|
+
limit = limit < 1 ? 10 : limit
|
437
|
+
|
438
|
+
json = Mock.loadfile('volumes/list')
|
439
|
+
vl = JSON.load(json)
|
440
|
+
total = vl.count
|
441
|
+
vl = pagenate(vl,start,limit)
|
442
|
+
|
443
|
+
res = [{
|
444
|
+
:owner_total => total,
|
445
|
+
:start => start,
|
446
|
+
:limit => limit,
|
447
|
+
:results => vl
|
448
|
+
}]
|
449
|
+
respond_to { |f|
|
450
|
+
f.json {res.to_json}
|
451
|
+
}
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
455
|
+
operation :show do
|
456
|
+
description 'Show the volume status'
|
457
|
+
# param id, string, required
|
458
|
+
control do
|
459
|
+
volume_id = params[:id]
|
460
|
+
raise UndefinedVolumeID if volume_id.nil?
|
461
|
+
json = Mock.loadfile('volumes/details')
|
462
|
+
vl = JSON.load(json)
|
463
|
+
vl = vl[volume_id]
|
464
|
+
respond_to { |f|
|
465
|
+
f.json { vl.to_json}
|
466
|
+
}
|
467
|
+
end
|
468
|
+
end
|
469
|
+
|
470
|
+
operation :create do
|
471
|
+
description 'Create the new volume'
|
472
|
+
# param volume_size, string, required
|
473
|
+
# param snapshot_id, string, optional
|
474
|
+
# param private_pool_id, string, optional
|
475
|
+
control do
|
476
|
+
vl = { :status => 'creating', :messages => 'creating the new volume vol-xxxxxxx'}
|
477
|
+
# vl = Models::Volume.create(:size=> params[:volume_size])
|
478
|
+
# vl.state_machine.on_create
|
479
|
+
respond_to { |f|
|
480
|
+
f.json { vl.to_json}
|
481
|
+
}
|
482
|
+
end
|
483
|
+
end
|
484
|
+
|
485
|
+
operation :destroy do
|
486
|
+
description 'Delete the volume'
|
487
|
+
# param volume_id, string, required
|
488
|
+
control do
|
489
|
+
vl = { :status => 'deleting', :messages => 'deleting the volume vol-xxxxxxx'}
|
490
|
+
respond_to { |f|
|
491
|
+
f.json { vl.to_json}
|
492
|
+
}
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
496
|
+
operation :attach, :method =>:put, :member =>true do
|
497
|
+
description 'Attachd the volume'
|
498
|
+
# param volume_id, string, required
|
499
|
+
# param instance_id, string, required
|
500
|
+
control do
|
501
|
+
vl = { :status => 'attaching', :message => 'attaching the volume of vol-xxxxxx to instance_id'}
|
502
|
+
respond_to { |f|
|
503
|
+
f.json { vl.to_json}
|
504
|
+
}
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
508
|
+
operation :detach, :method =>:put, :member =>true do
|
509
|
+
description 'Detachd the volume'
|
510
|
+
# param volume_id, string, required
|
511
|
+
control do
|
512
|
+
vl = { :status => 'detaching', :message => 'detaching the volume of instance_id to vol-xxxxxx'}
|
513
|
+
respond_to { |f|
|
514
|
+
f.json { vl.to_json}
|
515
|
+
}
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
519
|
+
operation :status, :method =>:get, :member =>true do
|
520
|
+
description 'Show the status'
|
521
|
+
control do
|
522
|
+
vl = [{ :id => 1, :uuid => 'vol-xxxxxxx', :status => 1 },
|
523
|
+
{ :id => 2, :uuid => 'vol-xxxxxxx', :status => 0 },
|
524
|
+
{ :id => 3, :uuid => 'vol-xxxxxxx', :status => 3 },
|
525
|
+
{ :id => 4, :uuid => 'vol-xxxxxxx', :status => 2 },
|
526
|
+
{ :id => 5, :uuid => 'vol-xxxxxxx', :status => 4 }]
|
527
|
+
respond_to {|f|
|
528
|
+
f.json { vl.to_json}
|
529
|
+
}
|
530
|
+
end
|
531
|
+
end
|
532
|
+
end
|
533
|
+
|
534
|
+
collection :volume_snapshots do
|
535
|
+
operation :index do
|
536
|
+
description 'Show lists of the volume_snapshots'
|
537
|
+
# param start, Fixnum, optional
|
538
|
+
# param limit, Fixnum, optional
|
539
|
+
control do
|
540
|
+
start = params[:start].to_i
|
541
|
+
start = start < 1 ? 0 : start
|
542
|
+
limit = params[:limit].to_i
|
543
|
+
limit = limit < 1 ? 10 : limit
|
544
|
+
|
545
|
+
json = Mock.loadfile('volume_snapshots/list')
|
546
|
+
vs = JSON.load(json)
|
547
|
+
total = vs.count
|
548
|
+
vs = pagenate(vs,start,limit)
|
549
|
+
|
550
|
+
res = [{
|
551
|
+
:owner_total => total,
|
552
|
+
:start => start,
|
553
|
+
:limit => limit,
|
554
|
+
:results => vs
|
555
|
+
}]
|
556
|
+
respond_to { |f|
|
557
|
+
f.json {res.to_json}
|
558
|
+
}
|
559
|
+
end
|
560
|
+
end
|
561
|
+
|
562
|
+
operation :show do
|
563
|
+
description 'Show the volume status'
|
564
|
+
# param id, string, required
|
565
|
+
control do
|
566
|
+
snapshot_id = params[:id]
|
567
|
+
raise UndefinedVolumeSnapshotID if snapshot_id.nil?
|
568
|
+
json = Mock.loadfile('volume_snapshots/details')
|
569
|
+
vs = JSON.load(json)
|
570
|
+
vs = vs[snapshot_id]
|
571
|
+
respond_to { |f|
|
572
|
+
f.json { vs.to_json}
|
573
|
+
}
|
574
|
+
end
|
575
|
+
end
|
576
|
+
|
577
|
+
operation :create do
|
578
|
+
description 'Create a new volume snapshot'
|
579
|
+
# param volume_id, string, required
|
580
|
+
# param pool_id, string, optional
|
581
|
+
control do
|
582
|
+
vs = { :status => 'creating', :message => 'creating the new snapshot'}
|
583
|
+
respond_to { |f|
|
584
|
+
f.json { vs.to_json }
|
585
|
+
}
|
586
|
+
end
|
587
|
+
end
|
588
|
+
|
589
|
+
operation :destroy do
|
590
|
+
description 'Delete the volume snapshot'
|
591
|
+
# param snapshot_id, string, required
|
592
|
+
control do
|
593
|
+
vs = { :status => 'deleting', :message => 'deleting the snapshot'}
|
594
|
+
respond_to { |f|
|
595
|
+
f.json { vs.to_json }
|
596
|
+
}
|
597
|
+
end
|
598
|
+
end
|
599
|
+
|
600
|
+
operation :status, :method =>:get, :member =>true do
|
601
|
+
description 'Show the status'
|
602
|
+
control do
|
603
|
+
vs = [{ :id => 1, :uuid => 'snap-xxxxxxx', :status => 1 },
|
604
|
+
{ :id => 2, :uuid => 'snap-xxxxxxx', :status => 0 },
|
605
|
+
{ :id => 3, :uuid => 'snap-xxxxxxx', :status => 3 },
|
606
|
+
{ :id => 4, :uuid => 'snap-xxxxxxx', :status => 2 },
|
607
|
+
{ :id => 5, :uuid => 'snap-xxxxxxx', :status => 4 }]
|
608
|
+
respond_to {|f|
|
609
|
+
f.json { vs.to_json}
|
610
|
+
}
|
611
|
+
end
|
612
|
+
end
|
613
|
+
end
|
614
|
+
|
615
|
+
collection :netfilter_groups do
|
616
|
+
operation :index do
|
617
|
+
control do
|
618
|
+
start = params[:start].to_i
|
619
|
+
start = start < 1 ? 0 : start
|
620
|
+
limit = params[:limit].to_i
|
621
|
+
limit = limit < 1 ? 10 : limit
|
622
|
+
|
623
|
+
g = (1..30).collect { |i|
|
624
|
+
{
|
625
|
+
:id => i,
|
626
|
+
:name => "group_#{i}",
|
627
|
+
:description => "desc_group_#{i}",
|
628
|
+
:rule => "\ntcp:22,22,ip4:0.0.0.0\ntcp:80,80,ip4:0.0.0.0\n#tcp:443,443,ip4:0.0.0.0\nudp:53,53,ip4:0.0.0.0\nicmp:-1,-1,ip4:0.0.0.0\n",
|
629
|
+
:account_id => "a-00000000",
|
630
|
+
:created_at => "Fri Oct 22 10:50:09 +0900 2010",
|
631
|
+
:updated_at => "Fri Oct 22 10:50:09 +0900 2010",
|
632
|
+
}
|
633
|
+
}
|
634
|
+
total = g.count
|
635
|
+
g = pagenate(g,params[:start],params[:limit])
|
636
|
+
|
637
|
+
res = [{
|
638
|
+
:owner_total => total,
|
639
|
+
:start => start,
|
640
|
+
:limit => limit,
|
641
|
+
:results => g
|
642
|
+
}]
|
643
|
+
|
644
|
+
respond_to { |f|
|
645
|
+
f.json {res.to_json}
|
646
|
+
}
|
647
|
+
end
|
648
|
+
end
|
649
|
+
|
650
|
+
operation :show do
|
651
|
+
description 'Show lists of the netfilter_groups'
|
652
|
+
control do
|
653
|
+
@name = params[:id]
|
654
|
+
g = {
|
655
|
+
:id => 1,
|
656
|
+
:name => @name,
|
657
|
+
:description => "desc_#{@name}",
|
658
|
+
:rule => "\ntcp:22,22,ip4:0.0.0.0\ntcp:80,80,ip4:0.0.0.0\n#tcp:443,443,ip4:0.0.0.0\nudp:53,53,ip4:0.0.0.0\nicmp:-1,-1,ip4:0.0.0.0\n",
|
659
|
+
:account_id => "a-00000000",
|
660
|
+
:created_at => "Fri Oct 22 10:50:09 +0900 2010",
|
661
|
+
:updated_at => "Fri Oct 22 10:50:09 +0900 2010",
|
662
|
+
}
|
663
|
+
respond_to { |f|
|
664
|
+
f.json { g.to_json }
|
665
|
+
}
|
666
|
+
end
|
667
|
+
end
|
668
|
+
|
669
|
+
operation :create do
|
670
|
+
description 'Register a new netfilter_group'
|
671
|
+
# params name, string
|
672
|
+
# params description, string
|
673
|
+
# params rule, string
|
674
|
+
control do
|
675
|
+
raise UndefinedNetfilterGroup if params[:name].nil?
|
676
|
+
|
677
|
+
@name = params[:name]
|
678
|
+
@description = if params[:description]
|
679
|
+
params[:description]
|
680
|
+
else
|
681
|
+
"desc_#{@name}"
|
682
|
+
end
|
683
|
+
@rule = if params[:rule]
|
684
|
+
params[:rule]
|
685
|
+
else
|
686
|
+
"\ntcp:22,22,ip4:0.0.0.0\ntcp:80,80,ip4:0.0.0.0\n#tcp:443,443,ip4:0.0.0.0\nudp:53,53,ip4:0.0.0.0\nicmp:-1,-1,ip4:0.0.0.0\n"
|
687
|
+
end
|
688
|
+
|
689
|
+
g = {
|
690
|
+
:id => 1,
|
691
|
+
:name => @name,
|
692
|
+
:description => @description,
|
693
|
+
:rule => @rule,
|
694
|
+
:account_id => "a-00000000",
|
695
|
+
:created_at => "Fri Oct 22 10:50:09 +0900 2010",
|
696
|
+
:updated_at => "Fri Oct 22 10:50:09 +0900 2010",
|
697
|
+
}
|
698
|
+
respond_to { |f|
|
699
|
+
f.json { g.to_json }
|
700
|
+
}
|
701
|
+
end
|
702
|
+
end
|
703
|
+
|
704
|
+
operation :update do
|
705
|
+
description "Update parameters for the netfilter group"
|
706
|
+
# params description, string
|
707
|
+
# params rule, string
|
708
|
+
control do
|
709
|
+
@name = params[:id]
|
710
|
+
@description = nil
|
711
|
+
@rule = nil
|
712
|
+
|
713
|
+
if params[:description]
|
714
|
+
@description = params[:description]
|
715
|
+
else
|
716
|
+
@description = "desc_#{@name}"
|
717
|
+
end
|
718
|
+
|
719
|
+
if params[:rule]
|
720
|
+
@rule = params[:rule]
|
721
|
+
else
|
722
|
+
@rule = "\ntcp:22,22,ip4:0.0.0.0\ntcp:80,80,ip4:0.0.0.0\n#tcp:443,443,ip4:0.0.0.0\nudp:53,53,ip4:0.0.0.0\nicmp:-1,-1,ip4:0.0.0.0\n"
|
723
|
+
end
|
724
|
+
|
725
|
+
g = {
|
726
|
+
:id => 1,
|
727
|
+
:name => @name,
|
728
|
+
:description => @description,
|
729
|
+
:rule => @rule,
|
730
|
+
:account_id => "a-00000000",
|
731
|
+
:created_at => "Fri Oct 22 10:50:09 +0900 2010",
|
732
|
+
:updated_at => "Fri Oct 22 10:50:09 +0900 2010",
|
733
|
+
}
|
734
|
+
respond_to { |f|
|
735
|
+
f.json { g.to_json }
|
736
|
+
}
|
737
|
+
end
|
738
|
+
end
|
739
|
+
|
740
|
+
operation :destroy do
|
741
|
+
description "Delete the netfilter group"
|
742
|
+
|
743
|
+
control do
|
744
|
+
@name = params[:id]
|
745
|
+
g = {
|
746
|
+
:id => 1,
|
747
|
+
:name => @name,
|
748
|
+
:description => "desc_#{@name}",
|
749
|
+
:rule => "\ntcp:22,22,ip4:0.0.0.0\ntcp:80,80,ip4:0.0.0.0\n#tcp:443,443,ip4:0.0.0.0\nudp:53,53,ip4:0.0.0.0\nicmp:-1,-1,ip4:0.0.0.0\n",
|
750
|
+
:account_id => "a-00000000",
|
751
|
+
:created_at => "Fri Oct 22 10:50:09 +0900 2010",
|
752
|
+
:updated_at => "Fri Oct 22 10:50:09 +0900 2010",
|
753
|
+
}
|
754
|
+
respond_to { |f|
|
755
|
+
f.json { g.to_json }
|
756
|
+
}
|
757
|
+
end
|
758
|
+
end
|
759
|
+
|
760
|
+
end
|
761
|
+
|
762
|
+
collection :netfilter_rules do
|
763
|
+
operation :index do
|
764
|
+
control do
|
765
|
+
end
|
766
|
+
end
|
767
|
+
|
768
|
+
operation :show do
|
769
|
+
description 'Show lists of the netfilter_rules'
|
770
|
+
control do
|
771
|
+
g = [
|
772
|
+
{:id => 1, :netfilter_group_id => 1, :permission => "tcp:22,22,ip4:0.0.0.0", :created_at => "Fri Oct 22 11:15:10 +0900 2010", :updated_at => "Fri Oct 22 11:15:10 +0900 2010",},
|
773
|
+
{:id => 2, :netfilter_group_id => 1, :permission => "tcp:80,80,ip4:0.0.0.0", :created_at => "Fri Oct 22 11:15:10 +0900 2010", :updated_at => "Fri Oct 22 11:15:10 +0900 2010",},
|
774
|
+
{:id => 3, :netfilter_group_id => 1, :permission => "udp:53,53,ip4:0.0.0.0", :created_at => "Fri Oct 22 11:15:10 +0900 2010", :updated_at => "Fri Oct 22 11:15:10 +0900 2010",},
|
775
|
+
{:id => 4, :netfilter_group_id => 1, :permission => "icmp:-1,-1,ip4:0.0.0.0", :created_at => "Fri Oct 22 11:15:10 +0900 2010", :updated_at => "Fri Oct 22 11:15:10 +0900 2010",},
|
776
|
+
]
|
777
|
+
respond_to { |f|
|
778
|
+
f.json { g.to_json }
|
779
|
+
}
|
780
|
+
end
|
781
|
+
end
|
782
|
+
end
|
783
|
+
|
784
|
+
collection :private_pools do
|
785
|
+
operation :show do
|
786
|
+
description 'Show lists of the private_pools'
|
787
|
+
control do
|
788
|
+
pp = [{
|
789
|
+
:id => 1,
|
790
|
+
:account_id => 'u-xxxxxxx',
|
791
|
+
:storage_pool_id => 1,
|
792
|
+
:created_at => 'Fri Sep 10 14:50:11 +0900 2010',
|
793
|
+
:updated_at => 'Fri Sep 10 14:50:11 +0900 2010'
|
794
|
+
},{
|
795
|
+
:id => 2,
|
796
|
+
:account_id => 'u-xxxxxxx',
|
797
|
+
:storage_pool_id => 23,
|
798
|
+
:created_at => 'Fri Sep 10 14:50:11 +0900 2010',
|
799
|
+
:updated_at => 'Fri Sep 10 14:50:11 +0900 2010'
|
800
|
+
},{
|
801
|
+
:id => 2,
|
802
|
+
:account_id => 'u-xxxxxxx',
|
803
|
+
:storage_pool_id => 150,
|
804
|
+
:created_at => 'Fri Sep 10 14:50:11 +0900 2010',
|
805
|
+
:updated_at => 'Fri Sep 10 14:50:11 +0900 2010'
|
806
|
+
}]
|
807
|
+
respond_to { |f|
|
808
|
+
f.json { pp.to_json}
|
809
|
+
}
|
810
|
+
end
|
811
|
+
end
|
812
|
+
end
|
813
|
+
|
814
|
+
end
|
815
|
+
end
|
816
|
+
end
|