Skip to content
Snippets Groups Projects
Commit 925c3819 authored by Maxime Graulich's avatar Maxime Graulich
Browse files

ONELAB2

parent 130961d6
Branches
Tags
No related merge requests found
...@@ -232,9 +232,28 @@ class client : ...@@ -232,9 +232,28 @@ class client :
print('onelab info : %s' % msg) print('onelab info : %s' % msg)
return t, msg return t, msg
def _parseParameter(msg):
def extract_attr(b):
t, l = struct.unpack('!HH', b[:4])
if l+4 > len(b):
RuntimeError('onelab invalid parameter')
return t ,b[4:]
ptype, p = extract_attr(msg)
if ptype == 0x06:
param = _parameter('number')
param.frombytes(msg)
return param
elif ptype == 0x07:
param = _parameter('string')
param.frombytes(msg)
return param
else:
return None
def _getParameter(self, param, warn_if_not_found=True) : def _getParameter(self, param, warn_if_not_found=True) :
def extract_attr(b): def extract_attr(b):
print(len(b))
t, l = struct.unpack('!HH', b[:4]) t, l = struct.unpack('!HH', b[:4])
if l+4 > len(b): if l+4 > len(b):
RuntimeError('onelab invalid parameter') RuntimeError('onelab invalid parameter')
...@@ -246,8 +265,7 @@ class client : ...@@ -246,8 +265,7 @@ class client :
(t, msg) = self._receive() (t, msg) = self._receive()
if t == self._ONELAB_RESPONSE : if t == self._ONELAB_RESPONSE :
ptype, p = extract_attr(msg) ptype, p = extract_attr(msg)
if ptype == 0x06 or ptype == 0x05: if ptype == 0x06 or ptype == 0x07:
print("recv")
param.frombytes(msg) param.frombytes(msg)
elif ptype == 0x0A and warn_if_not_found: elif ptype == 0x0A and warn_if_not_found:
print('Unknown parameter %s' %(param.name)) print('Unknown parameter %s' %(param.name))
...@@ -270,14 +288,67 @@ class client : ...@@ -270,14 +288,67 @@ class client :
p.modify(**param) p.modify(**param)
self._send(self._ONELAB_UPDATE, p.tobytes()) self._send(self._ONELAB_UPDATE, p.tobytes())
def setString(self, name, **param):
if not self.socket :
return
p = _parameter('string', name=name)
self._getParameter(p, False)
p.modify(**param)
self._send(self._ONELAB_UPDATE, p.tobytes())
def _sendMessage(self, msg, lvl=5): def _sendMessage(self, msg, lvl=5):
if not self.socket : if not self.socket :
print (msg) print (msg)
return return
self._send(self._ONELAB_MESSAGE, struct.pack("!HHB", 0x0A, len(msg)+1, lvl)+msg) self._send(self._ONELAB_MESSAGE, struct.pack("!HHB", 0x0A, len(msg)+1, lvl)+msg)
def sendFatal(self, msg) :
self._sendMessage(msg+'\0', 1)
def sendError(self, msg) :
self._sendMessage(msg+'\0', 2)
def sendWarning(self, msg) :
self._sendMessage(msg+'\0', 3)
def sendInfo(self, msg) : def sendInfo(self, msg) :
self._sendMessage(msg+'\0') self._sendMessage(msg+'\0', 5)
def sendDebug(self, msg) :
self._sendMessage(msg+'\0', 99)
def waitOnSubClient(self, name):
if not self.socket :
return
while self._numSubClients > 0:
(t, msg) = self._receive()
if t == _ONELAB_UPDATE:
param = _parseParameter(msg)
if param.type=='string' and param.name[-7:]=='/Action' and param.value=='stop':
if param.name[-7:] == name: return
self._numSubClients -= 1 # FIXME check that the client is a subclient ?
def waitOnSubClients(self):
if not self.socket :
return
while self._numSubClients > 0:
(t, msg) = self._receive()
if t == _ONELAB_UPDATE:
param = _parseParameter(msg)
if param.type=='string' and param.name[:-7]=='/Action' and param.value=='stop':
self._numSubClients -= 1 # FIXME check that the client is a subclient ?
def runNonBlockingSubClient(self, name, command, arguments=''):
if self.action == 'check':
cmd = command
else:
cmd = command + ' ' + arguments
os.system(cmd);
self._numSubClients +=1
self.getString(name+'/Action', False)
def runSubClient(self, name, command, arguments=''):
self.runNonBlockingSubClient(name, command, arguments)
self.waitOnSubClient(name) # makes the subclient blocking
#if self.action == 'compute':
#TODO self.setChanged(name, False)
def __init__(self, ref=''): def __init__(self, ref=''):
self.socket = None self.socket = None
...@@ -306,12 +377,14 @@ class client : ...@@ -306,12 +377,14 @@ class client :
def finalize(self): def finalize(self):
# code aster python interpreter does not call the destructor at exit, it is # code aster python interpreter does not call the destructor at exit, it is
# necessary to call finalize() epxlicitely # necessary to call finalize() epxlicitely
print("finalize")
if self.socket : if self.socket :
#TODO self.waitOnSubClients() self.waitOnSubClients()
self._send(self._ONELAB_STOP) self._send(self._ONELAB_STOP)
self._receive() self._receive()
self.socket.close() self.socket.close()
self.socket = None self.socket = None
print("finalize end")
def __del__(self): def __del__(self):
self.finalize() self.finalize()
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment