def start(self): """Programmatic start of the main service.""" assert os.path.exists(self._env_work_dir) # reload configuration load_config(get_config_file()) logger.configure(config.get("logging")) timeline_event.configure_timeline(config.get("timeline")) # watch configuration changes self.start_watch_config() log.info("Starting Ambianic server...") # Register the signal handlers servers = {} # Start the job threads try: for s_name, s_class in ROOT_SERVERS.items(): srv = s_class(config=config) srv.start() servers[s_name] = srv self._latest_heartbeat = time.monotonic() self._servers = servers # Keep the main thread running, otherwise signals are ignored. while True: time.sleep(0.5) self._healthcheck(servers) self._heartbeat() except ServiceExit: log.info("Service exit requested.") # stop servers and cleanup references self._stop_servers(servers) self._servers = {} self._service_exit_requested = False # stop watching config files self.stop_watch_config() if self._service_restart_requested: self._service_restart_requested = False log.info("Restarting Ambianic server.") return self.start() log.info("Exiting Ambianic server.") return True
async def startup_event(): # set an initial data dir location if config: cfg_data_dir = config.get("data_dir", DEFAULT_DATA_DIR) set_data_dir(data_dir=cfg_data_dir) if not app.data_dir: set_data_dir(data_dir=DEFAULT_DATA_DIR)
def get_status(): """Returns overall status of the Ambianic Edge device along with other device details such as release version.""" name = config.get("display_name", "My Ambianic Edge device") response_object = StatusResponse(status="OK", version=__version__, display_name=name) return response_object
def test_no_pipelines(my_dir): load_config(os.path.join(my_dir, "test-config-no-pipelines.yaml"), clean=True) assert config.get("pipelines") is None hb_flag = threading.Event() srv, t = None, None try: srv, t = _start_mock_server(work_dir=my_dir, heartbeat_flag=hb_flag) assert srv assert t hb_flag.wait(timeout=3) assert hb_flag.is_set() pps = srv._servers["pipelines"] assert isinstance(pps, ambianic.pipeline.interpreter.PipelineServer) assert not pps.pipeline_server_job.job._pipelines finally: _stop_mock_server(server=srv, thread=t)
def __init__(self, config): """Create Flask based web service.""" self.config = config data_dir = None if config: data_dir = config.get('data_dir', None) if not data_dir: data_dir = DEFAULT_DATA_DIR self.srv = None app = create_app(data_dir=data_dir) ip_address = '0.0.0.0' port = 8778 log.info('starting flask web server on %s:%d', ip_address, port) self.srv = make_server(ip_address, port, app) ctx = app.app_context() ctx.push() with app.app_context(): flask.current_app.data_dir = data_dir self.flask_stopped = True log.debug('Flask process created')
def get_device_display_name(): """ Get the user friendly display name for this Ambianic Edge device. """ display_name = config.get("display_name", None) return display_name
def test_no_pipelines(): load_config(os.path.join(_dir, 'test-config-no-pipelines.yaml'), True) assert config.get("pipelines", None) is None
def test_get_device_display_name(client): current_device_display_name = config.get("display_name", None) rv = client.get("/api/device/display_name") data = rv.json() log.debug(f"get -> /api/device/display_name: JSON response: {data}") assert data == current_device_display_name