ifw-daq  1.0.0
IFW Data Acquisition modules
entrypoint.py
Go to the documentation of this file.
1 """
2 @file
3 @ingroup daq_metadaqifsim
4 @copyright 2021 ESO - European Southern Observatory
5 """
6 # pylint: disable=no-name-in-module,import-error,invalid-name
7 import argparse
8 import signal
9 import logging
10 import threading
11 import elt.pymal as pymal
12 
13 from ModDaqsimif.Daqsimif.SimCtl import SimCtlSyncService
14 
15 from . import __version__
16 from . import simulator
17 
18 
19 def LoadMalForUri(uri, malSpecificProperties):
20  """Load MAL mapping based on the first three characters of the uri
21  @param uri string uri
22  @param malSpecificProperties map of properties to use to initialize mapping
23  @return reference to mal.CiiFactory instance
24  @throw RuntimeError when mapping could not be loaded
25  """
26  scheme = uri[0:3]
27  malName = scheme
28  if malName == 'opc':
29  malName = 'opcua'
30  mal = pymal.loadMal(malName, malSpecificProperties)
31  factory = pymal.CiiFactory.getInstance()
32  factory.registerMal(scheme, mal)
33  return mal, factory
34 
35 
36 def main(args): # pylint: disable=unused-argument,too-many-locals
37  """Main entrypoint for simulator
38  """
39  logger = logging.getLogger("metadaqsim")
40 
41  parser = argparse.ArgumentParser()
42  parser.add_argument(
43  "--version",
44  action="version",
45  version="%(prog)s " "{version}".format(version=__version__),
46  help="print version number and exit",
47  )
48  parser.add_argument(
49  "-v",
50  "--verbose",
51  action="count",
52  default=0,
53  help="set the verbosity level: -v INFO, -vv DEBUG",
54  )
55  parser.add_argument(
56  "name",
57  help="server process name/id",
58  )
59  parser.add_argument(
60  "uri",
61  help="server URI where simulator will accept requests, without the service path",
62  )
63 
64  # Parse basic arguments to set up logging
65  main_args, _ = parser.parse_known_args()
66  verbose = main_args.verbose
67  level = logging.WARNING
68  if verbose >= 1:
69  level = logging.INFO
70  if verbose >= 2:
71  level = logging.DEBUG
72  # Configure console logging:
73  if main_args.verbose > 0 and False:
74  chdlr = logging.StreamHandler()
75  if verbose == 1:
76  chdlr.setFormatter(logging.Formatter("%(levelname)s: %(message)s"))
77  else:
78  chdlr.setFormatter(
79  logging.Formatter("%(name)s: %(levelname)s: %(message)s")
80  )
81  chdlr.setLevel(level)
82  logging.getLogger().addHandler(chdlr)
83 
84  logging.basicConfig(level=level, format="%(levelname)s: %(message)s")
85  logger.info("Started metadaqsim %s", __version__)
86 
87  name = main_args.name
88  uri = main_args.uri
89  mal, factory = LoadMalForUri(uri, {})
90 
91  logger.info("Creating server mal")
92  with factory.createServer(uri, pymal.rr.qos.DEFAULT, {}) as server:
93  try:
94  def shutdown(signum, frame): # pylint: disable=unused-argument
95  logger.info("Closing server due to signal %d", signum)
96  server.close()
97 
98  signal.signal(signal.SIGINT, shutdown)
99  signal.signal(signal.SIGTERM, shutdown)
100 
101  sim_ctl = simulator.SimulatorCtl(name, mal, server)
102 
103  try:
104  logger.info("Registering service 'simctl' on %s", uri)
105  server.registerService("simctl", SimCtlSyncService, sim_ctl)
106 
107  logger.info("Running server...")
108 
109  # Run mal in different thread to avoid it stealing signals.
110  # In addition it deadlocks when trying to shut down.
111  def run():
112  server.run()
113 
114  thr = threading.Thread(target=run, daemon=True)
115  thr.start()
116  thr.join()
117  logger.info("Server done.")
118  return 0
119  except Exception:
120  logging.exception("Exception")
121  return -2
122  except Exception:
123  logging.exception("Exception")
124  return -1
metadaqsim.entrypoint.LoadMalForUri
def LoadMalForUri(uri, malSpecificProperties)
Load MAL mapping based on the first three characters of the uri.
Definition: entrypoint.py:25
metadaqsim.simulator.SimulatorCtl
Simulator controller that implements Modmetadaqsimif and sets up simulation behaviour for Simulator.
Definition: simulator.py:169
metadaqsim.entrypoint.main
def main(args)
Main entrypoint for simulator.
Definition: entrypoint.py:38