From 6b9540d02293a0673802b484b1d848877f50a7b5 Mon Sep 17 00:00:00 2001
From: Valentin Rigal <rigal@teklia.com>
Date: Mon, 17 May 2021 18:00:04 +0200
Subject: [PATCH] Add a developer mode via --dev argument

---
 arkindex_worker/worker/__init__.py          |  2 ++
 arkindex_worker/worker/base.py              | 29 ++++++++++++++-------
 tests/test_base_worker.py                   | 14 ++++++++++
 tests/test_elements_worker/test_elements.py |  3 +++
 tests/test_elements_worker/test_worker.py   | 14 ++++++++++
 5 files changed, 53 insertions(+), 9 deletions(-)

diff --git a/arkindex_worker/worker/__init__.py b/arkindex_worker/worker/__init__.py
index 040b5b2c..cfd043dc 100644
--- a/arkindex_worker/worker/__init__.py
+++ b/arkindex_worker/worker/__init__.py
@@ -86,6 +86,8 @@ class ElementsWorker(
 
     @property
     def store_activity(self):
+        if self.args.dev:
+            return False
         assert (
             self.process_information
         ), "Worker must be configured to access its process activity state"
diff --git a/arkindex_worker/worker/base.py b/arkindex_worker/worker/base.py
index cff845c1..25e126ce 100644
--- a/arkindex_worker/worker/base.py
+++ b/arkindex_worker/worker/base.py
@@ -61,6 +61,7 @@ class BaseWorker(object):
 
         logger.info(f"Worker will use {self.work_dir} as working directory")
 
+        self.process_information = None
         self.support_cache = support_cache
         # use_cache will be updated in configure() if the cache is supported and if there
         # is at least one available sqlite database either given or in the parent tasks
@@ -68,8 +69,8 @@ class BaseWorker(object):
 
     @property
     def is_read_only(self):
-        """Worker cannot publish anything without a worker version ID"""
-        return self.worker_version_id is None
+        """Worker cannot publish anything in dev mode or without a worker version ID"""
+        return self.args.dev or self.worker_version_id is None
 
     def configure(self):
         """
@@ -95,6 +96,15 @@ class BaseWorker(object):
             action="store_true",
             default=False,
         )
+        self.parser.add_argument(
+            "--dev",
+            help=(
+                "Run worker in developer mode. "
+                "Worker will be in read-only state even if a worker_version is supplied. "
+                "ARKINDEX_PROCESS_ID environment variable is not required with this flag."
+            ),
+            action="store_true",
+        )
 
         # Call potential extra arguments
         self.add_arguments()
@@ -116,13 +126,14 @@ class BaseWorker(object):
         logger.debug(f"Connected as {user['display_name']} - {user['email']}")
         self.features = user["features"]
 
-        # Load process information
-        assert os.environ.get(
-            "ARKINDEX_PROCESS_ID"
-        ), "ARKINDEX_PROCESS_ID environment variable is not defined"
-        self.process_information = self.request(
-            "RetrieveDataImport", id=os.environ["ARKINDEX_PROCESS_ID"]
-        )
+        # Load process information except in developer mode
+        if not self.args.dev:
+            assert os.environ.get(
+                "ARKINDEX_PROCESS_ID"
+            ), "ARKINDEX_PROCESS_ID environment variable is not defined"
+            self.process_information = self.request(
+                "RetrieveDataImport", id=os.environ["ARKINDEX_PROCESS_ID"]
+            )
 
         if self.worker_version_id:
             # Retrieve initial configuration from API
diff --git a/tests/test_base_worker.py b/tests/test_base_worker.py
index d5f577c0..90953177 100644
--- a/tests/test_base_worker.py
+++ b/tests/test_base_worker.py
@@ -119,6 +119,20 @@ def test_cli_arg_verbose_given(mocker, mock_config_api):
     logger.setLevel(logging.NOTSET)
 
 
+def test_configure_dev_mode(mocker, mock_user_api, mock_worker_version_api):
+    """
+    Configuring a worker in developer mode avoid retrieving process information
+    """
+    worker = BaseWorker()
+    mocker.patch.object(sys, "argv", ["worker", "--dev"])
+    worker.configure()
+
+    assert worker.args.dev is True
+    assert worker.process_information is None
+    assert worker.worker_version_id == "12341234-1234-1234-1234-123412341234"
+    assert worker.is_read_only is True
+
+
 def test_load_missing_secret():
     worker = BaseWorker()
     worker.api_client = MockApiClient()
diff --git a/tests/test_elements_worker/test_elements.py b/tests/test_elements_worker/test_elements.py
index 46eeda2d..b89fb20f 100644
--- a/tests/test_elements_worker/test_elements.py
+++ b/tests/test_elements_worker/test_elements.py
@@ -91,6 +91,7 @@ def test_list_elements_element_arg(mocker, mock_elements_worker):
             verbose=False,
             elements_list=None,
             database=None,
+            dev=False,
         ),
     )
 
@@ -121,6 +122,7 @@ def test_list_elements_both_args_error(mocker, mock_elements_worker):
             verbose=False,
             elements_list=open(path),
             database=None,
+            dev=False,
         ),
     )
 
@@ -144,6 +146,7 @@ def test_database_arg(mocker, mock_elements_worker, tmp_path):
             verbose=False,
             elements_list=None,
             database=str(database_path),
+            dev=False,
         ),
     )
 
diff --git a/tests/test_elements_worker/test_worker.py b/tests/test_elements_worker/test_worker.py
index 998e3df3..ca52c53a 100644
--- a/tests/test_elements_worker/test_worker.py
+++ b/tests/test_elements_worker/test_worker.py
@@ -100,6 +100,20 @@ def test_activities_disabled(
     ] == BASE_API_CALLS
 
 
+def test_activities_dev_mode(mocker, mock_user_api, mock_worker_version_api):
+    """
+    Worker activities are not stored in dev mode
+    """
+    worker = ElementsWorker()
+    mocker.patch.object(sys, "argv", ["worker", "--dev"])
+    worker.configure()
+
+    assert worker.args.dev is True
+    assert worker.process_information is None
+    assert worker.is_read_only is True
+    assert worker.store_activity is False
+
+
 def test_update_call(responses, mock_elements_worker, mock_process_api):
     """Test an update call with feature enabled triggers an API call"""
     responses.add(
-- 
GitLab