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 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