From 3b70243adce054b904f4fe61dfcc5beef0f7f54b Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Mar 2024 14:50:13 +0100 Subject: [PATCH 01/49] AY-745 - added Deadline credentials to Settings This provides Site Settings fields for Deadline user name and password. --- server_addon/deadline/server/settings/main.py | 23 +++++++++++++++++++ server_addon/deadline/server/version.py | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/server_addon/deadline/server/settings/main.py b/server_addon/deadline/server/settings/main.py index 9537d6d550..8213268bce 100644 --- a/server_addon/deadline/server/settings/main.py +++ b/server_addon/deadline/server/settings/main.py @@ -18,6 +18,16 @@ class ServerListSubmodel(BaseSettingsModel): value: str = SettingsField(title="Value") +class LocalSubmodel(BaseSettingsModel): + """Select your local and remote site""" + username: str = SettingsField("", + title="Username", + scope=["site"]) + password: str = SettingsField("", + title="Password", + scope=["site"]) + + async def defined_deadline_ws_name_enum_resolver( addon: "BaseServerAddon", settings_variant: str = "production", @@ -48,17 +58,30 @@ class DeadlineSettings(BaseSettingsModel): scope=["project"], enum_resolver=defined_deadline_ws_name_enum_resolver ) + require_authentication: bool = SettingsField( + False, + title="Require Authentication", + scope=["project"], + ) publish: PublishPluginsModel = SettingsField( default_factory=PublishPluginsModel, title="Publish Plugins", ) + local_settings: LocalSubmodel = SettingsField( + default_factory=LocalSubmodel, + title="Local setting", + scope=["site"], + description="This setting is only applicable for artist's site", + ) + @validator("deadline_urls") def validate_unique_names(cls, value): ensure_unique_names(value) return value + DEFAULT_VALUES = { "deadline_urls": [ { diff --git a/server_addon/deadline/server/version.py b/server_addon/deadline/server/version.py index c11f861afb..569b1212f7 100644 --- a/server_addon/deadline/server/version.py +++ b/server_addon/deadline/server/version.py @@ -1 +1 @@ -__version__ = "0.1.9" +__version__ = "0.1.10" From 3137d8e7971cdc449a30f4efd77f368d2832fab4 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Mar 2024 14:53:57 +0100 Subject: [PATCH 02/49] AY-745 - added collector for DL user credentials Collects credentials if Project Settings have deadline authentication required. --- .../publish/collect_user_credentials.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py new file mode 100644 index 0000000000..d523f693a2 --- /dev/null +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +"""Collect user credentials + +Requires: + context -> project_settings + +Provides: + context -> deadline_require_authentication (bool) + context -> deadline_auth (tuple (str, str)) - (username, password) or None +""" +import pyblish.api + + +class CollectUserCredentials(pyblish.api.ContextPlugin): + """Collects user name and password for artist if DL requires authentication + """ + + # Run before collect_deadline_server_instance. + order = pyblish.api.CollectorOrder + label = "Collect Deadline User Credentials" + + def process(self, context): + deadline_settings = context.data["project_settings"]["deadline"] + + context.data["deadline_require_authentication"] = ( + deadline_settings)["require_authentication"] + context.data["deadline_auth"] = None + + if not context.data["deadline_require_authentication"]: + return + + local_settings = deadline_settings["local_settings"] + context.data["deadline_auth"] = (local_settings["username"], + local_settings["password"]) From 20d47e54ca678a6046582ac6544fcb670a53f86b Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Mar 2024 14:54:24 +0100 Subject: [PATCH 03/49] AY-745 - updated validator for DL connection --- .../help/validate_deadline_connection.xml | 17 +++++++++++++++++ .../publish/validate_deadline_connection.py | 18 ++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml diff --git a/client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml b/client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml new file mode 100644 index 0000000000..cafcdb8928 --- /dev/null +++ b/client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml @@ -0,0 +1,17 @@ + + + + Deadline Authentication + +## Deadline authenticatin is required + +This project has set in Settings that Deadline requires authentication. + +### How to repair? + +Please go to Ayon Server Site settings and provide your Deadline username and + most likely password too. (Deadline could run in configuration that empty passwords are allowed. Ask your administrator for details.) + + + + \ No newline at end of file diff --git a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py index a7b300beff..b1503fb95b 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py +++ b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py @@ -1,5 +1,7 @@ import pyblish.api +from ayon_core.pipeline import PublishXmlValidationError + from openpype_modules.deadline.abstract_submit_deadline import requests_get @@ -15,8 +17,9 @@ class ValidateDeadlineConnection(pyblish.api.InstancePlugin): responses = {} def process(self, instance): + context = instance.context # get default deadline webservice url from deadline module - deadline_url = instance.context.data["defaultDeadline"] + deadline_url = context.data["defaultDeadline"] # if custom one is set in instance, use that if instance.data.get("deadlineUrl"): deadline_url = instance.data.get("deadlineUrl") @@ -25,8 +28,19 @@ class ValidateDeadlineConnection(pyblish.api.InstancePlugin): ) assert deadline_url, "Requires Deadline Webservice URL" + kwargs = {} + if context.data["deadline_require_authentication"]: + kwargs["auth"] = context.data["deadline_auth"] + + if not context.data["deadline_auth"]: + raise PublishXmlValidationError( + self, + "Deadline requires authentication. " + "At least username is required to be set in " + "Site Settings.") + if deadline_url not in self.responses: - self.responses[deadline_url] = requests_get(deadline_url) + self.responses[deadline_url] = requests_get(deadline_url, **kwargs) response = self.responses[deadline_url] assert response.ok, "Response must be ok" From 5ad0d4af0080577cfa4928d36c152c5012ea2575 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Mar 2024 14:54:41 +0100 Subject: [PATCH 04/49] AY-745 - updated validator for DL pools --- client/ayon_core/modules/deadline/deadline_module.py | 7 +++++-- .../deadline/plugins/publish/validate_deadline_pools.py | 6 ++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/modules/deadline/deadline_module.py b/client/ayon_core/modules/deadline/deadline_module.py index d2f0e263d4..761c8a8e92 100644 --- a/client/ayon_core/modules/deadline/deadline_module.py +++ b/client/ayon_core/modules/deadline/deadline_module.py @@ -45,7 +45,7 @@ class DeadlineModule(AYONAddon, IPluginPaths): } @staticmethod - def get_deadline_pools(webservice, log=None): + def get_deadline_pools(webservice, auth=None, log=None): # type: (str) -> list """Get pools from Deadline. Args: @@ -64,7 +64,10 @@ class DeadlineModule(AYONAddon, IPluginPaths): argument = "{}/api/pools?NamesOnly=true".format(webservice) try: - response = requests_get(argument) + kwargs = {} + if auth: + kwargs["auth"] = auth + response = requests_get(argument, **kwargs) except requests.exceptions.ConnectionError as exc: msg = 'Cannot connect to DL web service {}'.format(webservice) log.error(msg) diff --git a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py index 2feb044cf1..c54d187ccf 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py +++ b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py @@ -38,7 +38,8 @@ class ValidateDeadlinePools(OptionalPyblishPluginMixin, return deadline_url = self.get_deadline_url(instance) - pools = self.get_pools(deadline_url) + pools = self.get_pools(deadline_url, + instance.context.data["deadline_auth"]) invalid_pools = {} primary_pool = instance.data.get("primaryPool") @@ -69,13 +70,14 @@ class ValidateDeadlinePools(OptionalPyblishPluginMixin, deadline_url = instance.data.get("deadlineUrl") return deadline_url - def get_pools(self, deadline_url): + def get_pools(self, deadline_url, auth): if deadline_url not in self.pools_per_url: self.log.debug( "Querying available pools for Deadline url: {}".format( deadline_url) ) pools = DeadlineModule.get_deadline_pools(deadline_url, + auth=auth, log=self.log) self.log.info("Available pools: {}".format(pools)) self.pools_per_url[deadline_url] = pools From 615e6ae6f3ff13b817ebf1a5f0b7186aaef8016b Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Mar 2024 15:02:14 +0100 Subject: [PATCH 05/49] AY-745 - updated validator for expected files --- .../plugins/publish/validate_expected_and_rendered_files.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py b/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py index a666c5c2dc..0f20b5a644 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py +++ b/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py @@ -208,7 +208,10 @@ class ValidateExpectedFiles(pyblish.api.InstancePlugin): url = "{}/api/jobs?JobID={}".format(deadline_url, job_id) try: - response = requests_get(url) + kwargs = {} + if instance.context.data["deadline_auth"]: + kwargs["auth"] = instance.context.data["deadline_auth"] + response = requests_get(url, **kwargs) except requests.exceptions.ConnectionError: self.log.error("Deadline is not accessible at " "{}".format(deadline_url)) From 28e5834b4cbe6facec6baccb951c7b8e4f0cec11 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Mar 2024 15:04:17 +0100 Subject: [PATCH 06/49] AY-745 - added authentication credentials to all calls to DL Changed all calls to module's method which handle SSL --- .../deadline/abstract_submit_deadline.py | 19 +++++++++++++------ .../publish/submit_celaction_deadline.py | 8 ++++++-- .../plugins/publish/submit_fusion_deadline.py | 8 +++++--- .../plugins/publish/submit_maya_deadline.py | 14 +++++++++----- .../plugins/publish/submit_nuke_deadline.py | 8 ++++++-- .../publish/submit_publish_cache_job.py | 8 ++++++-- .../plugins/publish/submit_publish_job.py | 8 ++++++-- 7 files changed, 51 insertions(+), 22 deletions(-) diff --git a/client/ayon_core/modules/deadline/abstract_submit_deadline.py b/client/ayon_core/modules/deadline/abstract_submit_deadline.py index 2e0518ae20..293e981230 100644 --- a/client/ayon_core/modules/deadline/abstract_submit_deadline.py +++ b/client/ayon_core/modules/deadline/abstract_submit_deadline.py @@ -460,7 +460,9 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, self.plugin_info = self.get_plugin_info() self.aux_files = self.get_aux_files() - job_id = self.process_submission() + auth = context.data.get("deadline_auth") + self.log.info(f"auth::{auth}") + job_id = self.process_submission(auth) self.log.info("Submitted job to Deadline: {}.".format(job_id)) # TODO: Find a way that's more generic and not render type specific @@ -473,10 +475,10 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, job_info=render_job_info, plugin_info=render_plugin_info ) - render_job_id = self.submit(payload) + render_job_id = self.submit(payload, auth) self.log.info("Render job id: %s", render_job_id) - def process_submission(self): + def process_submission(self, auth=None): """Process data for submission. This takes Deadline JobInfo, PluginInfo, AuxFile, creates payload @@ -487,7 +489,7 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, """ payload = self.assemble_payload() - return self.submit(payload) + return self.submit(payload, auth) @abstractmethod def get_job_info(self): @@ -577,7 +579,7 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, "AuxFiles": aux_files or self.aux_files } - def submit(self, payload): + def submit(self, payload, auth): """Submit payload to Deadline API end-point. This takes payload in the form of JSON file and POST it to @@ -585,6 +587,7 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, Args: payload (dict): dict to become json in deadline submission. + auth (tuple): (username, password) Returns: str: resulting Deadline job id. @@ -594,7 +597,11 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, """ url = "{}/api/jobs".format(self._deadline_url) - response = requests_post(url, json=payload) + kwargs = {} + if auth: + kwargs["auth"] = auth + response = requests_post(url, json=payload, + **kwargs) if not response.ok: self.log.error("Submission failed!") self.log.error(response.status_code) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py index bc3636da63..e3160988c8 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py @@ -2,9 +2,10 @@ import os import re import json import getpass -import requests import pyblish.api +from openpype_modules.deadline.abstract_submit_deadline import requests_post + class CelactionSubmitDeadline(pyblish.api.InstancePlugin): """Submit CelAction2D scene to Deadline @@ -193,7 +194,10 @@ class CelactionSubmitDeadline(pyblish.api.InstancePlugin): self.log.debug("__ expectedFiles: `{}`".format( instance.data["expectedFiles"])) - response = requests.post(self.deadline_url, json=payload) + kwargs = {} + if instance.context.data["deadline_auth"]: + kwargs["auth"] = instance.context.data["deadline_auth"] + response = requests_post(self.deadline_url, json=payload, **kwargs) if not response.ok: self.log.error( diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py index 837ed91c60..54ec6101d0 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py @@ -2,10 +2,9 @@ import os import json import getpass -import requests - import pyblish.api +from openpype_modules.deadline.abstract_submit_deadline import requests_post from ayon_core.pipeline.publish import ( AYONPyblishPluginMixin ) @@ -251,7 +250,10 @@ class FusionSubmitDeadline( # E.g. http://192.168.0.1:8082/api/jobs url = "{}/api/jobs".format(deadline_url) - response = requests.post(url, json=payload) + kwargs = {} + if instance.context.data["deadline_auth"]: + kwargs["auth"] = instance.context.data["deadline_auth"] + response = requests_post(url, json=payload, **kwargs) if not response.ok: raise Exception(response.text) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py index 0e871eb90e..10e834e09a 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py @@ -290,7 +290,7 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, return plugin_payload - def process_submission(self): + def process_submission(self, auth=None): from maya import cmds instance = self._instance @@ -330,7 +330,8 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, if "vrayscene" in instance.data["families"]: self.log.debug("Submitting V-Ray scene render..") vray_export_payload = self._get_vray_export_payload(payload_data) - export_job = self.submit(vray_export_payload) + export_job = self.submit(vray_export_payload, + instance.context.data["deadline_auth"]) payload = self._get_vray_render_payload(payload_data) @@ -349,7 +350,8 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, else: # Submit main render job job_info, plugin_info = payload - self.submit(self.assemble_payload(job_info, plugin_info)) + self.submit(self.assemble_payload(job_info, plugin_info), + instance.context.data["deadline_auth"]) def _tile_render(self, payload): """Submit as tile render per frame with dependent assembly jobs.""" @@ -449,7 +451,8 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, # Submit frame tile jobs frame_tile_job_id = {} for frame, tile_job_payload in frame_payloads.items(): - job_id = self.submit(tile_job_payload) + job_id = self.submit(tile_job_payload, + instance.context.data["deadline_auth"]) frame_tile_job_id[frame] = job_id # Define assembly payloads @@ -557,7 +560,8 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, "submitting assembly job {} of {}".format(i + 1, num_assemblies) ) - assembly_job_id = self.submit(payload) + assembly_job_id = self.submit(payload, + instance.context.data["deadline_auth"]) assembly_job_ids.append(assembly_job_id) instance.data["assemblySubmissionJobs"] = assembly_job_ids diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py index a3111454b3..e80c56ee1f 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py @@ -4,9 +4,9 @@ import json import getpass from datetime import datetime -import requests import pyblish.api +from openpype_modules.deadline.abstract_submit_deadline import requests_post from ayon_core.pipeline.publish import ( AYONPyblishPluginMixin ) @@ -434,7 +434,11 @@ class NukeSubmitDeadline(pyblish.api.InstancePlugin, self.log.debug("__ expectedFiles: `{}`".format( instance.data["expectedFiles"])) - response = requests.post(self.deadline_url, json=payload, timeout=10) + kwargs = {} + if instance.context.data["deadline_auth"]: + kwargs["auth"] = instance.context.data["deadline_auth"] + response = requests_post(self.deadline_url, json=payload, timeout=10, + **kwargs) if not response.ok: raise Exception(response.text) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py index 0561e0f65c..86ac2201e6 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py @@ -5,10 +5,10 @@ import json import re from copy import deepcopy -import requests import ayon_api import pyblish.api +from openpype_modules.deadline.abstract_submit_deadline import requests_post from ayon_core.pipeline import publish from ayon_core.lib import EnumDef, is_in_tests from ayon_core.pipeline.version_start import get_versioning_start @@ -209,7 +209,11 @@ class ProcessSubmittedCacheJobOnFarm(pyblish.api.InstancePlugin, self.log.debug("Submitting Deadline publish job ...") url = "{}/api/jobs".format(self.deadline_url) - response = requests.post(url, json=payload, timeout=10) + kwargs = {} + if instance.context.data["deadline_auth"]: + kwargs["auth"] = instance.context.data["deadline_auth"] + response = requests_post(url, json=payload, timeout=10, + **kwargs) if not response.ok: raise Exception(response.text) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index 7a6abd5507..e9e76a112c 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -5,11 +5,11 @@ import json import re from copy import deepcopy -import requests import clique import ayon_api import pyblish.api +from openpype_modules.deadline.abstract_submit_deadline import requests_post from ayon_core.pipeline import publish from ayon_core.lib import EnumDef, is_in_tests from ayon_core.pipeline.version_start import get_versioning_start @@ -303,7 +303,11 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, self.log.debug("Submitting Deadline publish job ...") url = "{}/api/jobs".format(self.deadline_url) - response = requests.post(url, json=payload, timeout=10) + kwargs = {} + if instance.context.data["deadline_auth"]: + kwargs["auth"] = instance.context.data["deadline_auth"] + response = requests_post(url, json=payload, timeout=10, + **kwargs) if not response.ok: raise Exception(response.text) From 0a9b88a7cf903b856821d273f63f14b442e44daa Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Mar 2024 15:17:06 +0100 Subject: [PATCH 07/49] AY-745 - fix validation --- .../plugins/publish/validate_deadline_connection.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py index b1503fb95b..2c05e505c5 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py +++ b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py @@ -32,7 +32,7 @@ class ValidateDeadlineConnection(pyblish.api.InstancePlugin): if context.data["deadline_require_authentication"]: kwargs["auth"] = context.data["deadline_auth"] - if not context.data["deadline_auth"]: + if not context.data["deadline_auth"][0]: raise PublishXmlValidationError( self, "Deadline requires authentication. " @@ -43,6 +43,12 @@ class ValidateDeadlineConnection(pyblish.api.InstancePlugin): self.responses[deadline_url] = requests_get(deadline_url, **kwargs) response = self.responses[deadline_url] + if response.status_code == 401: + raise PublishXmlValidationError( + self, + "Deadline requires authentication. " + "Provided credentials are not working. " + "Please change them in Site Settings") assert response.ok, "Response must be ok" assert response.text.startswith("Deadline Web Service "), ( "Web service did not respond with 'Deadline Web Service'" From 56a5f42a66582854e16753604c83f720a3adb848 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Mar 2024 16:11:52 +0100 Subject: [PATCH 08/49] Update client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml Co-authored-by: Roy Nieterau --- .../plugins/publish/help/validate_deadline_connection.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml b/client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml index cafcdb8928..e9377d8baa 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml +++ b/client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml @@ -3,7 +3,7 @@ Deadline Authentication -## Deadline authenticatin is required +## Deadline authentication is required This project has set in Settings that Deadline requires authentication. From 543ffa902512e62602f53ce5de94df258dea5b08 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Mar 2024 16:11:59 +0100 Subject: [PATCH 09/49] Update client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py Co-authored-by: Roy Nieterau --- .../deadline/plugins/publish/collect_user_credentials.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py index d523f693a2..75836d9fca 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py @@ -11,7 +11,7 @@ Provides: import pyblish.api -class CollectUserCredentials(pyblish.api.ContextPlugin): +class CollectDeadlineUserCredentials(pyblish.api.ContextPlugin): """Collects user name and password for artist if DL requires authentication """ From 209cad619118393eb7a3c1442e67d3e6df9cb543 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Mar 2024 16:13:08 +0100 Subject: [PATCH 10/49] AY-745 - remove logging --- client/ayon_core/modules/deadline/abstract_submit_deadline.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/abstract_submit_deadline.py b/client/ayon_core/modules/deadline/abstract_submit_deadline.py index 293e981230..cc565fdc1e 100644 --- a/client/ayon_core/modules/deadline/abstract_submit_deadline.py +++ b/client/ayon_core/modules/deadline/abstract_submit_deadline.py @@ -461,7 +461,6 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, self.aux_files = self.get_aux_files() auth = context.data.get("deadline_auth") - self.log.info(f"auth::{auth}") job_id = self.process_submission(auth) self.log.info("Submitted job to Deadline: {}.".format(job_id)) From 7fae6d1aaf40952c69189569f99b099578dae3c1 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 25 Mar 2024 12:38:21 +0100 Subject: [PATCH 11/49] AY-745 - added new system wide Site settings Credentials for DL servers should be set only once, not for each project separately --- server_addon/deadline/server/__init__.py | 4 +- .../deadline/server/settings/__init__.py | 2 + server_addon/deadline/server/settings/main.py | 51 +++++++------------ .../deadline/server/settings/site_settings.py | 26 ++++++++++ 4 files changed, 48 insertions(+), 35 deletions(-) create mode 100644 server_addon/deadline/server/settings/site_settings.py diff --git a/server_addon/deadline/server/__init__.py b/server_addon/deadline/server/__init__.py index 36d04189a9..4a67b9741c 100644 --- a/server_addon/deadline/server/__init__.py +++ b/server_addon/deadline/server/__init__.py @@ -3,7 +3,7 @@ from typing import Type from ayon_server.addons import BaseServerAddon from .version import __version__ -from .settings import DeadlineSettings, DEFAULT_VALUES +from .settings import DeadlineSettings, DEFAULT_VALUES, DeadlineSiteSettings class Deadline(BaseServerAddon): @@ -11,6 +11,8 @@ class Deadline(BaseServerAddon): title = "Deadline" version = __version__ settings_model: Type[DeadlineSettings] = DeadlineSettings + site_settings_model: Type[DeadlineSiteSettings] = DeadlineSiteSettings + async def get_default_settings(self): settings_model_cls = self.get_settings_model() diff --git a/server_addon/deadline/server/settings/__init__.py b/server_addon/deadline/server/settings/__init__.py index 0307862afa..d25c0fb330 100644 --- a/server_addon/deadline/server/settings/__init__.py +++ b/server_addon/deadline/server/settings/__init__.py @@ -2,9 +2,11 @@ from .main import ( DeadlineSettings, DEFAULT_VALUES, ) +from .site_settings import DeadlineSiteSettings __all__ = ( "DeadlineSettings", + "DeadlineSiteSettings", "DEFAULT_VALUES", ) diff --git a/server_addon/deadline/server/settings/main.py b/server_addon/deadline/server/settings/main.py index 8213268bce..31a42a3e27 100644 --- a/server_addon/deadline/server/settings/main.py +++ b/server_addon/deadline/server/settings/main.py @@ -12,22 +12,6 @@ from .publish_plugins import ( ) -class ServerListSubmodel(BaseSettingsModel): - _layout = "compact" - name: str = SettingsField(title="Name") - value: str = SettingsField(title="Value") - - -class LocalSubmodel(BaseSettingsModel): - """Select your local and remote site""" - username: str = SettingsField("", - title="Username", - scope=["site"]) - password: str = SettingsField("", - title="Password", - scope=["site"]) - - async def defined_deadline_ws_name_enum_resolver( addon: "BaseServerAddon", settings_variant: str = "production", @@ -39,42 +23,39 @@ async def defined_deadline_ws_name_enum_resolver( settings = await addon.get_studio_settings(variant=settings_variant) - ws_urls = [] + ws_server_name = [] for deadline_url_item in settings.deadline_urls: - ws_urls.append(deadline_url_item.name) + ws_server_name.append(deadline_url_item.name) - return ws_urls + return ws_server_name + +class ServerListSubmodel(BaseSettingsModel): + _layout = "compact" + name: str = SettingsField(title="Name") + value: str = SettingsField(title="Url") + require_authentication: bool = SettingsField(title="Require authentication") + ssl: bool = SettingsField(title="SSL") class DeadlineSettings(BaseSettingsModel): deadline_urls: list[ServerListSubmodel] = SettingsField( default_factory=list, - title="System Deadline Webservice URLs", + title="System Deadline Webservice Info", scope=["studio"], ) + deadline_server: str = SettingsField( - title="Project deadline server", + title="Project Deadline server name", section="---", scope=["project"], enum_resolver=defined_deadline_ws_name_enum_resolver ) - require_authentication: bool = SettingsField( - False, - title="Require Authentication", - scope=["project"], - ) + publish: PublishPluginsModel = SettingsField( default_factory=PublishPluginsModel, title="Publish Plugins", ) - local_settings: LocalSubmodel = SettingsField( - default_factory=LocalSubmodel, - title="Local setting", - scope=["site"], - description="This setting is only applicable for artist's site", - ) - @validator("deadline_urls") def validate_unique_names(cls, value): ensure_unique_names(value) @@ -86,7 +67,9 @@ DEFAULT_VALUES = { "deadline_urls": [ { "name": "default", - "value": "http://127.0.0.1:8082" + "value": "http://127.0.0.1:8082", + "require_authentication": False, + "ssl": False } ], "deadline_server": "default", diff --git a/server_addon/deadline/server/settings/site_settings.py b/server_addon/deadline/server/settings/site_settings.py new file mode 100644 index 0000000000..cc3ec66ad9 --- /dev/null +++ b/server_addon/deadline/server/settings/site_settings.py @@ -0,0 +1,26 @@ +from ayon_server.settings import ( + BaseSettingsModel, + SettingsField, +) +from .main import defined_deadline_ws_name_enum_resolver + + +class LocalSubmodel(BaseSettingsModel): + """Provide credentials for configured DL servers""" + _layout = "expanded" + server_name: str = SettingsField("", + title="DL server name", + enum_resolver=defined_deadline_ws_name_enum_resolver) + username: str = SettingsField("", + title="Username") + password: str = SettingsField("", + title="Password") + + +class DeadlineSiteSettings(BaseSettingsModel): + local_settings: list[LocalSubmodel] = SettingsField( + default_factory=list, + title="Local setting", + description="Please provide credentials for configured Deadline servers", + ) + From 6b0568a3edb5b5eb8e91160da8a6d69f7f268da1 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:36:54 +0100 Subject: [PATCH 12/49] AY-745 - added version to client side Required for getting site settings from addon --- client/ayon_core/modules/deadline/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/ayon_core/modules/deadline/__init__.py b/client/ayon_core/modules/deadline/__init__.py index 5631e501d8..683d8dbe4a 100644 --- a/client/ayon_core/modules/deadline/__init__.py +++ b/client/ayon_core/modules/deadline/__init__.py @@ -1,6 +1,8 @@ from .deadline_module import DeadlineModule +from .version import __version__ __all__ = ( "DeadlineModule", + "__version__" ) From 12d49cbe6158907102aaec4bd7d3e55a0a7f2a38 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:37:27 +0100 Subject: [PATCH 13/49] AY-745 - added field to carry over deadline info Should be refactored into more generic if necessary --- client/ayon_core/pipeline/publish/abstract_collect_render.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/pipeline/publish/abstract_collect_render.py b/client/ayon_core/pipeline/publish/abstract_collect_render.py index 745632ca0a..6bd011b8f1 100644 --- a/client/ayon_core/pipeline/publish/abstract_collect_render.py +++ b/client/ayon_core/pipeline/publish/abstract_collect_render.py @@ -80,6 +80,7 @@ class RenderInstance(object): anatomyData = attr.ib(default=None) outputDir = attr.ib(default=None) context = attr.ib(default=None) + deadline = attr.ib(default=None) @frameStart.validator def check_frame_start(self, _, value): From 6347e659650f7b7179f9c6be76fc4befdd8ec6e5 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:38:20 +0100 Subject: [PATCH 14/49] AY-745 - explicit cast to tuple Data class translates auth tuple into list --- .../ayon_core/modules/deadline/abstract_submit_deadline.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/client/ayon_core/modules/deadline/abstract_submit_deadline.py b/client/ayon_core/modules/deadline/abstract_submit_deadline.py index cc565fdc1e..9b62f473dd 100644 --- a/client/ayon_core/modules/deadline/abstract_submit_deadline.py +++ b/client/ayon_core/modules/deadline/abstract_submit_deadline.py @@ -49,6 +49,10 @@ def requests_post(*args, **kwargs): if 'verify' not in kwargs: kwargs['verify'] = False if os.getenv("OPENPYPE_DONT_VERIFY_SSL", True) else True # noqa + + auth = kwargs.get("auth") + if auth: + kwargs["auth"] = tuple(auth) # explicit cast to tuple # add 10sec timeout before bailing out kwargs['timeout'] = 10 return requests.post(*args, **kwargs) @@ -70,6 +74,9 @@ def requests_get(*args, **kwargs): if 'verify' not in kwargs: kwargs['verify'] = False if os.getenv("OPENPYPE_DONT_VERIFY_SSL", True) else True # noqa + auth = kwargs.get("auth") + if auth: + kwargs["auth"] = tuple(auth) # add 10sec timeout before bailing out kwargs['timeout'] = 10 return requests.get(*args, **kwargs) From 5c9fc4a9960cbeeca236e56df0ecf5fa28e174ab Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:38:46 +0100 Subject: [PATCH 15/49] AY-745 - changed structure Additiona 'deadline' wrapper introduced --- .../ayon_core/modules/deadline/abstract_submit_deadline.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/modules/deadline/abstract_submit_deadline.py b/client/ayon_core/modules/deadline/abstract_submit_deadline.py index 9b62f473dd..e71177b34e 100644 --- a/client/ayon_core/modules/deadline/abstract_submit_deadline.py +++ b/client/ayon_core/modules/deadline/abstract_submit_deadline.py @@ -441,9 +441,7 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, """Plugin entry point.""" self._instance = instance context = instance.context - self._deadline_url = context.data.get("defaultDeadline") - self._deadline_url = instance.data.get( - "deadlineUrl", self._deadline_url) + self._deadline_url = instance.data["deadline"]["url"] assert self._deadline_url, "Requires Deadline Webservice URL" @@ -467,7 +465,7 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, self.plugin_info = self.get_plugin_info() self.aux_files = self.get_aux_files() - auth = context.data.get("deadline_auth") + auth = instance.data["deadline"]["auth"] job_id = self.process_submission(auth) self.log.info("Submitted job to Deadline: {}.".format(job_id)) From 68be4d77303ef311f09c92c779a125aff8fc93c0 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:40:56 +0100 Subject: [PATCH 16/49] AY-745 - changed aproach to get DL to use collect_deadline_server_from_instance.py should be reworked as currently it is not applicable for any publishes. There were fields to provide DL server directly into DCC UI (Maya, Nuke), but they are gone with New Publisher. --- .../collect_deadline_server_from_instance.py | 41 +++++++++++++++---- .../collect_default_deadline_server.py | 18 ++++---- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py index ea4b7a213e..74ab79cfbc 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py @@ -7,6 +7,7 @@ attribute or using default server if that attribute doesn't exists. """ import pyblish.api from ayon_core.pipeline.publish import KnownPublishError +from ayon_core.pipeline.context_tools import get_current_host_name class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): @@ -15,15 +16,37 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): # Run before collect_render. order = pyblish.api.CollectorOrder + 0.005 label = "Deadline Webservice from the Instance" - families = ["rendering", "renderlayer"] - hosts = ["maya"] + families = ["render", + "rendering", + "render.farm", + "renderFarm", + "renderlayer", + "maxrender", + "usdrender", + "redshift_rop", + "arnold_rop", + "mantra_rop", + "karma_rop", + "vray_rop", + "publish.hou", + "image"] # for Fusion def process(self, instance): - instance.data["deadlineUrl"] = self._collect_deadline_url(instance) - instance.data["deadlineUrl"] = \ - instance.data["deadlineUrl"].strip().rstrip("/") + if not "deadline" in instance.data: + instance.data["deadline"] = {} + + host_name = get_current_host_name() + if host_name == "maya": + deadline_url = self._collect_deadline_url(instance) + else: + deadline_url = (instance.data.get("deadlineUrl") or # backwards + instance.data.get("deadline", {}).get("url")) + if deadline_url: + instance.data["deadline"]["url"] = deadline_url.strip().rstrip("/") + else: + instance.data["deadline"]["url"] = instance.context.data["deadline"]["defaultDeadline"] # noqa self.log.debug( - "Using {} for submission.".format(instance.data["deadlineUrl"])) + "Using {} for submission".format(instance.data["deadline"]["url"])) def _collect_deadline_url(self, render_instance): # type: (pyblish.api.Instance) -> str @@ -49,8 +72,8 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): ["project_settings"] ["deadline"] ) - - default_server = render_instance.context.data["defaultDeadline"] + default_server = (render_instance.context.data["deadline"] + ["defaultDeadline"]) # QUESTION How and where is this is set? Should be removed? instance_server = render_instance.data.get("deadlineServers") if not instance_server: @@ -66,7 +89,7 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): default_servers = { url_item["name"]: url_item["value"] - for url_item in deadline_settings["deadline_urls"] + for url_item in deadline_settings["deadline_server_info"] } project_servers = ( render_instance.context.data diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py index 8123409052..472a40300d 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py @@ -33,15 +33,17 @@ class CollectDefaultDeadlineServer(pyblish.api.ContextPlugin): deadline_settings = context.data["project_settings"]["deadline"] deadline_server_name = deadline_settings["deadline_server"] - deadline_webservice = None + dl_ws_item = None if deadline_server_name: - deadline_webservice = deadline_module.deadline_urls.get( + dl_ws_item = deadline_module.deadline_server_info.get( deadline_server_name) - default_deadline_webservice = deadline_module.deadline_urls["default"] - deadline_webservice = ( - deadline_webservice - or default_deadline_webservice - ) + if dl_ws_item: + deadline_url = dl_ws_item["value"] + else: + default_dl_item = deadline_module.deadline_server_info.pop() + deadline_url = default_dl_item["value"] - context.data["defaultDeadline"] = deadline_webservice.strip().rstrip("/") # noqa + context.data["deadline"] = {} + context.data["deadline"]["defaultDeadline"] = ( + deadline_url.strip().rstrip("/")) From eca34a912be848c4f3f7f16991634156edb35745 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:41:44 +0100 Subject: [PATCH 17/49] AY-745 - update to Harmony collector DL will not work for Harmony, needs to be translated into New Publisher. --- .../hosts/harmony/plugins/publish/collect_farm_render.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/harmony/plugins/publish/collect_farm_render.py b/client/ayon_core/hosts/harmony/plugins/publish/collect_farm_render.py index 156e2ac6ba..e869de316f 100644 --- a/client/ayon_core/hosts/harmony/plugins/publish/collect_farm_render.py +++ b/client/ayon_core/hosts/harmony/plugins/publish/collect_farm_render.py @@ -177,7 +177,8 @@ class CollectFarmRender(publish.AbstractCollectRender): outputFormat=info[1], outputStartFrame=info[3], leadingZeros=info[2], - ignoreFrameHandleCheck=True + ignoreFrameHandleCheck=True, + # deadline=inst.data.get("deadline") TODO ) render_instance.context = context From abfcd8b2e7985d15664fbc48923a0b2a0c71b211 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:43:02 +0100 Subject: [PATCH 18/49] AY-745 - explicit carry over of DL meta for AbstractCollectRender AbstractCollectRender changes from original instance to `RenderInstance`, DL metadata must be propagated. --- .../hosts/aftereffects/plugins/publish/collect_render.py | 1 + client/ayon_core/hosts/fusion/plugins/publish/collect_render.py | 1 + 2 files changed, 2 insertions(+) diff --git a/client/ayon_core/hosts/aftereffects/plugins/publish/collect_render.py b/client/ayon_core/hosts/aftereffects/plugins/publish/collect_render.py index afd58ca758..913b4a7b96 100644 --- a/client/ayon_core/hosts/aftereffects/plugins/publish/collect_render.py +++ b/client/ayon_core/hosts/aftereffects/plugins/publish/collect_render.py @@ -146,6 +146,7 @@ class CollectAERender(publish.AbstractCollectRender): if "review" in instance.families: # to skip ExtractReview locally instance.families.remove("review") + instance.deadline = inst.data.get("deadline") instances.append(instance) instances_to_remove.append(inst) diff --git a/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py b/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py index 36102d02cb..ddc2902644 100644 --- a/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py +++ b/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py @@ -113,6 +113,7 @@ class CollectFusionRender( if "review" in instance.families: # to skip ExtractReview locally instance.families.remove("review") + instance.deadline = inst.data.get("deadline") # add new instance to the list and remove the original # instance since it is not needed anymore From 50ade43360ec6b5c6011f37186a25d216c5ea6b9 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:47:38 +0100 Subject: [PATCH 19/49] AY-745 - add user credentials to instance All render instances should have deadline server collected, enhance metadata with credentials --- .../publish/collect_user_credentials.py | 79 ++++++++++++++++--- 1 file changed, 66 insertions(+), 13 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py index 75836d9fca..061890dd08 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py @@ -3,32 +3,85 @@ Requires: context -> project_settings + instance.data["deadline"]["url"] + or instance.data["deadlineUrl"] for backward compatibility, remove soon Provides: - context -> deadline_require_authentication (bool) - context -> deadline_auth (tuple (str, str)) - (username, password) or None + instance.data["deadline"] -> require_authentication (bool) + instance.data["deadline"] -> auth (tuple (str, str)) - + (username, password) or None """ import pyblish.api +from ayon_api import get_server_api_connection +from ayon_core.modules.deadline.deadline_module import DeadlineModule +from ayon_core.modules.deadline import __version__ -class CollectDeadlineUserCredentials(pyblish.api.ContextPlugin): + +class CollectDeadlineUserCredentials(pyblish.api.InstancePlugin): """Collects user name and password for artist if DL requires authentication """ # Run before collect_deadline_server_instance. - order = pyblish.api.CollectorOrder + order = pyblish.api.CollectorOrder + 0.200 label = "Collect Deadline User Credentials" - def process(self, context): - deadline_settings = context.data["project_settings"]["deadline"] + hosts = ["aftereffects", + "fusion", + "harmony" + "nuke", + "maya", + "max", + "houdini"] - context.data["deadline_require_authentication"] = ( - deadline_settings)["require_authentication"] - context.data["deadline_auth"] = None + families = ["render", + "rendering", + "render.farm", + "renderFarm", + "renderlayer", + "maxrender", + "usdrender", + "redshift_rop", + "arnold_rop", + "mantra_rop", + "karma_rop", + "vray_rop", + "publish.hou"] - if not context.data["deadline_require_authentication"]: + def process(self, instance): + # backward compatibility, remove soon + collected_deadline_url = (instance.data.get("deadlineUrl") or + instance.data.get("deadline", {}).get("url")) + if not collected_deadline_url: + raise ValueError("Instance doesn't have 'deadlineUrl'.") + context_data = instance.context.data + deadline_settings = context_data["project_settings"]["deadline"] + + deadline_server_name = None + # deadline url might be set directly from instance, need to find + # metadata for it + for deadline_info in deadline_settings["deadline_urls"]: + dl_settings_url = deadline_info["value"].strip().rstrip("/") + if dl_settings_url == collected_deadline_url: + deadline_server_name = deadline_info["name"] + break + + if not deadline_server_name: + raise ValueError(f"Collected {collected_deadline_url} doesn't " + "match any site configured in Studio Settings") + + instance.data["deadline"]["require_authentication"] = ( + deadline_info["require_authentication"] + ) + instance.data["deadline"]["auth"] = None + + if not deadline_info["require_authentication"]: return - local_settings = deadline_settings["local_settings"] - context.data["deadline_auth"] = (local_settings["username"], - local_settings["password"]) + local_settings = get_server_api_connection().get_addon_site_settings( + DeadlineModule.name, __version__) + local_settings = local_settings["local_settings"] + for server_info in local_settings: + if deadline_server_name == server_info["server_name"]: + instance.data["deadline"]["auth"] = (server_info["username"], + server_info["password"]) From 7cf416dc7ed40858daeb8510c625dd83cf2f6e4f Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:48:24 +0100 Subject: [PATCH 20/49] AY-745 - refactored class variable It is not only urls, it is whole metadata --- client/ayon_core/modules/deadline/deadline_module.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/modules/deadline/deadline_module.py b/client/ayon_core/modules/deadline/deadline_module.py index 761c8a8e92..3a35654737 100644 --- a/client/ayon_core/modules/deadline/deadline_module.py +++ b/client/ayon_core/modules/deadline/deadline_module.py @@ -19,23 +19,23 @@ class DeadlineModule(AYONAddon, IPluginPaths): def initialize(self, studio_settings): # This module is always enabled - deadline_urls = {} + deadline_server_info = {} enabled = self.name in studio_settings if enabled: deadline_settings = studio_settings[self.name] - deadline_urls = { - url_item["name"]: url_item["value"] + deadline_server_info = { + url_item["name"]: url_item for url_item in deadline_settings["deadline_urls"] } - if enabled and not deadline_urls: + if enabled and not deadline_server_info: enabled = False self.log.warning(( "Deadline Webservice URLs are not specified. Disabling addon." )) self.enabled = enabled - self.deadline_urls = deadline_urls + self.deadline_server_info = deadline_server_info def get_plugin_paths(self): """Deadline plugin paths.""" From 6faa5acdf79d185b6f09ec9db88bb6f0b80debc2 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:49:20 +0100 Subject: [PATCH 21/49] AY-745 - refactored format of credentials Now on instance, in `deadline` dictionary --- .../plugins/publish/submit_blender_deadline.py | 3 ++- .../plugins/publish/submit_fusion_deadline.py | 10 ++++------ .../plugins/publish/submit_max_deadline.py | 6 ++++-- .../plugins/publish/submit_maya_deadline.py | 8 ++++---- .../plugins/publish/submit_nuke_deadline.py | 5 +++-- .../plugins/publish/submit_publish_cache_job.py | 5 +++-- .../deadline/plugins/publish/submit_publish_job.py | 14 +++++++------- 7 files changed, 27 insertions(+), 24 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py index ae19e63a37..a60bd70b13 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py @@ -172,7 +172,8 @@ class BlenderSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, instance.data["toBeRenderedOn"] = "deadline" payload = self.assemble_payload() - return self.submit(payload) + return self.submit(payload, + auth=instance.data["deadline"]["auth"]) def from_published_scene(self): """ diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py index 54ec6101d0..35c99108be 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py @@ -94,10 +94,7 @@ class FusionSubmitDeadline( from ayon_core.hosts.fusion.api.lib import get_frame_path # get default deadline webservice url from deadline module - deadline_url = instance.context.data["defaultDeadline"] - # if custom one is set in instance, use that - if instance.data.get("deadlineUrl"): - deadline_url = instance.data.get("deadlineUrl") + deadline_url = instance.data["deadline"]["url"] assert deadline_url, "Requires Deadline Webservice URL" # Collect all saver instances in context that are to be rendered @@ -251,8 +248,9 @@ class FusionSubmitDeadline( # E.g. http://192.168.0.1:8082/api/jobs url = "{}/api/jobs".format(deadline_url) kwargs = {} - if instance.context.data["deadline_auth"]: - kwargs["auth"] = instance.context.data["deadline_auth"] + auth = instance.data["deadline"]["auth"] + if auth: + kwargs["auth"] = auth response = requests_post(url, json=payload, **kwargs) if not response.ok: raise Exception(response.text) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py index 1abefa515a..51a9e6abfd 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py @@ -185,11 +185,13 @@ class MaxSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, payload_data, project_settings) job_infos, plugin_infos = payload for job_info, plugin_info in zip(job_infos, plugin_infos): - self.submit(self.assemble_payload(job_info, plugin_info)) + self.submit(self.assemble_payload(job_info, plugin_info), + instance.data["deadline"]["auth"]) else: payload = self._use_published_name(payload_data, project_settings) job_info, plugin_info = payload - self.submit(self.assemble_payload(job_info, plugin_info)) + self.submit(self.assemble_payload(job_info, plugin_info), + instance.data["deadline"]["auth"]) def _use_published_name(self, data, project_settings): # Not all hosts can import these modules. diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py index 10e834e09a..83ccfc7278 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py @@ -331,7 +331,7 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, self.log.debug("Submitting V-Ray scene render..") vray_export_payload = self._get_vray_export_payload(payload_data) export_job = self.submit(vray_export_payload, - instance.context.data["deadline_auth"]) + instance.data["deadline"]["auth"]) payload = self._get_vray_render_payload(payload_data) @@ -351,7 +351,7 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, # Submit main render job job_info, plugin_info = payload self.submit(self.assemble_payload(job_info, plugin_info), - instance.context.data["deadline_auth"]) + instance.data["deadline"]["auth"]) def _tile_render(self, payload): """Submit as tile render per frame with dependent assembly jobs.""" @@ -452,7 +452,7 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, frame_tile_job_id = {} for frame, tile_job_payload in frame_payloads.items(): job_id = self.submit(tile_job_payload, - instance.context.data["deadline_auth"]) + instance.data["deadline"]["auth"]) frame_tile_job_id[frame] = job_id # Define assembly payloads @@ -561,7 +561,7 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, num_assemblies) ) assembly_job_id = self.submit(payload, - instance.context.data["deadline_auth"]) + instance.data["deadline"]["auth"]) assembly_job_ids.append(assembly_job_id) instance.data["assemblySubmissionJobs"] = assembly_job_ids diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py index e80c56ee1f..07ee30af8c 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py @@ -435,8 +435,9 @@ class NukeSubmitDeadline(pyblish.api.InstancePlugin, self.log.debug("__ expectedFiles: `{}`".format( instance.data["expectedFiles"])) kwargs = {} - if instance.context.data["deadline_auth"]: - kwargs["auth"] = instance.context.data["deadline_auth"] + auth = instance.data["deadline"]["auth"] + if auth: + kwargs["auth"] = auth response = requests_post(self.deadline_url, json=payload, timeout=10, **kwargs) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py index 86ac2201e6..09e4f8a446 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py @@ -210,8 +210,9 @@ class ProcessSubmittedCacheJobOnFarm(pyblish.api.InstancePlugin, url = "{}/api/jobs".format(self.deadline_url) kwargs = {} - if instance.context.data["deadline_auth"]: - kwargs["auth"] = instance.context.data["deadline_auth"] + auth = instance.data["deadline"]["auth"] + if auth: + kwargs["auth"] = auth response = requests_post(url, json=payload, timeout=10, **kwargs) if not response.ok: diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index e9e76a112c..bacf902849 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -304,8 +304,9 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, url = "{}/api/jobs".format(self.deadline_url) kwargs = {} - if instance.context.data["deadline_auth"]: - kwargs["auth"] = instance.context.data["deadline_auth"] + auth = instance.data["deadline"]["auth"] + if auth: + kwargs["auth"] = auth response = requests_post(url, json=payload, timeout=10, **kwargs) if not response.ok: @@ -462,10 +463,7 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, } # get default deadline webservice url from deadline module - self.deadline_url = instance.context.data["defaultDeadline"] - # if custom one is set in instance, use that - if instance.data.get("deadlineUrl"): - self.deadline_url = instance.data.get("deadlineUrl") + self.deadline_url = instance.data["deadline"]["url"] assert self.deadline_url, "Requires Deadline Webservice URL" deadline_publish_job_id = \ @@ -473,7 +471,9 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, # Inject deadline url to instances. for inst in instances: - inst["deadlineUrl"] = self.deadline_url + if not "deadline" in inst: + inst["deadline"] = {} + inst["deadline"]["url"] = self.deadline_url # publish job file publish_job = { From 2ed1d0feee7cb12db33e53b0982e5b6c8ce3b1ae Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:50:26 +0100 Subject: [PATCH 22/49] AY-745 - refactored format of credentials Now on instance, in `deadline` dictionary --- .../publish/validate_deadline_connection.py | 21 +++++++------------ .../publish/validate_deadline_pools.py | 12 ++--------- 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py index 2c05e505c5..e077aedd9b 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py +++ b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py @@ -10,29 +10,22 @@ class ValidateDeadlineConnection(pyblish.api.InstancePlugin): label = "Validate Deadline Web Service" order = pyblish.api.ValidatorOrder - hosts = ["maya", "nuke"] - families = ["renderlayer", "render"] + hosts = ["maya", "nuke", "aftereffects", "harmony", "fusion"] + families = ["renderlayer", "render", "render.farm"] # cache responses = {} def process(self, instance): - context = instance.context - # get default deadline webservice url from deadline module - deadline_url = context.data["defaultDeadline"] - # if custom one is set in instance, use that - if instance.data.get("deadlineUrl"): - deadline_url = instance.data.get("deadlineUrl") - self.log.debug( - "We have deadline URL on instance {}".format(deadline_url) - ) + deadline_url = instance.data["deadline"]["url"] assert deadline_url, "Requires Deadline Webservice URL" kwargs = {} - if context.data["deadline_require_authentication"]: - kwargs["auth"] = context.data["deadline_auth"] + if instance.data["deadline"]["require_authentication"]: + auth = instance.data["deadline"]["auth"] + kwargs["auth"] = auth - if not context.data["deadline_auth"][0]: + if not auth[0]: raise PublishXmlValidationError( self, "Deadline requires authentication. " diff --git a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py index c54d187ccf..1afe49b7c9 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py +++ b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py @@ -37,9 +37,9 @@ class ValidateDeadlinePools(OptionalPyblishPluginMixin, self.log.debug("Skipping local instance.") return - deadline_url = self.get_deadline_url(instance) + deadline_url = instance.data["deadline"]["url"] pools = self.get_pools(deadline_url, - instance.context.data["deadline_auth"]) + instance.data["deadline"].get("auth")) invalid_pools = {} primary_pool = instance.data.get("primaryPool") @@ -62,14 +62,6 @@ class ValidateDeadlinePools(OptionalPyblishPluginMixin, formatting_data={"pools_str": ", ".join(pools)} ) - def get_deadline_url(self, instance): - # get default deadline webservice url from deadline module - deadline_url = instance.context.data["defaultDeadline"] - if instance.data.get("deadlineUrl"): - # if custom one is set in instance, use that - deadline_url = instance.data.get("deadlineUrl") - return deadline_url - def get_pools(self, deadline_url, auth): if deadline_url not in self.pools_per_url: self.log.debug( From 2dac53a940a1a8cc5efeaa6fcdc487cf2344f2ba Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:51:00 +0100 Subject: [PATCH 23/49] AY-745 - added protection for older DL Some DLs returned `none` for no pools configured. --- .../deadline/plugins/publish/validate_deadline_pools.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py index 1afe49b7c9..5094b3deaf 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py +++ b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_pools.py @@ -71,6 +71,9 @@ class ValidateDeadlinePools(OptionalPyblishPluginMixin, pools = DeadlineModule.get_deadline_pools(deadline_url, auth=auth, log=self.log) + # some DL return "none" as a pool name + if not "none" in pools: + pools.append("none") self.log.info("Available pools: {}".format(pools)) self.pools_per_url[deadline_url] = pools From e604c28cdb901f1d9312691f0f71fcc6754d2d87 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 13:51:15 +0100 Subject: [PATCH 24/49] AY-745 - added version for client side --- client/ayon_core/modules/deadline/version.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 client/ayon_core/modules/deadline/version.py diff --git a/client/ayon_core/modules/deadline/version.py b/client/ayon_core/modules/deadline/version.py new file mode 100644 index 0000000000..569b1212f7 --- /dev/null +++ b/client/ayon_core/modules/deadline/version.py @@ -0,0 +1 @@ +__version__ = "0.1.10" From 569d11932395bdc5c97a8cd2386f6b85c56fd8bb Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 14:57:11 +0100 Subject: [PATCH 25/49] AY-745 - add local filtering Shouldn't run to DL --- .../publish/collect_deadline_server_from_instance.py | 1 + .../plugins/publish/collect_default_deadline_server.py | 3 +-- .../plugins/publish/collect_user_credentials.py | 10 ++++------ .../publish/validate_expected_and_rendered_files.py | 6 +----- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py index 74ab79cfbc..913d64cb91 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py @@ -16,6 +16,7 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): # Run before collect_render. order = pyblish.api.CollectorOrder + 0.005 label = "Deadline Webservice from the Instance" + targets = ["local"] families = ["render", "rendering", "render.farm", diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py index 472a40300d..17b9386b5d 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py @@ -20,8 +20,7 @@ class CollectDefaultDeadlineServer(pyblish.api.ContextPlugin): # Run before collect_deadline_server_instance. order = pyblish.api.CollectorOrder + 0.0025 label = "Default Deadline Webservice" - - pass_mongo_url = False + targets = ["local"] def process(self, context): try: diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py index 061890dd08..e7bbe48bd0 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py @@ -4,7 +4,6 @@ Requires: context -> project_settings instance.data["deadline"]["url"] - or instance.data["deadlineUrl"] for backward compatibility, remove soon Provides: instance.data["deadline"] -> require_authentication (bool) @@ -26,9 +25,10 @@ class CollectDeadlineUserCredentials(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.200 label = "Collect Deadline User Credentials" + targets = ["local"] hosts = ["aftereffects", "fusion", - "harmony" + "harmony", "nuke", "maya", "max", @@ -49,11 +49,9 @@ class CollectDeadlineUserCredentials(pyblish.api.InstancePlugin): "publish.hou"] def process(self, instance): - # backward compatibility, remove soon - collected_deadline_url = (instance.data.get("deadlineUrl") or - instance.data.get("deadline", {}).get("url")) + collected_deadline_url = instance.data["deadline"]["url"] if not collected_deadline_url: - raise ValueError("Instance doesn't have 'deadlineUrl'.") + raise ValueError("Instance doesn't have '[deadline][url]'.") context_data = instance.context.data deadline_settings = context_data["project_settings"]["deadline"] diff --git a/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py b/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py index 0f20b5a644..2b1c99aca8 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py +++ b/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py @@ -199,11 +199,7 @@ class ValidateExpectedFiles(pyblish.api.InstancePlugin): (dict): Job info from Deadline """ - # get default deadline webservice url from deadline module - deadline_url = instance.context.data["defaultDeadline"] - # if custom one is set in instance, use that - if instance.data.get("deadlineUrl"): - deadline_url = instance.data.get("deadlineUrl") + deadline_url = instance.data["deadline"]["url"] assert deadline_url, "Requires Deadline Webservice URL" url = "{}/api/jobs?JobID={}".format(deadline_url, job_id) From b4d5c02a6c51a7b8c2ced6e30925aa1052772253 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 14:57:37 +0100 Subject: [PATCH 26/49] AY-745 - fix retrieval of deadline url --- .../deadline/plugins/publish/submit_celaction_deadline.py | 6 +----- .../deadline/plugins/publish/submit_fusion_deadline.py | 1 - .../deadline/plugins/publish/submit_nuke_deadline.py | 6 +----- .../deadline/plugins/publish/submit_publish_cache_job.py | 8 ++------ 4 files changed, 4 insertions(+), 17 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py index e3160988c8..fe399b6a32 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py @@ -31,11 +31,7 @@ class CelactionSubmitDeadline(pyblish.api.InstancePlugin): context = instance.context - # get default deadline webservice url from deadline module - deadline_url = instance.context.data["defaultDeadline"] - # if custom one is set in instance, use that - if instance.data.get("deadlineUrl"): - deadline_url = instance.data.get("deadlineUrl") + deadline_url = instance.data["deadline"]["url"] assert deadline_url, "Requires Deadline Webservice URL" self.deadline_url = "{}/api/jobs".format(deadline_url) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py index 35c99108be..88929ff6ab 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py @@ -93,7 +93,6 @@ class FusionSubmitDeadline( from ayon_core.hosts.fusion.api.lib import get_frame_path - # get default deadline webservice url from deadline module deadline_url = instance.data["deadline"]["url"] assert deadline_url, "Requires Deadline Webservice URL" diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py index 07ee30af8c..98f775187e 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py @@ -109,11 +109,7 @@ class NukeSubmitDeadline(pyblish.api.InstancePlugin, node = instance.data["transientData"]["node"] context = instance.context - # get default deadline webservice url from deadline module - deadline_url = instance.context.data["defaultDeadline"] - # if custom one is set in instance, use that - if instance.data.get("deadlineUrl"): - deadline_url = instance.data.get("deadlineUrl") + deadline_url = instance.data["deadline"]["url"] assert deadline_url, "Requires Deadline Webservice URL" self.deadline_url = "{}/api/jobs".format(deadline_url) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py index 09e4f8a446..728c4d186a 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py @@ -346,12 +346,8 @@ class ProcessSubmittedCacheJobOnFarm(pyblish.api.InstancePlugin, deadline_publish_job_id = None if submission_type == "deadline": - # get default deadline webservice url from deadline module - self.deadline_url = instance.context.data["defaultDeadline"] - # if custom one is set in instance, use that - if instance.data.get("deadlineUrl"): - self.deadline_url = instance.data.get("deadlineUrl") - assert self.deadline_url, "Requires Deadline Webservice URL" + deadline_url = instance.data["deadline"]["url"] + assert deadline_url, "Requires Deadline Webservice URL" deadline_publish_job_id = \ self._submit_deadline_post_job(instance, render_job) From 77c939b93be2b2d7600043a8c9dcaa6f928f8cf5 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 15:06:54 +0100 Subject: [PATCH 27/49] AY-745 - remove unnecessary comment --- .../deadline/plugins/publish/collect_user_credentials.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py index e7bbe48bd0..86418387a5 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py @@ -20,8 +20,6 @@ from ayon_core.modules.deadline import __version__ class CollectDeadlineUserCredentials(pyblish.api.InstancePlugin): """Collects user name and password for artist if DL requires authentication """ - - # Run before collect_deadline_server_instance. order = pyblish.api.CollectorOrder + 0.200 label = "Collect Deadline User Credentials" From 466f940a737f2ff32bdb115b503c7d0fab30530e Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 15:31:00 +0100 Subject: [PATCH 28/49] AY-745 - added todo This should be refactored in next PR --- .../plugins/publish/collect_deadline_server_from_instance.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py index 913d64cb91..8e7f836830 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py @@ -36,6 +36,7 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): if not "deadline" in instance.data: instance.data["deadline"] = {} + # todo: separate logic should be removed, all hosts should have same host_name = get_current_host_name() if host_name == "maya": deadline_url = self._collect_deadline_url(instance) From 6bbb956732a4eaec3def182a3c240c5e90d59d53 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 15:34:40 +0100 Subject: [PATCH 29/49] AY-745 - renamed class --- server_addon/deadline/server/settings/site_settings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/deadline/server/settings/site_settings.py b/server_addon/deadline/server/settings/site_settings.py index cc3ec66ad9..a77a6edc7e 100644 --- a/server_addon/deadline/server/settings/site_settings.py +++ b/server_addon/deadline/server/settings/site_settings.py @@ -5,7 +5,7 @@ from ayon_server.settings import ( from .main import defined_deadline_ws_name_enum_resolver -class LocalSubmodel(BaseSettingsModel): +class CredentialPerServerModel(BaseSettingsModel): """Provide credentials for configured DL servers""" _layout = "expanded" server_name: str = SettingsField("", @@ -18,7 +18,7 @@ class LocalSubmodel(BaseSettingsModel): class DeadlineSiteSettings(BaseSettingsModel): - local_settings: list[LocalSubmodel] = SettingsField( + local_settings: list[CredentialPerServerModel] = SettingsField( default_factory=list, title="Local setting", description="Please provide credentials for configured Deadline servers", From 2dc3eec35f1b9d4b381334d6be164f41a10f0b76 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 15:38:03 +0100 Subject: [PATCH 30/49] AY-745 - renamed class --- server_addon/deadline/server/settings/main.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server_addon/deadline/server/settings/main.py b/server_addon/deadline/server/settings/main.py index 31a42a3e27..4289e3d335 100644 --- a/server_addon/deadline/server/settings/main.py +++ b/server_addon/deadline/server/settings/main.py @@ -29,7 +29,8 @@ async def defined_deadline_ws_name_enum_resolver( return ws_server_name -class ServerListSubmodel(BaseSettingsModel): +class ServerItemSubmodel(BaseSettingsModel): + """Connection info about configured DL servers.""" _layout = "compact" name: str = SettingsField(title="Name") value: str = SettingsField(title="Url") @@ -38,12 +39,14 @@ class ServerListSubmodel(BaseSettingsModel): class DeadlineSettings(BaseSettingsModel): - deadline_urls: list[ServerListSubmodel] = SettingsField( + # configured DL servers + deadline_urls: list[ServerItemSubmodel] = SettingsField( default_factory=list, title="System Deadline Webservice Info", scope=["studio"], ) + # name(key) of selected server for project deadline_server: str = SettingsField( title="Project Deadline server name", section="---", From bef6855cca0972d24cf942d6f7e964f78a875288 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Mar 2024 15:55:53 +0100 Subject: [PATCH 31/49] AY-745 - fix passing DL credentials to metadata file Must be passed to query current values for job if changed by artist in DL directly. --- .../modules/deadline/plugins/publish/submit_publish_job.py | 4 ++-- .../plugins/publish/validate_expected_and_rendered_files.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index 99a976132a..6d288111b7 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -469,11 +469,11 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, deadline_publish_job_id = \ self._submit_deadline_post_job(instance, render_job, instances) - # Inject deadline url to instances. + # Inject deadline url to instances to query DL for job id for overrides for inst in instances: if not "deadline" in inst: inst["deadline"] = {} - inst["deadline"]["url"] = self.deadline_url + inst["deadline"] = instance.data["deadline"] # publish job file publish_job = { diff --git a/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py b/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py index 0c3977278e..83e867408c 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py +++ b/client/ayon_core/modules/deadline/plugins/publish/validate_expected_and_rendered_files.py @@ -205,8 +205,9 @@ class ValidateExpectedFiles(pyblish.api.InstancePlugin): url = "{}/api/jobs?JobID={}".format(deadline_url, job_id) try: kwargs = {} - if instance.context.data["deadline_auth"]: - kwargs["auth"] = instance.context.data["deadline_auth"] + auth = instance.data["deadline"]["auth"] + if auth: + kwargs["auth"] = auth response = requests_get(url, **kwargs) except requests.exceptions.ConnectionError: self.log.error("Deadline is not accessible at " From ab74098b7bd49494ee7a1cf60e33605b602495a4 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 3 Apr 2024 14:07:39 +0200 Subject: [PATCH 32/49] AY-745 - provide default values for new Settings field --- server_addon/deadline/server/settings/main.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server_addon/deadline/server/settings/main.py b/server_addon/deadline/server/settings/main.py index 4289e3d335..8a6b0e3b37 100644 --- a/server_addon/deadline/server/settings/main.py +++ b/server_addon/deadline/server/settings/main.py @@ -34,8 +34,11 @@ class ServerItemSubmodel(BaseSettingsModel): _layout = "compact" name: str = SettingsField(title="Name") value: str = SettingsField(title="Url") - require_authentication: bool = SettingsField(title="Require authentication") - ssl: bool = SettingsField(title="SSL") + require_authentication: bool = SettingsField( + False, + title="Require authentication") + ssl: bool = SettingsField(False, + title="SSL") class DeadlineSettings(BaseSettingsModel): From 50127b9d84a19869cd2110294cc48dbec3b9340e Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 4 Apr 2024 17:10:17 +0200 Subject: [PATCH 33/49] Refactor name to denote multiple servers --- client/ayon_core/modules/deadline/deadline_module.py | 8 ++++---- .../publish/collect_deadline_server_from_instance.py | 2 +- .../plugins/publish/collect_default_deadline_server.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/modules/deadline/deadline_module.py b/client/ayon_core/modules/deadline/deadline_module.py index 3a35654737..ea9e4085ab 100644 --- a/client/ayon_core/modules/deadline/deadline_module.py +++ b/client/ayon_core/modules/deadline/deadline_module.py @@ -19,23 +19,23 @@ class DeadlineModule(AYONAddon, IPluginPaths): def initialize(self, studio_settings): # This module is always enabled - deadline_server_info = {} + deadline_servers_info = {} enabled = self.name in studio_settings if enabled: deadline_settings = studio_settings[self.name] - deadline_server_info = { + deadline_servers_info = { url_item["name"]: url_item for url_item in deadline_settings["deadline_urls"] } - if enabled and not deadline_server_info: + if enabled and not deadline_servers_info: enabled = False self.log.warning(( "Deadline Webservice URLs are not specified. Disabling addon." )) self.enabled = enabled - self.deadline_server_info = deadline_server_info + self.deadline_servers_info = deadline_servers_info def get_plugin_paths(self): """Deadline plugin paths.""" diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py index 8e7f836830..c6b30d3b2a 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py @@ -91,7 +91,7 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): default_servers = { url_item["name"]: url_item["value"] - for url_item in deadline_settings["deadline_server_info"] + for url_item in deadline_settings["deadline_servers_info"] } project_servers = ( render_instance.context.data diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py index 419de7acac..ced72607bc 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py @@ -34,13 +34,13 @@ class CollectDefaultDeadlineServer(pyblish.api.ContextPlugin): dl_ws_item = None if deadline_server_name: - dl_ws_item = deadline_module.deadline_server_info.get( + dl_ws_item = deadline_module.deadline_servers_info.get( deadline_server_name) if dl_ws_item: deadline_url = dl_ws_item["value"] else: - default_dl_item = deadline_module.deadline_server_info.pop() + default_dl_item = deadline_module.deadline_servers_info.pop() deadline_url = default_dl_item["value"] context.data["deadline"] = {} From 766cbd9f57135f44fb3121ad29ca29efc66fd0f0 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 4 Apr 2024 17:13:00 +0200 Subject: [PATCH 34/49] Refactor change docstring --- client/ayon_core/modules/deadline/deadline_module.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/modules/deadline/deadline_module.py b/client/ayon_core/modules/deadline/deadline_module.py index ea9e4085ab..b1089bbfe2 100644 --- a/client/ayon_core/modules/deadline/deadline_module.py +++ b/client/ayon_core/modules/deadline/deadline_module.py @@ -46,13 +46,14 @@ class DeadlineModule(AYONAddon, IPluginPaths): @staticmethod def get_deadline_pools(webservice, auth=None, log=None): - # type: (str) -> list """Get pools from Deadline. Args: webservice (str): Server url. - log (Logger) + auth (Optional[Tuple[str, str]]): Tuple containing username, + password + log (Optional[Logger]): Logger to log errors to, if provided. Returns: - list: Pools. + List[str]: Pools. Throws: RuntimeError: If deadline webservice is unreachable. From c4c56f8d3f0d752abd5ddd6000d391b82d838fbc Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 5 Apr 2024 11:09:27 +0200 Subject: [PATCH 35/49] AY-747- refactor name of variable --- .../publish/collect_default_deadline_server.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py index ced72607bc..2ea17123b7 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py @@ -32,16 +32,16 @@ class CollectDefaultDeadlineServer(pyblish.api.ContextPlugin): deadline_settings = context.data["project_settings"]["deadline"] deadline_server_name = deadline_settings["deadline_server"] - dl_ws_item = None + dl_server_info = None if deadline_server_name: - dl_ws_item = deadline_module.deadline_servers_info.get( + dl_server_info = deadline_module.deadline_servers_info.get( deadline_server_name) - if dl_ws_item: - deadline_url = dl_ws_item["value"] + if dl_server_info: + deadline_url = dl_server_info["value"] else: - default_dl_item = deadline_module.deadline_servers_info.pop() - deadline_url = default_dl_item["value"] + default_dl_server_info = deadline_module.deadline_servers_info.pop() + deadline_url = default_dl_server_info["value"] context.data["deadline"] = {} context.data["deadline"]["defaultDeadline"] = ( From 26a11a562869141fd2b7d2cf604af775c65fa1bd Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 5 Apr 2024 11:10:23 +0200 Subject: [PATCH 36/49] AY-747- refactor query default --- .../deadline/plugins/publish/collect_default_deadline_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py index 2ea17123b7..6fca97b4ef 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py @@ -40,7 +40,7 @@ class CollectDefaultDeadlineServer(pyblish.api.ContextPlugin): if dl_server_info: deadline_url = dl_server_info["value"] else: - default_dl_server_info = deadline_module.deadline_servers_info.pop() + default_dl_server_info = deadline_module.deadline_servers_info[0] deadline_url = default_dl_server_info["value"] context.data["deadline"] = {} From cba1dae30ffeced94f79931f034e2640d1d5def8 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 5 Apr 2024 11:14:22 +0200 Subject: [PATCH 37/49] Update client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml Co-authored-by: Roy Nieterau --- .../plugins/publish/help/validate_deadline_connection.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml b/client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml index e9377d8baa..eec05df08a 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml +++ b/client/ayon_core/modules/deadline/plugins/publish/help/validate_deadline_connection.xml @@ -9,8 +9,8 @@ This project has set in Settings that Deadline requires authentication. ### How to repair? -Please go to Ayon Server Site settings and provide your Deadline username and - most likely password too. (Deadline could run in configuration that empty passwords are allowed. Ask your administrator for details.) +Please go to Ayon Server > Site Settings and provide your Deadline username and password. +In some cases the password may be empty if Deadline is configured to allow that. Ask your administrator. From 4332c507368c7d20ebf82043e5a2c8269e7221cf Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 5 Apr 2024 11:18:41 +0200 Subject: [PATCH 38/49] AY-747- refactor passing of auth No necessary to pass kwargs --- .../ayon_core/modules/deadline/abstract_submit_deadline.py | 5 +---- .../deadline/plugins/publish/submit_celaction_deadline.py | 6 ++---- .../deadline/plugins/publish/submit_fusion_deadline.py | 5 +---- .../deadline/plugins/publish/submit_nuke_deadline.py | 5 +---- .../deadline/plugins/publish/submit_publish_cache_job.py | 5 +---- .../modules/deadline/plugins/publish/submit_publish_job.py | 5 +---- 6 files changed, 7 insertions(+), 24 deletions(-) diff --git a/client/ayon_core/modules/deadline/abstract_submit_deadline.py b/client/ayon_core/modules/deadline/abstract_submit_deadline.py index e71177b34e..00e51100bc 100644 --- a/client/ayon_core/modules/deadline/abstract_submit_deadline.py +++ b/client/ayon_core/modules/deadline/abstract_submit_deadline.py @@ -601,11 +601,8 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, """ url = "{}/api/jobs".format(self._deadline_url) - kwargs = {} - if auth: - kwargs["auth"] = auth response = requests_post(url, json=payload, - **kwargs) + auth=auth) if not response.ok: self.log.error("Submission failed!") self.log.error(response.status_code) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py index 86c017818f..2ff50a16b9 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py @@ -194,10 +194,8 @@ class CelactionSubmitDeadline(pyblish.api.InstancePlugin): self.log.debug("__ expectedFiles: `{}`".format( instance.data["expectedFiles"])) - kwargs = {} - if instance.context.data["deadline_auth"]: - kwargs["auth"] = instance.context.data["deadline_auth"] - response = requests_post(self.deadline_url, json=payload, **kwargs) + response = requests_post(self.deadline_url, json=payload, + auth=instance.context.data["deadline_auth"]) if not response.ok: self.log.error( diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py index 4027991ca7..d5664f14c4 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py @@ -251,11 +251,8 @@ class FusionSubmitDeadline( # E.g. http://192.168.0.1:8082/api/jobs url = "{}/api/jobs".format(deadline_url) - kwargs = {} auth = instance.data["deadline"]["auth"] - if auth: - kwargs["auth"] = auth - response = requests_post(url, json=payload, **kwargs) + response = requests_post(url, json=payload, auth=auth) if not response.ok: raise Exception(response.text) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py index 287b3da19c..dbf92719e8 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py @@ -431,12 +431,9 @@ class NukeSubmitDeadline(pyblish.api.InstancePlugin, self.log.debug("__ expectedFiles: `{}`".format( instance.data["expectedFiles"])) - kwargs = {} auth = instance.data["deadline"]["auth"] - if auth: - kwargs["auth"] = auth response = requests_post(self.deadline_url, json=payload, timeout=10, - **kwargs) + auth=auth) if not response.ok: raise Exception(response.text) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py index 8ae781d051..9f6278a4c5 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py @@ -209,12 +209,9 @@ class ProcessSubmittedCacheJobOnFarm(pyblish.api.InstancePlugin, self.log.debug("Submitting Deadline publish job ...") url = "{}/api/jobs".format(self.deadline_url) - kwargs = {} auth = instance.data["deadline"]["auth"] - if auth: - kwargs["auth"] = auth response = requests_post(url, json=payload, timeout=10, - **kwargs) + auth=auth) if not response.ok: raise Exception(response.text) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index 6d288111b7..ce90fc2706 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -303,12 +303,9 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, self.log.debug("Submitting Deadline publish job ...") url = "{}/api/jobs".format(self.deadline_url) - kwargs = {} auth = instance.data["deadline"]["auth"] - if auth: - kwargs["auth"] = auth response = requests_post(url, json=payload, timeout=10, - **kwargs) + auth=auth) if not response.ok: raise Exception(response.text) From f5e24b642bf940b8277272ad8647e85bb7a6d31f Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 5 Apr 2024 11:30:14 +0200 Subject: [PATCH 39/49] AY-747- update todo --- .../hosts/harmony/plugins/publish/collect_farm_render.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/harmony/plugins/publish/collect_farm_render.py b/client/ayon_core/hosts/harmony/plugins/publish/collect_farm_render.py index e869de316f..c63eb114e5 100644 --- a/client/ayon_core/hosts/harmony/plugins/publish/collect_farm_render.py +++ b/client/ayon_core/hosts/harmony/plugins/publish/collect_farm_render.py @@ -178,7 +178,9 @@ class CollectFarmRender(publish.AbstractCollectRender): outputStartFrame=info[3], leadingZeros=info[2], ignoreFrameHandleCheck=True, - # deadline=inst.data.get("deadline") TODO + #todo: inst is not available, must be determined, fix when + #reworking to Publisher + # deadline=inst.data.get("deadline") ) render_instance.context = context From 497ce6d0127792af74e0301239c98154e819e5cd Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 16 Apr 2024 11:31:09 +0200 Subject: [PATCH 40/49] Update client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../deadline/plugins/publish/submit_celaction_deadline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py index 2ff50a16b9..2220442dac 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py @@ -195,7 +195,7 @@ class CelactionSubmitDeadline(pyblish.api.InstancePlugin): instance.data["expectedFiles"])) response = requests_post(self.deadline_url, json=payload, - auth=instance.context.data["deadline_auth"]) + auth=instance.data["deadline"]["require_authentication"]) if not response.ok: self.log.error( From f43fbc239c6a46525b203a2deb1bb30d99ab1e4e Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 16 Apr 2024 11:32:41 +0200 Subject: [PATCH 41/49] Use collected host name Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../plugins/publish/collect_deadline_server_from_instance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py index c6b30d3b2a..3927b67d37 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py @@ -37,7 +37,7 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): instance.data["deadline"] = {} # todo: separate logic should be removed, all hosts should have same - host_name = get_current_host_name() + host_name = instance.context.data["hostName"] if host_name == "maya": deadline_url = self._collect_deadline_url(instance) else: From 48a1dc86ffdb787b7bf4718eb8dcb7e15e577f57 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 16 Apr 2024 11:33:21 +0200 Subject: [PATCH 42/49] Add todo Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../deadline/plugins/publish/collect_user_credentials.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py index 86418387a5..2777cc906a 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py @@ -73,7 +73,8 @@ class CollectDeadlineUserCredentials(pyblish.api.InstancePlugin): if not deadline_info["require_authentication"]: return - + # TODO import 'get_addon_site_settings' when available + # in public 'ayon_api' local_settings = get_server_api_connection().get_addon_site_settings( DeadlineModule.name, __version__) local_settings = local_settings["local_settings"] From ff2296def65d9ab262facdab63a97b9c1c3f9573 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 16 Apr 2024 11:33:46 +0200 Subject: [PATCH 43/49] Removed unneeded import Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../plugins/publish/collect_deadline_server_from_instance.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py index 3927b67d37..181b553a61 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py @@ -7,7 +7,6 @@ attribute or using default server if that attribute doesn't exists. """ import pyblish.api from ayon_core.pipeline.publish import KnownPublishError -from ayon_core.pipeline.context_tools import get_current_host_name class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): From 4bc53958128daa420d96b4bb0627e3175b736163 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 18 Apr 2024 13:06:31 +0200 Subject: [PATCH 44/49] Refactor - updated names for default deadline url --- .../publish/collect_deadline_server_from_instance.py | 8 ++++---- .../plugins/publish/collect_default_deadline_server.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py index c6b30d3b2a..9741571e88 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py @@ -46,7 +46,7 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): if deadline_url: instance.data["deadline"]["url"] = deadline_url.strip().rstrip("/") else: - instance.data["deadline"]["url"] = instance.context.data["deadline"]["defaultDeadline"] # noqa + instance.data["deadline"]["url"] = instance.context.data["deadline"]["defaultUrl"] # noqa self.log.debug( "Using {} for submission".format(instance.data["deadline"]["url"])) @@ -74,13 +74,13 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): ["project_settings"] ["deadline"] ) - default_server = (render_instance.context.data["deadline"] - ["defaultDeadline"]) + default_server_url = (render_instance.context.data["deadline"] + ["defaultUrl"]) # QUESTION How and where is this is set? Should be removed? instance_server = render_instance.data.get("deadlineServers") if not instance_server: self.log.debug("Using default server.") - return default_server + return default_server_url # Get instance server as sting. if isinstance(instance_server, int): diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py index 6fca97b4ef..dde1043301 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py @@ -44,5 +44,5 @@ class CollectDefaultDeadlineServer(pyblish.api.ContextPlugin): deadline_url = default_dl_server_info["value"] context.data["deadline"] = {} - context.data["deadline"]["defaultDeadline"] = ( + context.data["deadline"]["defaultUrl"] = ( deadline_url.strip().rstrip("/")) From 090304a4a8ac9e81b6434dd3825a5d1a160bfeeb Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 18 Apr 2024 14:06:37 +0200 Subject: [PATCH 45/49] Refactor - move deadline plugins later Run them after collect render plugins to better differentiate between local and farm targetted plugins. --- .../publish/collect_deadline_server_from_instance.py | 8 ++++++-- .../plugins/publish/collect_default_deadline_server.py | 2 +- .../deadline/plugins/publish/collect_user_credentials.py | 6 +++++- .../plugins/publish/validate_deadline_connection.py | 4 ++++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py index b769a923fe..22022831a0 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_deadline_server_from_instance.py @@ -13,7 +13,7 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): """Collect Deadline Webservice URL from instance.""" # Run before collect_render. - order = pyblish.api.CollectorOrder + 0.005 + order = pyblish.api.CollectorOrder + 0.225 label = "Deadline Webservice from the Instance" targets = ["local"] families = ["render", @@ -32,7 +32,11 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin): "image"] # for Fusion def process(self, instance): - if not "deadline" in instance.data: + if not instance.data.get("farm"): + self.log.debug("Should not be processed on farm, skipping.") + return + + if not instance.data.get("deadline"): instance.data["deadline"] = {} # todo: separate logic should be removed, all hosts should have same diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py index dde1043301..9238e0ed95 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_default_deadline_server.py @@ -18,7 +18,7 @@ class CollectDefaultDeadlineServer(pyblish.api.ContextPlugin): """ # Run before collect_deadline_server_instance. - order = pyblish.api.CollectorOrder + 0.0025 + order = pyblish.api.CollectorOrder + 0.200 label = "Default Deadline Webservice" targets = ["local"] diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py index 2777cc906a..7a506ab645 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py @@ -20,7 +20,7 @@ from ayon_core.modules.deadline import __version__ class CollectDeadlineUserCredentials(pyblish.api.InstancePlugin): """Collects user name and password for artist if DL requires authentication """ - order = pyblish.api.CollectorOrder + 0.200 + order = pyblish.api.CollectorOrder + 0.250 label = "Collect Deadline User Credentials" targets = ["local"] @@ -47,6 +47,10 @@ class CollectDeadlineUserCredentials(pyblish.api.InstancePlugin): "publish.hou"] def process(self, instance): + if not instance.data.get("farm"): + self.log.debug("Should not be processed on farm, skipping.") + return + collected_deadline_url = instance.data["deadline"]["url"] if not collected_deadline_url: raise ValueError("Instance doesn't have '[deadline][url]'.") diff --git a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py index e077aedd9b..8fffd47786 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py +++ b/client/ayon_core/modules/deadline/plugins/publish/validate_deadline_connection.py @@ -17,6 +17,10 @@ class ValidateDeadlineConnection(pyblish.api.InstancePlugin): responses = {} def process(self, instance): + if not instance.data.get("farm"): + self.log.debug("Should not be processed on farm, skipping.") + return + deadline_url = instance.data["deadline"]["url"] assert deadline_url, "Requires Deadline Webservice URL" From fbc0ee693595123ae233e577bbdad28bb35ef49c Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 18 Apr 2024 14:08:50 +0200 Subject: [PATCH 46/49] Fix - get source_instance directly from instance It was returning it as list without it --- client/ayon_core/pipeline/publish/abstract_collect_render.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/pipeline/publish/abstract_collect_render.py b/client/ayon_core/pipeline/publish/abstract_collect_render.py index b515d91ae4..17cab876b6 100644 --- a/client/ayon_core/pipeline/publish/abstract_collect_render.py +++ b/client/ayon_core/pipeline/publish/abstract_collect_render.py @@ -216,13 +216,12 @@ class AbstractCollectRender(pyblish.api.ContextPlugin): # add additional data data = self.add_additional_data(data) - render_instance_dict = attr.asdict(render_instance) - # Merge into source instance if provided, otherwise create instance - instance = render_instance_dict.pop("source_instance", None) + instance = render_instance.source_instance if instance is None: instance = context.create_instance(render_instance.name) + render_instance_dict = attr.asdict(render_instance) instance.data.update(render_instance_dict) instance.data.update(data) From 5fed3d7b2f6ed60739cea1de53c4d2d26d0f01ca Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 May 2024 16:31:42 +0200 Subject: [PATCH 47/49] AY-745 - added missed blender for credential collection --- .../modules/deadline/plugins/publish/collect_user_credentials.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py index 7a506ab645..5d03523c89 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py @@ -25,6 +25,7 @@ class CollectDeadlineUserCredentials(pyblish.api.InstancePlugin): targets = ["local"] hosts = ["aftereffects", + "blender", "fusion", "harmony", "nuke", From 22d1837db52d55b806765321ecef98e1967b0923 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 May 2024 16:36:09 +0200 Subject: [PATCH 48/49] AY-745 - fixe for cache submissions --- .../deadline/plugins/publish/submit_publish_cache_job.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py index c73fb253f1..16fb66a59a 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py @@ -346,15 +346,17 @@ class ProcessSubmittedCacheJobOnFarm(pyblish.api.InstancePlugin, deadline_publish_job_id = None if submission_type == "deadline": - deadline_url = instance.data["deadline"]["url"] - assert deadline_url, "Requires Deadline Webservice URL" + self.deadline_url = instance.data["deadline"]["url"] + assert self.deadline_url, "Requires Deadline Webservice URL" deadline_publish_job_id = \ self._submit_deadline_post_job(instance, render_job) # Inject deadline url to instances. for inst in instances: - inst["deadlineUrl"] = self.deadline_url + if "deadline" not in inst: + inst["deadline"] = {} + inst["deadline"] = instance.data["deadline"] # publish job file publish_job = { From 004a4feb9dc85472f022cb9501322f7e82c7081d Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 6 May 2024 10:58:07 +0200 Subject: [PATCH 49/49] Fix order of collect render Must be collected before DL metadata --- .../hosts/aftereffects/plugins/publish/collect_render.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/aftereffects/plugins/publish/collect_render.py b/client/ayon_core/hosts/aftereffects/plugins/publish/collect_render.py index 5ef044459d..ebd4b8f944 100644 --- a/client/ayon_core/hosts/aftereffects/plugins/publish/collect_render.py +++ b/client/ayon_core/hosts/aftereffects/plugins/publish/collect_render.py @@ -24,7 +24,7 @@ class AERenderInstance(RenderInstance): class CollectAERender(publish.AbstractCollectRender): - order = pyblish.api.CollectorOrder + 0.405 + order = pyblish.api.CollectorOrder + 0.100 label = "Collect After Effects Render Layers" hosts = ["aftereffects"]