cloudstack-cli 0.3.2 → 0.3.3
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/Gemfile.lock +1 -1
- data/lib/cloudstack-cli/commands/router.rb +58 -52
- data/lib/cloudstack-cli/commands/server.rb +1 -0
- data/lib/cloudstack-cli/helper.rb +32 -13
- data/lib/cloudstack-cli/version.rb +1 -1
- data/lib/cloudstack-client/commands/server.rb +11 -0
- data/lib/cloudstack-client/version.rb +1 -1
- metadata +17 -10
- checksums.yaml +0 -7
- data/lib/cloudstack-client/commands/volumes.rb +0 -20
data/Gemfile.lock
CHANGED
@@ -40,63 +40,38 @@ class Router < CloudstackCli::Base
|
|
40
40
|
end
|
41
41
|
|
42
42
|
routers.reverse! if options[:reverse]
|
43
|
-
|
44
|
-
|
45
|
-
else
|
46
|
-
table = [[
|
47
|
-
'Name', 'Zone', 'Account', 'Project', 'Redundant-State', 'IP', 'Linklocal IP', 'Status', 'ID'
|
48
|
-
]]
|
49
|
-
table[0].delete('ID') unless options[:showid]
|
50
|
-
routers.each do |router|
|
51
|
-
table << [
|
52
|
-
router["name"],
|
53
|
-
router["zonename"],
|
54
|
-
router["account"],
|
55
|
-
router["project"],
|
56
|
-
router["redundantstate"],
|
57
|
-
router["nic"].first ? router["nic"].first['ipaddress'] : "",
|
58
|
-
router["linklocalip"],
|
59
|
-
router["state"],
|
60
|
-
router["id"]
|
61
|
-
]
|
62
|
-
table[-1].delete_at(-1) unless table[0].index "ID"
|
63
|
-
end
|
64
|
-
print_table table
|
65
|
-
puts
|
66
|
-
say "Number of routers: #{routers.size}"
|
67
|
-
end
|
43
|
+
|
44
|
+
print_routers(routers, options)
|
68
45
|
|
69
46
|
if options[:command]
|
70
47
|
case options[:command].downcase
|
71
48
|
when "start"
|
72
|
-
exit unless yes?("
|
73
|
-
routers.
|
74
|
-
|
75
|
-
say "job started ", :green if job = client.start_router(router['id'], async: false)
|
76
|
-
say "(jobid: #{job['jobid']})"
|
49
|
+
exit unless yes?("\nStart the router(s) above? [y/N]:", :magenta)
|
50
|
+
jobs = routers.map do |router|
|
51
|
+
{id: client.start_router(router['id'], async: false)['jobid'], name: "Start router #{router['name']}"}
|
77
52
|
end
|
78
53
|
when "stop"
|
79
|
-
exit unless yes?("
|
80
|
-
routers.
|
81
|
-
|
82
|
-
say "job started ", :green if job = client.stop_router(router['id'], async: false)
|
83
|
-
say "(jobid: #{job['jobid']})"
|
54
|
+
exit unless yes?("\nStop the router(s) above? [y/N]:", :magenta)
|
55
|
+
jobs = routers.map do |router|
|
56
|
+
{id: client.stop_router(router['id'], async: false)['jobid'], name: "Stop router #{router['name']}"}
|
84
57
|
end
|
85
58
|
else
|
86
|
-
say "
|
87
|
-
exit
|
59
|
+
say "\nCommand #{options[:command]} not supported.", :red
|
60
|
+
exit 1
|
88
61
|
end
|
62
|
+
puts
|
63
|
+
watch_jobs(jobs)
|
89
64
|
end
|
90
65
|
end
|
91
66
|
|
92
67
|
desc "stop NAME [NAME2 ..]", "stop virtual router(s)"
|
93
68
|
option :force, description: "stop without asking", type: :boolean, aliases: '-f'
|
94
69
|
def stop(*names)
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
70
|
+
routers = names.map {|name| get_router(name)}
|
71
|
+
print_routers(routers)
|
72
|
+
exit unless options[:force] || yes?("\nStop router(s) above?", :magenta)
|
73
|
+
jobs = routers.map do |router|
|
74
|
+
{id: client.stop_router(router['id'], async: false)['jobid'], name: "Stop router #{router['name']}"}
|
100
75
|
end
|
101
76
|
puts
|
102
77
|
watch_jobs(jobs)
|
@@ -105,11 +80,11 @@ class Router < CloudstackCli::Base
|
|
105
80
|
desc "start NAME [NAME2 ..]", "start virtual router(s)"
|
106
81
|
option :force, description: "start without asking", type: :boolean, aliases: '-f'
|
107
82
|
def start(*names)
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
83
|
+
routers = names.map {|name| get_router(name)}
|
84
|
+
print_routers(routers)
|
85
|
+
exit unless options[:force] || yes?("\nStart router(s) above?", :magenta)
|
86
|
+
jobs = routers.map do |router|
|
87
|
+
{id: client.start_router(router['id'], async: false)['jobid'], name: "Start router #{router['name']}"}
|
113
88
|
end
|
114
89
|
puts
|
115
90
|
watch_jobs(jobs)
|
@@ -118,15 +93,18 @@ class Router < CloudstackCli::Base
|
|
118
93
|
desc "destroy NAME [NAME2 ..]", "destroy virtual router(s)"
|
119
94
|
option :force, description: "destroy without asking", type: :boolean, aliases: '-f'
|
120
95
|
def destroy(*names)
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
96
|
+
routers = names.map {|name| get_router(name)}
|
97
|
+
print_routers(routers)
|
98
|
+
exit unless options[:force] || yes?("\nDestroy router(s) above?", :magenta)
|
99
|
+
jobs = routers.map do |router|
|
100
|
+
{id: client.destroy_router(router['id'], async: false)['jobid'], name: "Destroy router #{router['name']}"}
|
126
101
|
end
|
102
|
+
puts
|
103
|
+
watch_jobs(jobs)
|
127
104
|
end
|
128
105
|
|
129
106
|
no_commands do
|
107
|
+
|
130
108
|
def get_router(name)
|
131
109
|
unless router = client.get_router(name)
|
132
110
|
say "Can't find router with name #{name}.", :red
|
@@ -134,6 +112,34 @@ class Router < CloudstackCli::Base
|
|
134
112
|
end
|
135
113
|
router
|
136
114
|
end
|
115
|
+
|
116
|
+
def print_routers(routers, options = {})
|
117
|
+
if routers.size < 1
|
118
|
+
say "No routers found."
|
119
|
+
else
|
120
|
+
table = [[
|
121
|
+
'Name', 'Zone', 'Account', 'Project', 'Redundant-State', 'IP', 'Linklocal IP', 'Status', 'ID'
|
122
|
+
]]
|
123
|
+
table[0].delete('ID') unless options[:showid]
|
124
|
+
routers.each do |router|
|
125
|
+
table << [
|
126
|
+
router["name"],
|
127
|
+
router["zonename"],
|
128
|
+
router["account"],
|
129
|
+
router["project"],
|
130
|
+
router["redundantstate"],
|
131
|
+
router["nic"].first ? router["nic"].first['ipaddress'] : "",
|
132
|
+
router["linklocalip"],
|
133
|
+
router["state"],
|
134
|
+
router["id"]
|
135
|
+
]
|
136
|
+
table[-1].delete_at(-1) unless table[0].index "ID"
|
137
|
+
end
|
138
|
+
print_table table
|
139
|
+
puts
|
140
|
+
say "Number of routers: #{routers.size}"
|
141
|
+
end
|
142
|
+
end
|
137
143
|
end
|
138
144
|
|
139
145
|
end
|
@@ -46,6 +46,7 @@ class Server < CloudstackCli::Base
|
|
46
46
|
option :hypervisor, desc: "only used for iso deployments, default: vmware"
|
47
47
|
option :keypair, desc: "the name of the ssh keypair to use"
|
48
48
|
option :group, desc: "group name"
|
49
|
+
option :account, desc: "account name"
|
49
50
|
def create(name)
|
50
51
|
bootstrap_server(options.merge({name: name}))
|
51
52
|
end
|
@@ -17,28 +17,47 @@ module CloudstackCli
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
ASYNC_STATES = {
|
21
|
+
0 => "running",
|
22
|
+
1 => "completed",
|
23
|
+
2 => "error"
|
24
|
+
}
|
25
|
+
|
20
26
|
def watch_jobs(jobs)
|
21
27
|
chars = %w(| / - \\)
|
22
|
-
async_state = {0 => "running", 1 => "completed", 2 => "error"}
|
23
28
|
status = get_async_job_status(jobs.map {|job| job[:id]})
|
24
29
|
call = 0
|
30
|
+
opts = {t_start: Time.now}
|
31
|
+
puts
|
25
32
|
while status.include?(0) do
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
33
|
+
if call.modulo(40) == 0
|
34
|
+
t = Thread.new { status = get_async_job_status(jobs.map {|job| job[:id]}) }
|
35
|
+
while t.alive?
|
36
|
+
chars = print_job_status(jobs, status, chars, opts)
|
37
|
+
end
|
38
|
+
t.join
|
39
|
+
else
|
40
|
+
print ("\r" + "\e[A\e[K" * (status.size + 1)) if call > 0
|
41
|
+
chars = print_job_status(jobs, status, chars,
|
42
|
+
call == 0 ? opts.merge(no_clear: true) : opts
|
43
|
+
)
|
44
|
+
call += 1
|
31
45
|
end
|
32
|
-
|
33
|
-
sleep 0.1
|
34
|
-
chars.push chars.shift
|
35
|
-
call += 1
|
36
46
|
end
|
37
|
-
|
38
|
-
|
47
|
+
print_job_status(jobs, status, chars, opts)
|
48
|
+
end
|
49
|
+
|
50
|
+
def print_job_status(jobs, status, spinner, opts = {t_start: Time.now})
|
51
|
+
print ("\r" + "\e[A\e[K" * (status.size + 1)) unless opts[:no_clear]
|
39
52
|
status.each_with_index do |job_status, i|
|
40
|
-
|
53
|
+
print "#{jobs[i][:name]} : job #{ASYNC_STATES[job_status]} "
|
54
|
+
puts job_status == 0 ? spinner.first : ""
|
41
55
|
end
|
56
|
+
t_elapsed = opts[:t_start] ? (Time.now - opts[:t_start]).round(1) : 0
|
57
|
+
puts "Runtime: #{t_elapsed}s"
|
58
|
+
sleep opts[:sleeptime] || 0.1
|
59
|
+
spinner.push spinner.shift
|
60
|
+
spinner
|
42
61
|
end
|
43
62
|
|
44
63
|
def bootstrap_server(args = {})
|
@@ -193,6 +193,7 @@ module CloudstackClient
|
|
193
193
|
network['id']
|
194
194
|
}
|
195
195
|
|
196
|
+
|
196
197
|
params = {
|
197
198
|
'command' => 'deployVirtualMachine',
|
198
199
|
'serviceOfferingId' => service['id'],
|
@@ -209,6 +210,16 @@ module CloudstackClient
|
|
209
210
|
params['group'] = args[:group] if args[:group]
|
210
211
|
params['displayname'] = args[:displayname] if args[:displayname]
|
211
212
|
|
213
|
+
if args[:account]
|
214
|
+
account = list_accounts({name: args[:account]}).first
|
215
|
+
unless account
|
216
|
+
puts "Error: Account #{args[:account]} not found."
|
217
|
+
exit 1
|
218
|
+
end
|
219
|
+
params['domainid'] = account["domainid"]
|
220
|
+
params['account'] = args[:account]
|
221
|
+
end
|
222
|
+
|
212
223
|
json = send_async_request(params)
|
213
224
|
json['virtualmachine']
|
214
225
|
end
|
metadata
CHANGED
@@ -1,32 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cloudstack-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Nik Wolfgramm
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-16 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: rdoc
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- - '>='
|
19
|
+
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: '0'
|
20
22
|
type: :development
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
|
-
- - '>='
|
27
|
+
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '0'
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: rake
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - ~>
|
32
36
|
- !ruby/object:Gem::Version
|
@@ -34,6 +38,7 @@ dependencies:
|
|
34
38
|
type: :development
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - ~>
|
39
44
|
- !ruby/object:Gem::Version
|
@@ -41,6 +46,7 @@ dependencies:
|
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: thor
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - ~>
|
46
52
|
- !ruby/object:Gem::Version
|
@@ -48,6 +54,7 @@ dependencies:
|
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - ~>
|
53
60
|
- !ruby/object:Gem::Version
|
@@ -117,7 +124,6 @@ files:
|
|
117
124
|
- lib/cloudstack-client/commands/template.rb
|
118
125
|
- lib/cloudstack-client/commands/user.rb
|
119
126
|
- lib/cloudstack-client/commands/volume.rb
|
120
|
-
- lib/cloudstack-client/commands/volumes.rb
|
121
127
|
- lib/cloudstack-client/commands/zone.rb
|
122
128
|
- lib/cloudstack-client/version.rb
|
123
129
|
- lib/cloudstack_cli.rb
|
@@ -126,7 +132,6 @@ files:
|
|
126
132
|
homepage: https://bitbucket.org/swisstxt/cloudstack-cli
|
127
133
|
licenses:
|
128
134
|
- MIT
|
129
|
-
metadata: {}
|
130
135
|
post_install_message:
|
131
136
|
rdoc_options:
|
132
137
|
- --line-numbers
|
@@ -134,20 +139,22 @@ rdoc_options:
|
|
134
139
|
require_paths:
|
135
140
|
- lib
|
136
141
|
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
+
none: false
|
137
143
|
requirements:
|
138
|
-
- - '>='
|
144
|
+
- - ! '>='
|
139
145
|
- !ruby/object:Gem::Version
|
140
146
|
version: 1.9.3
|
141
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
none: false
|
142
149
|
requirements:
|
143
|
-
- - '>='
|
150
|
+
- - ! '>='
|
144
151
|
- !ruby/object:Gem::Version
|
145
152
|
version: '0'
|
146
153
|
requirements: []
|
147
154
|
rubyforge_project:
|
148
|
-
rubygems_version:
|
155
|
+
rubygems_version: 1.8.23
|
149
156
|
signing_key:
|
150
|
-
specification_version:
|
157
|
+
specification_version: 3
|
151
158
|
summary: cloudstack-cli CloudStack API client
|
152
159
|
test_files:
|
153
160
|
- test/stack_example.json
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 7554f6d7a5dc9ae9a56557edfb3a39b7b63778c1
|
4
|
-
data.tar.gz: db3d8020dc9497700d7a3e65594c5a8a35140a78
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 15451bfd39437d023cba04e4da98424e1d7b66286647a538b4bb3c7c03335b00d47e16e32593a0e9f3180e76d6313ea460353bd270561af193720e89e4db93a8
|
7
|
-
data.tar.gz: a68d0d706ffa1e7a091eff9c8e540ea7cadaeaf4086042c2555f7bc24c306c9ef80ffbbb264269289cb856036a34787cbf96f1fc20e71060b0ac5da45824e487
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module CloudstackClient
|
2
|
-
|
3
|
-
module Volumes
|
4
|
-
|
5
|
-
##
|
6
|
-
# Lists all volumes.
|
7
|
-
|
8
|
-
def list_volumes(project_id = nil)
|
9
|
-
params = {
|
10
|
-
'command' => 'listVolumes',
|
11
|
-
'listall' => true,
|
12
|
-
}
|
13
|
-
params['projectid'] = project_id if project_id
|
14
|
-
json = send_request(params)
|
15
|
-
json['network'] || []
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|