cloudstack-cli 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cloudstack-cli (0.3.1)
4
+ cloudstack-cli (0.3.2)
5
5
  thor (~> 0.18.1)
6
6
 
7
7
  GEM
@@ -40,63 +40,38 @@ class Router < CloudstackCli::Base
40
40
  end
41
41
 
42
42
  routers.reverse! if options[:reverse]
43
- if routers.size < 1
44
- say "No routers found."
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?("Start the routers above? [y/N]:", :magenta)
73
- routers.each do |router|
74
- say "Start router #{router['name']}... "
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?("Stop the routers above? [y/N]:", :magenta)
80
- routers.each do |router|
81
- say "Stop router #{router['name']}... "
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 "Command #{options[:command]} not supported", :red
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
- jobs = []
96
- names.each do |name|
97
- router = get_router(name)
98
- exit unless options[:force] || yes?("Stop router #{router['name']}?", :magenta)
99
- jobs << {id: client.stop_router(router['id'], async: false)['jobid'], name: "Stop router #{name}"}
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
- jobs = []
109
- names.each do |name|
110
- router = get_router(name)
111
- exit unless options[:force] || yes?("Start router #{router['name']}?", :magenta)
112
- jobs << {id: client.start_router(router['id'], async: false)['jobid'], name: "Start router #{name}"}
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
- names.each do |name|
122
- router = get_router(name)
123
- exit unless options[:force] || yes?("Destroy router #{router['name']}?", :magenta)
124
- say "OK", :green if client.destroy_router(router['id'])
125
- puts
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
- status = call.modulo(40) == 0 ? get_async_job_status(jobs.map {|job| job[:id]}) : status
27
- print ("\r" + "\e[A\e[K" * (status.size)) if call > 0
28
-
29
- status.each_with_index do |job_status, i|
30
- puts "#{jobs[i][:name]} : job #{async_state[job_status]} #{chars[0]}"
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
- print ("\r" + "\e[A\e[K" * (status.size))
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
- puts "#{jobs[i][:name]} : job #{async_state[job_status]}"
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 = {})
@@ -1,3 +1,3 @@
1
1
  module CloudstackCli
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.3"
3
3
  end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module CloudstackClient
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  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.2
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-15 00:00:00.000000000 Z
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: 2.0.2
155
+ rubygems_version: 1.8.23
149
156
  signing_key:
150
- specification_version: 4
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