Correction du lancement du service onenode
Le service onenode ne se lance pas a cause d'une boucle dans les dépendances de services. Pour régler le problème on le lance après la multi-user.target De plus au moment ou le service se lance opennebula n'est pas complètement lancé alors le script essaye d'ouvrir des connections pendant 20 secondes avant de remonter un problème. Enfin on garde une liste des machines qui sont "running" avant l'arrêt du serveur pour pouvoir les relance proprement. Contribution de Cadoles (htts://www.cadoles.com) ref #20338 @6h
This commit is contained in:
parent
edc07ce939
commit
e9ff4ad34c
|
@ -2,6 +2,7 @@
|
|||
Description=OpenNebula Node starter
|
||||
After=opennebula.service opennebula-sunstone.service libvirt-bin.service
|
||||
ConditionPathExists=/etc/eole/release
|
||||
After=multi-user.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
|
@ -10,8 +11,8 @@ Environment=ENDPOINT=http://127.0.0.1:2633/RPC2
|
|||
TimeoutSec=1min
|
||||
RemainAfterExit=yes
|
||||
Restart=no
|
||||
ExecStart=/usr/share/eole/sbin/onevm-all -w -c ${CREDS} -e ${ENDPOINT} -a "resume"
|
||||
ExecStop=/usr/share/eole/sbin/onevm-all -w -c ${CREDS} -e ${ENDPOINT} -a "suspend"
|
||||
ExecStart=/usr/share/eole/sbin/onevm-all -t 20 -w -c ${CREDS} -e ${ENDPOINT} -a "resume"
|
||||
ExecStop=/usr/share/eole/sbin/onevm-all -t 20 -w -c ${CREDS} -e ${ENDPOINT} -a "suspend"
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
|
|
@ -5,6 +5,11 @@
|
|||
##############################################################################
|
||||
ONE_LOCATION=ENV["ONE_LOCATION"]
|
||||
USER=ENV["user"]
|
||||
RUNVMFILE="/var/lib/one/running.bck"
|
||||
TIMEOUT=20
|
||||
|
||||
# oneadmin user flag value
|
||||
USERFLAG=-2
|
||||
|
||||
if !ONE_LOCATION
|
||||
RUBY_LIB_LOCATION="/usr/lib/one/ruby"
|
||||
|
@ -55,13 +60,16 @@ end
|
|||
# AIM: Suspend a virtual machine
|
||||
#
|
||||
def _do_suspend(vm, wait)
|
||||
fd = File.open(RUNVMFILE,'a')
|
||||
if vm.status == "runn"
|
||||
puts("Suspending #{vm.name} ...")
|
||||
fd.write("#{vm.id}\n")
|
||||
vm.suspend
|
||||
if wait
|
||||
_wait(vm, "susp")
|
||||
end
|
||||
end
|
||||
fd.close
|
||||
end
|
||||
|
||||
#
|
||||
|
@ -69,28 +77,34 @@ end
|
|||
# PARAM: OpenNebula::VirtualMachine object
|
||||
# AIM: Resum a suspended virtual machines
|
||||
#
|
||||
def _do_resume(vm, wait)
|
||||
if vm.status == "susp"
|
||||
puts("Resume on #{vm.name}")
|
||||
vm.resume
|
||||
# elsif vm.status == 'save'
|
||||
# puts("Recover on #{vm.name}")
|
||||
# # Try to recover VM with retry action
|
||||
# vm.recover(2)
|
||||
# vm.resume
|
||||
elsif vm.status == 'unkn'
|
||||
puts("Resume on #{vm.name}")
|
||||
def _do_resume(vm, wait, force=FALSE)
|
||||
if force
|
||||
vm.resume
|
||||
else
|
||||
return -1
|
||||
if vm.status == "susp"
|
||||
puts("Resume on #{vm.name}")
|
||||
vm.resume
|
||||
# elsif vm.status == 'save'
|
||||
# puts("Recover on #{vm.name}")
|
||||
# # Try to recover VM with retry action
|
||||
# vm.recover(2)
|
||||
# vm.resume
|
||||
elsif vm.status == 'unkn'
|
||||
puts("Resume on #{vm.name}")
|
||||
vm.resume
|
||||
else
|
||||
return -1
|
||||
end
|
||||
end
|
||||
|
||||
if wait
|
||||
_wait(vm, "runn")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
options = {:creds => nil, :action => nil, :endpoint => nil}
|
||||
options = {:creds => nil, :action => nil, :endpoint => nil,
|
||||
:timeout => nil}
|
||||
|
||||
parser = OptionParser.new do|opts|
|
||||
opts.banner = "Usage: #{File.basename(__FILE__)} [options]"
|
||||
|
@ -106,6 +120,10 @@ parser = OptionParser.new do|opts|
|
|||
options[:endpoint] = value;
|
||||
end
|
||||
|
||||
opts.on('-t', '--timeout timeout', 'Timeout for opennebula connection') do |value|
|
||||
options[:timeout] = value.to_i;
|
||||
end
|
||||
|
||||
opts.on('-w', '--wait', 'Wait for action ends') do |w|
|
||||
options[:wait] = w
|
||||
end
|
||||
|
@ -114,6 +132,8 @@ parser = OptionParser.new do|opts|
|
|||
puts opts
|
||||
exit
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
parser.parse!
|
||||
|
@ -133,6 +153,10 @@ if not options[:endpoint]
|
|||
options[:endpoint] = "http://#{ip}:2633/RPC2"
|
||||
end
|
||||
|
||||
if not options[:timeout]
|
||||
options[:timeout] = TIMEOUT
|
||||
end
|
||||
|
||||
# Actions
|
||||
SUPPORTED = ['status', 'boot', 'resume', 'shutdown', 'suspend']
|
||||
|
||||
|
@ -154,12 +178,24 @@ end
|
|||
begin
|
||||
client = Client.new(CREDENTIALS, options[:endpoint])
|
||||
|
||||
vm_pool = VirtualMachinePool.new(client, -1)
|
||||
vm_pool = VirtualMachinePool.new(client, USERFLAG)
|
||||
|
||||
if File.exist?(RUNVMFILE)
|
||||
running_vms = File.open(RUNVMFILE,'r')
|
||||
else
|
||||
running_vms = []
|
||||
end
|
||||
|
||||
rc = vm_pool.info
|
||||
if OpenNebula.is_error?(rc)
|
||||
puts rc.message
|
||||
exit(-1)
|
||||
cnt = 0
|
||||
while OpenNebula.is_error?(rc)
|
||||
if cnt == options[:timeout]
|
||||
puts rc.message
|
||||
exit(-1)
|
||||
end
|
||||
rc = vm_pool.info
|
||||
sleep(1)
|
||||
cnt += 1
|
||||
end
|
||||
|
||||
vm_pool.each do |vm|
|
||||
|
@ -175,11 +211,18 @@ begin
|
|||
when "suspend"
|
||||
_do_suspend(vm, options[:wait])
|
||||
when "resume"
|
||||
_do_resume(vm, options[:wait])
|
||||
force = FALSE
|
||||
if running_vms.include?('vm.id')
|
||||
force = TRUE
|
||||
end
|
||||
_do_resume(vm, options[:wait], force)
|
||||
else
|
||||
puts("#{vm.name}\t#{vm.status}")
|
||||
end
|
||||
end
|
||||
if options[:action] == "resume"
|
||||
File.truncate(RUNVMFILE, 0)
|
||||
end
|
||||
rescue Exception => e
|
||||
puts e.message
|
||||
exit(-1)
|
||||
|
|
Loading…
Reference in New Issue