|
1
|
|
|
""" |
|
2
|
|
|
Enarksh |
|
3
|
|
|
|
|
4
|
|
|
Copyright 2013-2016 Set Based IT Consultancy |
|
5
|
|
|
|
|
6
|
|
|
Licence MIT |
|
7
|
|
|
""" |
|
8
|
|
|
import sys |
|
9
|
|
|
import traceback |
|
10
|
|
|
|
|
11
|
|
|
from enarksh.DataLayer import DataLayer |
|
12
|
|
|
from enarksh.xml_reader.XmlReader import XmlReader |
|
13
|
|
|
from enarksh.xml_reader.node.FakeParent import FakeParent |
|
14
|
|
|
|
|
15
|
|
|
|
|
16
|
|
|
class DynamicWorkerDefinitionMessageEventHandler: |
|
17
|
|
|
""" |
|
18
|
|
|
An event handler for a DynamicWorkerDefinitionMessage received events. |
|
19
|
|
|
""" |
|
20
|
|
|
|
|
21
|
|
|
# ------------------------------------------------------------------------------------------------------------------ |
|
22
|
|
|
@staticmethod |
|
23
|
|
|
def handle(_event, message, controller): |
|
24
|
|
|
""" |
|
25
|
|
|
Handles a DynamicWorkerDefinitionMessage received event. |
|
26
|
|
|
|
|
27
|
|
|
:param * _event: Not used. |
|
28
|
|
|
:param enarksh.controller.message.DynamicWorkerDefinitionMessage.DynamicWorkerDefinitionMessage message: |
|
29
|
|
|
The message. |
|
30
|
|
|
:param enarksh.controller.Controller.Controller controller: The controller. |
|
31
|
|
|
""" |
|
32
|
|
|
del _event |
|
33
|
|
|
|
|
34
|
|
|
try: |
|
35
|
|
|
print('rnd_id: ' + str(message.rnd_id)) |
|
36
|
|
|
|
|
37
|
|
|
# Get info of the dynamic node. |
|
38
|
|
|
info = DataLayer.enk_back_run_node_get_dynamic_info_by_generator(message.rnd_id) |
|
39
|
|
|
|
|
40
|
|
|
schedule = controller.get_schedule_by_sch_id(message.sch_id) |
|
41
|
|
|
parent = FakeParent(schedule, |
|
42
|
|
|
controller.host_resources, |
|
43
|
|
|
info['nod_id_outer_worker'], |
|
44
|
|
|
info['rnd_id_outer_worker']) |
|
45
|
|
|
|
|
46
|
|
|
# Validate XML against XSD. |
|
47
|
|
|
reader = XmlReader() |
|
48
|
|
|
inner_worker = reader.parse_dynamic_worker(message.xml, parent) |
|
49
|
|
|
name = inner_worker.name |
|
50
|
|
|
|
|
51
|
|
|
# Note: Dynamic node is the parent of the worker node which is the parent of the inner worker node. |
|
52
|
|
|
inner_worker.set_levels(info['nod_recursion_level'] + 2) |
|
53
|
|
|
|
|
54
|
|
|
# Store the dynamically defined inner worker node. |
|
55
|
|
|
inner_worker.store(info['srv_id'], 0) |
|
56
|
|
|
|
|
57
|
|
|
# Create dependencies between the input and output port of the worker node and its child node(s). |
|
58
|
|
|
DataLayer.enk_back_node_dynamic_add_dependencies(info['nod_id_outer_worker'], inner_worker.nod_id) |
|
59
|
|
|
|
|
60
|
|
|
# XXX trigger reload of front end |
|
61
|
|
|
|
|
62
|
|
|
# Unload the schedule to force a reload of the schedule with new nodes added. |
|
63
|
|
|
controller.unload_schedule(message.sch_id) |
|
64
|
|
|
|
|
65
|
|
|
response = {'ret': 0, |
|
66
|
|
|
'message': "Worker '%s' successfully loaded." % name} |
|
67
|
|
|
|
|
68
|
|
|
except Exception as exception: |
|
69
|
|
|
print(exception, file=sys.stderr) |
|
70
|
|
|
response = {'ret': -1, |
|
71
|
|
|
'message': str(exception)} |
|
72
|
|
|
traceback.print_exc(file=sys.stderr) |
|
73
|
|
|
|
|
74
|
|
|
# Send the message to the job. |
|
75
|
|
|
controller.message_controller.send_message('lockstep', response, True) |
|
76
|
|
|
|
|
77
|
|
|
# ---------------------------------------------------------------------------------------------------------------------- |
|
78
|
|
|
|