Skip to content

Commit 354a2b3

Browse files
committed
fix: handle duplicate module UUID better; default to schedule on pyruntime
1 parent d8ddab8 commit 354a2b3

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

handlers/control.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
class 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),

pubsub/messages.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class UUIDNotFound(SLException):
9999

100100
def __init__(self, obj, obj_type="runtime"):
101101
super().__init__(
102-
{"desc": "invalid {} UUID".format(obj_type), "data": obj})
102+
{"desc": "invalid {} Name/UUID".format(obj_type), "data": obj})
103103

104104

105105
class DuplicateUUID(SLException):

0 commit comments

Comments
 (0)