diff --git a/clearml_agent/backend_api/config/default/api.conf b/clearml_agent/backend_api/config/default/api.conf index 9f8aa62..9616e1b 100644 --- a/clearml_agent/backend_api/config/default/api.conf +++ b/clearml_agent/backend_api/config/default/api.conf @@ -28,6 +28,9 @@ pool_maxsize: 512 pool_connections: 512 + + # Override the default http method, use "put" if working behind GCP load balancer (default: "get") + # default_method: "get" } auth { diff --git a/clearml_agent/backend_api/session/request.py b/clearml_agent/backend_api/session/request.py index 009ee6d..7685f46 100644 --- a/clearml_agent/backend_api/session/request.py +++ b/clearml_agent/backend_api/session/request.py @@ -8,13 +8,14 @@ from .datamodel import DataModel from .defs import ENV_API_DEFAULT_REQ_METHOD -if ENV_API_DEFAULT_REQ_METHOD.get().upper() not in ("GET", "POST"): +if ENV_API_DEFAULT_REQ_METHOD.get().upper() not in ("GET", "POST", "PUT"): raise ValueError( "CLEARML_API_DEFAULT_REQ_METHOD environment variable must be 'get' or 'post' (any case is allowed)." ) class Request(ApiModel): + def_method = ENV_API_DEFAULT_REQ_METHOD.get(default="get") _method = ENV_API_DEFAULT_REQ_METHOD.get(default="get") def __init__(self, **kwargs): diff --git a/clearml_agent/backend_api/session/session.py b/clearml_agent/backend_api/session/session.py index ace788e..ba1581e 100644 --- a/clearml_agent/backend_api/session/session.py +++ b/clearml_agent/backend_api/session/session.py @@ -14,8 +14,9 @@ from requests.auth import HTTPBasicAuth from six.moves.urllib.parse import urlparse, urlunparse from .callresult import CallResult -from .defs import ENV_VERBOSE, ENV_HOST, ENV_ACCESS_KEY, ENV_SECRET_KEY, ENV_WEB_HOST, ENV_FILES_HOST, ENV_AUTH_TOKEN, \ - ENV_NO_DEFAULT_SERVER, ENV_DISABLE_VAULT_SUPPORT, ENV_INITIAL_CONNECT_RETRY_OVERRIDE, ENV_API_DEFAULT_REQ_METHOD +from .defs import ( + ENV_VERBOSE, ENV_HOST, ENV_ACCESS_KEY, ENV_SECRET_KEY, ENV_WEB_HOST, ENV_FILES_HOST, ENV_AUTH_TOKEN, + ENV_NO_DEFAULT_SERVER, ENV_DISABLE_VAULT_SUPPORT, ENV_INITIAL_CONNECT_RETRY_OVERRIDE, ENV_API_DEFAULT_REQ_METHOD, ) from .request import Request, BatchRequest from .token_manager import TokenManager from ..config import load @@ -110,6 +111,19 @@ class Session(TokenManager): self._logger = logger self.__auth_token = None + if ENV_API_DEFAULT_REQ_METHOD.get(default=None): + # Make sure we update the config object, so we pass it into the new containers when we map them + self.config["api.http.default_method"] = ENV_API_DEFAULT_REQ_METHOD.get() + # notice the default setting of Request.def_method are already set by the OS environment + elif self.config.get("api.http.default_method", None): + def_method = str(self.config.get("api.http.default_method", None)).strip() + if def_method.upper() not in ("GET", "POST", "PUT"): + raise ValueError( + "api.http.default_method variable must be 'get' or 'post' (any case is allowed)." + ) + Request.def_method = def_method + Request._method = Request.def_method + if ENV_AUTH_TOKEN.get( value_cb=lambda key, value: print("Using environment access token {}=********".format(key)) ): @@ -251,7 +265,7 @@ class Session(TokenManager): service, action, version=None, - method="get", + method=Request.def_method, headers=None, auth=None, data=None, @@ -328,7 +342,7 @@ class Session(TokenManager): service, action, version=None, - method="get", + method=Request.def_method, headers=None, data=None, json=None, @@ -371,7 +385,7 @@ class Session(TokenManager): headers=None, data=None, json=None, - method="get", + method=Request.def_method, ): """ Send a raw batch API request. Batch requests always use application/json-lines content type. @@ -615,7 +629,7 @@ class Session(TokenManager): try: data = {"expiration_sec": exp} if exp else {} res = self._send_request( - method=ENV_API_DEFAULT_REQ_METHOD.get(default="get"), + method=Request.def_method, service="auth", action="login", auth=auth, diff --git a/clearml_agent/commands/resolver.py b/clearml_agent/commands/resolver.py index e47aa68..61f813b 100644 --- a/clearml_agent/commands/resolver.py +++ b/clearml_agent/commands/resolver.py @@ -1,6 +1,8 @@ import json import re import shlex + +from clearml_agent.backend_api.session import Request from clearml_agent.helper.package.requirements import ( RequirementsManager, MarkerRequirement, compare_version_rules, ) @@ -26,7 +28,7 @@ def resolve_default_container(session, task_id, container_config): 'script.repository', 'script.branch', 'project', 'container'], 'search_hidden': True}, - method='get', + method=Request.def_method, async_enable=False, ) try: @@ -53,7 +55,7 @@ def resolve_default_container(session, task_id, container_config): 'id': [task_info.get('project')], 'only_fields': ['name'], }, - method='get', + method=Request.def_method, async_enable=False, ) try: diff --git a/clearml_agent/commands/worker.py b/clearml_agent/commands/worker.py index b535a6d..d79a531 100644 --- a/clearml_agent/commands/worker.py +++ b/clearml_agent/commands/worker.py @@ -38,7 +38,7 @@ from clearml_agent.backend_api.services import auth as auth_api from clearml_agent.backend_api.services import queues as queues_api from clearml_agent.backend_api.services import tasks as tasks_api from clearml_agent.backend_api.services import workers as workers_api -from clearml_agent.backend_api.session import CallResult +from clearml_agent.backend_api.session import CallResult, Request from clearml_agent.backend_api.session.defs import ( ENV_ENABLE_ENV_CONFIG_SECTION, ENV_ENABLE_FILES_CONFIG_SECTION, ENV_VENV_CONFIGURED, ENV_PROPAGATE_EXITCODE, ) @@ -272,7 +272,7 @@ def get_task(session, task_id, **kwargs): action='get_all', version='2.14', json={"id": [task_id], "search_hidden": True, **kwargs}, - method='get', + method=Request.def_method, async_enable=False, ) result = CallResult.from_result( @@ -304,7 +304,7 @@ def get_next_task(session, queue, get_task_info=False): action='get_next_task', version='2.14', json=request, - method='get', + method=Request.def_method, async_enable=False, ) if not result.ok: @@ -325,7 +325,7 @@ def get_task_container(session, task_id): action='get_all', version='2.14', json={'id': [task_id], 'only_fields': ['container'], 'search_hidden': True}, - method='get', + method=Request.def_method, async_enable=False, ) try: @@ -366,7 +366,7 @@ def set_task_container(session, task_id, docker_image=None, docker_arguments=Non action='edit', version='2.13', json={'task': task_id, 'container': container, 'force': True}, - method='get', + method=Request.def_method, async_enable=False, ) return result.ok diff --git a/clearml_agent/glue/k8s.py b/clearml_agent/glue/k8s.py index 8abc45f..c54d985 100644 --- a/clearml_agent/glue/k8s.py +++ b/clearml_agent/glue/k8s.py @@ -27,8 +27,8 @@ from clearml_agent.helper.dicts import merge_dicts from clearml_agent.helper.process import get_bash_output from clearml_agent.helper.resource_monitor import ResourceMonitor from clearml_agent.interface.base import ObjectID - -from .definitions import ENV_START_AGENT_SCRIPT_PATH +from clearml_agent.backend_api.session import Request +from clearml_agent.glue.definitions import ENV_START_AGENT_SCRIPT_PATH class K8sIntegration(Worker): @@ -299,7 +299,7 @@ class K8sIntegration(Worker): service='tasks', action='update', json={"task": task_id, "status_message": "K8S glue status: {}".format(msg)}, - method='get', + method=Request.def_method, async_enable=False, ) if not result.ok: diff --git a/clearml_agent/session.py b/clearml_agent/session.py index f813cca..fa52035 100644 --- a/clearml_agent/session.py +++ b/clearml_agent/session.py @@ -288,7 +288,7 @@ class Session(_Session): def get(self, service, action, version=None, headers=None, data=None, json=None, async_enable=False, **kwargs): return self._manual_request(service=service, action=action, - version=version, method="get", headers=headers, + version=version, method=Request.def_method, headers=headers, data=data, async_enable=async_enable, json=json or kwargs) @@ -299,7 +299,7 @@ class Session(_Session): data=data, async_enable=async_enable, json=json or kwargs) - def _manual_request(self, service, action, version=None, method="get", headers=None, + def _manual_request(self, service, action, version=None, method=Request.def_method, headers=None, data=None, json=None, async_enable=False, **kwargs): res = self.send_request(service=service, action=action,