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