airflow-unicore-integration 0.2.4__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. {airflow_unicore_integration-0.2.4/src/airflow_unicore_integration.egg-info → airflow_unicore_integration-0.3.0}/PKG-INFO +1 -1
  2. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/pyproject.toml +1 -1
  3. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/executors/unicore_executor.py +20 -1
  4. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/operators/container.py +4 -7
  5. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/operators/unicore_operators.py +2 -2
  6. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/util/job.py +5 -0
  7. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0/src/airflow_unicore_integration.egg-info}/PKG-INFO +1 -1
  8. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/LICENSE +0 -0
  9. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/README.rst +0 -0
  10. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/setup.cfg +0 -0
  11. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/__init__.py +0 -0
  12. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/executors/__init__.py +0 -0
  13. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/executors/run_task_via_supervisor.py +0 -0
  14. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/hooks/__init__.py +0 -0
  15. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/hooks/unicore_hooks.py +0 -0
  16. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/operators/__init__.py +0 -0
  17. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/policies/__init__.py +0 -0
  18. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration/util/launch_script_content.py +0 -0
  19. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration.egg-info/SOURCES.txt +0 -0
  20. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration.egg-info/dependency_links.txt +0 -0
  21. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration.egg-info/entry_points.txt +0 -0
  22. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration.egg-info/requires.txt +0 -0
  23. {airflow_unicore_integration-0.2.4 → airflow_unicore_integration-0.3.0}/src/airflow_unicore_integration.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airflow-unicore-integration
3
- Version: 0.2.4
3
+ Version: 0.3.0
4
4
  Summary: Running Unicore Jobs from airflow DAGs.
5
5
  Author-email: Christian Böttcher <c.boettcher@fz-juelich.de>
6
6
  License-Expression: BSD-3-Clause
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "airflow-unicore-integration"
10
- version = "0.2.4"
10
+ version = "0.3.0"
11
11
  authors = [
12
12
  { name="Christian Böttcher", email="c.boettcher@fz-juelich.de" },
13
13
  ]
@@ -20,8 +20,10 @@ from airflow.models.taskinstance import TaskInstance
20
20
  from airflow.models.taskinstancekey import TaskInstanceKey
21
21
  from airflow.utils.state import TaskInstanceState
22
22
  from pyunicore import client
23
+ from pyunicore.credentials import AuthenticationFailedException
23
24
  from pyunicore.credentials import Credential
24
25
  from pyunicore.credentials import create_credential
26
+ from requests.exceptions import RequestException
25
27
 
26
28
  from ..util.job import JobDescriptionGenerator
27
29
  from ..util.job import NaiveJobDescriptionGenerator
@@ -152,7 +154,24 @@ class UnicoreExecutor(BaseExecutor):
152
154
  raise TypeError(f"Don't know how to queue workload of type {type(workload).__name__}")
153
155
 
154
156
  # submit job to unicore and add to active_jobs dict for task state management
155
- job = self._submit_job(workload)
157
+ try:
158
+ job = self._submit_job(workload)
159
+ except AuthenticationFailedException as auth_exception:
160
+ self.fail(workload.ti.key)
161
+ self.log.error(
162
+ "Invalid credentials for UNICORE. Failing all UNICORE tasks until this has been resolved."
163
+ )
164
+ self.log.error(auth_exception)
165
+ return
166
+ except RequestException as re:
167
+ # Any kind of requests error, from DNS issues, to timeout Issues, to invalid UNICORE URL issues
168
+ self.fail(workload.ti.key)
169
+ self.log.error(
170
+ "Some Error appeared during the connection attempt to UNICORE. Failing this task Instance."
171
+ )
172
+ self.log.error(re)
173
+ return
174
+
156
175
  self.active_jobs[workload.ti.key] = job
157
176
 
158
177
  def end(self, heartbeat_interval=10) -> None:
@@ -1,6 +1,3 @@
1
- from typing import Dict
2
- from typing import List
3
-
4
1
  from airflow_unicore_integration.operators.unicore_operators import (
5
2
  UnicoreGenericOperator,
6
3
  )
@@ -10,13 +7,13 @@ class UnicoreContainerOperator(UnicoreGenericOperator):
10
7
  def __init__(
11
8
  self, name: str, docker_image_url: str, command: str, options: str | None = None, **kwargs
12
9
  ):
13
- params: Dict[str, str | List[str]] = {"COMMAND": command, "IMAGE_URL": docker_image_url}
14
- if options is not None:
15
- params["OPTIONS"] = options
16
10
  super().__init__(
17
11
  name=name,
18
12
  application_name="CONTAINER",
19
13
  application_version="1.0",
20
- parameters=params,
21
14
  **kwargs,
22
15
  )
16
+ self.params["COMMAND"] = command
17
+ self.params["IMAGE_URL"] = docker_image_url
18
+ if options is not None:
19
+ self.params["OPTIONS"] = options
@@ -45,7 +45,7 @@ class UnicoreGenericOperator(BaseOperator):
45
45
  user_post_command: str | None = None,
46
46
  run_user_post_command_on_login_node: bool | None = None,
47
47
  user_post_command_ignore_non_zero_exit_code: bool | None = None,
48
- resources: Dict[str, str] | None = None,
48
+ uc_resources: Dict[str, str] | None = None,
49
49
  project: str | None = None,
50
50
  imports: List[Dict[str, str | Sequence[str]]] | None = None,
51
51
  exports: List[Dict[str, str | List[str]]] | None = None,
@@ -97,7 +97,7 @@ class UnicoreGenericOperator(BaseOperator):
97
97
  self.user_post_command_ignore_non_zero_exit_code = (
98
98
  user_post_command_ignore_non_zero_exit_code
99
99
  )
100
- self.resources = resources
100
+ self.resources = uc_resources
101
101
  self.project = project
102
102
  self.imports = imports
103
103
  self.exports = exports
@@ -27,6 +27,7 @@ class JobDescriptionGenerator:
27
27
  EXECUTOR_CONFIG_POST_COMMANDS = "postcommands" # gets added to the unicore job descirption
28
28
  EXECUTOR_CONFIG_JOB_TYPE = "job_type"
29
29
  EXECUTOR_CONFIG_LOGIN_NODE = "login_node"
30
+ EXECUTOR_CONFIG_JOB_DESCRIPTION_PARAMS = "custom_job_description_additions"
30
31
  EXECUTOR_CONFIG_UNICORE_CONN_KEY = (
31
32
  "unicore_connection_id" # alternative connection id for the Unicore connection to use
32
33
  )
@@ -63,6 +64,7 @@ class NaiveJobDescriptionGenerator(JobDescriptionGenerator):
63
64
  user_added_post_commands: list[str] = executor_config.get(JobDescriptionGenerator.EXECUTOR_CONFIG_POST_COMMANDS, []) # type: ignore
64
65
  user_defined_job_type: str = executor_config.get(JobDescriptionGenerator.EXECUTOR_CONFIG_JOB_TYPE, None) # type: ignore
65
66
  user_defined_login_node: str = executor_config.get(JobDescriptionGenerator.EXECUTOR_CONFIG_LOGIN_NODE, None) # type: ignore
67
+ user_added_job_description: Dict[str, Any] = executor_config.get(JobDescriptionGenerator.EXECUTOR_CONFIG_JOB_DESCRIPTION_PARAMS, {}) # type: ignore
66
68
  # get local dag path from cmd and fix dag path in arguments
67
69
  dag_rel_path = str(workload.dag_rel_path)
68
70
  if dag_rel_path.startswith("DAG_FOLDER"):
@@ -194,4 +196,7 @@ class NaiveJobDescriptionGenerator(JobDescriptionGenerator):
194
196
  if user_added_resources:
195
197
  job_descr_dict["Resources"] = user_added_resources
196
198
 
199
+ # overwrite with values from user added field
200
+ job_descr_dict.update(user_added_job_description)
201
+
197
202
  return job_descr_dict
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airflow-unicore-integration
3
- Version: 0.2.4
3
+ Version: 0.3.0
4
4
  Summary: Running Unicore Jobs from airflow DAGs.
5
5
  Author-email: Christian Böttcher <c.boettcher@fz-juelich.de>
6
6
  License-Expression: BSD-3-Clause