rubiojr-domctl 0.2.20090414130028 → 0.2.20090415143011
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -0
- data/README.txt +1 -1
- data/bin/domctl +31 -14
- data/domctl.gemspec +2 -2
- data/lib/domctl.rb +1 -1
- data/lib/domctl/commands/cluster_nodes.rb +8 -0
- data/lib/domctl/commands/dom0_info.rb +17 -2
- data/lib/domctl/commands/domu_info.rb +41 -31
- data/lib/domctl/commands/farm_info.rb +57 -14
- data/lib/domctl/commands/help.rb +24 -18
- data/lib/domctl/commands/list_running.rb +48 -32
- data/lib/domctl/commands/locate_domu.rb +26 -13
- data/lib/domctl/commands/mem_info.rb +31 -5
- data/lib/domctl/commands/oldest_domus.rb +14 -2
- data/lib/domctl/commands/recent_domus.rb +17 -4
- data/lib/domctl/commands/show_vifs.rb +50 -39
- data/lib/domctl/config.rb +2 -2
- data/scripts/newrelease +1 -1
- metadata +2 -2
data/History.txt
CHANGED
data/README.txt
CHANGED
data/bin/domctl
CHANGED
@@ -5,6 +5,15 @@ require 'term/ansicolor'
|
|
5
5
|
gem 'pangea', '~> 0.1'
|
6
6
|
require 'pangea'
|
7
7
|
|
8
|
+
debug_enabled = false
|
9
|
+
|
10
|
+
debug = ! ARGV.index('--debug').nil?
|
11
|
+
if debug
|
12
|
+
puts 'Debugging enabled.'
|
13
|
+
debug_enabled = true
|
14
|
+
ARGV.delete('--debug')
|
15
|
+
end
|
16
|
+
|
8
17
|
begin
|
9
18
|
require "#{File.join(File.dirname(__FILE__), '../lib/domctl.rb')}"
|
10
19
|
rescue
|
@@ -16,47 +25,47 @@ include Domctl
|
|
16
25
|
|
17
26
|
DOMCTL_COMMANDS = {
|
18
27
|
:cpu_utilisation => {
|
19
|
-
:help => "domctl cpu_utilisation",
|
28
|
+
:help => "domctl cpu_utilisation\n",
|
20
29
|
:proc => CpuUtilisationCommand
|
21
30
|
},
|
22
31
|
:farm_info => {
|
23
|
-
:help =>
|
32
|
+
:help => FarmInfoHelp,
|
24
33
|
:proc => FarmInfoCommand
|
25
34
|
},
|
26
35
|
:mem_info => {
|
27
|
-
:help =>
|
36
|
+
:help => MemInfoHelp,
|
28
37
|
:proc => MemInfoCommand
|
29
38
|
},
|
30
39
|
:locate_domu => {
|
31
|
-
:help =>
|
40
|
+
:help => LocateDomuHelp,
|
32
41
|
:proc => LocateDomuCommand
|
33
42
|
},
|
34
43
|
:list_running => {
|
35
|
-
:help =>
|
44
|
+
:help => ListRunningHelp,
|
36
45
|
:proc => ListRunningCommand
|
37
46
|
},
|
38
47
|
:cluster_nodes => {
|
39
|
-
:help =>
|
48
|
+
:help => ClusterNodesHelp,
|
40
49
|
:proc => ClusterNodesCommand
|
41
50
|
},
|
42
51
|
:show_vifs => {
|
43
|
-
:help =>
|
52
|
+
:help => ShowVifsHelp,
|
44
53
|
:proc => ShowVifsCommand
|
45
54
|
},
|
46
55
|
:domu_info => {
|
47
|
-
:help =>
|
56
|
+
:help => DomuInfoHelp,
|
48
57
|
:proc => DomuInfoCommand
|
49
58
|
},
|
50
59
|
:dom0_info => {
|
51
|
-
:help =>
|
60
|
+
:help => Dom0InfoHelp,
|
52
61
|
:proc => Dom0InfoCommand
|
53
62
|
},
|
54
63
|
:recent_domus => {
|
55
|
-
:help =>
|
64
|
+
:help => RecentDomusHelp,
|
56
65
|
:proc => RecentDomusCommand
|
57
66
|
},
|
58
67
|
:oldest_domus => {
|
59
|
-
:help =>
|
68
|
+
:help => OldestDomusHelp,
|
60
69
|
:proc => OldestDomusCommand
|
61
70
|
},
|
62
71
|
:version => {
|
@@ -68,19 +77,27 @@ DOMCTL_COMMANDS = {
|
|
68
77
|
}
|
69
78
|
}
|
70
79
|
|
80
|
+
trap("INT") { $stderr.puts "\nAborting."; exit }
|
81
|
+
|
71
82
|
Domctl::Config.validate
|
72
83
|
command = ARGV.shift
|
73
84
|
if command.nil? or DOMCTL_COMMANDS[command.to_sym].nil?
|
74
|
-
|
75
|
-
|
85
|
+
DOMCTL_COMMANDS[:help][:args] = []
|
86
|
+
HelpCommand.call
|
87
|
+
exit 1
|
76
88
|
end
|
77
89
|
begin
|
78
90
|
args = ARGV
|
79
91
|
DOMCTL_COMMANDS[command.to_sym][:args] = args
|
80
92
|
DOMCTL_COMMANDS[command.to_sym][:proc].call
|
93
|
+
rescue SystemExit => e
|
94
|
+
$stderr.puts "Aborting."
|
81
95
|
rescue Exception => e
|
82
|
-
if
|
96
|
+
if debug_enabled
|
83
97
|
puts e.message
|
84
98
|
puts e.backtrace
|
99
|
+
else
|
100
|
+
puts "CRITICAL: #{e.message}"
|
85
101
|
end
|
86
102
|
end
|
103
|
+
|
data/domctl.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{domctl}
|
3
|
-
s.version = "0.2.
|
3
|
+
s.version = "0.2.20090415143011"
|
4
4
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
6
6
|
s.authors = ["Sergio RubioSergio Rubio"]
|
7
|
-
s.date = %q{2009-04-
|
7
|
+
s.date = %q{2009-04-15}
|
8
8
|
s.default_executable = %q{domctl}
|
9
9
|
s.description = %q{Xen Cluster Management Tool}
|
10
10
|
s.email = %q{sergio@rubio.namesergio@rubio.name}
|
data/lib/domctl.rb
CHANGED
@@ -2,6 +2,14 @@ module Domctl
|
|
2
2
|
################
|
3
3
|
# cluster_nodes
|
4
4
|
# ##############
|
5
|
+
ClusterNodesHelp = <<-EOF
|
6
|
+
|
7
|
+
Usage: domctl cluster_nodes
|
8
|
+
|
9
|
+
Show the Xen hosts (dom0) defined in #{Domctl::Config.config_file}
|
10
|
+
|
11
|
+
EOF
|
12
|
+
|
5
13
|
ClusterNodesCommand = Proc.new do
|
6
14
|
Domctl::Config.cluster_nodes.keys.sort.each do |n|
|
7
15
|
puts n
|
@@ -2,6 +2,20 @@ module Domctl
|
|
2
2
|
################
|
3
3
|
# dom0_info
|
4
4
|
################
|
5
|
+
|
6
|
+
Dom0InfoHelp = <<-HERE
|
7
|
+
|
8
|
+
domctl dom0_info <dom0_name>
|
9
|
+
|
10
|
+
Print some info from the given dom0
|
11
|
+
|
12
|
+
EXAMPLES
|
13
|
+
|
14
|
+
1. domctl dom0_info xen0
|
15
|
+
|
16
|
+
"Print info from the xen0 host"
|
17
|
+
|
18
|
+
HERE
|
5
19
|
Dom0InfoCommand = Proc.new do
|
6
20
|
def print_dom0_info(h)
|
7
21
|
puts "Label: #{h.label}"
|
@@ -12,7 +26,7 @@ module Domctl
|
|
12
26
|
puts "Xen Version: #{h.software_version['Xen']}"
|
13
27
|
puts "Arch: #{h.software_version['machine']}"
|
14
28
|
puts "Kernel Version: #{h.software_version['release']}"
|
15
|
-
print "CPUs:
|
29
|
+
print "CPUs: "
|
16
30
|
h.cpus.each do |c|
|
17
31
|
print "%.2f " % (c.utilisation * 100)
|
18
32
|
end
|
@@ -23,13 +37,14 @@ module Domctl
|
|
23
37
|
$stderr.puts DOMCTL_COMMANDS[:dom0_info][:help]
|
24
38
|
exit 1
|
25
39
|
end
|
40
|
+
Domctl::Config.exit_if_not_defined(dom0)
|
26
41
|
dom0.strip.chomp!
|
27
42
|
settings = Domctl::Config.cluster_nodes[dom0]
|
28
43
|
begin
|
29
44
|
h = Pangea::Host.connect(settings['url'], settings['username'], settings['password'])
|
30
45
|
print_dom0_info(h)
|
31
46
|
rescue Exception
|
32
|
-
puts "Error connecting to host #{
|
47
|
+
puts "Error connecting to host #{dom0}. Skipping."
|
33
48
|
end
|
34
49
|
end
|
35
50
|
end
|
@@ -2,17 +2,45 @@ module Domctl
|
|
2
2
|
################
|
3
3
|
# domu_info
|
4
4
|
################
|
5
|
+
|
6
|
+
DomuInfoHelp = <<-HERE
|
7
|
+
|
8
|
+
domctl domu_info <domu_name>
|
9
|
+
|
10
|
+
Print some info from the given domU. domu_name can be the full name
|
11
|
+
or the partial name from a running domU.
|
12
|
+
|
13
|
+
EXAMPLES
|
14
|
+
|
15
|
+
1. domctl domu_info vm-test
|
16
|
+
|
17
|
+
"Print info from vm-test"
|
18
|
+
|
19
|
+
2. domctl domu_info xen0:vm-test
|
20
|
+
|
21
|
+
"Print info from vm-test, but match only domUs resident in xen0 host"
|
22
|
+
|
23
|
+
HERE
|
24
|
+
|
5
25
|
DomuInfoCommand = Proc.new do
|
6
|
-
def print_vm_status(
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
26
|
+
def print_vm_status(h, vm_label)
|
27
|
+
h.resident_vms.each do |vm|
|
28
|
+
if vm.label =~ /^.*#{vm_label}.*$/
|
29
|
+
puts
|
30
|
+
header = "[#{vm.label}]"
|
31
|
+
puts header
|
32
|
+
puts "-" * header.size
|
33
|
+
puts "Dom ID: #{vm.domid}"
|
34
|
+
puts "Max Mem: #{Pangea::Util::humanize_bytes(vm.dyn_max_mem)}"
|
35
|
+
puts "Min Mem: #{Pangea::Util::humanize_bytes(vm.dyn_min_mem)}"
|
36
|
+
puts "Power State: #{vm.power_state}"
|
37
|
+
puts "Resident On: #{vm.resident_on.label}"
|
38
|
+
puts "Actions:"
|
39
|
+
puts " after crash: #{vm.actions_after_crash}"
|
40
|
+
puts " after reboot: #{vm.actions_after_reboot}"
|
41
|
+
puts " after shutdown: #{vm.actions_after_shutdown}"
|
42
|
+
end
|
43
|
+
end
|
16
44
|
end
|
17
45
|
args = DOMCTL_COMMANDS[:domu_info][:args][0]
|
18
46
|
if args.nil?
|
@@ -20,36 +48,18 @@ module Domctl
|
|
20
48
|
exit 1
|
21
49
|
end
|
22
50
|
args.strip.chomp!
|
23
|
-
found = false
|
24
51
|
# dom0:domU notation
|
25
52
|
if args =~ /^.*:.*$/
|
26
53
|
host, domu = args.split(':')
|
27
54
|
settings = Domctl::Config.cluster_nodes[host]
|
28
55
|
h = Pangea::Host.connect(settings['url'], settings['username'], settings['password'])
|
29
|
-
h
|
30
|
-
if vm.label == domu
|
31
|
-
found = true
|
32
|
-
print_vm_status(vm)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
puts "DomU #{domu} not found in #{host}" if not found
|
56
|
+
print_vm_status(h, domu)
|
36
57
|
else
|
37
58
|
domu = args
|
38
59
|
puts "Searching..."
|
39
|
-
Domctl::Config.
|
40
|
-
|
41
|
-
h = Pangea::Host.connect(settings['url'], settings['username'], settings['password'])
|
42
|
-
rescue Exception
|
43
|
-
puts "Error connecting to host #{node}. Skipping."
|
44
|
-
end
|
45
|
-
h.resident_vms.each do |vm|
|
46
|
-
if vm.label == domu
|
47
|
-
found = true
|
48
|
-
print_vm_status(vm)
|
49
|
-
end
|
50
|
-
end
|
60
|
+
Domctl::Config.each_host do |h|
|
61
|
+
print_vm_status(h, domu)
|
51
62
|
end
|
52
|
-
puts "DomU #{domu} not found" if not found
|
53
63
|
end
|
54
64
|
end
|
55
65
|
end
|
@@ -2,23 +2,66 @@ module Domctl
|
|
2
2
|
################
|
3
3
|
# farm_info
|
4
4
|
# ##############
|
5
|
+
|
6
|
+
FarmInfoHelp = <<-HELP
|
7
|
+
|
8
|
+
domctl farm_info
|
9
|
+
|
10
|
+
Print info from all the hosts defined in the config file:
|
11
|
+
- Memory Free
|
12
|
+
- Total Memory
|
13
|
+
- Number of CPUs
|
14
|
+
- Resident Virtual Machines (domUs)
|
15
|
+
- Number of CPUs/Cores
|
16
|
+
- CPUs/Cores utilisation
|
17
|
+
|
18
|
+
HELP
|
19
|
+
|
5
20
|
FarmInfoCommand = Proc.new do
|
6
|
-
|
21
|
+
buffer = ""
|
22
|
+
print "Gathering Info"
|
23
|
+
farm_total_mem = 0
|
24
|
+
farm_free_mem = 0
|
25
|
+
farm_resident_vms = 0
|
26
|
+
farm_cpus = 0
|
27
|
+
farm_hosts = 0
|
28
|
+
threads = []
|
7
29
|
Domctl::Config.each_host do |h|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
30
|
+
print '.'
|
31
|
+
threads << Thread.new(buffer) do |bf|
|
32
|
+
farm_hosts += 1
|
33
|
+
buff = ''
|
34
|
+
buff << "\n\n[#{h.label}]\n"
|
35
|
+
buff << "-------\n"
|
36
|
+
metrics = h.metrics
|
37
|
+
mfree = Pangea::Util.humanize_bytes(metrics.memory_free)
|
38
|
+
farm_free_mem += metrics.memory_free.to_i
|
39
|
+
mtotal = Pangea::Util.humanize_bytes(metrics.memory_total)
|
40
|
+
farm_total_mem += metrics.memory_total.to_i
|
41
|
+
vms = h.resident_vms.size - 1
|
42
|
+
farm_resident_vms += vms
|
43
|
+
buff += "Resident VMs: #{vms}\n"
|
44
|
+
buff += "Mem Free: #{mfree} Mem Total: #{mtotal}\n"
|
45
|
+
cpus = h.cpus.sort { |a,b| a.number <=> b.number }
|
46
|
+
buff += "CPUs (#{cpus.size}): "
|
47
|
+
cpus.each do |c|
|
48
|
+
farm_cpus += 1
|
49
|
+
buff += "%.2f " % (c.utilisation * 100)
|
50
|
+
end
|
51
|
+
bf << buff
|
19
52
|
end
|
20
|
-
puts
|
21
|
-
puts
|
22
53
|
end
|
54
|
+
threads.each { |t| t.join }
|
55
|
+
buffer += "\n\n"
|
56
|
+
puts buffer
|
57
|
+
puts
|
58
|
+
puts 'Global Info:'
|
59
|
+
puts '-----------------------------------------------'
|
60
|
+
puts "Farm Hosts: #{farm_hosts}"
|
61
|
+
puts "Farm Total Memory: #{Pangea::Util.humanize_bytes(farm_total_mem)}"
|
62
|
+
puts "Farm Free Memory: #{Pangea::Util.humanize_bytes(farm_free_mem)}"
|
63
|
+
puts "Farm Resident VMs: #{farm_resident_vms}"
|
64
|
+
puts "Farm CPUs: #{farm_cpus}"
|
65
|
+
puts '-----------------------------------------------'
|
23
66
|
end
|
24
67
|
end
|
data/lib/domctl/commands/help.rb
CHANGED
@@ -3,28 +3,34 @@ module Domctl
|
|
3
3
|
# help
|
4
4
|
# ##############
|
5
5
|
HelpCommand = Proc.new do
|
6
|
-
|
7
|
-
|
6
|
+
cmd = DOMCTL_COMMANDS[:help][:args][0]
|
7
|
+
if not cmd.nil? and not DOMCTL_COMMANDS[cmd.to_sym].nil?
|
8
|
+
puts DOMCTL_COMMANDS[cmd.to_sym][:help]
|
9
|
+
else
|
10
|
+
puts """
|
11
|
+
domctl #{Domctl::VERSION}
|
8
12
|
|
9
|
-
|
13
|
+
Usage: #{File.basename(__FILE__)} command [arguments...]
|
10
14
|
|
11
|
-
|
15
|
+
Available commands:
|
12
16
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
17
|
+
help print this help or the help associated
|
18
|
+
to a command
|
19
|
+
list_running list all running domUs in the specified dom0
|
20
|
+
locate_domu find the dom0 hosting the specified domU
|
21
|
+
show_vifs list the VIFs from a given domU
|
22
|
+
domu_info print DomU info
|
23
|
+
dom0_info print Dom0 info
|
24
|
+
recent_domus print the last 10 domus created
|
25
|
+
oldest_domus print the first 10 domus created
|
26
|
+
mem_info print the memory available in a host
|
27
|
+
farm_info print statistics from all the Hosts
|
28
|
+
cpu_utilisation CPU utilisation from all the Hosts
|
29
|
+
cluster_nodes print the cluster nodes defined in #{Domctl::Config.config_file}
|
25
30
|
|
26
|
-
|
31
|
+
Type domctl help <command> to get specific command help.
|
27
32
|
|
28
|
-
|
33
|
+
"""
|
34
|
+
end
|
29
35
|
end
|
30
36
|
end
|
@@ -2,57 +2,73 @@ module Domctl
|
|
2
2
|
################
|
3
3
|
# list_running
|
4
4
|
# ##############
|
5
|
+
ListRunningHelp = <<-HERE
|
6
|
+
|
7
|
+
Usage: domctl list_running <dom0_name|all>
|
8
|
+
|
9
|
+
Lists the running domUs in a given host (in every defined host if 'all' parameter is used instead of the dom0 name)
|
10
|
+
|
11
|
+
EXAMPLES
|
12
|
+
|
13
|
+
1. domctl list_running xen0
|
14
|
+
|
15
|
+
"List all the domUs running in xen0"
|
16
|
+
|
17
|
+
2. domctl list_running all
|
18
|
+
|
19
|
+
"List all the domUs in every host defined in #{Domctl::Config.config_file}"
|
20
|
+
|
21
|
+
HERE
|
22
|
+
|
5
23
|
ListRunningCommand = Proc.new do
|
24
|
+
def print_running(h)
|
25
|
+
buffer = "\n"
|
26
|
+
header = 'label'.ljust(30) + 'memory'.ljust(15) + 'power state'.ljust(15) + 'cpus'
|
27
|
+
buffer << "[#{h.label}]".rjust(header.size) + "\n"
|
28
|
+
buffer << header + "\n"
|
29
|
+
buffer << ("-" * header.size) + "\n"
|
30
|
+
h.resident_vms.each do |vm|
|
31
|
+
label = vm.label
|
32
|
+
next if vm.is_control_domain?
|
33
|
+
buffer << "#{label}".ljust(30)
|
34
|
+
metrics = vm.metrics
|
35
|
+
m = Pangea::Util.humanize_bytes(metrics.memory_actual)
|
36
|
+
buffer << m.ljust(15)
|
37
|
+
buffer << vm.power_state.to_s.ljust(15)
|
38
|
+
buffer << metrics.vcpus_number + "\n"
|
39
|
+
end
|
40
|
+
buffer
|
41
|
+
end
|
6
42
|
node = DOMCTL_COMMANDS[:list_running][:args][0]
|
7
43
|
if node.nil?
|
8
44
|
$stderr.puts DOMCTL_COMMANDS[:list_running][:help]
|
9
45
|
exit 1
|
10
46
|
end
|
47
|
+
threads = []
|
48
|
+
buffer = ''
|
11
49
|
if node == 'all'
|
50
|
+
print "Working"
|
12
51
|
Domctl::Config.each_host do |h|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
puts header
|
17
|
-
puts "-" * header.size
|
18
|
-
h.resident_vms.each do |vm|
|
19
|
-
label = vm.label
|
20
|
-
next if vm.is_control_domain?
|
21
|
-
print "#{label}".ljust(30)
|
22
|
-
metrics = vm.metrics
|
23
|
-
m = Pangea::Util.humanize_bytes(metrics.memory_actual)
|
24
|
-
print m.ljust(15)
|
25
|
-
print vm.power_state.to_s.ljust(15)
|
26
|
-
print metrics.vcpus_number
|
27
|
-
puts
|
52
|
+
print '.'
|
53
|
+
threads << Thread.new do
|
54
|
+
buffer << print_running(h)
|
28
55
|
end
|
29
56
|
end
|
30
57
|
else
|
31
|
-
|
32
|
-
$stderr.puts "ERROR: Xen host not defined in #{Domctl::Config.config_file}"
|
33
|
-
exit 1
|
34
|
-
end
|
58
|
+
Domctl::Config.exit_if_not_defined(node)
|
35
59
|
settings = Domctl::Config.cluster_nodes[node]
|
36
60
|
begin
|
61
|
+
puts 'Working...'
|
37
62
|
h = Pangea::Host.connect(settings['url'], settings['username'], settings['password'])
|
38
|
-
|
39
|
-
|
40
|
-
puts "-" * header.size
|
41
|
-
h.resident_vms.each do |vm|
|
42
|
-
label = vm.label
|
43
|
-
next if vm.is_control_domain?
|
44
|
-
print "#{label}".ljust(30)
|
45
|
-
metrics = vm.metrics
|
46
|
-
m = Pangea::Util.humanize_bytes(metrics.memory_actual)
|
47
|
-
print m.ljust(15)
|
48
|
-
print vm.power_state.to_s.ljust(15)
|
49
|
-
print metrics.vcpus_number
|
50
|
-
puts
|
63
|
+
threads << Thread.new do
|
64
|
+
buffer << print_running(h)
|
51
65
|
end
|
52
66
|
rescue Exception => e
|
53
67
|
puts e.message
|
54
68
|
puts "Error connecting to host #{node}. Skipping."
|
55
69
|
end
|
56
70
|
end
|
71
|
+
threads.each { |t| t.join }
|
72
|
+
puts buffer
|
57
73
|
end
|
58
74
|
end
|
@@ -2,29 +2,42 @@ module Domctl
|
|
2
2
|
################
|
3
3
|
# locate_domu
|
4
4
|
# ##############
|
5
|
+
LocateDomuHelp = <<-HERE
|
6
|
+
|
7
|
+
domctl locate_domu <domU name>
|
8
|
+
|
9
|
+
Find the domUs matching <domU name>
|
10
|
+
|
11
|
+
EXAMPLES
|
12
|
+
|
13
|
+
domctl locate_domu test-vm
|
14
|
+
|
15
|
+
"Locates a DomU named test-vm."
|
16
|
+
|
17
|
+
HERE
|
18
|
+
|
5
19
|
LocateDomuCommand = Proc.new do
|
6
20
|
domus = []
|
7
|
-
|
8
|
-
|
21
|
+
threads = []
|
22
|
+
arg = DOMCTL_COMMANDS[:locate_domu][:args][0]
|
23
|
+
if arg.nil?
|
9
24
|
$stderr.puts DOMCTL_COMMANDS[:locate_domu][:help]
|
10
25
|
exit 1
|
11
26
|
end
|
12
27
|
print "Searching"
|
13
|
-
Domctl::Config.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
if vm.label =~ /^.*#{args}.*$/
|
21
|
-
domus << "#{node}: #{vm.label}"
|
28
|
+
Domctl::Config.each_host do |h|
|
29
|
+
print '.'
|
30
|
+
threads << Thread.new do
|
31
|
+
h.resident_vms.each do |vm|
|
32
|
+
if vm.label =~ /^.*#{arg}.*$/
|
33
|
+
domus << "#{h.label}: #{vm.label}"
|
34
|
+
end
|
22
35
|
end
|
23
36
|
end
|
24
|
-
print '.'
|
25
37
|
end
|
38
|
+
threads.each { |t| t.join }
|
26
39
|
puts
|
27
|
-
puts "
|
40
|
+
puts "DomU matching '#{arg}' not found." if domus.empty?
|
28
41
|
domus.each { |d| puts d }
|
29
42
|
end
|
30
43
|
end
|
@@ -2,17 +2,43 @@ module Domctl
|
|
2
2
|
################
|
3
3
|
# mem_info
|
4
4
|
# ##############
|
5
|
+
|
6
|
+
MemInfoHelp = <<-HERE
|
7
|
+
|
8
|
+
Usage: domctl mem_info [dom0_name]
|
9
|
+
|
10
|
+
dom0_name is optional. If dom0_name is supplied, it only prints the memory info from the given host.
|
11
|
+
|
12
|
+
EXAMPLES
|
13
|
+
|
14
|
+
1. domctl mem_info xen0
|
15
|
+
|
16
|
+
"Print the memory info from xen0"
|
17
|
+
|
18
|
+
2. domctl mem_info
|
19
|
+
|
20
|
+
"Print the memory info from all the hosts defined in domctl config file"
|
21
|
+
HERE
|
22
|
+
|
5
23
|
MemInfoCommand = Proc.new do
|
6
24
|
node = DOMCTL_COMMANDS[:mem_info][:args][0]
|
25
|
+
threads = []
|
26
|
+
buffer = ""
|
7
27
|
if node.nil?
|
28
|
+
print 'Working'
|
8
29
|
Domctl::Config.each_host do |h|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
30
|
+
print '.'
|
31
|
+
threads << Thread.new do
|
32
|
+
mfree = Pangea::Util.humanize_bytes(h.metrics.memory_free)
|
33
|
+
mtotal = Pangea::Util.humanize_bytes(h.metrics.memory_total)
|
34
|
+
buffer << "#{h.label.ljust(30)} #{(mfree + ' free').ljust(15)} #{mtotal} available\n"
|
35
|
+
end
|
14
36
|
end
|
37
|
+
threads.each { |t| t.join }
|
38
|
+
puts
|
39
|
+
puts buffer
|
15
40
|
else
|
41
|
+
Domctl::Config.exit_if_not_defined(node)
|
16
42
|
settings = Domctl::Config.cluster_nodes[node]
|
17
43
|
begin
|
18
44
|
h = Pangea::Host.connect(settings['url'], settings['username'], settings['password'])
|
@@ -1,13 +1,25 @@
|
|
1
1
|
module Domctl
|
2
|
+
OldestDomusHelp = <<-HELP
|
3
|
+
|
4
|
+
Usage: domctl oldest_domus
|
5
|
+
|
6
|
+
Print the oldest domUs (the first 10 created).
|
7
|
+
|
8
|
+
HELP
|
9
|
+
|
2
10
|
OldestDomusCommand = Proc.new do
|
3
11
|
oldest = []
|
12
|
+
threads = []
|
4
13
|
print 'Working '
|
5
14
|
Domctl::Config.each_host do |h|
|
6
15
|
print '.'
|
7
|
-
|
8
|
-
|
16
|
+
threads << Thread.new do
|
17
|
+
h.resident_vms.each do |vm|
|
18
|
+
oldest << [vm.label, vm.metrics.start_time] if vm.label != 'Domain-0'
|
19
|
+
end
|
9
20
|
end
|
10
21
|
end
|
22
|
+
threads.each { |t| t.join }
|
11
23
|
puts ' done.'
|
12
24
|
oldest.sort { |a,b| a[1] <=> b[1] }[0..9].each do |label, date|
|
13
25
|
puts "#{label}".ljust(30) + date.to_s
|
@@ -1,15 +1,28 @@
|
|
1
1
|
module Domctl
|
2
|
+
|
3
|
+
RecentDomusHelp = <<-HELP
|
4
|
+
|
5
|
+
domctl recent_domus
|
6
|
+
|
7
|
+
Print the most recent domUs created (the last 10 created).
|
8
|
+
|
9
|
+
HELP
|
10
|
+
|
2
11
|
RecentDomusCommand = Proc.new do
|
3
12
|
recent = []
|
13
|
+
t = []
|
4
14
|
print 'Working '
|
5
15
|
Domctl::Config.each_host do |h|
|
6
|
-
|
7
|
-
|
8
|
-
|
16
|
+
t << Thread.new do
|
17
|
+
print '.'
|
18
|
+
h.resident_vms.each do |vm|
|
19
|
+
recent << [vm.label, vm.metrics.start_time] if vm.label != 'Domain-0'
|
20
|
+
end
|
9
21
|
end
|
10
22
|
end
|
23
|
+
t.each { |thread| thread.join }
|
11
24
|
puts ' done.'
|
12
|
-
recent.sort { |a,b| a[1] <=> b[1] }[-10..-1].each do |label, date|
|
25
|
+
recent.sort { |a,b| a[1] <=> b[1] }[-10..-1].reverse.each do |label, date|
|
13
26
|
puts "#{label}".ljust(30) + date.to_s
|
14
27
|
end
|
15
28
|
end
|
@@ -2,56 +2,67 @@ module Domctl
|
|
2
2
|
################
|
3
3
|
# show_vifs
|
4
4
|
# ##############
|
5
|
+
|
6
|
+
ShowVifsHelp = <<-HERE
|
7
|
+
|
8
|
+
domctl show_vifs <[dom0_name:]domU_name>
|
9
|
+
|
10
|
+
Print the virtual interfaces from the given domU
|
11
|
+
|
12
|
+
EXAMPLES
|
13
|
+
|
14
|
+
1. domctl show_vifs vm-test
|
15
|
+
|
16
|
+
"Print the VIFs found in vm-test (if vm-test exists)"
|
17
|
+
|
18
|
+
1. domctl show_vifs xen0:vm-test
|
19
|
+
|
20
|
+
"Print the VIFs found in vm-test, but look for vm-test in xen0 host only."
|
21
|
+
HERE
|
22
|
+
|
5
23
|
ShowVifsCommand = Proc.new do
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
24
|
+
def print_vifs(h, vm_label)
|
25
|
+
buffer = ''
|
26
|
+
h.resident_vms.each do |vm|
|
27
|
+
if vm.label =~ /^.*#{vm_label}.*$/
|
28
|
+
header = "\n[#{vm.label}]\n"
|
29
|
+
buffer << header
|
30
|
+
buffer << ("-" * header.size)
|
31
|
+
vm.vifs.each do |vif|
|
32
|
+
buffer << "\nDevice: #{vif.device} **\n"
|
33
|
+
buffer << "MAC Address: #{vif.mac}\n"
|
34
|
+
metrics = vif.metrics
|
35
|
+
buffer << "KBits/s IN: %.3f\n" % metrics.io_read_kbs
|
36
|
+
buffer << "KBits/s OUT: %.3f\n" % metrics.io_write_kbs
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
buffer
|
12
41
|
end
|
13
|
-
|
14
|
-
|
15
|
-
if args.nil?
|
42
|
+
domu_name = DOMCTL_COMMANDS[:show_vifs][:args][0]
|
43
|
+
if domu_name.nil?
|
16
44
|
$stderr.puts DOMCTL_COMMANDS[:show_vifs][:help]
|
17
45
|
exit 1
|
18
46
|
end
|
19
|
-
if
|
20
|
-
host, domu =
|
47
|
+
if domu_name =~ /^.*:.*$/
|
48
|
+
host, domu = domu_name.split(':')
|
21
49
|
Domctl::Config.exit_if_not_defined(host)
|
22
50
|
settings = Domctl::Config.cluster_nodes[host]
|
23
51
|
h = Pangea::Host.connect(settings['url'], settings['username'], settings['password'])
|
24
|
-
h
|
25
|
-
if vm.label == domu
|
26
|
-
found = true
|
27
|
-
puts "#{vm.label}"
|
28
|
-
puts "------------------"
|
29
|
-
vm.vifs.each do |vif|
|
30
|
-
print_vif(vif)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
puts "DomU #{domu} not found in #{host}" if not found
|
52
|
+
puts print_vifs(h, domu)
|
35
53
|
else
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
h.resident_vms.each do |vm|
|
44
|
-
if vm.label == args
|
45
|
-
found = true
|
46
|
-
puts "#{vm.label}"
|
47
|
-
puts "------------------"
|
48
|
-
vm.vifs.each do |vif|
|
49
|
-
print_vif(vif)
|
50
|
-
end
|
51
|
-
end
|
54
|
+
threads = []
|
55
|
+
print "Searching"
|
56
|
+
buffer = ''
|
57
|
+
Domctl::Config.each_host do |h|
|
58
|
+
print '.'
|
59
|
+
threads << Thread.new do
|
60
|
+
buffer << print_vifs(h, domu_name)
|
52
61
|
end
|
53
62
|
end
|
63
|
+
threads.each { |t| t.join }
|
64
|
+
puts ' done.'
|
65
|
+
puts buffer if not buffer.empty?
|
54
66
|
end
|
55
|
-
puts "#{args} not found." if not found
|
56
67
|
end
|
57
68
|
end
|
data/lib/domctl/config.rb
CHANGED
@@ -49,7 +49,7 @@ module Domctl
|
|
49
49
|
begin
|
50
50
|
h = Pangea::Host.connect(settings['url'], settings['username'], settings['password'])
|
51
51
|
yield h
|
52
|
-
rescue
|
52
|
+
rescue Pangea::LinkConnectError => e
|
53
53
|
puts "Error connecting to host #{node}. Skipping."
|
54
54
|
end
|
55
55
|
end
|
@@ -58,7 +58,7 @@ module Domctl
|
|
58
58
|
def self.exit_if_not_defined(node)
|
59
59
|
settings = Domctl::Config.cluster_nodes[node]
|
60
60
|
if settings.nil?
|
61
|
-
$stderr.puts "ERROR: Xen host not defined in #{Domctl::Config.config_file}"
|
61
|
+
$stderr.puts "ERROR: Xen host #{node} not defined in #{Domctl::Config.config_file}"
|
62
62
|
exit 1
|
63
63
|
end
|
64
64
|
end
|
data/scripts/newrelease
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubiojr-domctl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.20090415143011
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergio RubioSergio Rubio
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-04-
|
12
|
+
date: 2009-04-15 00:00:00 -07:00
|
13
13
|
default_executable: domctl
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|