From eaab4bf418f6c0151254d8bfc2c34ca09ef3e411 Mon Sep 17 00:00:00 2001
From: David Trattnig <david.trattnig@o94.at>
Date: Fri, 26 Jun 2020 12:13:08 +0200
Subject: [PATCH] Settings for deployment mode.

---
 .../sample/sample-development.engine-api.ini  | 18 ++++++++++
 src/service.py                                | 34 ++++++++++++++++++-
 2 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/config/sample/sample-development.engine-api.ini b/config/sample/sample-development.engine-api.ini
index 44d7c1f..175300a 100644
--- a/config/sample/sample-development.engine-api.ini
+++ b/config/sample/sample-development.engine-api.ini
@@ -20,3 +20,21 @@ debug_flask="false"
 [api]
 api_port=8008
 
+
+[federation]
+
+# Engine API supports two deployment models:
+#
+#   - "main": Deployed together with some `engine` (Single instance or for redundant engines)
+#   - "sync": Independent deployment, in charge of syncing data of two main-nodes
+#
+# The `synch_host` identifies the host where data is gathered from/synced to, depended on the
+# chosen `node_type`.
+#
+
+node_type="main"
+sync_host="http://localhost:8010"
+
+; node_type="sync"
+; main_host_1="http://localhost:8008"
+; main_host_2="http://localhost:8009"
diff --git a/src/service.py b/src/service.py
index 7e3155a..aa2ded2 100644
--- a/src/service.py
+++ b/src/service.py
@@ -19,9 +19,18 @@
 
 import datetime
 
+from enum import Enum
 from models import PlayLog, TrackSchema
 
 
+class NodeType(Enum):
+    """
+    Types of API Server deployment models.
+    """
+    MAIN = "main"
+    SYNC = "sync"
+
+
 
 class ApiService():
     """
@@ -30,12 +39,35 @@ class ApiService():
 
     config = None
     logger = None
+    node_type = None
+    sync_host = None
+    main_hosts = None
 
 
     def __init__(self, config, logger):
+        """
+        Initialize Service.
+        """
         self.config = config
         self.logger = logger
 
+        # Evaluate deployment mode
+        node_type = config.get("node_type")
+        if not node_type == NodeType.MAIN.value:
+            self.node_type = NodeType.SYNC
+            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))
+
+        else:
+            self.node_type = NodeType.MAIN
+
+            # Validate sync host
+            self.sync_host = config.get("sync_host")
+            if not self.sync_host:
+                raise ValueError("Invalid sync_host '%s'!" % self.sync_host)    
+
+            self.logger.info("Running in 'MAIN' mode. Pushing data to '%s'" % (self.sync_host))
+
 
     def current_track(self):  
         """
@@ -71,9 +103,9 @@ class ApiService():
         Get paginated playlog entries for since the given timestamp.  
 
         Args:
-            since_time (datetime): Get entries after this timestamp (e.g. &#x27;2020-08-29T09:12:33.001Z&#x27;)
             page (Integer): The number of items to skip before starting to collect the result set
             size (Integer): The numbers of items to return per page
+            since_time (datetime): Optionally, get entries after this timestamp (e.g. "2020-08-29T09:12:33.001Z")
 
         Returns:
             (List[PlayLogEntry])
-- 
GitLab