cloudstack-cli 0.15.1 → 1.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,18 +1,22 @@
|
|
1
1
|
class LoadBalancer < CloudstackCli::Base
|
2
|
-
|
2
|
+
|
3
3
|
desc "list", "list load balancer rules"
|
4
4
|
option :project
|
5
5
|
def list
|
6
|
-
|
7
|
-
rules = client.list_load_balancer_rules(
|
8
|
-
{ project_name: project ? project['name'] : nil }
|
9
|
-
)
|
6
|
+
resolve_project
|
7
|
+
rules = client.list_load_balancer_rules(options)
|
10
8
|
if rules.size < 1
|
11
9
|
puts "No load balancer rules found."
|
12
10
|
else
|
13
|
-
table = [
|
11
|
+
table = [%w(Name Public-IP Public-Port Private-Port Algorithm)]
|
14
12
|
rules.each do |rule|
|
15
|
-
table << [
|
13
|
+
table << [
|
14
|
+
rule['name'],
|
15
|
+
rule['publicip'],
|
16
|
+
rule['publicport'],
|
17
|
+
rule['privateport'],
|
18
|
+
rule['algorithm']
|
19
|
+
]
|
16
20
|
end
|
17
21
|
print_table table
|
18
22
|
say "Total number of rules: #{rules.count}"
|
@@ -24,31 +28,65 @@ class LoadBalancer < CloudstackCli::Base
|
|
24
28
|
option :ip, required: true
|
25
29
|
option :public_port, required: true
|
26
30
|
option :private_port
|
31
|
+
option :algorithm,
|
32
|
+
enum: %w(source roundrobin leastconn),
|
33
|
+
default: "roundrobin"
|
34
|
+
option :open_firewall, type: :boolean
|
35
|
+
option :cidr_list
|
36
|
+
option :protocol
|
27
37
|
def create(name)
|
28
|
-
|
38
|
+
resolve_project
|
39
|
+
ip_options = {ip_address: options[:ip]}
|
40
|
+
ip_options[:project_id] = options[:project_id] if options[:project_id]
|
41
|
+
unless ip = client.list_public_ip_addresses(ip_options).first
|
42
|
+
say "Error: IP #{options[:ip]} not found.", :red
|
43
|
+
exit 1
|
44
|
+
end
|
29
45
|
options[:private_port] = options[:public_port] if options[:private_port] == nil
|
46
|
+
options[:name] = name
|
47
|
+
options[:publicip_id] = ip['id']
|
30
48
|
say "Create rule #{name}...", :yellow
|
31
|
-
rule = client.create_load_balancer_rule(
|
32
|
-
|
33
|
-
options[:ip],
|
34
|
-
options[:private_port],
|
35
|
-
options[:public_port],
|
36
|
-
)
|
37
|
-
say "OK!", :green
|
49
|
+
rule = client.create_load_balancer_rule(options)
|
50
|
+
say " OK!", :green
|
38
51
|
end
|
39
52
|
|
40
|
-
desc "add NAME", "assign servers to balancer rule"
|
41
|
-
option :servers,
|
53
|
+
desc "add LB-NAME", "assign servers to balancer rule"
|
54
|
+
option :servers,
|
55
|
+
required: true,
|
56
|
+
type: :array,
|
57
|
+
desc: "server names"
|
58
|
+
option :project
|
42
59
|
def add(name)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
60
|
+
resolve_project
|
61
|
+
default_args = options.dup
|
62
|
+
default_args.delete(:servers)
|
63
|
+
|
64
|
+
servers = options[:servers].map do |server|
|
65
|
+
client.list_virtual_machines(default_args.merge(name: server)).first
|
66
|
+
end.compact
|
67
|
+
|
68
|
+
unless servers.size > 0
|
69
|
+
say "No servers found with the following name(s): #{options[:servers].join(', ')}", :yellow
|
70
|
+
exit 1
|
71
|
+
end
|
72
|
+
|
73
|
+
unless rule = client.list_load_balancer_rules(default_args.merge(name: name)).first
|
74
|
+
say "Error: LB rule with name #{name} not found.", :red
|
75
|
+
exit 1
|
76
|
+
end
|
77
|
+
|
78
|
+
say "Add #{servers.map{|s| s['name']}.join(', ')} to rule #{name} ", :yellow
|
79
|
+
lb = client.assign_to_load_balancer_rule(
|
80
|
+
{
|
81
|
+
id: rule['id'],
|
82
|
+
virtualmachine_ids: servers.map{|s| s['id']}.join(',')
|
83
|
+
}.merge(default_args)
|
47
84
|
)
|
48
|
-
|
49
|
-
|
85
|
+
|
86
|
+
if lb['success']
|
87
|
+
say " OK.", :green
|
50
88
|
else
|
51
|
-
say "Failed
|
89
|
+
say " Failed.", :red
|
52
90
|
end
|
53
91
|
end
|
54
|
-
end
|
92
|
+
end
|
@@ -3,37 +3,19 @@ class Network < CloudstackCli::Base
|
|
3
3
|
desc "list", "list networks"
|
4
4
|
option :project, desc: 'the project name of the network'
|
5
5
|
option :account, desc: 'the owner of the network'
|
6
|
-
option :zone, desc: '
|
6
|
+
option :zone, desc: 'the name of the zone the network belongs to'
|
7
7
|
option :type, desc: 'the type of the network'
|
8
8
|
option :showid, type: :boolean, desc: 'show the network id'
|
9
9
|
option :showvlan, type: :boolean, desc: 'show the VLAN'
|
10
10
|
def list
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
say "Zone '#{options[:zone]}' not found.", :red
|
15
|
-
exit 1
|
16
|
-
end
|
17
|
-
zone_id = zone['id']
|
18
|
-
end
|
19
|
-
|
20
|
-
networks = []
|
21
|
-
if project
|
22
|
-
networks = client.list_networks(project_id: project['id'], zone_id: zone_id)
|
23
|
-
elsif options[:account]
|
24
|
-
networks = client.list_networks(account: options[:account], zone_id: zone_id)
|
25
|
-
else
|
26
|
-
networks = client.list_networks(zone_id: zone_id)
|
27
|
-
networks += client.list_networks(project_id: -1, zone_id: zone_id)
|
28
|
-
end
|
29
|
-
|
30
|
-
if options[:type]
|
31
|
-
networks = filter_by(networks, 'type', options[:type])
|
32
|
-
end
|
11
|
+
resolve_zone if options[:zone]
|
12
|
+
resolve_project
|
13
|
+
networks = client.list_networks(options)
|
33
14
|
|
34
15
|
if networks.size < 1
|
35
16
|
puts "No networks found."
|
36
17
|
else
|
18
|
+
networks = filter_by(networks, 'type', options[:type]) if options[:type]
|
37
19
|
table = [%w(Name Displaytext Account/Project Zone Domain State Type Offering)]
|
38
20
|
table[0] << "ID" if options[:showid]
|
39
21
|
table[0] << "VLAN" if options[:showvlan]
|
@@ -56,72 +38,45 @@ class Network < CloudstackCli::Base
|
|
56
38
|
end
|
57
39
|
end
|
58
40
|
|
59
|
-
desc "default", "get the default network"
|
60
|
-
option :zone
|
61
|
-
def default
|
62
|
-
network = client.get_default_network(options[:zone])
|
63
|
-
unless network
|
64
|
-
puts "No default network found."
|
65
|
-
else
|
66
|
-
table = [["Name", "Displaytext", "Domain", "Zone"]]
|
67
|
-
table[0] << "ID" if options[:showid]
|
68
|
-
table << [
|
69
|
-
network["name"],
|
70
|
-
network["displaytext"],
|
71
|
-
network["domain"],
|
72
|
-
network["zonename"]
|
73
|
-
]
|
74
|
-
table[-1] << network["id"] if options[:showid]
|
75
|
-
print_table table
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
41
|
desc "show NAME", "show detailed infos about a network"
|
80
42
|
option :project
|
81
43
|
def show(name)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
project = find_project
|
87
|
-
options[:project_id] = project['id']
|
88
|
-
end
|
44
|
+
resolve_project
|
45
|
+
unless network = client.list_networks(options).find {|n| n['name'] == name}
|
46
|
+
say "Error: No network with name '#{name}' found.", :red
|
47
|
+
exit
|
89
48
|
end
|
90
|
-
|
91
|
-
|
92
|
-
else
|
93
|
-
table = server.map do |key, value|
|
94
|
-
[ set_color("#{key}:", :yellow), "#{value}" ]
|
95
|
-
end
|
96
|
-
print_table table
|
49
|
+
table = network.map do |key, value|
|
50
|
+
[ set_color("#{key}:", :yellow), "#{value}" ]
|
97
51
|
end
|
52
|
+
print_table table
|
98
53
|
end
|
99
54
|
|
100
55
|
desc "restart NAME", "restart network"
|
101
|
-
option :cleanup, type: :boolean, default:
|
56
|
+
option :cleanup, type: :boolean, default: false
|
57
|
+
option :project
|
102
58
|
def restart(name)
|
103
|
-
|
104
|
-
network = client.
|
105
|
-
|
106
|
-
say "Network #{name} not found."
|
59
|
+
resolve_project
|
60
|
+
unless network = client.list_networks(options).find {|n| n['name'] == name}
|
61
|
+
say "Network with name '#{name}' not found."
|
107
62
|
exit 1
|
108
63
|
end
|
109
64
|
if yes? "Restart network \"#{network['name']}\" (cleanup=#{options[:cleanup]})?"
|
110
|
-
|
65
|
+
client.restart_network(id: network['id'], cleanup: options[:cleanup])
|
111
66
|
end
|
112
67
|
end
|
113
68
|
|
114
69
|
desc "delete NAME", "delete network"
|
70
|
+
option :project
|
115
71
|
def delete(name)
|
116
|
-
|
117
|
-
network = client.
|
118
|
-
|
119
|
-
say "Network \"#{name}\" not found."
|
72
|
+
resolve_project
|
73
|
+
unless network = client.list_networks(options).find {|n| n['name'] == name}
|
74
|
+
say "Error: Network with name '#{name}' not found.", :red
|
120
75
|
exit 1
|
121
76
|
end
|
122
|
-
if yes? "
|
123
|
-
|
77
|
+
if yes? "Delete network \"#{network['name']}\"?"
|
78
|
+
client.delete_network(id: network['id'])
|
124
79
|
end
|
125
80
|
end
|
126
81
|
|
127
|
-
end
|
82
|
+
end
|
@@ -3,8 +3,8 @@ class PhysicalNetwork < CloudstackCli::Base
|
|
3
3
|
desc "list", "list physical networks"
|
4
4
|
option :project
|
5
5
|
def list
|
6
|
-
|
7
|
-
networks = client.list_physical_networks
|
6
|
+
resolve_project
|
7
|
+
networks = client.list_physical_networks(options)
|
8
8
|
zones = client.list_zones
|
9
9
|
if networks.size < 1
|
10
10
|
puts "No networks found"
|
@@ -14,7 +14,7 @@ class PhysicalNetwork < CloudstackCli::Base
|
|
14
14
|
table << [
|
15
15
|
network["name"],
|
16
16
|
network["state"],
|
17
|
-
zones.select{|zone| zone['id'] == network["zoneid"]}.first["name"],
|
17
|
+
zones.select{|zone| zone['id'] == network["zoneid"]}.first["name"],
|
18
18
|
network["id"]
|
19
19
|
]
|
20
20
|
end
|
@@ -23,4 +23,4 @@ class PhysicalNetwork < CloudstackCli::Base
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
end
|
26
|
+
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
class Pod < CloudstackCli::Base
|
2
2
|
|
3
3
|
desc 'list', 'list pods'
|
4
|
+
option :zone
|
4
5
|
def list
|
6
|
+
resolve_zone
|
5
7
|
pods = client.list_pods(options)
|
6
8
|
if pods.size < 1
|
7
9
|
say "No pods found."
|
@@ -18,4 +20,4 @@ class Pod < CloudstackCli::Base
|
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
|
-
end
|
23
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class PortRule < CloudstackCli::Base
|
2
2
|
|
3
|
-
desc "create
|
3
|
+
desc "create VM-NAME", "create portforwarding rules for a given VM"
|
4
4
|
option :rules, type: :array,
|
5
5
|
required: true,
|
6
6
|
desc: "Port Forwarding Rules [public_ip]:port ...",
|
@@ -9,38 +9,44 @@ class PortRule < CloudstackCli::Base
|
|
9
9
|
option :project
|
10
10
|
option :keyword, desc: "list by keyword"
|
11
11
|
def create(server_name)
|
12
|
-
|
13
|
-
unless server = client.
|
12
|
+
resolve_project
|
13
|
+
unless server = client.list_virtual_machines(name: server_name, project_id: options[:project_id]).first
|
14
14
|
error "Server #{server_name} not found."
|
15
15
|
exit 1
|
16
16
|
end
|
17
|
-
frontendip = nil
|
18
17
|
options[:rules].each do |pf_rule|
|
19
18
|
ip = pf_rule.split(":")[0]
|
20
|
-
|
21
|
-
ip_addr = client.
|
22
|
-
|
23
|
-
say "Error: IP #{ip} not found.", :red
|
19
|
+
unless ip == ''
|
20
|
+
unless ip_addr = client.list_public_ip_addresses(ipaddress: ip, project_id: options[:project_id]).first
|
21
|
+
say "Error: IP #{ip} not found.", :yellow
|
24
22
|
next
|
25
23
|
end
|
26
24
|
else
|
27
|
-
|
28
|
-
|
25
|
+
say "Assign a new IP address ", :yellow
|
26
|
+
say(" OK", :green) if ip_addr = client.associate_ip_address(
|
27
|
+
networkid: client.list_networks(
|
28
|
+
project_id: options[:project_id]
|
29
|
+
).find {|n| n['name'] == options[:network]}['id'],
|
30
|
+
project_id: options[:project_id]
|
29
31
|
)
|
30
32
|
end
|
31
33
|
port = pf_rule.split(":")[1]
|
32
|
-
|
33
|
-
say
|
34
|
-
|
35
|
-
|
34
|
+
say "Create port forwarding rule #{ip_addr["ipaddress"]}:#{port} for server #{server_name} ", :yellow
|
35
|
+
say(" OK.", :green) if client.create_port_forwarding_rule(
|
36
|
+
ipaddress_id: ip_addr["id"],
|
37
|
+
public_port: port,
|
38
|
+
private_port: port,
|
39
|
+
virtualmachine_id: server["id"],
|
40
|
+
protocol: "TCP"
|
41
|
+
)
|
36
42
|
end
|
37
43
|
end
|
38
44
|
|
39
45
|
desc "list", "list portforwarding rules"
|
40
46
|
option :project
|
41
47
|
def list
|
42
|
-
|
43
|
-
rules = client.list_port_forwarding_rules(
|
48
|
+
resolve_project
|
49
|
+
rules = client.list_port_forwarding_rules(options)
|
44
50
|
if rules.size < 1
|
45
51
|
puts "No rules found."
|
46
52
|
else
|
@@ -69,4 +75,4 @@ class PortRule < CloudstackCli::Base
|
|
69
75
|
end
|
70
76
|
end
|
71
77
|
end
|
72
|
-
end
|
78
|
+
end
|
@@ -2,8 +2,8 @@ class Project < CloudstackCli::Base
|
|
2
2
|
|
3
3
|
desc "show NAME", "show detailed infos about a project"
|
4
4
|
def show(name)
|
5
|
-
unless project = client.
|
6
|
-
|
5
|
+
unless project = client.list_projects(name: name, listall: true).first
|
6
|
+
say "Error: No project with name '#{name}' found.", :red
|
7
7
|
else
|
8
8
|
table = project.map do |key, value|
|
9
9
|
[ set_color("#{key}", :yellow), "#{value}" ]
|
@@ -14,7 +14,7 @@ class Project < CloudstackCli::Base
|
|
14
14
|
|
15
15
|
desc "list", "list projects"
|
16
16
|
def list
|
17
|
-
projects = client.list_projects
|
17
|
+
projects = client.list_projects(listall: true)
|
18
18
|
if projects.size < 1
|
19
19
|
puts "No projects found."
|
20
20
|
else
|
@@ -29,25 +29,24 @@ class Project < CloudstackCli::Base
|
|
29
29
|
|
30
30
|
desc "list_accounts PROJECT_NAME", "show accounts belonging to a project"
|
31
31
|
def list_accounts(name)
|
32
|
-
unless project = client.
|
33
|
-
say "No project with name #{name} found."
|
32
|
+
unless project = client.list_projects(name: name, listall: true).first
|
33
|
+
say "Error: No project with name '#{name}' found.", :red
|
34
34
|
else
|
35
|
-
accounts = client.list_project_accounts(project['id']
|
35
|
+
accounts = client.list_project_accounts(project_id: project['id'])
|
36
36
|
if accounts.size < 1
|
37
37
|
say "No project accounts found."
|
38
38
|
else
|
39
|
-
table = [%w(Name Type Domain
|
39
|
+
table = [%w(Account-Name Account-Type Role Domain)]
|
40
40
|
accounts.each do |account|
|
41
41
|
table << [
|
42
|
-
account['
|
43
|
-
TYPES[account['accounttype']],
|
44
|
-
account['
|
45
|
-
account['
|
42
|
+
account['account'],
|
43
|
+
Account::TYPES[account['accounttype']],
|
44
|
+
account['role'],
|
45
|
+
account['domain']
|
46
46
|
]
|
47
47
|
end
|
48
48
|
print_table table
|
49
49
|
say "Total number of project accounts: #{accounts.size}"
|
50
|
-
print_table table
|
51
50
|
end
|
52
51
|
end
|
53
52
|
end
|
@@ -19,6 +19,8 @@ class ResourceLimit < CloudstackCli::Base
|
|
19
19
|
option :project
|
20
20
|
option :type, desc: "specify type, see types for a list of types"
|
21
21
|
def list
|
22
|
+
resolve_account
|
23
|
+
resolve_project
|
22
24
|
limits = client.list_resource_limits(options)
|
23
25
|
table = []
|
24
26
|
header = options[:project] ? ["Project"] : ["Account"]
|
@@ -42,7 +44,9 @@ class ResourceLimit < CloudstackCli::Base
|
|
42
44
|
option :project, desc: "refresh resource for a specified project"
|
43
45
|
option :type, desc: "specify type, see types for a list of types"
|
44
46
|
def refresh
|
45
|
-
|
47
|
+
resolve_domain
|
48
|
+
resolve_account
|
49
|
+
resolve_project
|
46
50
|
options[:resource_type] = options[:type] if options[:type]
|
47
51
|
|
48
52
|
unless ['domain_id', 'account', 'project'].any? {|k| options.key?(k)}
|
@@ -69,7 +73,9 @@ class ResourceLimit < CloudstackCli::Base
|
|
69
73
|
desc: "Maximum resource limit.",
|
70
74
|
required: true
|
71
75
|
def update
|
72
|
-
|
76
|
+
resolve_domain
|
77
|
+
resolve_account
|
78
|
+
resolve_project
|
73
79
|
options[:resource_type] = options[:type]
|
74
80
|
|
75
81
|
unless ['domain_id', 'account', 'project'].any? {|k| options.key?(k)}
|
@@ -106,16 +112,6 @@ class ResourceLimit < CloudstackCli::Base
|
|
106
112
|
value.to_s
|
107
113
|
end
|
108
114
|
|
109
|
-
def set_domain_id
|
110
|
-
domains = client.list_domains(options[:domain])
|
111
|
-
if domains.size < 1
|
112
|
-
say "Domain #{options[:domain]} not found.", :red
|
113
|
-
exit -1
|
114
|
-
else
|
115
|
-
options[:domain_id] = domains.first['id']
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
115
|
end
|
120
116
|
|
121
117
|
end
|
@@ -7,35 +7,26 @@ class Router < CloudstackCli::Base
|
|
7
7
|
option :status, desc: "the status of the router"
|
8
8
|
option :redundant_state, desc: "the state of redundant virtual router",
|
9
9
|
enum: %w(master backup fault unknown)
|
10
|
-
option :listall, type: :boolean, desc: "list all routers"
|
10
|
+
option :listall, type: :boolean, desc: "list all routers", default: true
|
11
11
|
option :showid, type: :boolean, desc: "display the router ID"
|
12
|
-
|
12
|
+
option :reverse, type: :boolean, default: false, desc: "reverse listing of routers"
|
13
13
|
option :command,
|
14
14
|
desc: "command to execute for each router",
|
15
15
|
enum: %w(START STOP REBOOT)
|
16
|
-
|
17
|
-
|
16
|
+
option :concurrency, type: :numeric, default: 10, aliases: '-C',
|
17
|
+
desc: "number of concurrent command to execute"
|
18
18
|
def list
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
status: options[:status],
|
25
|
-
zone: options[:zone]
|
26
|
-
}
|
27
|
-
)
|
19
|
+
resolve_project
|
20
|
+
resolve_zone
|
21
|
+
resolve_account
|
22
|
+
|
23
|
+
routers = client.list_routers(options)
|
28
24
|
|
29
25
|
if options[:listall]
|
30
26
|
projects = client.list_projects
|
31
27
|
projects.each do |project|
|
32
28
|
routers = routers + client.list_routers(
|
33
|
-
|
34
|
-
account: options[:account],
|
35
|
-
projectid: project['id'],
|
36
|
-
status: options[:status],
|
37
|
-
zone: options[:zone]
|
38
|
-
}
|
29
|
+
options.merge(projectid: project['id'])
|
39
30
|
)
|
40
31
|
end
|
41
32
|
end
|
@@ -54,69 +45,69 @@ class Router < CloudstackCli::Base
|
|
54
45
|
exit 1
|
55
46
|
end
|
56
47
|
exit unless yes?("\n#{command.capitalize} the router(s) above? [y/N]:", :magenta)
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
48
|
+
routers.each_slice(options[:concurrency]) do | batch |
|
49
|
+
jobs = batch.map do |router|
|
50
|
+
{id: client.send("#{command}_router", router['id'], async: false)['jobid'], name: "#{command.capitalize} router #{router['name']}"}
|
51
|
+
end
|
52
|
+
puts
|
53
|
+
watch_jobs(jobs)
|
54
|
+
end
|
64
55
|
end
|
65
56
|
end
|
66
57
|
|
67
58
|
desc "stop NAME [NAME2 ..]", "stop virtual router(s)"
|
68
|
-
option :force, desc: "stop without
|
59
|
+
option :force, desc: "stop without confirmation", type: :boolean, aliases: '-f'
|
69
60
|
def stop(*names)
|
70
61
|
routers = names.map {|name| get_router(name)}
|
71
62
|
print_routers(routers)
|
72
63
|
exit unless options[:force] || yes?("\nStop router(s) above? [y/N]:", :magenta)
|
73
64
|
jobs = routers.map do |router|
|
74
|
-
{id: client.stop_router(router['id'],
|
65
|
+
{id: client.stop_router({id: router['id']}, {sync: true})['jobid'], name: "Stop router #{router['name']}"}
|
75
66
|
end
|
76
67
|
puts
|
77
68
|
watch_jobs(jobs)
|
78
69
|
end
|
79
70
|
|
80
71
|
desc "start NAME [NAME2 ..]", "start virtual router(s)"
|
81
|
-
option :force, desc: "start without
|
72
|
+
option :force, desc: "start without confirmation", type: :boolean, aliases: '-f'
|
82
73
|
def start(*names)
|
83
74
|
routers = names.map {|name| get_router(name)}
|
84
75
|
print_routers(routers)
|
85
76
|
exit unless options[:force] || yes?("\nStart router(s) above? [y/N]:", :magenta)
|
86
77
|
jobs = routers.map do |router|
|
87
|
-
{id: client.start_router(router['id'],
|
78
|
+
{id: client.start_router({id: router['id']}, {sync: true})['jobid'], name: "Start router #{router['name']}"}
|
88
79
|
end
|
89
80
|
puts
|
90
81
|
watch_jobs(jobs)
|
91
82
|
end
|
92
83
|
|
93
84
|
desc "reboot NAME [NAME2 ..]", "reboot virtual router(s)"
|
94
|
-
option :force, desc: "start without
|
85
|
+
option :force, desc: "start without confirmation", type: :boolean, aliases: '-f'
|
95
86
|
def reboot(*names)
|
96
|
-
routers = names.map {|name|
|
87
|
+
routers = names.map {|name| client.list_routers(name: name).first}
|
97
88
|
print_routers(routers)
|
98
89
|
exit unless options[:force] || yes?("\nReboot router(s) above? [y/N]:", :magenta)
|
99
90
|
jobs = routers.map do |router|
|
100
|
-
{id: client.reboot_router(router['id'],
|
91
|
+
{id: client.reboot_router({id: router['id']}, {sync: true})['jobid'], name: "Reboot router #{router['name']}"}
|
101
92
|
end
|
102
93
|
puts
|
103
94
|
watch_jobs(jobs)
|
104
95
|
end
|
105
96
|
|
106
|
-
desc "
|
107
|
-
option :force, desc: "
|
108
|
-
def
|
97
|
+
desc "stop_start NAME [NAME2 ..]", "stops and starts virtual router(s)"
|
98
|
+
option :force, desc: "stop_start without confirmation", type: :boolean, aliases: '-f'
|
99
|
+
def stop_start(*names)
|
109
100
|
routers = names.map {|name| get_router(name)}
|
110
101
|
print_routers(routers)
|
111
102
|
exit unless options[:force] || yes?("\nRestart router(s) above? [y/N]:", :magenta)
|
112
103
|
jobs = routers.map do |router|
|
113
|
-
{id: client.stop_router(router['id'],
|
104
|
+
{id: client.stop_router({id: router['id']}, {sync: true})['jobid'], name: "Stop router #{router['name']}"}
|
114
105
|
end
|
115
106
|
puts
|
116
107
|
watch_jobs(jobs)
|
117
108
|
|
118
109
|
jobs = routers.map do |router|
|
119
|
-
{id: client.start_router(router['id'],
|
110
|
+
{id: client.start_router({id: router['id']}, {sync: true})['jobid'], name: "Start router #{router['name']}"}
|
120
111
|
end
|
121
112
|
puts
|
122
113
|
watch_jobs(jobs)
|
@@ -131,7 +122,7 @@ class Router < CloudstackCli::Base
|
|
131
122
|
print_routers(routers)
|
132
123
|
exit unless options[:force] || yes?("\nDestroy router(s) above? [y/N]:", :magenta)
|
133
124
|
jobs = routers.map do |router|
|
134
|
-
{id: client.destroy_router(router['id'],
|
125
|
+
{id: client.destroy_router({id: router['id']}, {sync: true})['jobid'], name: "Destroy router #{router['name']}"}
|
135
126
|
end
|
136
127
|
puts
|
137
128
|
watch_jobs(jobs)
|
@@ -140,8 +131,8 @@ class Router < CloudstackCli::Base
|
|
140
131
|
no_commands do
|
141
132
|
|
142
133
|
def get_router(name)
|
143
|
-
unless router = client.
|
144
|
-
unless router = client.
|
134
|
+
unless router = client.list_routers(name: name, listall: true).first
|
135
|
+
unless router = client.list_routers(name: name, project_id: -1).first
|
145
136
|
say "Can't find router with name #{name}.", :red
|
146
137
|
exit 1
|
147
138
|
end
|
@@ -154,7 +145,7 @@ class Router < CloudstackCli::Base
|
|
154
145
|
say "No routers found."
|
155
146
|
else
|
156
147
|
table = [[
|
157
|
-
'Name', 'Zone', 'Account', 'Project', 'Redundant-State', 'IP', 'Linklocal IP', 'Status', 'Redundant', 'ID'
|
148
|
+
'Name', 'Zone', 'Account', 'Project', 'Redundant-State', 'IP', 'Linklocal IP', 'Status', 'Redundant', 'OfferingID', 'Offering', 'ID'
|
158
149
|
]]
|
159
150
|
table[0].delete('ID') unless options[:showid]
|
160
151
|
routers.each do |router|
|
@@ -168,6 +159,8 @@ class Router < CloudstackCli::Base
|
|
168
159
|
router["linklocalip"],
|
169
160
|
router["state"],
|
170
161
|
router["isredundantrouter"],
|
162
|
+
router["serviceofferingid"],
|
163
|
+
router["serviceofferingname"],
|
171
164
|
router["id"]
|
172
165
|
]
|
173
166
|
table[-1].delete_at(-1) unless table[0].index "ID"
|
@@ -4,8 +4,11 @@ class Snapshot < CloudstackCli::Base
|
|
4
4
|
option :account
|
5
5
|
option :project
|
6
6
|
option :domain
|
7
|
-
option :listall
|
7
|
+
option :listall, default: true
|
8
8
|
def list
|
9
|
+
resolve_account
|
10
|
+
resolve_project
|
11
|
+
resolve_domain
|
9
12
|
snapshots = client.list_snapshots(options)
|
10
13
|
if snapshots.size < 1
|
11
14
|
say "No snapshots found."
|
@@ -22,4 +25,4 @@ class Snapshot < CloudstackCli::Base
|
|
22
25
|
end
|
23
26
|
end
|
24
27
|
|
25
|
-
end
|
28
|
+
end
|