Source code for epyt_flow.rest_api.server

  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()