opennebula-cli 4.14.2 → 4.90.0.beta1
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/NOTICE +1 -1
- data/bin/oneacct +1 -1
- data/bin/oneacl +1 -1
- data/bin/onecluster +4 -1
- data/bin/onedatastore +4 -1
- data/bin/oneflow +26 -1
- data/bin/oneflow-template +57 -1
- data/bin/onegroup +4 -1
- data/bin/onehost +24 -15
- data/bin/oneimage +5 -3
- data/bin/onemarket +178 -0
- data/bin/onemarketapp +282 -0
- data/bin/onesecgroup +18 -1
- data/bin/oneshowback +1 -1
- data/bin/onetemplate +30 -21
- data/bin/oneuser +12 -6
- data/bin/oneuser.backup +522 -0
- data/bin/onevcenter +287 -1
- data/bin/onevdc +4 -1
- data/bin/onevm +78 -56
- data/bin/onevnet +10 -4
- data/bin/onevrouter +305 -0
- data/bin/onezone +4 -1
- data/lib/cli_helper.rb +1 -1
- data/lib/command_parser.rb +1 -1
- data/lib/one_helper/oneacct_helper.rb +1 -1
- data/lib/one_helper/oneacl_helper.rb +11 -5
- data/lib/one_helper/onecluster_helper.rb +1 -1
- data/lib/one_helper/onedatastore_helper.rb +17 -7
- data/lib/one_helper/onegroup_helper.rb +1 -1
- data/lib/one_helper/onehost_helper.rb +2 -5
- data/lib/one_helper/oneimage_helper.rb +1 -15
- data/lib/one_helper/onemarket_helper.rb +152 -0
- data/lib/one_helper/onemarketapp_helper.rb +223 -0
- data/lib/one_helper/onequota_helper.rb +1 -1
- data/lib/one_helper/onesecgroup_helper.rb +46 -3
- data/lib/one_helper/onetemplate_helper.rb +146 -11
- data/lib/one_helper/oneuser_helper.rb +1 -1
- data/lib/one_helper/onevdc_helper.rb +1 -1
- data/lib/one_helper/onevm_helper.rb +37 -53
- data/lib/one_helper/onevnet_helper.rb +23 -11
- data/lib/one_helper/onevrouter_helper.rb +221 -0
- data/lib/one_helper/onezone_helper.rb +1 -1
- data/lib/one_helper.rb +193 -25
- metadata +21 -10
data/lib/one_helper.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# -------------------------------------------------------------------------- #
|
2
|
-
# Copyright 2002-
|
2
|
+
# Copyright 2002-2016, OpenNebula Project, OpenNebula Systems #
|
3
3
|
# #
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
5
5
|
# not use this file except in compliance with the License. You may obtain #
|
@@ -28,7 +28,7 @@ include OpenNebula
|
|
28
28
|
module OpenNebulaHelper
|
29
29
|
ONE_VERSION=<<-EOT
|
30
30
|
OpenNebula #{OpenNebula::VERSION}
|
31
|
-
Copyright 2002-
|
31
|
+
Copyright 2002-2016, OpenNebula Project, OpenNebula Systems
|
32
32
|
|
33
33
|
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
34
34
|
not use this file except in compliance with the License. You may obtain
|
@@ -267,6 +267,12 @@ EOT
|
|
267
267
|
:description => 'VNC IP where to listen for connections. '<<
|
268
268
|
'By default is 0.0.0.0 (all interfaces).'
|
269
269
|
},
|
270
|
+
{
|
271
|
+
:name => 'vnc_keymap',
|
272
|
+
:large => '--vnc-keymap keymap',
|
273
|
+
:format => String,
|
274
|
+
:description => 'VNC keyboard layout'
|
275
|
+
},
|
270
276
|
{
|
271
277
|
:name => 'spice',
|
272
278
|
:large => '--spice',
|
@@ -285,12 +291,18 @@ EOT
|
|
285
291
|
:description => 'spice IP where to listen for connections. '<<
|
286
292
|
'By default is 0.0.0.0 (all interfaces).'
|
287
293
|
},
|
294
|
+
{
|
295
|
+
:name => 'spice_keymap',
|
296
|
+
:large => '--spice-keymap keymap',
|
297
|
+
:format => String,
|
298
|
+
:description => 'spice keyboard layout'
|
299
|
+
},
|
288
300
|
{
|
289
301
|
:name => 'ssh',
|
290
302
|
:large => '--ssh [file]',
|
291
303
|
:description => "Add an ssh public key to the context. If the \n"<<
|
292
|
-
(' '*31)<<"file is omited then the user variable \n"<<
|
293
|
-
(' '*31)<<"SSH_PUBLIC_KEY will be used.",
|
304
|
+
(' '*31) << "file is omited then the user variable \n"<<
|
305
|
+
(' '*31) << "SSH_PUBLIC_KEY will be used.",
|
294
306
|
:format => String,
|
295
307
|
:proc => lambda do |o, options|
|
296
308
|
if !o
|
@@ -313,8 +325,8 @@ EOT
|
|
313
325
|
},
|
314
326
|
{
|
315
327
|
:name => 'boot',
|
316
|
-
:large => '--boot
|
317
|
-
:description => '
|
328
|
+
:large => '--boot device_list',
|
329
|
+
:description => 'Set boot device list e.g. disk0,disk2,nic0',
|
318
330
|
:format => String
|
319
331
|
},
|
320
332
|
{
|
@@ -329,12 +341,28 @@ EOT
|
|
329
341
|
:large => '--init script1,script2',
|
330
342
|
:format => Array,
|
331
343
|
:description => 'Script or scripts to start in context'
|
344
|
+
},
|
345
|
+
{
|
346
|
+
:name => 'startscript',
|
347
|
+
:large => '--startscript [file]',
|
348
|
+
:format => String,
|
349
|
+
:description => 'Start script to be executed'
|
332
350
|
}
|
333
351
|
]
|
334
352
|
|
335
|
-
|
353
|
+
FORCE={
|
354
|
+
:name => 'force',
|
355
|
+
:large => '--force',
|
356
|
+
:description => 'Overwrite the file'
|
357
|
+
}
|
358
|
+
|
359
|
+
TEMPLATE_OPTIONS_VM = [TEMPLATE_NAME_VM] + TEMPLATE_OPTIONS + [DRY]
|
360
|
+
|
361
|
+
CAPACITY_OPTIONS_VM = [TEMPLATE_OPTIONS[0], TEMPLATE_OPTIONS[1],
|
362
|
+
TEMPLATE_OPTIONS[3]]
|
336
363
|
|
337
|
-
|
364
|
+
UPDATECONF_OPTIONS_VM = TEMPLATE_OPTIONS[6..15] + [TEMPLATE_OPTIONS[2],
|
365
|
+
TEMPLATE_OPTIONS[17], TEMPLATE_OPTIONS[18]]
|
338
366
|
|
339
367
|
OPTIONS = XML, NUMERIC, KILOBYTES
|
340
368
|
|
@@ -665,12 +693,12 @@ EOT
|
|
665
693
|
end
|
666
694
|
end
|
667
695
|
|
668
|
-
private
|
669
|
-
|
670
696
|
def retrieve_resource(id)
|
671
697
|
factory(id)
|
672
698
|
end
|
673
699
|
|
700
|
+
private
|
701
|
+
|
674
702
|
def pool_to_array(pool)
|
675
703
|
if !pool.instance_of?(Hash)
|
676
704
|
phash = pool.to_hash
|
@@ -714,16 +742,17 @@ EOT
|
|
714
742
|
client=OneHelper.client
|
715
743
|
|
716
744
|
pool = case poolname
|
717
|
-
when "HOST"
|
718
|
-
when "GROUP"
|
719
|
-
when "USER"
|
720
|
-
when "DATASTORE"
|
721
|
-
when "CLUSTER"
|
722
|
-
when "VNET"
|
723
|
-
when "IMAGE"
|
724
|
-
when "VMTEMPLATE"
|
725
|
-
when "VM"
|
726
|
-
when "ZONE"
|
745
|
+
when "HOST" then OpenNebula::HostPool.new(client)
|
746
|
+
when "GROUP" then OpenNebula::GroupPool.new(client)
|
747
|
+
when "USER" then OpenNebula::UserPool.new(client)
|
748
|
+
when "DATASTORE" then OpenNebula::DatastorePool.new(client)
|
749
|
+
when "CLUSTER" then OpenNebula::ClusterPool.new(client)
|
750
|
+
when "VNET" then OpenNebula::VirtualNetworkPool.new(client)
|
751
|
+
when "IMAGE" then OpenNebula::ImagePool.new(client)
|
752
|
+
when "VMTEMPLATE" then OpenNebula::TemplatePool.new(client)
|
753
|
+
when "VM" then OpenNebula::VirtualMachinePool.new(client)
|
754
|
+
when "ZONE" then OpenNebula::ZonePool.new(client)
|
755
|
+
when "MARKETPLACE" then OpenNebula::MarketPlacePool.new(client)
|
727
756
|
end
|
728
757
|
|
729
758
|
rc = pool.info
|
@@ -819,6 +848,15 @@ EOT
|
|
819
848
|
end
|
820
849
|
end
|
821
850
|
|
851
|
+
def OpenNebulaHelper.clusters_str(clusters)
|
852
|
+
if clusters.nil?
|
853
|
+
"-"
|
854
|
+
else
|
855
|
+
[clusters].flatten.join(',')
|
856
|
+
end
|
857
|
+
|
858
|
+
end
|
859
|
+
|
822
860
|
def OpenNebulaHelper.update_template(id, resource, path=nil, xpath='TEMPLATE')
|
823
861
|
return update_template_helper(false, id, resource, path, xpath)
|
824
862
|
end
|
@@ -915,7 +953,7 @@ EOT
|
|
915
953
|
end
|
916
954
|
|
917
955
|
def self.create_context(options)
|
918
|
-
context_options = [:ssh, :net_context, :context, :init, :files_ds]
|
956
|
+
context_options = [:ssh, :net_context, :context, :init, :files_ds, :startscript]
|
919
957
|
if !(options.keys & context_options).empty?
|
920
958
|
lines=[]
|
921
959
|
|
@@ -953,8 +991,20 @@ EOT
|
|
953
991
|
lines << %Q<INIT_SCRIPTS="#{options[:init].join(' ')}">
|
954
992
|
end
|
955
993
|
|
994
|
+
if options[:startscript]
|
995
|
+
script = nil
|
996
|
+
begin
|
997
|
+
script = File.read(options[:startscript]).strip
|
998
|
+
rescue Exception => e
|
999
|
+
STDERR.puts e.message
|
1000
|
+
exit(-1)
|
1001
|
+
end
|
1002
|
+
script = Base64::strict_encode64(script)
|
1003
|
+
lines<<"START_SCRIPT_BASE64=\"#{script}\""
|
1004
|
+
end
|
1005
|
+
|
956
1006
|
if !lines.empty?
|
957
|
-
"CONTEXT=[\n"<<lines.map{|l| " "<<l }.join(",\n")<<"\n]\n"
|
1007
|
+
"CONTEXT=[\n" << lines.map{|l| " " << l }.join(",\n") << "\n]\n"
|
958
1008
|
else
|
959
1009
|
nil
|
960
1010
|
end
|
@@ -963,7 +1013,7 @@ EOT
|
|
963
1013
|
end
|
964
1014
|
end
|
965
1015
|
|
966
|
-
def self.create_template(options)
|
1016
|
+
def self.create_template(options, template_obj=nil)
|
967
1017
|
template=''
|
968
1018
|
|
969
1019
|
template<<"NAME=\"#{options[:name]}\"\n" if options[:name]
|
@@ -1005,7 +1055,10 @@ EOT
|
|
1005
1055
|
if options[:vnc_password]
|
1006
1056
|
template << ", PASSWD=\"#{options[:vnc_password]}\""
|
1007
1057
|
end
|
1008
|
-
|
1058
|
+
if options[:vnc_keymap]
|
1059
|
+
template << ", KEYMAP=\"#{options[:vnc_keymap]}\""
|
1060
|
+
end
|
1061
|
+
template<<' ]' << "\n"
|
1009
1062
|
end
|
1010
1063
|
|
1011
1064
|
if options[:spice]
|
@@ -1014,12 +1067,26 @@ EOT
|
|
1014
1067
|
if options[:spice_password]
|
1015
1068
|
template << ", PASSWD=\"#{options[:spice_password]}\""
|
1016
1069
|
end
|
1017
|
-
|
1070
|
+
if options[:spice_keymap]
|
1071
|
+
template << ", KEYMAP=\"#{options[:spice_keymap]}\""
|
1072
|
+
end
|
1073
|
+
template<<' ]' << "\n"
|
1018
1074
|
end
|
1019
1075
|
|
1020
1076
|
context=create_context(options)
|
1021
1077
|
template<<context if context
|
1022
1078
|
|
1079
|
+
if options[:userdata] && !template_obj.nil?
|
1080
|
+
if template_obj.has_elements?('TEMPLATE/EC2')
|
1081
|
+
template_obj.add_element(
|
1082
|
+
'TEMPLATE/EC2',
|
1083
|
+
'USERDATA' => options[:userdata])
|
1084
|
+
|
1085
|
+
template << template_obj.template_like_str(
|
1086
|
+
'TEMPLATE', false, 'EC2')
|
1087
|
+
end
|
1088
|
+
end
|
1089
|
+
|
1023
1090
|
[0, template]
|
1024
1091
|
end
|
1025
1092
|
|
@@ -1034,4 +1101,105 @@ EOT
|
|
1034
1101
|
# in options hash
|
1035
1102
|
(template_options-options.keys)!=template_options
|
1036
1103
|
end
|
1104
|
+
|
1105
|
+
def self.sunstone_url
|
1106
|
+
if (one_sunstone = ENV['ONE_SUNSTONE'])
|
1107
|
+
one_sunstone
|
1108
|
+
elsif (one_xmlrpc = ENV['ONE_XMLRPC'])
|
1109
|
+
uri = URI(one_xmlrpc)
|
1110
|
+
"#{uri.scheme}://#{uri.host}:9869"
|
1111
|
+
else
|
1112
|
+
"http://localhost:9869"
|
1113
|
+
end
|
1114
|
+
end
|
1115
|
+
|
1116
|
+
def self.download_resource_sunstone(kind, id, path, force)
|
1117
|
+
client = OneHelper.client
|
1118
|
+
user, password = client.one_auth.split(":", 2)
|
1119
|
+
|
1120
|
+
# Step 1: Build Session to get Cookie
|
1121
|
+
uri = URI(File.join(sunstone_url,"login"))
|
1122
|
+
|
1123
|
+
req = Net::HTTP::Post.new(uri)
|
1124
|
+
req.basic_auth user, password
|
1125
|
+
|
1126
|
+
begin
|
1127
|
+
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
1128
|
+
http.request(req)
|
1129
|
+
end
|
1130
|
+
rescue
|
1131
|
+
return OpenNebula::Error.new("Error connecting to '#{uri}'.")
|
1132
|
+
end
|
1133
|
+
|
1134
|
+
cookie = res.response['set-cookie'].split('; ')[0]
|
1135
|
+
|
1136
|
+
if cookie.nil?
|
1137
|
+
return OpenNebula::Error.new("Unable to get Cookie. Is OpenNebula running?")
|
1138
|
+
end
|
1139
|
+
|
1140
|
+
# Step 2: Open '/' to get the csrftoken
|
1141
|
+
uri = URI(sunstone_url)
|
1142
|
+
|
1143
|
+
req = Net::HTTP::Get.new(uri)
|
1144
|
+
req['Cookie'] = cookie
|
1145
|
+
|
1146
|
+
begin
|
1147
|
+
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
1148
|
+
http.request(req)
|
1149
|
+
end
|
1150
|
+
rescue
|
1151
|
+
return OpenNebula::Error.new("Error connecting to '#{uri}'.")
|
1152
|
+
end
|
1153
|
+
|
1154
|
+
m = res.body.match(/var csrftoken = '(.*)';/)
|
1155
|
+
csrftoken = m[1] rescue nil
|
1156
|
+
|
1157
|
+
if csrftoken.nil?
|
1158
|
+
return OpenNebula::Error.new("Unable to get csrftoken.")
|
1159
|
+
end
|
1160
|
+
|
1161
|
+
# Step 3: Download resource
|
1162
|
+
uri = URI(File.join(sunstone_url,
|
1163
|
+
kind.to_s,
|
1164
|
+
id.to_s,
|
1165
|
+
"download?csrftoken=#{csrftoken}"))
|
1166
|
+
|
1167
|
+
req = Net::HTTP::Get.new(uri)
|
1168
|
+
|
1169
|
+
req['Cookie'] = cookie
|
1170
|
+
req['User-Agent'] = "OpenNebula CLI"
|
1171
|
+
|
1172
|
+
begin
|
1173
|
+
File.open(path, 'wb') do |f|
|
1174
|
+
Net::HTTP.start(uri.hostname, uri.port) do |http|
|
1175
|
+
http.request(req) do |res|
|
1176
|
+
res.read_body do |chunk|
|
1177
|
+
f.write(chunk)
|
1178
|
+
end
|
1179
|
+
end
|
1180
|
+
end
|
1181
|
+
end
|
1182
|
+
rescue Errno::EACCES
|
1183
|
+
return OpenNebula::Error.new("Target file not writable.")
|
1184
|
+
end
|
1185
|
+
|
1186
|
+
error_message = nil
|
1187
|
+
|
1188
|
+
File.open(path, 'rb') do |f|
|
1189
|
+
begin
|
1190
|
+
f.seek(-1024, IO::SEEK_END)
|
1191
|
+
rescue Errno::EINVAL
|
1192
|
+
end
|
1193
|
+
|
1194
|
+
tail = f.read
|
1195
|
+
|
1196
|
+
m = tail.match(/@\^_\^@ (.*) @\^_\^@/m)
|
1197
|
+
error_message = m[1] if m
|
1198
|
+
end
|
1199
|
+
|
1200
|
+
if error_message
|
1201
|
+
File.unlink(path)
|
1202
|
+
return OpenNebula::Error.new("Remote server error: #{error_message}")
|
1203
|
+
end
|
1204
|
+
end
|
1037
1205
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opennebula-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.90.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenNebula
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opennebula
|
@@ -16,17 +16,18 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 4.
|
19
|
+
version: 4.90.0.beta1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 4.
|
26
|
+
version: 4.90.0.beta1
|
27
27
|
description: Commands used to talk to OpenNebula
|
28
28
|
email: contact@opennebula.org
|
29
29
|
executables:
|
30
|
+
- oneuser.backup
|
30
31
|
- oneacct
|
31
32
|
- oneacl
|
32
33
|
- onecluster
|
@@ -34,17 +35,20 @@ executables:
|
|
34
35
|
- oneflow
|
35
36
|
- oneflow-template
|
36
37
|
- onegroup
|
37
|
-
-
|
38
|
+
- onehost
|
39
|
+
- onemarket
|
40
|
+
- onemarketapp
|
38
41
|
- onesecgroup
|
39
42
|
- oneshowback
|
40
43
|
- onetemplate
|
41
44
|
- oneuser
|
45
|
+
- onevcenter
|
42
46
|
- onevdc
|
43
47
|
- onevnet
|
48
|
+
- onevrouter
|
44
49
|
- onezone
|
45
|
-
-
|
50
|
+
- oneimage
|
46
51
|
- onevm
|
47
|
-
- onehost
|
48
52
|
extensions: []
|
49
53
|
extra_rdoc_files: []
|
50
54
|
files:
|
@@ -59,14 +63,18 @@ files:
|
|
59
63
|
- bin/onegroup
|
60
64
|
- bin/onehost
|
61
65
|
- bin/oneimage
|
66
|
+
- bin/onemarket
|
67
|
+
- bin/onemarketapp
|
62
68
|
- bin/onesecgroup
|
63
69
|
- bin/oneshowback
|
64
70
|
- bin/onetemplate
|
65
71
|
- bin/oneuser
|
72
|
+
- bin/oneuser.backup
|
66
73
|
- bin/onevcenter
|
67
74
|
- bin/onevdc
|
68
75
|
- bin/onevm
|
69
76
|
- bin/onevnet
|
77
|
+
- bin/onevrouter
|
70
78
|
- bin/onezone
|
71
79
|
- lib/cli_helper.rb
|
72
80
|
- lib/command_parser.rb
|
@@ -78,6 +86,8 @@ files:
|
|
78
86
|
- lib/one_helper/onegroup_helper.rb
|
79
87
|
- lib/one_helper/onehost_helper.rb
|
80
88
|
- lib/one_helper/oneimage_helper.rb
|
89
|
+
- lib/one_helper/onemarket_helper.rb
|
90
|
+
- lib/one_helper/onemarketapp_helper.rb
|
81
91
|
- lib/one_helper/onequota_helper.rb
|
82
92
|
- lib/one_helper/onesecgroup_helper.rb
|
83
93
|
- lib/one_helper/onetemplate_helper.rb
|
@@ -85,6 +95,7 @@ files:
|
|
85
95
|
- lib/one_helper/onevdc_helper.rb
|
86
96
|
- lib/one_helper/onevm_helper.rb
|
87
97
|
- lib/one_helper/onevnet_helper.rb
|
98
|
+
- lib/one_helper/onevrouter_helper.rb
|
88
99
|
- lib/one_helper/onezone_helper.rb
|
89
100
|
homepage: http://opennebula.org
|
90
101
|
licenses:
|
@@ -101,12 +112,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
112
|
version: '0'
|
102
113
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
114
|
requirements:
|
104
|
-
- - "
|
115
|
+
- - ">"
|
105
116
|
- !ruby/object:Gem::Version
|
106
|
-
version:
|
117
|
+
version: 1.3.1
|
107
118
|
requirements: []
|
108
119
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
120
|
+
rubygems_version: 2.5.1
|
110
121
|
signing_key:
|
111
122
|
specification_version: 4
|
112
123
|
summary: OpenNebula Command Line Interface
|