1"""
2This module provides the EPyT-Flow REST API server.
3"""
4from wsgiref.simple_server import make_server, WSGIServer
5import falcon
6
7from .scenario.handlers import ScenarioManager, ScenarioNewHandler, \
8 ScenarioRemoveHandler, ScenarioGeneralParamsHandler, ScenarioSensorConfigHandler, \
9 ScenarioExportHandler, ScenarioTopologyHandler, ScenarioConfigHandler, \
10 ScenarioNodeDemandPatternHandler, ScenarioQualityParamsHandler
11from .scenario.uncertainty_handlers import ScenarioModelUncertaintyHandler, \
12 ScenarioSensorUncertaintyHandler
13from .scenario.control_handlers import ScenarioSimpleControlHandler, ScenarioComplexControlHandler
14from .scenario.event_handlers import ScenarioLeakageHandler, ScenarioSensorFaultHandler, \
15 ScenarioQualityEventHandler, ScenarioSensorReadingAttackHandler
16from .scenario.simulation_handlers import ScenarioSimulationHandler, \
17 ScenarioBasicQualitySimulationHandler, ScenarioAdvancedQualitySimulationHandler
18from .scada_data.handlers import ScadaDataManager, ScadaDataSensorConfigHandler, \
19 ScadaDataRemoveHandler, ScadaDataSensorFaultsHandler, ScadaDataConvertUnitsHandler
20from .scada_data.data_handlers import ScadaDataPressuresHandler, ScadaDataDemandsHandler, \
21 ScadaDataFlowsHandler, ScadaDataLinksQualityHandler, ScadaDataNodesQualityHandler, \
22 ScadaDataNodeBulkSpeciesHandler, ScadaDataLinkBulkSpeciesHandler, \
23 ScadaDataSurfaceSpeciesHandler, ScadaDataTankVolumesHandler, ScadaDataPumpStatesHandler, \
24 ScadaDataValveStatesHandler
25from .scada_data.export_handlers import ScadaDataExportHandler, ScadaDataXlsxExportHandler, \
26 ScadaDataMatlabExportHandler, ScadaDataNumpyExportHandler
27
28
[docs]
29class RestApiService():
30 """
31 Class implementing the REST API server.
32
33 Parameters
34 ----------
35 port : `int`, optional
36 Port of the server.
37
38 The default is 8080
39 """
40 def __init__(self, port: int = 8080):
41 self.app = falcon.App()
42 self.__port = port
43
44 self.scenario_mgr = ScenarioManager()
45 self.scada_data_mgr = ScadaDataManager()
46
47 self.app.add_route("/scenario/new",
48 ScenarioNewHandler(self.scenario_mgr))
49 self.app.add_route("/scenario/{scenario_id}",
50 ScenarioRemoveHandler(self.scenario_mgr))
51 self.app.add_route("/scenario/{scenario_id}/export",
52 ScenarioExportHandler(self.scenario_mgr))
53 self.app.add_route("/scenario/{scenario_id}/topology",
54 ScenarioTopologyHandler(self.scenario_mgr))
55 self.app.add_route("/scenario/{scenario_id}/scenario_config",
56 ScenarioConfigHandler(self.scenario_mgr))
57 self.app.add_route("/scenario/{scenario_id}/general_params",
58 ScenarioGeneralParamsHandler(self.scenario_mgr))
59 self.app.add_route("/scenario/{scenario_id}/quality_params",
60 ScenarioQualityParamsHandler(self.scenario_mgr))
61 self.app.add_route("/scenario/{scenario_id}/sensor_config",
62 ScenarioSensorConfigHandler(self.scenario_mgr))
63 self.app.add_route("/scenario/{scenario_id}/uncertainty/model",
64 ScenarioModelUncertaintyHandler(self.scenario_mgr))
65 self.app.add_route("/scenario/{scenario_id}/uncertainty/sensors",
66 ScenarioSensorUncertaintyHandler(self.scenario_mgr))
67 self.app.add_route("/scenario/{scenario_id}/controls/simple",
68 ScenarioSimpleControlHandler(self.scenario_mgr))
69 self.app.add_route("/scenario/{scenario_id}/controls/complex",
70 ScenarioComplexControlHandler(self.scenario_mgr))
71 self.app.add_route("/scenario/{scenario_id}/events/leakages",
72 ScenarioLeakageHandler(self.scenario_mgr))
73 self.app.add_route("/scenario/{scenario_id}/events/quality",
74 ScenarioQualityEventHandler(self.scenario_mgr))
75 self.app.add_route("/scenario/{scenario_id}/events/sensor_reading_attacks",
76 ScenarioSensorReadingAttackHandler(self.scenario_mgr))
77 self.app.add_route("/scenario/{scenario_id}/events/sensor_faults",
78 ScenarioSensorFaultHandler(self.scenario_mgr))
79 self.app.add_route("/scenario/{scenario_id}/node/{node_id}/demand_pattern",
80 ScenarioNodeDemandPatternHandler(self.scenario_mgr))
81 self.app.add_route("/scenario/{scenario_id}/simulation",
82 ScenarioSimulationHandler(scenario_mgr=self.scenario_mgr,
83 scada_data_mgr=self.scada_data_mgr))
84 self.app.add_route("/scenario/{scenario_id}/simulation/advanced_quality",
85 ScenarioBasicQualitySimulationHandler(scenario_mgr=self.scenario_mgr,
86 scada_data_mgr=
87 self.scada_data_mgr))
88 self.app.add_route("/scenario/{scenario_id}/simulation/basic_quality",
89 ScenarioAdvancedQualitySimulationHandler(scenario_mgr=self.scenario_mgr,
90 scada_data_mgr=
91 self.scada_data_mgr))
92
93 self.app.add_route("/scada_data/{data_id}",
94 ScadaDataRemoveHandler(self.scada_data_mgr))
95 self.app.add_route("/scada_data/{data_id}/sensor_config",
96 ScadaDataSensorConfigHandler(self.scada_data_mgr))
97 self.app.add_route("/scada_data/{data_id}/sensor_faults",
98 ScadaDataSensorFaultsHandler(self.scada_data_mgr))
99 self.app.add_route("/scada_data/{data_id}/nodes/pressures",
100 ScadaDataPressuresHandler(self.scada_data_mgr))
101 self.app.add_route("/scada_data/{data_id}/nodes/demands",
102 ScadaDataDemandsHandler(self.scada_data_mgr))
103 self.app.add_route("/scada_data/{data_id}/nodes/quality",
104 ScadaDataNodesQualityHandler(self.scada_data_mgr))
105 self.app.add_route("/scada_data/{data_id}/nodes/bulk_species",
106 ScadaDataNodeBulkSpeciesHandler(self.scada_data_mgr))
107 self.app.add_route("/scada_data/{data_id}/links/flows",
108 ScadaDataFlowsHandler(self.scada_data_mgr))
109 self.app.add_route("/scada_data/{data_id}/links/quality",
110 ScadaDataLinksQualityHandler(self.scada_data_mgr))
111 self.app.add_route("/scada_data/{data_id}/links/bulk_species",
112 ScadaDataLinkBulkSpeciesHandler(self.scada_data_mgr))
113 self.app.add_route("/scada_data/{data_id}/links/surface_species",
114 ScadaDataSurfaceSpeciesHandler(self.scada_data_mgr))
115 self.app.add_route("/scada_data/{data_id}/pump_states",
116 ScadaDataPumpStatesHandler(self.scada_data_mgr))
117 self.app.add_route("/scada_data/{data_id}/valve_states",
118 ScadaDataValveStatesHandler(self.scada_data_mgr))
119 self.app.add_route("/scada_data/{data_id}/tank_volumes",
120 ScadaDataTankVolumesHandler(self.scada_data_mgr))
121 self.app.add_route("/scada_data/{data_id}/export/xlsx",
122 ScadaDataXlsxExportHandler(scada_data_mgr=self.scada_data_mgr))
123 self.app.add_route("/scada_data/{data_id}/export/matlab",
124 ScadaDataMatlabExportHandler(scada_data_mgr=self.scada_data_mgr))
125 self.app.add_route("/scada_data/{data_id}/export/numpy",
126 ScadaDataNumpyExportHandler(scada_data_mgr=self.scada_data_mgr))
127 self.app.add_route("/scada_data/{data_id}/export",
128 ScadaDataExportHandler(scada_data_mgr=self.scada_data_mgr))
129 self.app.add_route("/scada_data/{data_id}/convert_units",
130 ScadaDataConvertUnitsHandler(scada_data_mgr=self.scada_data_mgr))
131
132 @property
133 def port(self) -> int:
134 """
135 Gets the port of the web server.
136
137 Returns
138 -------
139 `int`
140 Port.
141 """
142 return self.__port
143
[docs]
144 def make_server(self) -> WSGIServer:
145 """
146 Returns a new web server.
147 """
148 return make_server("", self.__port, self.app)
149
[docs]
150 def run(self) -> None:
151 """
152 Runs the REST service.
153 """
154 with self.make_server() as httpd:
155 httpd.serve_forever()