opennebula-cli 5.10.5 → 5.12.0.1
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.
- checksums.yaml +4 -4
- data/bin/oneacct +4 -2
- data/bin/oneacl +4 -2
- data/bin/onecluster +4 -2
- data/bin/onedatastore +4 -2
- data/bin/oneflow +151 -552
- data/bin/oneflow-template +173 -293
- data/bin/onegroup +4 -2
- data/bin/onehook +4 -2
- data/bin/onehost +78 -10
- data/bin/oneimage +4 -2
- data/bin/onemarket +4 -2
- data/bin/onemarketapp +17 -4
- data/bin/onesecgroup +4 -2
- data/bin/oneshowback +4 -2
- data/bin/onetemplate +4 -2
- data/bin/oneuser +4 -2
- data/bin/onevcenter +4 -2
- data/bin/onevdc +4 -2
- data/bin/onevm +90 -17
- data/bin/onevmgroup +4 -2
- data/bin/onevnet +13 -4
- data/bin/onevntemplate +4 -2
- data/bin/onevrouter +4 -2
- data/bin/onezone +7 -2
- data/lib/cli_helper.rb +54 -30
- data/lib/command_parser.rb +33 -14
- data/lib/one_helper.rb +258 -6
- data/lib/one_helper/oneacct_helper.rb +1 -1
- data/lib/one_helper/oneacl_helper.rb +1 -1
- data/lib/one_helper/onecluster_helper.rb +4 -4
- data/lib/one_helper/onedatastore_helper.rb +1 -1
- data/lib/one_helper/oneflow_helper.rb +419 -0
- data/lib/one_helper/oneflowtemplate_helper.rb +312 -0
- data/lib/one_helper/onegroup_helper.rb +1 -1
- data/lib/one_helper/onehook_helper.rb +1 -1
- data/lib/one_helper/onehost_helper.rb +148 -68
- data/lib/one_helper/oneimage_helper.rb +2 -2
- data/lib/one_helper/onemarket_helper.rb +1 -1
- data/lib/one_helper/onemarketapp_helper.rb +1 -1
- data/lib/one_helper/oneprovision_helper.rb +104 -60
- data/lib/one_helper/onequota_helper.rb +1 -1
- data/lib/one_helper/onesecgroup_helper.rb +1 -1
- data/lib/one_helper/onetemplate_helper.rb +9 -180
- data/lib/one_helper/oneuser_helper.rb +1 -1
- data/lib/one_helper/onevcenter_helper.rb +2 -1
- data/lib/one_helper/onevdc_helper.rb +1 -1
- data/lib/one_helper/onevm_helper.rb +11 -6
- data/lib/one_helper/onevmgroup_helper.rb +1 -1
- data/lib/one_helper/onevnet_helper.rb +1 -1
- data/lib/one_helper/onevntemplate_helper.rb +1 -1
- data/lib/one_helper/onevrouter_helper.rb +1 -1
- data/lib/one_helper/onezone_helper.rb +3 -1
- metadata +15 -13
data/bin/oneflow-template
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
# -------------------------------------------------------------------------- #
|
4
|
-
# Copyright 2002-
|
4
|
+
# Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
|
5
5
|
# #
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
7
7
|
# not use this file except in compliance with the License. You may obtain #
|
@@ -20,139 +20,62 @@ ONE_LOCATION = ENV['ONE_LOCATION']
|
|
20
20
|
|
21
21
|
if !ONE_LOCATION
|
22
22
|
RUBY_LIB_LOCATION = '/usr/lib/one/ruby'
|
23
|
+
ONEFLOW_LOCATION = '/usr/lib/one/oneflow/lib'
|
23
24
|
GEMS_LOCATION = '/usr/share/one/gems'
|
24
25
|
else
|
25
26
|
RUBY_LIB_LOCATION = ONE_LOCATION + '/lib/ruby'
|
27
|
+
ONEFLOW_LOCATION = ONE_LOCATION + '/lib/oneflow/lib'
|
26
28
|
GEMS_LOCATION = ONE_LOCATION + '/share/gems'
|
27
29
|
end
|
28
30
|
|
29
31
|
if File.directory?(GEMS_LOCATION)
|
30
|
-
|
32
|
+
$LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
|
33
|
+
require 'rubygems'
|
34
|
+
Gem.use_paths(File.realpath(GEMS_LOCATION))
|
31
35
|
end
|
32
36
|
|
33
37
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
38
|
+
$LOAD_PATH << ONEFLOW_LOCATION
|
34
39
|
$LOAD_PATH << RUBY_LIB_LOCATION + '/cli'
|
40
|
+
$LOAD_PATH << RUBY_LIB_LOCATION + '/oneflow/lib'
|
41
|
+
|
42
|
+
require 'json'
|
43
|
+
require 'English'
|
44
|
+
require 'tempfile'
|
35
45
|
|
36
46
|
require 'command_parser'
|
37
47
|
require 'opennebula/oneflow_client'
|
38
|
-
require '
|
48
|
+
require 'models'
|
39
49
|
require 'cli_helper'
|
40
|
-
require 'one_helper'
|
41
|
-
|
42
|
-
require 'json'
|
50
|
+
require 'one_helper/oneflowtemplate_helper'
|
43
51
|
|
44
52
|
USER_AGENT = 'CLI'
|
45
53
|
|
46
54
|
# Base Path representing the resource to be used in the requests
|
47
55
|
RESOURCE_PATH = '/service_template'
|
48
56
|
|
49
|
-
#
|
50
|
-
# Table
|
51
|
-
#
|
52
|
-
|
53
|
-
TABLE = CLIHelper::ShowTable.new(nil, self) do
|
54
|
-
column :ID, 'ID', :size => 10 do |d|
|
55
|
-
d['ID']
|
56
|
-
end
|
57
|
-
|
58
|
-
column :USER, 'Username', :left, :size => 15 do |d|
|
59
|
-
d['UNAME']
|
60
|
-
end
|
61
|
-
|
62
|
-
column :GROUP, 'Group', :left, :size => 15 do |d|
|
63
|
-
d['GNAME']
|
64
|
-
end
|
65
|
-
|
66
|
-
column :NAME, 'Name', :left, :size => 37 do |d|
|
67
|
-
d['NAME']
|
68
|
-
end
|
69
|
-
|
70
|
-
default :ID, :USER, :GROUP, :NAME
|
71
|
-
end
|
72
|
-
|
73
|
-
# Show the service template information. This method is used in top and
|
74
|
-
# show commands
|
75
|
-
# @param [Service::Client] client
|
76
|
-
# @param [Array] args
|
77
|
-
# @param [Hash] options
|
78
|
-
# @return [[Integer, String], Integer] Returns the exit_code and optionally
|
79
|
-
# a String to be printed
|
80
|
-
def show_service_template(client, args, options)
|
81
|
-
response = client.get("#{RESOURCE_PATH}/#{args[0]}")
|
82
|
-
|
83
|
-
if CloudClient.is_error?(response)
|
84
|
-
[response.code.to_i, response.to_s]
|
85
|
-
else
|
86
|
-
# [0,response.body]
|
87
|
-
if options[:json]
|
88
|
-
[0, response.body]
|
89
|
-
else
|
90
|
-
str = '%-20s: %-20s'
|
91
|
-
str_h1 = '%-80s'
|
92
|
-
|
93
|
-
document_hash = JSON.parse(response.body)
|
94
|
-
template = document_hash['DOCUMENT']['TEMPLATE']['BODY']
|
95
|
-
|
96
|
-
CLIHelper.print_header(str_h1 %
|
97
|
-
"SERVICE TEMPLATE #{document_hash['DOCUMENT']['ID']} "\
|
98
|
-
'INFORMATION')
|
99
|
-
|
100
|
-
puts Kernel.format str, 'ID', document_hash['DOCUMENT']['ID']
|
101
|
-
puts Kernel.format str, 'NAME', document_hash['DOCUMENT']['NAME']
|
102
|
-
puts Kernel.format str, 'USER', document_hash['DOCUMENT']['UNAME']
|
103
|
-
puts Kernel.format str, 'GROUP', document_hash['DOCUMENT']['GNAME']
|
104
|
-
|
105
|
-
puts
|
106
|
-
|
107
|
-
CLIHelper.print_header(str_h1 % 'PERMISSIONS', false)
|
108
|
-
|
109
|
-
%w[OWNER GROUP OTHER].each do |e|
|
110
|
-
mask = '---'
|
111
|
-
permissions_hash = document_hash['DOCUMENT']['PERMISSIONS']
|
112
|
-
mask[0] = 'u' if permissions_hash["#{e}_U"] == '1'
|
113
|
-
mask[1] = 'm' if permissions_hash["#{e}_M"] == '1'
|
114
|
-
mask[2] = 'a' if permissions_hash["#{e}_A"] == '1'
|
115
|
-
|
116
|
-
puts Kernel.format str, e, mask
|
117
|
-
end
|
118
|
-
|
119
|
-
puts
|
120
|
-
|
121
|
-
CLIHelper.print_header(str_h1 % 'TEMPLATE CONTENTS', false)
|
122
|
-
puts JSON.pretty_generate(template)
|
123
|
-
|
124
|
-
0
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
# List the services. This method is used in top and list commands
|
130
|
-
# @param [Service::Client] client
|
131
|
-
# @param [Hash] options
|
132
|
-
# @return [[Integer, String], Integer] Returns the exit_code and optionally
|
133
|
-
# a String to be printed
|
134
|
-
def list_service_templates(client, options)
|
135
|
-
response = client.get(RESOURCE_PATH)
|
136
|
-
|
137
|
-
if CloudClient.is_error?(response)
|
138
|
-
[response.code.to_i, response.to_s]
|
139
|
-
else
|
140
|
-
# [0,response.body]
|
141
|
-
if options[:json]
|
142
|
-
[0, response.body]
|
143
|
-
else
|
144
|
-
array_list = JSON.parse(response.body)
|
145
|
-
TABLE.show(array_list['DOCUMENT_POOL']['DOCUMENT'])
|
146
|
-
0
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
#
|
152
|
-
# Commands
|
153
|
-
#
|
154
|
-
|
155
57
|
CommandParser::CmdParser.new(ARGV) do
|
58
|
+
MULTIPLE = {
|
59
|
+
:name => 'multiple',
|
60
|
+
:short => '-m x',
|
61
|
+
:large => '--multiple x',
|
62
|
+
:format => Integer,
|
63
|
+
:description => 'Instance multiple templates'
|
64
|
+
}
|
65
|
+
|
66
|
+
RECURSIVE = {
|
67
|
+
:name => 'recursive',
|
68
|
+
:short => '-r',
|
69
|
+
:large => '--recursive',
|
70
|
+
:description => 'Clone the template recursively (templates and images)'
|
71
|
+
}
|
72
|
+
|
73
|
+
RECURSIVE_TEMPLATES = {
|
74
|
+
:name => 'recursive_templates',
|
75
|
+
:large => '--recursive-templates',
|
76
|
+
:description => 'Clone the template recursively (just templates)'
|
77
|
+
}
|
78
|
+
|
156
79
|
usage '`oneflow-template` <command> [<args>] [<options>]'
|
157
80
|
version OpenNebulaHelper::ONE_VERSION
|
158
81
|
|
@@ -160,9 +83,12 @@ CommandParser::CmdParser.new(ARGV) do
|
|
160
83
|
set :option, CommandParser::VERSION
|
161
84
|
set :option, CommandParser::HELP
|
162
85
|
|
163
|
-
#
|
86
|
+
# create helper object
|
87
|
+
helper = OneFlowTemplateHelper.new
|
88
|
+
|
89
|
+
############################################################################
|
164
90
|
# Formatters for arguments
|
165
|
-
|
91
|
+
############################################################################
|
166
92
|
set :format, :groupid, OpenNebulaHelper.rname_to_id_desc('GROUP') do |arg|
|
167
93
|
OpenNebulaHelper.rname_to_id(arg, 'GROUP')
|
168
94
|
end
|
@@ -181,81 +107,52 @@ CommandParser::CmdParser.new(ARGV) do
|
|
181
107
|
Service.list_to_id(arg, 'SERVICE TEMPLATE')
|
182
108
|
end
|
183
109
|
|
184
|
-
|
185
|
-
# List
|
186
|
-
#
|
110
|
+
###
|
187
111
|
|
188
112
|
list_desc = <<-EOT.unindent
|
189
113
|
List the available Service Templates
|
190
114
|
EOT
|
191
115
|
|
192
116
|
command :list, list_desc, :options => Service::JSON_FORMAT do
|
193
|
-
client
|
194
|
-
:username => options[:username],
|
195
|
-
:password => options[:password],
|
196
|
-
:url => options[:server],
|
197
|
-
:user_agent => USER_AGENT
|
198
|
-
)
|
199
|
-
|
200
|
-
list_service_templates(client, options)
|
117
|
+
helper.list_service_template_pool(helper.client(options), options)
|
201
118
|
end
|
202
119
|
|
203
|
-
|
204
|
-
# Top
|
205
|
-
#
|
120
|
+
###
|
206
121
|
|
207
122
|
top_desc = <<-EOT.unindent
|
208
123
|
List the available Service Templates continuously
|
209
124
|
EOT
|
210
125
|
|
211
|
-
command :top,
|
126
|
+
command :top,
|
127
|
+
top_desc,
|
212
128
|
:options => [Service::JSON_FORMAT,
|
213
129
|
Service::TOP,
|
214
130
|
CLIHelper::DELAY] do
|
215
|
-
|
216
|
-
:username => options[:username],
|
217
|
-
:password => options[:password],
|
218
|
-
:url => options[:server],
|
219
|
-
:user_agent => USER_AGENT
|
220
|
-
)
|
131
|
+
Signal.trap('INT') { exit(-1) }
|
221
132
|
|
222
|
-
options
|
133
|
+
helper.top_service_template_pool(helper.client(options), options)
|
223
134
|
|
224
|
-
|
225
|
-
|
226
|
-
CLIHelper.scr_cls
|
227
|
-
CLIHelper.scr_move(0, 0)
|
135
|
+
0
|
136
|
+
end
|
228
137
|
|
229
|
-
|
138
|
+
###
|
230
139
|
|
231
|
-
|
232
|
-
|
233
|
-
|
140
|
+
show_desc = <<-EOT.unindent
|
141
|
+
Show detailed information of a given Service Template
|
142
|
+
EOT
|
234
143
|
|
235
|
-
|
236
|
-
|
237
|
-
rescue StandardError => e
|
238
|
-
puts e.message
|
239
|
-
-1
|
240
|
-
end
|
144
|
+
command :show, show_desc, :templateid, :options => Service::JSON_FORMAT do
|
145
|
+
helper.format_resource(helper.client(options), args[0], options)
|
241
146
|
end
|
242
147
|
|
243
|
-
|
244
|
-
# Create
|
245
|
-
#
|
148
|
+
###
|
246
149
|
|
247
150
|
create_desc = <<-EOT.unindent
|
248
151
|
Create a new Service Template
|
249
152
|
EOT
|
250
153
|
|
251
154
|
command :create, create_desc, :file, :options => Service::JSON_FORMAT do
|
252
|
-
client
|
253
|
-
:username => options[:username],
|
254
|
-
:password => options[:password],
|
255
|
-
:url => options[:server],
|
256
|
-
:user_agent => USER_AGENT
|
257
|
-
)
|
258
|
-
|
155
|
+
client = helper.client(options)
|
259
156
|
response = client.post(RESOURCE_PATH, File.read(args[0]))
|
260
157
|
|
261
158
|
if CloudClient.is_error?(response)
|
@@ -264,180 +161,178 @@ CommandParser::CmdParser.new(ARGV) do
|
|
264
161
|
if options[:json]
|
265
162
|
[0, response.body]
|
266
163
|
else
|
267
|
-
|
268
|
-
|
164
|
+
puts "ID: #{JSON.parse(response.body)['DOCUMENT']['ID']}"
|
165
|
+
|
269
166
|
0
|
270
167
|
end
|
271
168
|
end
|
272
169
|
end
|
273
170
|
|
274
|
-
|
275
|
-
# Show
|
276
|
-
#
|
277
|
-
|
278
|
-
show_desc = <<-EOT.unindent
|
279
|
-
Show detailed information of a given Service Template
|
280
|
-
EOT
|
281
|
-
|
282
|
-
command :show, show_desc, :templateid, :options => Service::JSON_FORMAT do
|
283
|
-
client = Service::Client.new(
|
284
|
-
:username => options[:username],
|
285
|
-
:password => options[:password],
|
286
|
-
:url => options[:server],
|
287
|
-
:user_agent => USER_AGENT
|
288
|
-
)
|
289
|
-
|
290
|
-
show_service_template(client, args, options)
|
291
|
-
end
|
292
|
-
|
293
|
-
#
|
294
|
-
# Delete
|
295
|
-
#
|
171
|
+
###
|
296
172
|
|
297
173
|
delete_desc = <<-EOT.unindent
|
298
174
|
Delete a given Service Template
|
299
175
|
EOT
|
300
176
|
|
301
177
|
command :delete, delete_desc, [:range, :templateid_list] do
|
302
|
-
client =
|
303
|
-
:username => options[:username],
|
304
|
-
:password => options[:password],
|
305
|
-
:url => options[:server],
|
306
|
-
:user_agent => USER_AGENT
|
307
|
-
)
|
178
|
+
client = helper.client(options)
|
308
179
|
|
309
180
|
Service.perform_actions(args[0]) do |template_id|
|
310
181
|
client.delete("#{RESOURCE_PATH}/#{template_id}")
|
311
182
|
end
|
312
183
|
end
|
313
184
|
|
314
|
-
|
315
|
-
# Instantiate
|
316
|
-
#
|
185
|
+
###
|
317
186
|
|
318
187
|
instantiate_desc = <<-EOT.unindent
|
319
188
|
Instantiate a Service Template
|
320
189
|
EOT
|
321
190
|
|
322
|
-
command :instantiate,
|
323
|
-
|
324
|
-
|
325
|
-
:
|
326
|
-
:
|
327
|
-
|
328
|
-
:user_agent => USER_AGENT
|
329
|
-
)
|
330
|
-
|
191
|
+
command :instantiate,
|
192
|
+
instantiate_desc,
|
193
|
+
:templateid,
|
194
|
+
[:file, nil],
|
195
|
+
:options => [MULTIPLE, Service::JSON_FORMAT, Service::TOP] do
|
196
|
+
number = options[:multiple] || 1
|
331
197
|
params = {}
|
198
|
+
rc = 0
|
332
199
|
|
333
|
-
|
334
|
-
params['merge_template'] =
|
335
|
-
|
200
|
+
number.times do
|
201
|
+
params['merge_template'] = nil
|
202
|
+
params['merge_template'] = JSON.parse(File.read(args[1])) if args[1]
|
336
203
|
|
337
|
-
|
204
|
+
unless params['merge_template']
|
205
|
+
service_template = OpenNebula::ServiceTemplate
|
206
|
+
.new_with_id(args[0],
|
207
|
+
OpenNebula::Client.new)
|
208
|
+
service_template.info
|
338
209
|
|
339
|
-
|
210
|
+
body = JSON.parse(service_template['/DOCUMENT/TEMPLATE/BODY'])
|
340
211
|
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
[
|
212
|
+
params['merge_template'] = helper.custom_attrs(
|
213
|
+
body['custom_attrs']
|
214
|
+
)
|
215
|
+
|
216
|
+
params['merge_template'] = {} unless params['merge_template']
|
217
|
+
|
218
|
+
vnets = helper.networks(body['networks'])
|
219
|
+
params['merge_template'].merge!(vnets) unless vnets.nil?
|
220
|
+
end
|
221
|
+
|
222
|
+
json = Service.build_json_action('instantiate', params)
|
223
|
+
client = helper.client(options)
|
224
|
+
response = client.post("#{RESOURCE_PATH}/#{args[0]}/action", json)
|
225
|
+
|
226
|
+
if CloudClient.is_error?(response)
|
227
|
+
rc = [response.code.to_i, response.to_s]
|
228
|
+
break
|
346
229
|
else
|
347
|
-
|
348
|
-
|
349
|
-
|
230
|
+
if options[:json]
|
231
|
+
rc = [0, response.body]
|
232
|
+
break
|
233
|
+
else
|
234
|
+
rc = 0
|
235
|
+
puts "ID: #{JSON.parse(response.body)['DOCUMENT']['ID']}"
|
236
|
+
end
|
350
237
|
end
|
351
238
|
end
|
239
|
+
|
240
|
+
rc
|
352
241
|
end
|
353
242
|
|
243
|
+
###
|
244
|
+
|
354
245
|
chgrp_desc = <<-EOT.unindent
|
355
246
|
Changes the service template group
|
356
247
|
EOT
|
357
248
|
|
358
249
|
command :chgrp, chgrp_desc, [:range, :templateid_list], :groupid do
|
359
|
-
client =
|
360
|
-
:username => options[:username],
|
361
|
-
:password => options[:password],
|
362
|
-
:url => options[:server],
|
363
|
-
:user_agent => USER_AGENT
|
364
|
-
)
|
250
|
+
client = helper.client(options)
|
365
251
|
|
366
252
|
Service.perform_actions(args[0]) do |service_id|
|
367
253
|
params = {}
|
368
254
|
params['group_id'] = args[1].to_i
|
369
255
|
|
370
|
-
|
256
|
+
json = Service.build_json_action('chgrp', params)
|
371
257
|
|
372
|
-
client.post("#{RESOURCE_PATH}/#{service_id}/action",
|
258
|
+
client.post("#{RESOURCE_PATH}/#{service_id}/action", json)
|
373
259
|
end
|
374
260
|
end
|
375
261
|
|
262
|
+
###
|
263
|
+
|
376
264
|
chown_desc = <<-EOT.unindent
|
377
265
|
Changes the service template owner and group
|
378
266
|
EOT
|
379
267
|
|
380
|
-
command :chown,
|
381
|
-
|
382
|
-
|
383
|
-
:
|
384
|
-
:
|
385
|
-
|
386
|
-
:user_agent => USER_AGENT
|
387
|
-
)
|
268
|
+
command :chown,
|
269
|
+
chown_desc,
|
270
|
+
[:range, :templateid_list],
|
271
|
+
:userid,
|
272
|
+
[:groupid, nil] do
|
273
|
+
client = helper.client(options)
|
388
274
|
|
389
275
|
Service.perform_actions(args[0]) do |service_id|
|
390
276
|
params = {}
|
391
277
|
params['owner_id'] = args[1]
|
392
278
|
params['group_id'] = args[2] if args[2]
|
393
279
|
|
394
|
-
|
280
|
+
json = Service.build_json_action('chown', params)
|
395
281
|
|
396
|
-
client.post("#{RESOURCE_PATH}/#{service_id}/action",
|
282
|
+
client.post("#{RESOURCE_PATH}/#{service_id}/action", json)
|
397
283
|
end
|
398
284
|
end
|
399
285
|
|
286
|
+
###
|
287
|
+
|
400
288
|
chmod_desc = <<-EOT.unindent
|
401
289
|
Changes the service template permissions
|
402
290
|
EOT
|
403
291
|
|
404
292
|
command :chmod, chmod_desc, [:range, :templateid_list], :octet do
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
)
|
293
|
+
if !/\A\d+\z/.match(args[1])
|
294
|
+
STDERR.puts "Invalid '#{args[1]}' octed permissions"
|
295
|
+
exit(-1)
|
296
|
+
end
|
297
|
+
|
298
|
+
client = helper.client(options)
|
411
299
|
|
412
300
|
Service.perform_actions(args[0]) do |service_id|
|
413
301
|
params = {}
|
414
302
|
params['octet'] = args[1]
|
415
303
|
|
416
|
-
|
304
|
+
json = Service.build_json_action('chmod', params)
|
417
305
|
|
418
|
-
client.post("#{RESOURCE_PATH}/#{service_id}/action",
|
306
|
+
client.post("#{RESOURCE_PATH}/#{service_id}/action", json)
|
419
307
|
end
|
420
308
|
end
|
421
309
|
|
310
|
+
###
|
311
|
+
|
422
312
|
clone_desc = <<-EOT.unindent
|
423
313
|
Creates a new Service Template from an existing one
|
424
314
|
EOT
|
425
315
|
|
426
|
-
command :clone,
|
427
|
-
|
428
|
-
:
|
429
|
-
:
|
430
|
-
:
|
431
|
-
:user_agent => USER_AGENT
|
432
|
-
)
|
433
|
-
|
316
|
+
command :clone,
|
317
|
+
clone_desc,
|
318
|
+
:templateid,
|
319
|
+
:name,
|
320
|
+
:options => [RECURSIVE, RECURSIVE_TEMPLATES] do
|
434
321
|
params = {}
|
435
322
|
params['name'] = args[1]
|
436
323
|
|
437
|
-
|
324
|
+
if options.key?(:recursive)
|
325
|
+
params['recursive'] = 'all'
|
326
|
+
elsif options.key?(:recursive_templates)
|
327
|
+
params['recurisve'] = 'templates'
|
328
|
+
else
|
329
|
+
params['recursive'] = 'none'
|
330
|
+
end
|
331
|
+
|
332
|
+
json = Service.build_json_action('clone', params)
|
333
|
+
client = helper.client(options)
|
438
334
|
|
439
|
-
response = client.post("#{RESOURCE_PATH}/#{args[0]}/action",
|
440
|
-
json_action)
|
335
|
+
response = client.post("#{RESOURCE_PATH}/#{args[0]}/action", json)
|
441
336
|
|
442
337
|
if CloudClient.is_error?(response)
|
443
338
|
[response.code.to_i, response.to_s]
|
@@ -445,40 +340,33 @@ CommandParser::CmdParser.new(ARGV) do
|
|
445
340
|
if options[:json]
|
446
341
|
[0, response.body]
|
447
342
|
else
|
448
|
-
|
449
|
-
|
343
|
+
puts "ID: #{JSON.parse(response.body)['DOCUMENT']['ID']}"
|
344
|
+
|
450
345
|
0
|
451
346
|
end
|
452
347
|
end
|
453
348
|
end
|
454
349
|
|
350
|
+
###
|
351
|
+
|
455
352
|
rename_desc = <<-EOT.unindent
|
456
353
|
Renames the Service Template
|
457
354
|
EOT
|
458
355
|
|
459
356
|
command :rename, rename_desc, :templateid, :name do
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
:url => options[:server],
|
464
|
-
:user_agent => USER_AGENT
|
465
|
-
)
|
466
|
-
|
467
|
-
params = {}
|
468
|
-
params['name'] = args[1]
|
469
|
-
|
470
|
-
json_action = Service.build_json_action('rename', params)
|
357
|
+
Service.perform_action(args[0]) do |template_id|
|
358
|
+
params = {}
|
359
|
+
params['name'] = args[1]
|
471
360
|
|
472
|
-
|
473
|
-
|
361
|
+
json = Service.build_json_action('rename', params)
|
362
|
+
client = helper.client(options)
|
474
363
|
|
475
|
-
|
476
|
-
[response.code.to_i, response.to_s]
|
477
|
-
else
|
478
|
-
response.code.to_i
|
364
|
+
client.post("#{RESOURCE_PATH}/#{template_id}/action", json)
|
479
365
|
end
|
480
366
|
end
|
481
367
|
|
368
|
+
###
|
369
|
+
|
482
370
|
update_desc = <<-EOT.unindent
|
483
371
|
Update the template contents. If a path is not provided the editor will
|
484
372
|
be launched to modify the current content.
|
@@ -486,30 +374,23 @@ CommandParser::CmdParser.new(ARGV) do
|
|
486
374
|
|
487
375
|
command :update, update_desc, :templateid, [:file, nil] do
|
488
376
|
template_id = args[0]
|
489
|
-
client
|
490
|
-
:username => options[:username],
|
491
|
-
:password => options[:password],
|
492
|
-
:url => options[:server],
|
493
|
-
:user_agent => USER_AGENT
|
494
|
-
)
|
377
|
+
client = helper.client(options)
|
495
378
|
|
496
379
|
if args[1]
|
497
380
|
path = args[1]
|
498
381
|
else
|
499
|
-
require 'tempfile'
|
500
|
-
|
501
|
-
tmp = Tempfile.new(template_id.to_s)
|
502
|
-
path = tmp.path
|
503
|
-
|
504
382
|
response = client.get("#{RESOURCE_PATH}/#{template_id}")
|
505
383
|
|
506
384
|
if CloudClient.is_error?(response)
|
507
385
|
exit_with_code response.code.to_i, response.to_s
|
508
386
|
else
|
509
|
-
|
510
|
-
template =
|
387
|
+
document = JSON.parse(response.body)['DOCUMENT']
|
388
|
+
template = document['TEMPLATE']['BODY']
|
511
389
|
|
512
|
-
tmp
|
390
|
+
tmp = Tempfile.new(template_id.to_s)
|
391
|
+
path = tmp.path
|
392
|
+
|
393
|
+
tmp.write(JSON.pretty_generate(template))
|
513
394
|
tmp.flush
|
514
395
|
|
515
396
|
if ENV['EDITOR']
|
@@ -517,10 +398,11 @@ CommandParser::CmdParser.new(ARGV) do
|
|
517
398
|
else
|
518
399
|
editor_path = OpenNebulaHelper::EDITOR_PATH
|
519
400
|
end
|
401
|
+
|
520
402
|
system("#{editor_path} #{path}")
|
521
403
|
|
522
404
|
unless $CHILD_STATUS.exitstatus.zero?
|
523
|
-
puts 'Editor not defined'
|
405
|
+
STDERR.puts 'Editor not defined'
|
524
406
|
exit(-1)
|
525
407
|
end
|
526
408
|
|
@@ -528,15 +410,13 @@ CommandParser::CmdParser.new(ARGV) do
|
|
528
410
|
end
|
529
411
|
end
|
530
412
|
|
531
|
-
|
413
|
+
response = client.put("#{RESOURCE_PATH}/#{template_id}",
|
414
|
+
File.read(path))
|
532
415
|
|
533
|
-
t_str = File.read(path)
|
534
|
-
response = client.put("#{RESOURCE_PATH}/#{template_id}", t_str)
|
535
416
|
if CloudClient.is_error?(response)
|
536
|
-
|
537
|
-
|
417
|
+
[response.code.to_i, response.to_s]
|
418
|
+
else
|
419
|
+
0
|
538
420
|
end
|
539
|
-
|
540
|
-
exit_code
|
541
421
|
end
|
542
422
|
end
|