cloudstack-cli 1.4.1 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/lib/cloudstack-cli/base.rb +11 -2
  4. data/lib/cloudstack-cli/commands/account.rb +19 -10
  5. data/lib/cloudstack-cli/commands/affinity_group.rb +18 -9
  6. data/lib/cloudstack-cli/commands/capacity.rb +1 -1
  7. data/lib/cloudstack-cli/commands/cluster.rb +18 -9
  8. data/lib/cloudstack-cli/commands/compute_offer.rb +14 -1
  9. data/lib/cloudstack-cli/commands/disk_offer.rb +23 -10
  10. data/lib/cloudstack-cli/commands/domain.rb +14 -5
  11. data/lib/cloudstack-cli/commands/host.rb +16 -7
  12. data/lib/cloudstack-cli/commands/ip_address.rb +14 -5
  13. data/lib/cloudstack-cli/commands/iso.rb +24 -11
  14. data/lib/cloudstack-cli/commands/job.rb +19 -10
  15. data/lib/cloudstack-cli/commands/load_balancer.rb +20 -11
  16. data/lib/cloudstack-cli/commands/network.rb +31 -21
  17. data/lib/cloudstack-cli/commands/physical_network.rb +19 -10
  18. data/lib/cloudstack-cli/commands/pod.rb +17 -8
  19. data/lib/cloudstack-cli/commands/port_rule.rb +21 -12
  20. data/lib/cloudstack-cli/commands/project.rb +21 -12
  21. data/lib/cloudstack-cli/commands/region.rb +17 -8
  22. data/lib/cloudstack-cli/commands/resource_limit.rb +12 -2
  23. data/lib/cloudstack-cli/commands/router.rb +2 -2
  24. data/lib/cloudstack-cli/commands/snapshot.rb +18 -9
  25. data/lib/cloudstack-cli/commands/ssh_key_pair.rb +13 -4
  26. data/lib/cloudstack-cli/commands/storage_pool.rb +30 -21
  27. data/lib/cloudstack-cli/commands/system_vm.rb +16 -7
  28. data/lib/cloudstack-cli/commands/template.rb +21 -12
  29. data/lib/cloudstack-cli/commands/user.rb +17 -8
  30. data/lib/cloudstack-cli/commands/virtual_machine.rb +3 -2
  31. data/lib/cloudstack-cli/commands/volume.rb +28 -15
  32. data/lib/cloudstack-cli/commands/zone.rb +17 -8
  33. data/lib/cloudstack-cli/version.rb +1 -1
  34. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4ebac401185a9bc2eff1e5e81bc4ebd41637bfde
4
- data.tar.gz: 1624eba9dc6bc520eb321f27c46f5b561b14cea1
3
+ metadata.gz: e7f07e2763e1098aebc86ef957def19af52e6439
4
+ data.tar.gz: c7351b039d23832d297e18f4b3fad768f5dcf7f5
5
5
  SHA512:
6
- metadata.gz: 4e93e35e1642aa22f1bcfd34fba600b5b71810ae6e4bbdc90fb740a2abfb74d2a75c0c7cd6eccffa06c1aa7d83a7b5b75048ab20ce715e43a4fa65384798ebf2
7
- data.tar.gz: 4665df9fd113b2e200ff33c253d8c5686b30dd90fa1a323c02af1a9a7ebe32fe63877570b5cd597033510005a4d2b9c86400718d70b875351d3ec5915f512881
6
+ metadata.gz: a043f85b78500aafed6ae9fed0e38629f18aa0a564ab832fe91f907576da8bcf91bfa8bb4aa47cf5c1399bf8c8b14af70537d03eb1d434693b308ae727275783
7
+ data.tar.gz: f100042e728db5621e03dd6defd85fa7e4e80f8875f0d2daaddd44874dce6f85c5f9a69bea09fe364b066ff3af4818ca131da047029e744c47c4b950ad739e32
data/Gemfile.lock CHANGED
@@ -6,7 +6,7 @@ PATH
6
6
  PATH
7
7
  remote: .
8
8
  specs:
9
- cloudstack-cli (1.4.1)
9
+ cloudstack-cli (1.4.2)
10
10
  cloudstack_client (~> 1.3)
11
11
  thor (~> 0.19)
12
12
 
@@ -80,7 +80,7 @@ module CloudstackCli
80
80
  end
81
81
 
82
82
  def filter_by(objects, key, value)
83
- if objects.size < 2
83
+ if objects.size == 0
84
84
  return objects
85
85
  elsif !(keys = objects.map{|i| i.keys}.flatten.uniq).include?(key)
86
86
  say "WARNING: Filter invalid, no key \"#{key}\" found.", :yellow
@@ -88,7 +88,7 @@ module CloudstackCli
88
88
  return objects
89
89
  end
90
90
  objects.select do |object|
91
- object[key.to_s] =~ /#{value}/i
91
+ object[key.to_s].to_s =~ /#{value}/i
92
92
  end
93
93
  rescue RegexpError => e
94
94
  say "ERROR: Invalid regular expression in filter - #{e.message}", :red
@@ -103,6 +103,15 @@ module CloudstackCli
103
103
  objects
104
104
  end
105
105
 
106
+ def add_filters_to_options(command)
107
+ options[:filter].each do |filter_key, filter_value|
108
+ if client.api.params(command).find {|param| param["name"] == filter_key.downcase }
109
+ options[filter_key.downcase] = filter_value.gsub(/[^\w\s\.-]/, '')
110
+ options[:filter].delete(filter_key)
111
+ end
112
+ end
113
+ end
114
+
106
115
  def parse_file(file, extensions = %w(.json .yaml .yml))
107
116
  handler = case File.extname(file)
108
117
  when ".json"
@@ -21,22 +21,31 @@ class Account < CloudstackCli::Base
21
21
  end
22
22
 
23
23
  desc 'list', 'list accounts'
24
+ option :format, default: "table",
25
+ enum: %w(table json yaml)
24
26
  def list
25
27
  accounts = client.list_accounts(listall: true)
26
28
  if accounts.size < 1
27
29
  puts "No accounts found."
28
30
  else
29
- table = [%w(Name Type Domain State)]
30
- accounts.each do |account|
31
- table << [
32
- account['name'],
33
- TYPES[account['accounttype']],
34
- account['domain'],
35
- account['state']
36
- ]
31
+ case options[:format].to_sym
32
+ when :yaml
33
+ puts({accounts: accounts}.to_yaml)
34
+ when :json
35
+ puts JSON.pretty_generate(accounts: accounts)
36
+ else
37
+ table = [%w(Name Type Domain State)]
38
+ accounts.each do |account|
39
+ table << [
40
+ account['name'],
41
+ TYPES[account['accounttype']],
42
+ account['domain'],
43
+ account['state']
44
+ ]
45
+ end
46
+ print_table table
47
+ say "Total number of accounts: #{accounts.size}"
37
48
  end
38
- print_table table
39
- say "Total number of accounts: #{accounts.size}"
40
49
  end
41
50
  end
42
51
 
@@ -6,22 +6,31 @@ class AffinityGroup < CloudstackCli::Base
6
6
  option :type
7
7
  option :listall
8
8
  option :keyword
9
+ option :format, default: "table",
10
+ enum: %w(table json yaml)
9
11
  def list
10
12
  resolve_account
11
13
  affinity_groups = client.list_affinity_groups(options)
12
14
  if affinity_groups.size < 1
13
15
  say "No affinity groups found."
14
16
  else
15
- table = [%w(Domain Account Name, Description, VMs)]
16
- affinity_groups.each do |group|
17
- table << [
18
- group['domain'], group['account'],
19
- group['name'], group['description'],
20
- group['virtualmachineIds'] ? group['virtualmachineIds'].size : nil
21
- ]
17
+ case options[:format].to_sym
18
+ when :yaml
19
+ puts({affinity_groups: affinity_groups}.to_yaml)
20
+ when :json
21
+ puts JSON.pretty_generate(affinity_groups: affinity_groups)
22
+ else
23
+ table = [%w(Domain Account Name, Description, VMs)]
24
+ affinity_groups.each do |group|
25
+ table << [
26
+ group['domain'], group['account'],
27
+ group['name'], group['description'],
28
+ group['virtualmachineIds'] ? group['virtualmachineIds'].size : nil
29
+ ]
30
+ end
31
+ print_table table
32
+ say "Total number of affinity groups: #{affinity_groups.size}"
22
33
  end
23
- print_table table
24
- say "Total number of affinity groups: #{affinity_groups.size}"
25
34
  end
26
35
  end
27
36
 
@@ -13,7 +13,7 @@ class Capacity < CloudstackCli::Base
13
13
  }
14
14
 
15
15
  desc "list", "list system capacity"
16
- option :zone, desc: "lists clusters by zone"
16
+ option :zone, desc: "list capacity by zone"
17
17
  option :type, desc: "specify type, see types for a list of types"
18
18
  def list
19
19
  resolve_zone if options[:zone]
@@ -2,22 +2,31 @@ class Cluster < CloudstackCli::Base
2
2
 
3
3
  desc 'list', 'list clusters'
4
4
  option :zone, desc: "lists clusters by zone"
5
+ option :format, default: "table",
6
+ enum: %w(table json yaml)
5
7
  def list
6
8
  resolve_zone if options[:zone]
7
9
  clusters = client.list_clusters(options)
8
10
  if clusters.size < 1
9
11
  say "No clusters found."
10
12
  else
11
- table = [%w(Name Pod_Name Type Zone State)]
12
- clusters.each do |cluster|
13
- table << [
14
- cluster['name'], cluster['podname'],
15
- cluster['hypervisortype'], cluster['zonename'],
16
- cluster['managedstate']
17
- ]
13
+ case options[:format].to_sym
14
+ when :yaml
15
+ puts({clusters: clusters}.to_yaml)
16
+ when :json
17
+ puts JSON.pretty_generate(clusters: clusters)
18
+ else
19
+ table = [%w(Name Pod_Name Type Zone State)]
20
+ clusters.each do |cluster|
21
+ table << [
22
+ cluster['name'], cluster['podname'],
23
+ cluster['hypervisortype'], cluster['zonename'],
24
+ cluster['managedstate']
25
+ ]
26
+ end
27
+ print_table table
28
+ say "Total number of clusters: #{clusters.size}"
18
29
  end
19
- print_table table
20
- say "Total number of clusters: #{clusters.size}"
21
30
  end
22
31
  end
23
32
 
@@ -2,13 +2,26 @@ class ComputeOffer < CloudstackCli::Base
2
2
 
3
3
  desc 'list', 'list compute offerings'
4
4
  option :domain, desc: "the domain associated with the compute offering"
5
+ option :format, default: "table",
6
+ enum: %w(table json yaml)
7
+ option :filter, type: :hash,
8
+ desc: "filter objects based on arrtibutes: (attr1:regex attr2:regex ...)"
5
9
  def list
6
10
  resolve_domain
11
+ add_filters_to_options("listServiceOfferings") if options[:filter]
7
12
  offerings = client.list_service_offerings(options)
13
+ offerings = filter_objects(offerings) if options[:filter]
8
14
  if offerings.size < 1
9
15
  puts "No offerings found."
10
16
  else
11
- print_compute_offerings(offerings)
17
+ case options[:format].to_sym
18
+ when :yaml
19
+ puts({compute_offers: offerings}.to_yaml)
20
+ when :json
21
+ puts JSON.pretty_generate(compute_offers: offerings)
22
+ else
23
+ print_compute_offerings(offerings)
24
+ end
12
25
  end
13
26
  end
14
27
 
@@ -2,23 +2,36 @@ class DiskOffer < CloudstackCli::Base
2
2
 
3
3
  desc 'list', 'list disk offerings'
4
4
  option :domain, desc: "the domain of the disk offering"
5
+ option :format, default: "table",
6
+ enum: %w(table json yaml)
7
+ option :filter, type: :hash,
8
+ desc: "filter objects based on arrtibutes: (attr1:regex attr2:regex ...)"
5
9
  def list
6
10
  resolve_domain
11
+ add_filters_to_options("listDiskOfferings") if options[:filter]
7
12
  offerings = client.list_disk_offerings(options)
13
+ offerings = filter_objects(offerings) if options[:filter]
8
14
  if offerings.size < 1
9
15
  puts "No offerings found."
10
16
  else
11
- table = [["Name", "Displaytext", "Domain", "ID"]]
12
- offerings.each do |offering|
13
- table << [
14
- offering["name"],
15
- offering["displaytext"],
16
- offering["domain"],
17
- offering["id"]
18
- ]
17
+ case options[:format].to_sym
18
+ when :yaml
19
+ puts({disk_offers: offerings}.to_yaml)
20
+ when :json
21
+ puts JSON.pretty_generate(disk_offers: offerings)
22
+ else
23
+ table = [["Name", "Displaytext", "Domain", "ID"]]
24
+ offerings.each do |offering|
25
+ table << [
26
+ offering["name"],
27
+ offering["displaytext"],
28
+ offering["domain"],
29
+ offering["id"]
30
+ ]
31
+ end
32
+ print_table table
33
+ say "Total number of offerings: #{offerings.size}"
19
34
  end
20
- print_table table
21
- say "Total number of offerings: #{offerings.size}"
22
35
  end
23
36
  end
24
37
  end
@@ -1,17 +1,26 @@
1
1
  class Domain < CloudstackCli::Base
2
2
 
3
3
  desc 'list', 'list domains'
4
+ option :format, default: "table",
5
+ enum: %w(table json yaml)
4
6
  def list
5
7
  domains = client.list_domains
6
8
  if domains.size < 1
7
9
  puts "No domains found."
8
10
  else
9
- table = [%w(Name Path)]
10
- domains.each do |domain|
11
- table << [domain['name'], domain['path']]
11
+ case options[:format].to_sym
12
+ when :yaml
13
+ puts({domains: domains}.to_yaml)
14
+ when :json
15
+ puts JSON.pretty_generate(domains: domains)
16
+ else
17
+ table = [%w(Name Path)]
18
+ domains.each do |domain|
19
+ table << [domain['name'], domain['path']]
20
+ end
21
+ print_table table
22
+ say "Total number of domains: #{domains.size}"
12
23
  end
13
- print_table table
14
- say "Total number of domains: #{domains.size}"
15
24
  end
16
25
  end
17
26
 
@@ -3,20 +3,29 @@ class Host < CloudstackCli::Base
3
3
  desc 'list', 'list hosts'
4
4
  option :zone, desc: "lists hosts by zone"
5
5
  option :type, desc: "the host type"
6
+ option :format, default: "table",
7
+ enum: %w(table json yaml)
6
8
  def list
7
9
  resolve_zone if options[:zone]
8
10
  hosts = client.list_hosts(options)
9
11
  if hosts.size < 1
10
12
  say "No hosts found."
11
13
  else
12
- table = [["Zone", "Type", "Cluster", "Name"]]
13
- hosts.each do |host|
14
- table << [
15
- host['zonename'], host['type'], host['clustername'], host['name']
16
- ]
14
+ case options[:format].to_sym
15
+ when :yaml
16
+ puts({hosts: hosts}.to_yaml)
17
+ when :json
18
+ puts JSON.pretty_generate(hosts: hosts)
19
+ else
20
+ table = [["Zone", "Type", "Cluster", "Name"]]
21
+ hosts.each do |host|
22
+ table << [
23
+ host['zonename'], host['type'], host['clustername'], host['name']
24
+ ]
25
+ end
26
+ print_table table
27
+ say "Total number of hosts: #{hosts.size}"
17
28
  end
18
- print_table table
19
- say "Total number of hosts: #{hosts.size}"
20
29
  end
21
30
  end
22
31
 
@@ -29,6 +29,8 @@ class IpAddress < CloudstackCli::Base
29
29
  option :project
30
30
  option :account
31
31
  option :listall
32
+ option :format, default: "table",
33
+ enum: %w(table json yaml)
32
34
  def list
33
35
  resolve_account
34
36
  resolve_project
@@ -36,12 +38,19 @@ class IpAddress < CloudstackCli::Base
36
38
  if addresses.size < 1
37
39
  say "No ip addresses found."
38
40
  else
39
- table = [%w(ID Address Account Zone)]
40
- addresses.each do |address|
41
- table << [address["id"], address["ipaddress"], address["account"], address["zonename"]]
41
+ case options[:format].to_sym
42
+ when :yaml
43
+ puts({ip_addresses: addresses}.to_yaml)
44
+ when :json
45
+ puts JSON.pretty_generate(ip_addresses: addresses)
46
+ else
47
+ table = [%w(ID Address Account Zone)]
48
+ addresses.each do |address|
49
+ table << [address["id"], address["ipaddress"], address["account"], address["zonename"]]
50
+ end
51
+ print_table table
52
+ say "Total number of addresses: #{addresses.size}"
42
53
  end
43
- print_table table
44
- say "Total number of addresses: #{addresses.size}"
45
54
  end
46
55
  end
47
56
 
@@ -6,28 +6,41 @@ class Iso < CloudstackCli::Base
6
6
  option :account, desc: 'account name'
7
7
  option :type, desc: 'type of ISO',
8
8
  enum: %w(featured self selfexecutable sharedexecutable executable community all)
9
+ option :format, default: "table",
10
+ enum: %w(table json yaml)
11
+ option :filter, type: :hash,
12
+ desc: "filter objects based on arrtibutes: (attr1:regex attr2:regex ...)"
9
13
  def list
14
+ add_filters_to_options("listIsos") if options[:filter]
10
15
  resolve_project
11
16
  resolve_zone
12
17
  resolve_account
13
18
  options[:isofilter] = options[:type]
14
19
  options.delete :type
15
20
  isos = client.list_isos(options)
21
+ isos = filter_objects(isos) if options[:filter]
16
22
  if isos.size < 1
17
23
  puts "No ISO's found."
18
24
  else
19
- table = [%w(Name Zone Bootable Public Featured)]
20
- isos.each do |iso|
21
- table << [
22
- iso['name'],
23
- iso['zonename'],
24
- iso['bootable'],
25
- iso['ispublic'],
26
- iso['isfeatured']
27
- ]
25
+ case options[:format].to_sym
26
+ when :yaml
27
+ puts({isos: isos}.to_yaml)
28
+ when :json
29
+ puts JSON.pretty_generate(isos: isos)
30
+ else
31
+ table = [%w(Name Zone Bootable Public Featured)]
32
+ isos.each do |iso|
33
+ table << [
34
+ iso['name'],
35
+ iso['zonename'],
36
+ iso['bootable'],
37
+ iso['ispublic'],
38
+ iso['isfeatured']
39
+ ]
40
+ end
41
+ print_table(table)
42
+ say "Total number of ISO's: #{isos.size}"
28
43
  end
29
- print_table(table)
30
- say "Total number of ISO's: #{isos.size}"
31
44
  end
32
45
  end
33
46
 
@@ -1,22 +1,31 @@
1
1
  class Job < CloudstackCli::Base
2
2
 
3
3
  desc 'list', 'list async jobs'
4
+ option :format, default: "table",
5
+ enum: %w(table json yaml)
4
6
  def list
5
7
  jobs = client.list_async_jobs
6
8
  if jobs.size < 1
7
9
  say "No jobs found."
8
10
  else
9
- table = [%w(Command Created Status ID User-ID)]
10
- jobs.each do |job|
11
- table << [
12
- job['cmd'].split('.')[-1],
13
- job['created'],
14
- job['jobstatus'],
15
- job['jobid'],
16
- job['userid']
17
- ]
11
+ case options[:format].to_sym
12
+ when :yaml
13
+ puts({jobs: jobs}.to_yaml)
14
+ when :json
15
+ puts JSON.pretty_generate(jobs: jobs)
16
+ else
17
+ table = [%w(Command Created Status ID User-ID)]
18
+ jobs.each do |job|
19
+ table << [
20
+ job['cmd'].split('.')[-1],
21
+ job['created'],
22
+ job['jobstatus'],
23
+ job['jobid'],
24
+ job['userid']
25
+ ]
26
+ end
27
+ print_table table
18
28
  end
19
- print_table table
20
29
  end
21
30
  end
22
31
 
@@ -2,24 +2,33 @@ class LoadBalancer < CloudstackCli::Base
2
2
 
3
3
  desc "list", "list load balancer rules"
4
4
  option :project
5
+ option :format, default: "table",
6
+ enum: %w(table json yaml)
5
7
  def list
6
8
  resolve_project
7
9
  rules = client.list_load_balancer_rules(options)
8
10
  if rules.size < 1
9
11
  puts "No load balancer rules found."
10
12
  else
11
- table = [%w(Name Public-IP Public-Port Private-Port Algorithm)]
12
- rules.each do |rule|
13
- table << [
14
- rule['name'],
15
- rule['publicip'],
16
- rule['publicport'],
17
- rule['privateport'],
18
- rule['algorithm']
19
- ]
13
+ case options[:format].to_sym
14
+ when :yaml
15
+ puts({rules: rules}.to_yaml)
16
+ when :json
17
+ puts JSON.pretty_generate(rules: rules)
18
+ else
19
+ table = [%w(Name Public-IP Public-Port Private-Port Algorithm)]
20
+ rules.each do |rule|
21
+ table << [
22
+ rule['name'],
23
+ rule['publicip'],
24
+ rule['publicport'],
25
+ rule['privateport'],
26
+ rule['algorithm']
27
+ ]
28
+ end
29
+ print_table table
30
+ say "Total number of rules: #{rules.count}"
20
31
  end
21
- print_table table
22
- say "Total number of rules: #{rules.count}"
23
32
  end
24
33
  end
25
34
 
@@ -4,37 +4,47 @@ class Network < CloudstackCli::Base
4
4
  option :project, desc: 'the project name of the network'
5
5
  option :account, desc: 'the owner of the network'
6
6
  option :zone, desc: 'the name of the zone the network belongs to'
7
- option :type, desc: 'the type of the network'
8
7
  option :showid, type: :boolean, desc: 'show the network id'
9
8
  option :showvlan, type: :boolean, desc: 'show the VLAN'
9
+ option :filter, type: :hash,
10
+ desc: "filter objects based on arrtibutes: (attr1:regex attr2:regex ...)"
11
+ option :format, default: "table",
12
+ enum: %w(table json yaml)
10
13
  def list
11
14
  resolve_zone if options[:zone]
12
15
  resolve_project
16
+ add_filters_to_options("listNetworks") if options[:filter]
13
17
  networks = client.list_networks(options)
14
-
18
+ networks = filter_objects(networks) if options[:filter]
15
19
  if networks.size < 1
16
20
  puts "No networks found."
17
21
  else
18
- networks = filter_by(networks, 'type', options[:type]) if options[:type]
19
- table = [%w(Name Displaytext Account/Project Zone Domain State Type Offering)]
20
- table[0] << "ID" if options[:showid]
21
- table[0] << "VLAN" if options[:showvlan]
22
- networks.each do |network|
23
- table << [
24
- network["name"],
25
- network["displaytext"],
26
- network["account"] || network["project"],
27
- network["zonename"],
28
- network["domain"],
29
- network["state"],
30
- network["type"],
31
- network["networkofferingname"]
32
- ]
33
- table[-1] << network["id"] if options[:showid]
34
- table[-1] << network["vlan"] if options[:showvlan]
22
+ case options[:format].to_sym
23
+ when :yaml
24
+ puts({networks: networks}.to_yaml)
25
+ when :json
26
+ puts JSON.pretty_generate(networks: networks)
27
+ else
28
+ table = [%w(Name Displaytext Account/Project Zone Domain State Type Offering)]
29
+ table[0] << "ID" if options[:showid]
30
+ table[0] << "VLAN" if options[:showvlan]
31
+ networks.each do |network|
32
+ table << [
33
+ network["name"],
34
+ network["displaytext"],
35
+ network["account"] || network["project"],
36
+ network["zonename"],
37
+ network["domain"],
38
+ network["state"],
39
+ network["type"],
40
+ network["networkofferingname"]
41
+ ]
42
+ table[-1] << network["id"] if options[:showid]
43
+ table[-1] << network["vlan"] if options[:showvlan]
44
+ end
45
+ print_table table
46
+ say "Total number of networks: #{networks.count}"
35
47
  end
36
- print_table table
37
- say "Total number of networks: #{networks.count}"
38
48
  end
39
49
  end
40
50
 
@@ -2,6 +2,8 @@ class PhysicalNetwork < CloudstackCli::Base
2
2
 
3
3
  desc "list", "list physical networks"
4
4
  option :project
5
+ option :format, default: "table",
6
+ enum: %w(table json yaml)
5
7
  def list
6
8
  resolve_project
7
9
  networks = client.list_physical_networks(options)
@@ -9,17 +11,24 @@ class PhysicalNetwork < CloudstackCli::Base
9
11
  if networks.size < 1
10
12
  puts "No networks found"
11
13
  else
12
- table = [['Name', 'State', 'Zone', 'ID']]
13
- networks.each do |network|
14
- table << [
15
- network["name"],
16
- network["state"],
17
- zones.select{|zone| zone['id'] == network["zoneid"]}.first["name"],
18
- network["id"]
19
- ]
14
+ case options[:format].to_sym
15
+ when :yaml
16
+ puts({networks: networks}.to_yaml)
17
+ when :json
18
+ puts JSON.pretty_generate(networks: networks)
19
+ else
20
+ table = [['Name', 'State', 'Zone', 'ID']]
21
+ networks.each do |network|
22
+ table << [
23
+ network["name"],
24
+ network["state"],
25
+ zones.select{|zone| zone['id'] == network["zoneid"]}.first["name"],
26
+ network["id"]
27
+ ]
28
+ end
29
+ print_table table
30
+ say "Total number of networks: #{networks.count}"
20
31
  end
21
- print_table table
22
- say "Total number of networks: #{networks.count}"
23
32
  end
24
33
  end
25
34
 
@@ -2,21 +2,30 @@ class Pod < CloudstackCli::Base
2
2
 
3
3
  desc 'list', 'list pods'
4
4
  option :zone
5
+ option :format, default: "table",
6
+ enum: %w(table json yaml)
5
7
  def list
6
8
  resolve_zone
7
9
  pods = client.list_pods(options)
8
10
  if pods.size < 1
9
11
  say "No pods found."
10
12
  else
11
- table = [["Name", "Start-IP", "End-IP", "Zone"]]
12
- pods.each do |pod|
13
- table << [
14
- pod['name'], pod['startip'],
15
- pod['endip'], pod['zonename']
16
- ]
13
+ case options[:format].to_sym
14
+ when :yaml
15
+ puts({pods: pods}.to_yaml)
16
+ when :json
17
+ puts JSON.pretty_generate(pods: pods)
18
+ else
19
+ table = [["Name", "Start-IP", "End-IP", "Zone"]]
20
+ pods.each do |pod|
21
+ table << [
22
+ pod['name'], pod['startip'],
23
+ pod['endip'], pod['zonename']
24
+ ]
25
+ end
26
+ print_table table
27
+ say "Total number of pods: #{pods.count}"
17
28
  end
18
- print_table table
19
- say "Total number of pods: #{pods.count}"
20
29
  end
21
30
  end
22
31
 
@@ -44,25 +44,34 @@ class PortRule < CloudstackCli::Base
44
44
 
45
45
  desc "list", "list portforwarding rules"
46
46
  option :project
47
+ option :format, default: "table",
48
+ enum: %w(table json yaml)
47
49
  def list
48
50
  resolve_project
49
51
  rules = client.list_port_forwarding_rules(options)
50
52
  if rules.size < 1
51
53
  puts "No rules found."
52
54
  else
53
- table = [["IP", "Server", "Public-Port", "Private-Port", "Protocol", "State"]]
54
- rules.each do |rule|
55
- table << [
56
- rule['ipaddress'],
57
- rule['virtualmachinename'],
58
- print_ports(rule, 'public'),
59
- print_ports(rule, 'private'),
60
- rule['protocol'],
61
- rule['state']
62
- ]
55
+ case options[:format].to_sym
56
+ when :yaml
57
+ puts({rules: rules}.to_yaml)
58
+ when :json
59
+ puts JSON.pretty_generate(rules: rules)
60
+ else
61
+ table = [["IP", "Server", "Public-Port", "Private-Port", "Protocol", "State"]]
62
+ rules.each do |rule|
63
+ table << [
64
+ rule['ipaddress'],
65
+ rule['virtualmachinename'],
66
+ print_ports(rule, 'public'),
67
+ print_ports(rule, 'private'),
68
+ rule['protocol'],
69
+ rule['state']
70
+ ]
71
+ end
72
+ print_table table
73
+ say "Total number of rules: #{rules.count}"
63
74
  end
64
- print_table table
65
- say "Total number of rules: #{rules.count}"
66
75
  end
67
76
  end
68
77
 
@@ -14,25 +14,34 @@ class Project < CloudstackCli::Base
14
14
 
15
15
  desc "list", "list projects"
16
16
  option :domain, desc: "List only resources belonging to the domain specified"
17
+ option :format, default: "table",
18
+ enum: %w(table json yaml)
17
19
  def list
18
20
  resolve_domain
19
21
  projects = client.list_projects(options.merge listall: true)
20
22
  if projects.size < 1
21
23
  puts "No projects found."
22
24
  else
23
- table = [%w(Name Displaytext VMs CPU Memory Domain)]
24
- projects.each do |project|
25
- table << [
26
- project['name'],
27
- project['displaytext'],
28
- project['vmtotal'],
29
- project['cputotal'],
30
- project['memorytotal'] / 1024,
31
- project['domain']
32
- ]
25
+ case options[:format].to_sym
26
+ when :yaml
27
+ puts({projects: projects}.to_yaml)
28
+ when :json
29
+ puts JSON.pretty_generate(projects: projects)
30
+ else
31
+ table = [%w(Name Displaytext VMs CPU Memory Domain)]
32
+ projects.each do |project|
33
+ table << [
34
+ project['name'],
35
+ project['displaytext'],
36
+ project['vmtotal'],
37
+ project['cputotal'],
38
+ project['memorytotal'] / 1024,
39
+ project['domain']
40
+ ]
41
+ end
42
+ print_table(table)
43
+ say "Total number of projects: #{projects.count}"
33
44
  end
34
- print_table(table)
35
- say "Total number of projects: #{projects.count}"
36
45
  end
37
46
  end
38
47
 
@@ -1,20 +1,29 @@
1
1
  class Region < CloudstackCli::Base
2
2
 
3
3
  desc 'list', 'list regions'
4
+ option :format, default: "table",
5
+ enum: %w(table json yaml)
4
6
  def list
5
7
  regions = client.list_regions
6
8
  if regions.size < 1
7
9
  say "No regions found."
8
10
  else
9
- table = [%w(Name, Endpoint)]
10
- regions.each do |region|
11
- table << [
12
- region['name'], region['endpoint']
13
- ]
11
+ case options[:format].to_sym
12
+ when :yaml
13
+ puts({regions: regions}.to_yaml)
14
+ when :json
15
+ puts JSON.pretty_generate(regions: regions)
16
+ else
17
+ table = [%w(Name, Endpoint)]
18
+ regions.each do |region|
19
+ table << [
20
+ region['name'], region['endpoint']
21
+ ]
22
+ end
23
+ print_table table
24
+ say "Total number of regions: #{regions.size}"
14
25
  end
15
- print_table table
16
- say "Total number of regions: #{regions.size}"
17
26
  end
18
27
  end
19
28
 
20
- end
29
+ end
@@ -18,6 +18,8 @@ class ResourceLimit < CloudstackCli::Base
18
18
  option :account
19
19
  option :project
20
20
  option :type, desc: "specify type, see types for a list of types"
21
+ option :format, default: "table",
22
+ enum: %w(table json yaml)
21
23
  def list
22
24
  resolve_account
23
25
  resolve_project
@@ -34,8 +36,16 @@ class ResourceLimit < CloudstackCli::Base
34
36
  resource_to_s(limit, 'max')
35
37
  ]
36
38
  end
37
- table = table.insert(0, header)
38
- print_table table
39
+
40
+ case options[:format].to_sym
41
+ when :yaml
42
+ puts({resource_limits: limits}.to_yaml)
43
+ when :json
44
+ puts JSON.pretty_generate(resource_limits: limits)
45
+ else
46
+ table = table.insert(0, header)
47
+ print_table table
48
+ end
39
49
  end
40
50
 
41
51
  desc "refresh", "refresh resource counts"
@@ -167,9 +167,9 @@ class Router < CloudstackCli::Base
167
167
  options[:format] ||= "table"
168
168
  case options[:format].to_sym
169
169
  when :yaml
170
- puts({'routers' => routers}.to_yaml)
170
+ puts({routers: routers}.to_yaml)
171
171
  when :json
172
- say JSON.pretty_generate({ routers: routers })
172
+ puts JSON.pretty_generate(routers: routers)
173
173
  else
174
174
  table = [%w(
175
175
  Name Zone Account/Project IP Linklocal-IP Status Version
@@ -6,6 +6,8 @@ class Snapshot < CloudstackCli::Base
6
6
  option :domain, desc: "the domain name of the snapshot's account"
7
7
  option :listall, default: true, desc: "list all resources the caller has rights on"
8
8
  option :state, desc: "filter snapshots by state"
9
+ option :format, default: "table",
10
+ enum: %w(table json yaml)
9
11
  def list
10
12
  resolve_account
11
13
  resolve_project
@@ -14,16 +16,23 @@ class Snapshot < CloudstackCli::Base
14
16
  if snapshots.size < 1
15
17
  say "No snapshots found."
16
18
  else
17
- table = [%w(Account Name Volume Created Type State)]
18
- snapshots = filter_by(snapshots, :state, options[:state]) if options[:state]
19
- snapshots.each do |snapshot|
20
- table << [
21
- snapshot['account'], snapshot['name'], snapshot['volumename'],
22
- snapshot['created'], snapshot['snapshottype'], snapshot['state']
23
- ]
19
+ case options[:format].to_sym
20
+ when :yaml
21
+ puts({snapshots: snapshots}.to_yaml)
22
+ when :json
23
+ puts JSON.pretty_generate(snapshots: snapshots)
24
+ else
25
+ table = [%w(Account Name Volume Created Type State)]
26
+ snapshots = filter_by(snapshots, :state, options[:state]) if options[:state]
27
+ snapshots.each do |snapshot|
28
+ table << [
29
+ snapshot['account'], snapshot['name'], snapshot['volumename'],
30
+ snapshot['created'], snapshot['snapshottype'], snapshot['state']
31
+ ]
32
+ end
33
+ print_table table
34
+ say "Total number of snapshots: #{snapshots.size}"
24
35
  end
25
- print_table table
26
- say "Total number of snapshots: #{snapshots.size}"
27
36
  end
28
37
  end
29
38
 
@@ -4,6 +4,8 @@ class SshKeyPair < CloudstackCli::Base
4
4
  option :listall, default: true
5
5
  option :account
6
6
  option :project
7
+ option :format, default: "table",
8
+ enum: %w(table json yaml)
7
9
  def list
8
10
  resolve_account
9
11
  resolve_project
@@ -11,11 +13,18 @@ class SshKeyPair < CloudstackCli::Base
11
13
  if pairs.size < 1
12
14
  say "No ssh key pairs found."
13
15
  else
14
- table = [["Name", "Fingerprint"]]
15
- pairs.each do |pair|
16
- table << [pair['name'], pair['fingerprint']]
16
+ case options[:format].to_sym
17
+ when :yaml
18
+ puts({ssh_key_pairs: pairs}.to_yaml)
19
+ when :json
20
+ puts JSON.pretty_generate(ssh_key_pairs: pairs)
21
+ else
22
+ table = [["Name", "Fingerprint"]]
23
+ pairs.each do |pair|
24
+ table << [pair['name'], pair['fingerprint']]
25
+ end
26
+ print_table table
17
27
  end
18
- print_table table
19
28
  end
20
29
  end
21
30
 
@@ -5,34 +5,43 @@ class StoragePool < CloudstackCli::Base
5
5
  option :name, desc: "name of the storage pool"
6
6
  option :keyword, desc: "list by keyword"
7
7
  option :state, desc: "filter by state (Up, Maintenance)"
8
+ option :format, default: "table",
9
+ enum: %w(table json yaml)
8
10
  def list
9
11
  resolve_zone
10
12
  storage_pools = client.list_storage_pools(options)
11
13
  if storage_pools.size < 1
12
14
  say "No storage pools found."
13
15
  else
14
- storage_pools = filter_by(storage_pools, "state", options[:state]) if options[:state]
15
- table = [%w(Name Pod State Zone)]
16
- table[0] << "Size [GB]"
17
- table[0] << "Used [GB]"
18
- table[0] << "Used [%]"
19
- table[0] << "Alocated [GB]"
20
- table[0] << "Alocated [%]"
21
- table[0] << "Type"
22
- storage_pools.each do |storage_pool|
23
- total = storage_pool['disksizetotal'] / 1024**3
24
- used = (storage_pool['disksizeused'] / 1024**3) rescue 0
25
- allocated = (storage_pool['disksizeallocated'] / 1024**3) rescue 0
26
- table << [
27
- storage_pool['name'], storage_pool['podname'],
28
- storage_pool['state'], storage_pool['zonename'],
29
- total, used, (100.0 / total * used).round(0),
30
- allocated, (100.0 / total * allocated).round(0),
31
- storage_pool['type']
32
- ]
16
+ case options[:format].to_sym
17
+ when :yaml
18
+ puts({storage_pools: storage_pools}.to_yaml)
19
+ when :json
20
+ puts JSON.pretty_generate(storage_pools: storage_pools)
21
+ else
22
+ storage_pools = filter_by(storage_pools, "state", options[:state]) if options[:state]
23
+ table = [%w(Name Pod State Zone)]
24
+ table[0] << "Size [GB]"
25
+ table[0] << "Used [GB]"
26
+ table[0] << "Used [%]"
27
+ table[0] << "Alocated [GB]"
28
+ table[0] << "Alocated [%]"
29
+ table[0] << "Type"
30
+ storage_pools.each do |storage_pool|
31
+ total = storage_pool['disksizetotal'] / 1024**3
32
+ used = (storage_pool['disksizeused'] / 1024**3) rescue 0
33
+ allocated = (storage_pool['disksizeallocated'] / 1024**3) rescue 0
34
+ table << [
35
+ storage_pool['name'], storage_pool['podname'],
36
+ storage_pool['state'], storage_pool['zonename'],
37
+ total, used, (100.0 / total * used).round(0),
38
+ allocated, (100.0 / total * allocated).round(0),
39
+ storage_pool['type']
40
+ ]
41
+ end
42
+ print_table table
43
+ say "Total number of storage_pools: #{storage_pools.size}"
33
44
  end
34
- print_table table
35
- say "Total number of storage_pools: #{storage_pools.size}"
36
45
  end
37
46
  end
38
47
 
@@ -5,20 +5,29 @@ class SystemVm < CloudstackCli::Base
5
5
  option :state, desc: "state of the system VM"
6
6
  option :type, desc: "the system VM type.",
7
7
  enum: %w(consoleproxy secondarystoragevm)
8
+ option :format, default: "table",
9
+ enum: %w(table json yaml)
8
10
  def list
9
11
  resolve_zone
10
12
  vms = client.list_system_vms(options)
11
13
  if vms.size < 1
12
14
  say "No system VM's found."
13
15
  else
14
- table = [%w(Name Zone State Type)]
15
- vms.each do |vm|
16
- table << [
17
- vm['name'], vm['zonename'], vm['state'], vm['systemvmtype']
18
- ]
16
+ case options[:format].to_sym
17
+ when :yaml
18
+ puts({system_vms: vms}.to_yaml)
19
+ when :json
20
+ puts JSON.pretty_generate(system_vms: vms)
21
+ else
22
+ table = [%w(Name Zone State Type)]
23
+ vms.each do |vm|
24
+ table << [
25
+ vm['name'], vm['zonename'], vm['state'], vm['systemvmtype']
26
+ ]
27
+ end
28
+ print_table table
29
+ say "Total number of system VM's: #{vms.size}"
19
30
  end
20
- print_table table
21
- say "Total number of system VM's: #{vms.size}"
22
31
  end
23
32
  end
24
33
 
@@ -6,6 +6,8 @@ class Template < CloudstackCli::Base
6
6
  option :type,
7
7
  enum: %w(featured self self-executable executable community all),
8
8
  default: "featured"
9
+ option :format, default: "table",
10
+ enum: %w(table json yaml)
9
11
  def list(type='featured')
10
12
  resolve_project
11
13
  resolve_zone
@@ -14,19 +16,26 @@ class Template < CloudstackCli::Base
14
16
  if templates.size < 1
15
17
  puts "No templates found."
16
18
  else
17
- table = [%w(Name Created Zone Featured Public Format)]
18
- templates.each do |template|
19
- table << [
20
- template['name'],
21
- Time.parse(template['created']).strftime("%F"),
22
- template['zonename'],
23
- template['isfeatured'],
24
- template['ispublic'],
25
- template['format']
26
- ]
19
+ case options[:format].to_sym
20
+ when :yaml
21
+ puts({templates: templates}.to_yaml)
22
+ when :json
23
+ puts JSON.pretty_generate(templates: templates)
24
+ else
25
+ table = [%w(Name Created Zone Featured Public Format)]
26
+ templates.each do |template|
27
+ table << [
28
+ template['name'],
29
+ Time.parse(template['created']).strftime("%F"),
30
+ template['zonename'],
31
+ template['isfeatured'],
32
+ template['ispublic'],
33
+ template['format']
34
+ ]
35
+ end
36
+ print_table(table)
37
+ say "Total number of templates: #{templates.size}"
27
38
  end
28
- print_table(table)
29
- say "Total number of templates: #{templates.size}"
30
39
  end
31
40
  end
32
41
 
@@ -3,21 +3,30 @@ class User < CloudstackCli::Base
3
3
  desc 'list', 'list users'
4
4
  option :listall
5
5
  option :account
6
+ option :format, default: "table",
7
+ enum: %w(table json yaml)
6
8
  def list
7
9
  resolve_account
8
10
  users = client.list_users(options)
9
11
  if users.size < 1
10
12
  say "No users found."
11
13
  else
12
- table = [["Account", "Type", "Name", "Email", "State", "Domain"]]
13
- users.each do |user|
14
- table << [
15
- user['account'], Account::TYPES[user['accounttype']], "#{user['firstname']} #{user['lastname']}",
16
- user['email'], user['state'], user['domain']
17
- ]
14
+ case options[:format].to_sym
15
+ when :yaml
16
+ puts({users: users}.to_yaml)
17
+ when :json
18
+ puts JSON.pretty_generate(users: users)
19
+ else
20
+ table = [["Account", "Type", "Name", "Email", "State", "Domain"]]
21
+ users.each do |user|
22
+ table << [
23
+ user['account'], Account::TYPES[user['accounttype']], "#{user['firstname']} #{user['lastname']}",
24
+ user['email'], user['state'], user['domain']
25
+ ]
26
+ end
27
+ print_table table
28
+ say "Total number of users: #{users.size}"
18
29
  end
19
- print_table table
20
- say "Total number of users: #{users.size}"
21
30
  end
22
31
  end
23
32
 
@@ -19,6 +19,7 @@ class VirtualMachine < CloudstackCli::Base
19
19
  option :format, default: "table",
20
20
  enum: %w(table json yaml)
21
21
  def list
22
+ add_filters_to_options("listVirtualMachines") if options[:filter]
22
23
  resolve_account
23
24
  resolve_project
24
25
  resolve_zone
@@ -269,9 +270,9 @@ class VirtualMachine < CloudstackCli::Base
269
270
  def print_virtual_machines(virtual_machines)
270
271
  case options[:format].to_sym
271
272
  when :yaml
272
- puts({'virtual_machines' => virtual_machines}.to_yaml)
273
+ puts({virtual_machines: virtual_machines}.to_yaml)
273
274
  when :json
274
- say JSON.pretty_generate({ virtual_machines: virtual_machines })
275
+ puts JSON.pretty_generate(virtual_machines: virtual_machines)
275
276
  else
276
277
  with_i_name = virtual_machines.first['instancename']
277
278
  with_h_name = virtual_machines.first['hostname']
@@ -7,30 +7,43 @@ class Volume < CloudstackCli::Base
7
7
  option :keyword, desc: 'list by keyword'
8
8
  option :name, desc: 'name of the disk volume'
9
9
  option :type, desc: 'type of disk volume (ROOT or DATADISK)'
10
+ option :filter, type: :hash,
11
+ desc: "filter objects based on arrtibutes: (attr1:regex attr2:regex ...)"
12
+ option :format, default: "table",
13
+ enum: %w(table json yaml)
10
14
  def list
11
15
  resolve_project
12
16
  resolve_account
13
17
  resolve_zone
18
+ add_filters_to_options("listVolumes") if options[:filter]
14
19
  volumes = client.list_volumes(options)
20
+ volumes = filter_objects(volumes) if options[:filter]
15
21
  if volumes.size < 1
16
22
  say "No volumes found."
17
23
  else
18
- table = [%w(Name Type Size VM Storage Offeringname Zone Status)]
19
- table.first << 'Project' if options[:project]
20
- volumes.each do |volume|
21
- table << [
22
- volume['name'], volume['type'],
23
- (volume['size'] / 1024**3).to_s + 'GB',
24
- volume['vmname'],
25
- volume['storage'],
26
- volume['diskofferingname'],
27
- volume['zonename'],
28
- volume['state']
29
- ]
30
- table.last << volume['project'] if options[:project]
24
+ case options[:format].to_sym
25
+ when :yaml
26
+ puts({volumes: volumes}.to_yaml)
27
+ when :json
28
+ puts JSON.pretty_generate(volumes: volumes)
29
+ else
30
+ table = [%w(Name Type Size VM Storage Offeringname Zone Status)]
31
+ table.first << 'Project' if options[:project]
32
+ volumes.each do |volume|
33
+ table << [
34
+ volume['name'], volume['type'],
35
+ (volume['size'] / 1024**3).to_s + 'GB',
36
+ volume['vmname'],
37
+ volume['storage'],
38
+ volume['diskofferingname'],
39
+ volume['zonename'],
40
+ volume['state']
41
+ ]
42
+ table.last << volume['project'] if options[:project]
43
+ end
44
+ print_table(table)
45
+ say "Total number of volumes: #{volumes.size}"
31
46
  end
32
- print_table(table)
33
- say "Total number of volumes: #{volumes.size}"
34
47
  end
35
48
  end
36
49
 
@@ -1,21 +1,30 @@
1
1
  class Zone < CloudstackCli::Base
2
2
 
3
3
  desc "list", "list zones"
4
+ option :format, default: "table",
5
+ enum: %w(table json yaml)
4
6
  def list
5
7
  zones = client.list_zones
6
8
  if zones.size < 1
7
9
  puts "No projects found"
8
10
  else
9
- table = [%w(Name Network-Type Description)]
10
- zones.each do |zone|
11
- table << [
12
- zone['name'],
13
- zone['networktype'],
14
- zone['description']
15
- ]
11
+ case options[:format].to_sym
12
+ when :yaml
13
+ puts({zones: zones}.to_yaml)
14
+ when :json
15
+ puts JSON.pretty_generate(zones: zones)
16
+ else
17
+ table = [%w(Name Network-Type Description)]
18
+ zones.each do |zone|
19
+ table << [
20
+ zone['name'],
21
+ zone['networktype'],
22
+ zone['description']
23
+ ]
24
+ end
25
+ print_table(table)
16
26
  end
17
27
  end
18
- print_table(table)
19
28
  end
20
29
 
21
30
  end
@@ -1,3 +1,3 @@
1
1
  module CloudstackCli
2
- VERSION = "1.4.1"
2
+ VERSION = "1.4.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudstack-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 1.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nik Wolfgramm