Skip to content
Snippets Groups Projects
Commit 4f12d39d authored by David Trattnig's avatar David Trattnig
Browse files

Push logentry to sync host.

parent eaab4bf4
No related branches found
No related tags found
No related merge requests found
Pipeline #758 passed
...@@ -23,6 +23,12 @@ api_port=8008 ...@@ -23,6 +23,12 @@ api_port=8008
[federation] [federation]
# Defines the engine number id for identification of record sources. Default values are:
#
# 1 ... Engine 1 (main node)
# 2 ... Engine 2 (main node, not needed for single deployment)
# 0 ... Sync Host (sync node, not needed for single engine deployment)
#
# Engine API supports two deployment models: # Engine API supports two deployment models:
# #
# - "main": Deployed together with some `engine` (Single instance or for redundant engines) # - "main": Deployed together with some `engine` (Single instance or for redundant engines)
...@@ -30,11 +36,16 @@ api_port=8008 ...@@ -30,11 +36,16 @@ api_port=8008
# #
# The `synch_host` identifies the host where data is gathered from/synced to, depended on the # The `synch_host` identifies the host where data is gathered from/synced to, depended on the
# chosen `node_type`. # chosen `node_type`.
#
node_type="main" host_id=1
sync_host="http://localhost:8010" sync_host="http://localhost:8010"
; node_type="sync" ; host_id=2
; sync_host="http://localhost:8010"
; host_id=0
; main_host_1="http://localhost:8008" ; main_host_1="http://localhost:8008"
; main_host_2="http://localhost:8009" ; main_host_2="http://localhost:8009"
sync_api_store_playlog="/api/v1/playlog/store"
\ No newline at end of file
...@@ -18,9 +18,10 @@ ...@@ -18,9 +18,10 @@
import datetime import datetime
import requests
from enum import Enum from enum import Enum
from models import PlayLog, TrackSchema from models import PlayLog, PlayLogSchema, TrackSchema
class NodeType(Enum): class NodeType(Enum):
...@@ -52,21 +53,32 @@ class ApiService(): ...@@ -52,21 +53,32 @@ class ApiService():
self.logger = logger self.logger = logger
# Evaluate deployment mode # Evaluate deployment mode
node_type = config.get("node_type") node_type = NodeType.MAIN
if not node_type == NodeType.MAIN.value: host_id = config.get("host_id")
if host_id == 0:
node_type = NodeType.SYNC
# Configured as Sync node
if not node_type == NodeType.MAIN:
self.node_type = NodeType.SYNC self.node_type = NodeType.SYNC
self.main_hosts = [ config.get("main_host_1"), config.get("main_host_2") ] self.main_hosts = [ config.get("main_host_1"), config.get("main_host_2") ]
self.logger.info("Running in 'SYNC' mode. Syncing data of '%s'" % (self.main_hosts)) if not self.main_hosts[0] and not self.main_hosts[1]:
self.logger.warn("Not a single main host defined. Be aware what you are doing.")
msg = "No sync possible as no host nodes are configured."
else:
msg = "Syncing data of hosts '%s'" % (self.main_hosts)
# Configured as Main node
else: else:
self.node_type = NodeType.MAIN self.node_type = NodeType.MAIN
# Validate sync host
self.sync_host = config.get("sync_host") self.sync_host = config.get("sync_host")
if not self.sync_host: if not self.sync_host:
raise ValueError("Invalid sync_host '%s'!" % self.sync_host) msg = "No child node for synchronization defined."
else:
msg = "Pushing data to '%s'" % (self.sync_host)
self.logger.info("Running in '%s' mode. %s" % (self.node_type, msg))
self.logger.info("Running in 'MAIN' mode. Pushing data to '%s'" % (self.sync_host))
def current_track(self): def current_track(self):
...@@ -122,8 +134,27 @@ class ApiService(): ...@@ -122,8 +134,27 @@ class ApiService():
Returns: Returns:
(PlayLogEntry) (PlayLogEntry)
""" """
if not data.log_source:
data.log_source = self.host_id
playlog = PlayLog(data) playlog = PlayLog(data)
playlog.save() playlog.save()
self.logger.info("Stored playlog for '%s'" % playlog.track_start)
# Push to sync node if configured
if self.sync_host:
playlog_schema = PlayLogSchema()
json_playlog = playlog_schema.dump(playlog)
try:
api_url = self.sync_host + self.config.get("sync_api_store_playlog")
r = requests.post(api_url, json=json_playlog)
if r.status_code == 200:
self.logger.info("Successfully pushed playlog for '%s' to '%s'" % (playlog.track_start, self.sync_host))
else:
self.logger.error("Error while pushing playlog to sync-node: " + r.json())
except Exception as e:
self.logger.error("Error while posting to sync-node API '%s'!" % (api_url), e)
def clock_info(self): def clock_info(self):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment