cloudstack-cli 0.15.1 → 1.0.0.rc1
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/Gemfile +1 -1
- data/Gemfile.lock +4 -5
- data/cloudstack-cli.gemspec +2 -2
- data/lib/cloudstack-cli/base.rb +6 -16
- data/lib/cloudstack-cli/cli.rb +16 -4
- data/lib/cloudstack-cli/commands/account.rb +2 -4
- data/lib/cloudstack-cli/commands/affinity_group.rb +2 -1
- data/lib/cloudstack-cli/commands/capacity.rb +27 -26
- data/lib/cloudstack-cli/commands/cluster.rb +6 -3
- data/lib/cloudstack-cli/commands/compute_offer.rb +13 -11
- data/lib/cloudstack-cli/commands/configuration.rb +5 -6
- data/lib/cloudstack-cli/commands/disk_offer.rb +4 -3
- data/lib/cloudstack-cli/commands/domain.rb +6 -6
- data/lib/cloudstack-cli/commands/host.rb +16 -2
- data/lib/cloudstack-cli/commands/ip_address.rb +23 -14
- data/lib/cloudstack-cli/commands/iso.rb +23 -21
- data/lib/cloudstack-cli/commands/job.rb +15 -13
- data/lib/cloudstack-cli/commands/load_balancer.rb +63 -25
- data/lib/cloudstack-cli/commands/network.rb +25 -70
- data/lib/cloudstack-cli/commands/physical_network.rb +4 -4
- data/lib/cloudstack-cli/commands/pod.rb +3 -1
- data/lib/cloudstack-cli/commands/port_rule.rb +23 -17
- data/lib/cloudstack-cli/commands/project.rb +11 -12
- data/lib/cloudstack-cli/commands/resource_limit.rb +8 -12
- data/lib/cloudstack-cli/commands/router.rb +35 -42
- data/lib/cloudstack-cli/commands/snapshot.rb +5 -2
- data/lib/cloudstack-cli/commands/ssh_key_pairs.rb +20 -6
- data/lib/cloudstack-cli/commands/stack.rb +49 -39
- data/lib/cloudstack-cli/commands/storage_pool.rb +4 -3
- data/lib/cloudstack-cli/commands/system_vm.rb +11 -14
- data/lib/cloudstack-cli/commands/template.rb +11 -14
- data/lib/cloudstack-cli/commands/user.rb +4 -9
- data/lib/cloudstack-cli/commands/virtual_machine.rb +243 -0
- data/lib/cloudstack-cli/commands/volume.rb +117 -2
- data/lib/cloudstack-cli/commands/zone.rb +7 -3
- data/lib/cloudstack-cli/helper.rb +96 -35
- data/lib/cloudstack-cli/option_resolver.rb +176 -0
- data/lib/cloudstack-cli/version.rb +1 -1
- data/lib/cloudstack-cli.rb +2 -1
- metadata +9 -8
- data/lib/cloudstack-cli/commands/server.rb +0 -230
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: abbccb8fdb7cb7d93fb79f33f58f53469e0763fd
|
4
|
+
data.tar.gz: 6e4e7df9e6d4f4cbe5e6d79ffa0497426801d0c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48faa2904edaeb89a5dc81c7068b851ab1b99e241bdc2c836f30ac1dfaccdce608212cd6cc258fe3675dd8bb5fa58a3e3159b34d7649cfc2fd082423af724b22
|
7
|
+
data.tar.gz: 3ee41e41a2ab280d2dce91ad2f57eeeb16b362428729b98e47522f514cf743eb72fdbe5e2bd82d2d1c7b5999cfca0b3e9f5fb6807e79d72575b737d936bd3f5e
|
data/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem 'cloudstack_client', git: 'git@github.com:niwo/cloudstack_client.git'
|
3
|
+
gem 'cloudstack_client', git: 'git@github.com:niwo/cloudstack_client.git'
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in cloudstack-cli.gemspec
|
6
6
|
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
GIT
|
2
2
|
remote: git@github.com:niwo/cloudstack_client.git
|
3
|
-
revision:
|
4
|
-
branch: master
|
3
|
+
revision: b388af01e7403f65fc1ad5cd4c905a1f005afea3
|
5
4
|
specs:
|
6
|
-
cloudstack_client (0.
|
5
|
+
cloudstack_client (1.0.0.rc1)
|
7
6
|
|
8
7
|
PATH
|
9
8
|
remote: .
|
10
9
|
specs:
|
11
|
-
cloudstack-cli (0.
|
12
|
-
cloudstack_client (~> 0.
|
10
|
+
cloudstack-cli (1.0.0.rc1)
|
11
|
+
cloudstack_client (~> 1.0.0.rc1)
|
13
12
|
thor (~> 0.19.1)
|
14
13
|
|
15
14
|
GEM
|
data/cloudstack-cli.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.description = %q{cloudstack-cli is a CloudStack API command line client written in Ruby.}
|
12
12
|
gem.summary = %q{cloudstack-cli CloudStack API client}
|
13
13
|
gem.date = Time.now.utc.strftime("%Y-%m-%d")
|
14
|
-
gem.homepage = 'http://
|
14
|
+
gem.homepage = 'http://github.com/niwo/cloudstack-cli'
|
15
15
|
gem.license = 'MIT'
|
16
16
|
|
17
17
|
gem.required_ruby_version = '>= 1.9.3'
|
@@ -25,5 +25,5 @@ Gem::Specification.new do |gem|
|
|
25
25
|
gem.add_development_dependency('rake', '~> 10.4')
|
26
26
|
|
27
27
|
gem.add_dependency('thor', '~> 0.19.1')
|
28
|
-
gem.add_dependency('cloudstack_client', '~> 0.
|
28
|
+
gem.add_dependency('cloudstack_client', '~> 1.0.0.rc1')
|
29
29
|
end
|
data/lib/cloudstack-cli/base.rb
CHANGED
@@ -6,6 +6,7 @@ module CloudstackCli
|
|
6
6
|
class Base < Thor
|
7
7
|
include Thor::Actions
|
8
8
|
include CloudstackCli::Helper
|
9
|
+
include CloudstackCli::OptionResolver
|
9
10
|
|
10
11
|
attr_reader :config
|
11
12
|
|
@@ -21,14 +22,15 @@ module CloudstackCli
|
|
21
22
|
end
|
22
23
|
|
23
24
|
no_commands do
|
24
|
-
def client
|
25
|
+
def client
|
25
26
|
@config ||= load_configuration
|
26
|
-
@client ||= CloudstackClient::
|
27
|
+
@client ||= CloudstackClient::Client.new(
|
27
28
|
@config[:url],
|
28
29
|
@config[:api_key],
|
29
|
-
@config[:secret_key]
|
30
|
-
opts.merge({debug: options[:debug]})
|
30
|
+
@config[:secret_key]
|
31
31
|
)
|
32
|
+
@client.debug = true if options[:debug]
|
33
|
+
@client
|
32
34
|
end
|
33
35
|
|
34
36
|
def load_configuration(config_file = options[:config_file], env = options[:env])
|
@@ -61,18 +63,6 @@ module CloudstackCli
|
|
61
63
|
config
|
62
64
|
end
|
63
65
|
|
64
|
-
def find_project(name = options[:project], allow_all = true)
|
65
|
-
return nil unless name
|
66
|
-
if allow_all && %w(ALL -1).include?(name)
|
67
|
-
return {'id' => '-1'}
|
68
|
-
end
|
69
|
-
unless project = client.get_project(name)
|
70
|
-
say "Project '#{name}' not found", :red
|
71
|
-
exit 1
|
72
|
-
end
|
73
|
-
project
|
74
|
-
end
|
75
|
-
|
76
66
|
def filter_by(objects, key, value)
|
77
67
|
objects.select {|r| r[key].downcase == value.downcase}
|
78
68
|
end
|
data/lib/cloudstack-cli/cli.rb
CHANGED
@@ -15,7 +15,8 @@ module CloudstackCli
|
|
15
15
|
|
16
16
|
class_option :debug,
|
17
17
|
desc: 'Enable debug output',
|
18
|
-
type: :boolean
|
18
|
+
type: :boolean,
|
19
|
+
default: false
|
19
20
|
|
20
21
|
desc "version", "Print cloudstack-cli version number"
|
21
22
|
def version
|
@@ -45,6 +46,10 @@ module CloudstackCli
|
|
45
46
|
end
|
46
47
|
|
47
48
|
desc "command COMMAND [arg1=val1 arg2=val2...]", "Run a custom api command"
|
49
|
+
option :format, default: 'json',
|
50
|
+
enum: %w(json yaml), desc: "output format"
|
51
|
+
option :pretty_print, default: true, type: :boolean,
|
52
|
+
desc: "pretty print json output"
|
48
53
|
def command(command, *args)
|
49
54
|
params = {'command' => command}
|
50
55
|
args.each do |arg|
|
@@ -52,7 +57,12 @@ module CloudstackCli
|
|
52
57
|
params[arg[0]] = arg[1]
|
53
58
|
end
|
54
59
|
data = client.send_request(params)
|
55
|
-
|
60
|
+
output = if options[:format] == 'json'
|
61
|
+
options[:pretty_print] ? JSON.pretty_generate(data) : data.to_json
|
62
|
+
else
|
63
|
+
data.to_yaml
|
64
|
+
end
|
65
|
+
puts output
|
56
66
|
end
|
57
67
|
|
58
68
|
# require subcommands
|
@@ -79,8 +89,10 @@ module CloudstackCli
|
|
79
89
|
desc "project SUBCOMMAND ...ARGS", "Manage servers"
|
80
90
|
subcommand :project, Project
|
81
91
|
|
82
|
-
desc "
|
83
|
-
subcommand :
|
92
|
+
desc "virtual_machine SUBCOMMAND ...ARGS", "Manage virtual machines"
|
93
|
+
subcommand :virtual_machine, VirtualMachine
|
94
|
+
map 'vm' => :virtual_machine
|
95
|
+
map 'server' => :virtual_machine
|
84
96
|
|
85
97
|
desc "compute_offer SUBCOMMAND ...ARGS", "Manage offerings"
|
86
98
|
subcommand :compute_offer, ComputeOffer
|
@@ -8,11 +8,9 @@ class Account < CloudstackCli::Base
|
|
8
8
|
|
9
9
|
desc "show NAME", "show detailed infos about an account"
|
10
10
|
def show(name)
|
11
|
-
|
12
|
-
if accounts.size < 1
|
11
|
+
unless account = client.list_accounts(name: name).first
|
13
12
|
say "No account named \"#{name}\" found.", :red
|
14
13
|
else
|
15
|
-
account = accounts.first
|
16
14
|
account.delete 'user'
|
17
15
|
account['accounttype'] = "#{account['accounttype']} (#{TYPES[account['accounttype']]})"
|
18
16
|
table = account.map do |key, value|
|
@@ -24,7 +22,7 @@ class Account < CloudstackCli::Base
|
|
24
22
|
|
25
23
|
desc 'list', 'list accounts'
|
26
24
|
def list
|
27
|
-
accounts = client.list_accounts
|
25
|
+
accounts = client.list_accounts(listall: true)
|
28
26
|
if accounts.size < 1
|
29
27
|
puts "No accounts found."
|
30
28
|
else
|
@@ -7,6 +7,7 @@ class AffinityGroup < CloudstackCli::Base
|
|
7
7
|
option :listall
|
8
8
|
option :keyword
|
9
9
|
def list
|
10
|
+
resolve_account
|
10
11
|
affinity_groups = client.list_affinity_groups(options)
|
11
12
|
if affinity_groups.size < 1
|
12
13
|
say "No affinity groups found."
|
@@ -24,4 +25,4 @@ class AffinityGroup < CloudstackCli::Base
|
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
27
|
-
end
|
28
|
+
end
|
@@ -1,32 +1,33 @@
|
|
1
1
|
class Capacity < CloudstackCli::Base
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
2
|
+
CAPACITY_TYPES = {
|
3
|
+
0 => {name: "Memory", unit: "GB", divider: 1024.0**3},
|
4
|
+
1 => {name: "CPU", unit: "GHz", divider: 1000.0},
|
5
|
+
2 => {name: "Storage", unit: "TB", divider: 1024.0**4},
|
6
|
+
3 => {name: "Primary Storage", unit: "TB", divider: 1024.0**4},
|
7
|
+
4 => {name: "Public IP's"},
|
8
|
+
5 => {name: "Private IP's"},
|
9
|
+
6 => {name: "Secondary Storage", unit: "TB", divider: 1024.0**4},
|
10
|
+
7 => {name: "VLAN"},
|
11
|
+
8 => {name: "Direct Attached Public IP's"},
|
12
|
+
9 => {name: "Local Storage", unit: "TB", divider: 1024.0**4}
|
13
|
+
}
|
14
14
|
|
15
15
|
desc "list", "list system capacity"
|
16
|
-
option :zone
|
16
|
+
option :zone, desc: "lists clusters by zone"
|
17
17
|
option :type, desc: "specify type, see types for a list of types"
|
18
18
|
def list
|
19
|
-
|
20
|
-
|
19
|
+
resolve_zone if options[:zone]
|
20
|
+
capacities = client.list_capacity(options)
|
21
|
+
table = []
|
21
22
|
header = ["Zone", "Type", "Capacity Used", "Capacity Total", "Used"]
|
22
23
|
capacities.each do |c|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
table << [
|
25
|
+
c['zonename'],
|
26
|
+
CAPACITY_TYPES[c['type']][:name],
|
27
|
+
capacity_to_s(c, 'capacityused'),
|
28
|
+
capacity_to_s(c, 'capacitytotal'),
|
29
|
+
"#{c['percentused']}%"
|
30
|
+
]
|
30
31
|
end
|
31
32
|
table = table.sort {|a, b| [a[0], a[1]] <=> [b[0], b[1]]}.insert(0, header)
|
32
33
|
print_table table
|
@@ -44,14 +45,14 @@ class Capacity < CloudstackCli::Base
|
|
44
45
|
no_commands do
|
45
46
|
|
46
47
|
def capacity_to_s(capacity, entity)
|
47
|
-
value = CAPACITY_TYPES[capacity['type']][:divider] ?
|
48
|
-
(capacity[entity] / CAPACITY_TYPES[capacity['type']][:divider]).round(1) :
|
48
|
+
value = CAPACITY_TYPES[capacity['type']][:divider] ?
|
49
|
+
(capacity[entity] / CAPACITY_TYPES[capacity['type']][:divider]).round(1) :
|
49
50
|
capacity[entity]
|
50
|
-
CAPACITY_TYPES[capacity['type']][:unit] ?
|
51
|
+
CAPACITY_TYPES[capacity['type']][:unit] ?
|
51
52
|
"#{value} #{CAPACITY_TYPES[capacity['type']][:unit]}" :
|
52
53
|
value.to_s
|
53
54
|
end
|
54
55
|
|
55
56
|
end
|
56
57
|
|
57
|
-
end
|
58
|
+
end
|
@@ -1,16 +1,19 @@
|
|
1
1
|
class Cluster < CloudstackCli::Base
|
2
2
|
|
3
3
|
desc 'list', 'list clusters'
|
4
|
+
option :zone, desc: "lists clusters by zone"
|
4
5
|
def list
|
6
|
+
resolve_zone if options[:zone]
|
5
7
|
clusters = client.list_clusters(options)
|
6
8
|
if clusters.size < 1
|
7
9
|
say "No clusters found."
|
8
10
|
else
|
9
|
-
table = [%w(Name Pod_Name Type Zone)]
|
11
|
+
table = [%w(Name Pod_Name Type Zone State)]
|
10
12
|
clusters.each do |cluster|
|
11
13
|
table << [
|
12
14
|
cluster['name'], cluster['podname'],
|
13
|
-
cluster['hypervisortype'], cluster['zonename']
|
15
|
+
cluster['hypervisortype'], cluster['zonename'],
|
16
|
+
cluster['managedstate']
|
14
17
|
]
|
15
18
|
end
|
16
19
|
print_table table
|
@@ -18,4 +21,4 @@ class Cluster < CloudstackCli::Base
|
|
18
21
|
end
|
19
22
|
end
|
20
23
|
|
21
|
-
end
|
24
|
+
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
class ComputeOffer < CloudstackCli::Base
|
2
2
|
|
3
3
|
desc 'list', 'list compute offerings'
|
4
|
-
option :domain
|
4
|
+
option :domain, desc: "the domain associated with the compute offering"
|
5
5
|
def list
|
6
|
-
|
6
|
+
resolve_domain
|
7
|
+
offerings = client.list_service_offerings(options)
|
7
8
|
if offerings.size < 1
|
8
9
|
puts "No offerings found."
|
9
10
|
else
|
@@ -21,7 +22,7 @@ class ComputeOffer < CloudstackCli::Base
|
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
|
-
desc 'create NAME', 'create offering'
|
25
|
+
desc 'create NAME', 'create compute offering'
|
25
26
|
option :cpunumber, required: true
|
26
27
|
option :cpuspeed, required: true
|
27
28
|
option :displaytext, required: true
|
@@ -30,31 +31,32 @@ class ComputeOffer < CloudstackCli::Base
|
|
30
31
|
option :ha, type: :boolean
|
31
32
|
option :tags
|
32
33
|
def create(name)
|
34
|
+
resolve_domain
|
33
35
|
options[:name] = name
|
34
36
|
puts "OK" if client.create_offering(options)
|
35
37
|
end
|
36
38
|
|
37
|
-
desc 'delete ID', 'delete offering'
|
39
|
+
desc 'delete ID', 'delete compute offering'
|
38
40
|
def delete(id)
|
39
|
-
puts "OK" if client.
|
41
|
+
puts "OK" if client.delete_service_offering(id: id)
|
40
42
|
end
|
41
43
|
|
42
44
|
desc 'sort', 'sort by cpu and memory grouped by domain'
|
43
45
|
def sort
|
44
|
-
offerings = client.list_service_offerings
|
46
|
+
offerings = client.list_service_offerings
|
45
47
|
sortkey = -1
|
46
48
|
offerings.group_by{|o| o["domain"]}.each_value do |offers|
|
47
49
|
offers.sort {
|
48
50
|
|oa, ob| [oa["cpunumber"], oa["memory"]] <=> [ob["cpunumber"], ob["memory"]]
|
49
51
|
}.each do |offer|
|
50
52
|
puts "#{sortkey.abs} #{offer['domain']} - #{offer["displaytext"]}"
|
51
|
-
client.
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
client.update_service_offering(
|
54
|
+
id: offer['id'],
|
55
|
+
sortkey: sortkey
|
56
|
+
)
|
55
57
|
sortkey -= 1
|
56
58
|
end
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
60
|
-
end
|
62
|
+
end
|
@@ -1,19 +1,18 @@
|
|
1
1
|
class Configuration < CloudstackCli::Base
|
2
2
|
|
3
3
|
desc 'list', 'list configurations'
|
4
|
-
option :name
|
5
|
-
option :category
|
6
|
-
option :keyword
|
4
|
+
option :name, desc: "lists configuration by name"
|
5
|
+
option :category, desc: "lists configurations by category"
|
6
|
+
option :keyword, desc: "lists configuration by keyword"
|
7
7
|
def list
|
8
8
|
configs = client.list_configurations(options)
|
9
9
|
if configs.size < 1
|
10
10
|
say "No configuration found."
|
11
11
|
else
|
12
|
-
table = [%w(Name
|
12
|
+
table = [%w(Name Category Value)]
|
13
13
|
configs.each do |config|
|
14
14
|
table << [
|
15
15
|
config['name'],
|
16
|
-
config['scope'],
|
17
16
|
config['category'],
|
18
17
|
config['value']
|
19
18
|
]
|
@@ -23,4 +22,4 @@ class Configuration < CloudstackCli::Base
|
|
23
22
|
end
|
24
23
|
end
|
25
24
|
|
26
|
-
end
|
25
|
+
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
class DiskOffer < CloudstackCli::Base
|
2
2
|
|
3
3
|
desc 'list', 'list disk offerings'
|
4
|
-
option :domain
|
4
|
+
option :domain, desc: "the domain of the disk offering"
|
5
5
|
def list
|
6
|
-
|
6
|
+
resolve_domain
|
7
|
+
offerings = client.list_disk_offerings(options)
|
7
8
|
if offerings.size < 1
|
8
9
|
puts "No offerings found."
|
9
10
|
else
|
@@ -20,4 +21,4 @@ class DiskOffer < CloudstackCli::Base
|
|
20
21
|
say "Total number of offerings: #{offerings.size}"
|
21
22
|
end
|
22
23
|
end
|
23
|
-
end
|
24
|
+
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
class Domain < CloudstackCli::Base
|
2
2
|
|
3
|
-
desc 'list
|
4
|
-
def list
|
5
|
-
domains = client.list_domains
|
3
|
+
desc 'list', 'list domains'
|
4
|
+
def list
|
5
|
+
domains = client.list_domains
|
6
6
|
if domains.size < 1
|
7
7
|
puts "No domains found."
|
8
8
|
else
|
9
|
-
table = [
|
9
|
+
table = [%w(Name Path)]
|
10
10
|
domains.each do |domain|
|
11
11
|
table << [domain['name'], domain['path']]
|
12
12
|
end
|
@@ -14,5 +14,5 @@ class Domain < CloudstackCli::Base
|
|
14
14
|
say "Total number of domains: #{domains.size}"
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
18
|
-
end
|
17
|
+
|
18
|
+
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
class Host < CloudstackCli::Base
|
2
2
|
|
3
3
|
desc 'list', 'list hosts'
|
4
|
-
option :zone
|
4
|
+
option :zone, desc: "lists hosts by zone"
|
5
|
+
option :type, desc: "the host type"
|
5
6
|
def list
|
7
|
+
resolve_zone if options[:zone]
|
6
8
|
hosts = client.list_hosts(options)
|
7
9
|
if hosts.size < 1
|
8
10
|
say "No hosts found."
|
@@ -18,4 +20,16 @@ class Host < CloudstackCli::Base
|
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
|
-
|
23
|
+
desc 'show', 'show host details'
|
24
|
+
def show(name)
|
25
|
+
unless host = client.list_hosts(name: name).first
|
26
|
+
say "No host with name '#{name}' found."
|
27
|
+
else
|
28
|
+
table = host.map do |key, value|
|
29
|
+
[ set_color("#{key}:", :yellow), "#{value}" ]
|
30
|
+
end
|
31
|
+
print_table table
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -1,21 +1,28 @@
|
|
1
1
|
class IpAddress < CloudstackCli::Base
|
2
2
|
|
3
|
-
desc "release ID", "release public IP address"
|
4
|
-
def release(
|
5
|
-
|
3
|
+
desc "release ID [ID2 ID3]", "release public IP address by ID"
|
4
|
+
def release(*ids)
|
5
|
+
ids.each do |id|
|
6
|
+
say(" OK, released address with ID #{id}", :green) if client.disassociate_ip_address(id: id)
|
7
|
+
end
|
6
8
|
end
|
7
9
|
|
8
10
|
desc "ip_address assign NETWORK", "assign a public IP address"
|
9
11
|
option :project
|
10
12
|
def assign(network)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
resolve_project
|
14
|
+
options[:name] = network
|
15
|
+
unless network = client.list_networks(options).first
|
16
|
+
error "Network #{network} not found."
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
|
20
|
+
if address = client.associate_ip_address(networkid: network["id"])
|
21
|
+
say " OK. Assigned IP address:", :green
|
22
|
+
table = [%w(ID Address Account Zone)]
|
23
|
+
table << [address["id"], address["ipaddress"], address["account"], address["zonename"]]
|
24
|
+
print_table table
|
25
|
+
end
|
19
26
|
end
|
20
27
|
|
21
28
|
desc "list", "list public IP address"
|
@@ -23,17 +30,19 @@ class IpAddress < CloudstackCli::Base
|
|
23
30
|
option :account
|
24
31
|
option :listall
|
25
32
|
def list
|
26
|
-
|
33
|
+
resolve_account
|
34
|
+
resolve_project
|
27
35
|
addresses = client.list_public_ip_addresses(options)
|
28
36
|
if addresses.size < 1
|
29
37
|
say "No ip addresses found."
|
30
38
|
else
|
39
|
+
table = [%w(ID Address Account Zone)]
|
31
40
|
addresses.each do |address|
|
32
|
-
table << [address["ipaddress"], address["account"], address["zonename"]]
|
41
|
+
table << [address["id"], address["ipaddress"], address["account"], address["zonename"]]
|
33
42
|
end
|
34
43
|
print_table table
|
35
44
|
say "Total number of addresses: #{addresses.size}"
|
36
45
|
end
|
37
46
|
end
|
38
47
|
|
39
|
-
end
|
48
|
+
end
|
@@ -1,38 +1,40 @@
|
|
1
1
|
class Iso < CloudstackCli::Base
|
2
2
|
|
3
|
-
desc 'list
|
3
|
+
desc 'list', "list iso's"
|
4
4
|
option :project
|
5
5
|
option :zone
|
6
6
|
option :account
|
7
|
-
option :
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
isos = client.list_isos(
|
16
|
-
filter: type,
|
17
|
-
project_id: project ? project['id'] : nil,
|
18
|
-
zone_id: zone ? zone['id'] : nil
|
19
|
-
)
|
7
|
+
option :type,
|
8
|
+
enum: %w(featured self self-executable executable community all)
|
9
|
+
def list
|
10
|
+
resolve_project
|
11
|
+
resolve_zone
|
12
|
+
resolve_account
|
13
|
+
options[:isofilter] = options[:type]
|
14
|
+
options.delete :type
|
15
|
+
isos = client.list_isos(options)
|
20
16
|
if isos.size < 1
|
21
|
-
puts "No iso's found"
|
17
|
+
puts "No iso's found."
|
22
18
|
else
|
23
|
-
table = [
|
19
|
+
table = [%w(Name Zone Bootable Public Featured)]
|
24
20
|
isos.each do |iso|
|
25
|
-
table << [
|
21
|
+
table << [
|
22
|
+
iso['name'],
|
23
|
+
iso['zonename'],
|
24
|
+
iso['bootable'],
|
25
|
+
iso['ispublic'],
|
26
|
+
iso['isfeatured']
|
27
|
+
]
|
26
28
|
end
|
27
29
|
print_table(table)
|
28
30
|
say "Total number of isos: #{isos.size}"
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
32
|
-
desc 'detach
|
34
|
+
desc 'detach VM_ID', "detaches any ISO file (if any) currently attached to a virtual machine"
|
33
35
|
def detach(vm_id)
|
34
|
-
client.detach_iso(vm_id, {
|
35
|
-
say "OK", :green
|
36
|
+
client.detach_iso({virtualmachine_id: vm_id}, {sync: true})
|
37
|
+
say " OK", :green
|
36
38
|
end
|
37
39
|
|
38
|
-
end
|
40
|
+
end
|
@@ -2,13 +2,19 @@ class Job < CloudstackCli::Base
|
|
2
2
|
|
3
3
|
desc 'list', 'list async jobs'
|
4
4
|
def list
|
5
|
-
jobs = client.
|
5
|
+
jobs = client.list_async_jobs
|
6
6
|
if jobs.size < 1
|
7
7
|
say "No jobs found."
|
8
8
|
else
|
9
|
-
table = [
|
9
|
+
table = [%w(Command Created Status ID User-ID)]
|
10
10
|
jobs.each do |job|
|
11
|
-
table << [
|
11
|
+
table << [
|
12
|
+
job['cmd'].split('.')[-1],
|
13
|
+
job['created'],
|
14
|
+
job['jobstatus'],
|
15
|
+
job['jobid'],
|
16
|
+
job['userid']
|
17
|
+
]
|
12
18
|
end
|
13
19
|
print_table table
|
14
20
|
end
|
@@ -16,15 +22,11 @@ class Job < CloudstackCli::Base
|
|
16
22
|
|
17
23
|
desc 'query ID', 'query async job'
|
18
24
|
def query(id)
|
19
|
-
job = client.
|
20
|
-
job.
|
21
|
-
|
22
|
-
if value.is_a?(Hash)
|
23
|
-
value.each {|subkey, subvalue| say " #{subkey} : #{subvalue}"}
|
24
|
-
else
|
25
|
-
say(value)
|
26
|
-
end
|
25
|
+
job = client.query_async_job_result(jobid: id)
|
26
|
+
table = job.map do |key, value|
|
27
|
+
[ set_color("#{key}:", :yellow), "#{value}" ]
|
27
28
|
end
|
29
|
+
print_table table
|
28
30
|
end
|
29
|
-
|
30
|
-
end
|
31
|
+
|
32
|
+
end
|