1515class Control (ControlHandler ):
1616 """Runtime control messages."""
1717
18+ # if parent is not given will default to schedule on this runtime
19+ __DFT_RUNTIME_NAME = "pyruntime"
20+
1821 def __init__ (self , * args , ** kwargs ):
1922 self .topic = settings .MQTT_CONTROL
2023 self ._log = logging .getLogger ("control" )
@@ -36,7 +39,12 @@ def __get_runtime_or_schedule(self, msg, module):
3639 # rt = msg.get('data', 'parent')
3740 # sched_ret = self._get_object(rt, model=Runtime)
3841 # return sched_ret
39- return self ._get_object (msg .get ('data' , 'parent' ), model = Runtime )
42+ try :
43+ parent_id = msg .get ('data' , 'parent' )
44+ except messages .MissingField :
45+ return self ._get_object (Control .__DFT_RUNTIME_NAME , model = Runtime )
46+
47+ return self ._get_object (parent_id , model = Runtime )
4048
4149 def create_module (self , msg ):
4250 """Handle create message."""
@@ -46,14 +54,27 @@ def create_module(self, msg):
4654 if 'filetype' not in data :
4755 data ['filetype' ] = FileType .WA
4856
49- module = self ._object_from_dict (Module , data )
50- module .parent = self .__get_runtime_or_schedule (msg , module )
57+ module_id = msg .get ('data' , 'uuid' )
5158
59+ module = None
60+ try :
61+ module = self ._get_object (module_id , model = Module )
62+ if module .status == State .ALIVE :
63+ # module is running, will error out with a duplicate UUID
64+ raise messages .DuplicateUUID (data , obj_type = 'module' )
65+ else :
66+ module .status = State .ALIVE
67+ except messages .UUIDNotFound :
68+ # ok, will create a new one
69+ module = self ._object_from_dict (Module , data )
70+
71+ module .parent = self .__get_runtime_or_schedule (msg , module )
72+
5273 try :
5374 module .save ()
5475 except IntegrityError as e :
5576 if 'UNIQUE constraint' in str (e ):
56- raise messages .DuplicateUUID (data , obj_type = 'module' )
77+ raise messages .DuplicateUUID (data , obj_type = 'module' ) # should not happen!
5778
5879 return messages .Request (
5980 "{}/{}" .format (msg .topic , module .parent .uuid ),
0 commit comments