Commit fdffce00 authored by Antoine Catton's avatar Antoine Catton

Switch pbs promise timeout to sigterm catch.

parent a48250ef
...@@ -30,7 +30,8 @@ from urlparse import urlparse ...@@ -30,7 +30,8 @@ from urlparse import urlparse
import os import os
import subprocess import subprocess
import sys import sys
import time import signal
import inspect
from slapos.recipe.librecipe import GenericSlapRecipe from slapos.recipe.librecipe import GenericSlapRecipe
from slapos.recipe.dropbear import KnownHostsFile from slapos.recipe.dropbear import KnownHostsFile
...@@ -40,9 +41,37 @@ from slapos import slap as slapmodule ...@@ -40,9 +41,37 @@ from slapos import slap as slapmodule
def promise(args): def promise(args):
def sigterm_handler(signum, frame):
# Walk up in the stack to get promise local
# variables
ssh = None
for upper_frame in inspect.getouterframes(frame):
# Use promise.func_name insteand of 'promise' in order to be
# detected by editor if promise func name change.
# Else, it's hard to debug this kind of error.
if upper_frame[3] == promise.func_name:
try:
partition = upper_frame[0].f_locals['partition']
ssh = upper_frame[0].f_locals['ssh']
except KeyError:
raise SystemExit("SIGTERM Send too soon.")
break
# If ever promise function wasn't found in the stack.
if ssh is None:
raise SystemExit
# Bad python 2 syntax, looking forward python 3 to have print(file=)
print >> sys.stderr, "SSH Connection failed"
ssh.terminate()
partition.bang("SSH Connection failed. rdiff-backup is unusable.")
signal.signal(signal.SIGTERM, sigterm_handler)
slap = slapmodule.slap() slap = slapmodule.slap()
slap.initializeConnection(args['server_url'], slap.initializeConnection(args['server_url'],
key_file=args.get('key_file'), cert_file=args.get('cert_file')) key_file=args.get('key_file'), cert_file=args.get('cert_file'))
# This is used in sigterm_handler, it get it from the frame.
partition = slap.registerComputerPartition(args['computer_id'], partition = slap.registerComputerPartition(args['computer_id'],
args['partition_id']) args['partition_id'])
...@@ -55,16 +84,10 @@ def promise(args): ...@@ -55,16 +84,10 @@ def promise(args):
ssh.stdin.write(quitcommand) ssh.stdin.write(quitcommand)
ssh.stdin.flush() ssh.stdin.flush()
ssh.stdin.close() ssh.stdin.close()
ssh.wait()
time.sleep(2)
if ssh.poll() is None: if ssh.poll() is None:
ssh.kill() return 1
if ssh.wait() != 0:
# Bad python 2 syntax, looking forward python 3 to have print(file=)
print >> sys.stderr, "SSH Connection failed"
partition.bang("SSH Connection failed. rdiff-backup is unusable.")
return ssh.returncode return ssh.returncode
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment