From 5422f3a3187884de6c5d5ab0ecd9687295de3f63 Mon Sep 17 00:00:00 2001 From: Thomas Fricard Date: Mon, 9 Oct 2023 12:05:26 +0200 Subject: [PATCH 1/6] add a group limit setting in maya render set to send group limits on dealine for the job --- openpype/hosts/maya/api/lib.py | 21 ++++++++- .../maya/plugins/create/create_render.py | 6 +++ .../maya/plugins/publish/collect_render.py | 47 +++++++++++++++++++ openpype/modules/deadline/deadline_module.py | 31 ++++++++++++ .../plugins/publish/submit_maya_deadline.py | 2 + 5 files changed, 105 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/maya/api/lib.py b/openpype/hosts/maya/api/lib.py index fca4410ede1..ba0f049fd93 100644 --- a/openpype/hosts/maya/api/lib.py +++ b/openpype/hosts/maya/api/lib.py @@ -421,11 +421,28 @@ def imprint(node, data): add_type = {"attributeType": "enum", "enumName": ":".join(value)} set_type = {"keyable": False, "channelBox": True} value = 0 # enum default + elif isinstance(value, dict): + for key, group_list in value.items(): + cmds.addAttr( + node, + longName=key, + numberOfChildren=len(group_list), + attributeType="compound" + ) + for group in group_list: + cmds.addAttr( + node, + longName=group, + attributeType="bool", + parent=key + ) + continue else: raise TypeError("Unsupported type: %r" % type(value)) - cmds.addAttr(node, longName=key, **add_type) - cmds.setAttr(node + "." + key, value, **set_type) + if not isinstance(value, dict): + cmds.addAttr(node, longName=key, **add_type) + cmds.setAttr(node + "." + key, value, **set_type) def lsattr(attr, value=None): diff --git a/openpype/hosts/maya/plugins/create/create_render.py b/openpype/hosts/maya/plugins/create/create_render.py index 46811758086..6e66003c7c9 100644 --- a/openpype/hosts/maya/plugins/create/create_render.py +++ b/openpype/hosts/maya/plugins/create/create_render.py @@ -297,6 +297,12 @@ def _create_render_settings(self): self.data["secondaryPool"] = self._set_default_pool(pool_names, secondary_pool) + limit_groups = self.deadline_module.get_deadline_limit_groups( + deadline_url, + self.log + ) + self.data["limits"] = {"limits": limit_groups} + if muster_enabled: self.log.info(">>> Loading Muster credentials ...") self._load_credentials() diff --git a/openpype/hosts/maya/plugins/publish/collect_render.py b/openpype/hosts/maya/plugins/publish/collect_render.py index babd494758f..f1371fa6204 100644 --- a/openpype/hosts/maya/plugins/publish/collect_render.py +++ b/openpype/hosts/maya/plugins/publish/collect_render.py @@ -51,6 +51,8 @@ from openpype.lib import get_formatted_current_time from openpype.pipeline import legacy_io +from openpype.settings import get_system_settings, get_project_settings +from openpype.modules import ModulesManager from openpype.hosts.maya.api.lib_renderproducts import get as get_layer_render_products # noqa: E501 from openpype.hosts.maya.api import lib @@ -426,6 +428,9 @@ def parse_options(self, render_globals): options["mayaRenderPlugin"] = maya_render_plugin + limits = self._get_checked_limit_groups(attributes) + options["limits"] = limits + return options def _discover_pools(self, attributes): @@ -467,3 +472,45 @@ def get_render_attribute(attr, layer): return lib.get_attr_in_layer( "defaultRenderGlobals.{}".format(attr), layer=layer ) + + def _get_checked_limit_groups(self, attributes): + self.log.debug(f"SELF METHODS: {dir(self)}") + checked_limits = [] + deadline_settings = get_system_settings()["modules"]["deadline"] + + if not deadline_settings["enabled"]: + return checked_limits + + manager = ModulesManager() + deadline_module = manager.modules_by_name["deadline"] + + try: + default_servers = deadline_settings["deadline_urls"] + project_settings = get_project_settings( + legacy_io.Session["AVALON_PROJECT"] + ) + project_servers = ( + project_settings["deadline"]["deadline_servers"] + ) + deadline_servers = { + k: default_servers[k] + for k in project_servers + if k in default_servers + } + + if not deadline_servers: + deadline_servers = default_servers + except AttributeError: + # Handle situation were we had only one url for deadline. + # get default deadline webservice url from deadline module + deadline_servers = deadline_module.deadline_urls + + limit_groups = deadline_module.get_deadline_limit_groups( + deadline_settings['deadline_urls']["default"], + self.log + ) + for group, value in zip(limit_groups, attributes['limits'][0]): + if value is True: + checked_limits.append(group) + + return checked_limits diff --git a/openpype/modules/deadline/deadline_module.py b/openpype/modules/deadline/deadline_module.py index 9855f8c1b10..b73872b9ef4 100644 --- a/openpype/modules/deadline/deadline_module.py +++ b/openpype/modules/deadline/deadline_module.py @@ -74,3 +74,34 @@ def get_deadline_pools(webservice, log=None): return [] return response.json() + + @staticmethod + def get_deadline_limit_groups(webservice, log=None): + """Get Limits groups for Deadlin + Args: + webservice (str): Server url + log (Logger) + Returns: + list: Limits + Throws: + RuntimeError: If Deadline webservice is unreachable. + """ + if not log: + log = Logger.get_logger(__name__) + + argument = "{}/api/limitgroups?NamesOnly=true".format(webservice) + try: + response = requests_get(argument) + except requests.exceptions.ConnectionError as exc: + msg = "Cannot connect to DL web service {}".format(webservice) + log.error(msg) + six.reraise( + DeadlineWebserviceError, + DeadlineWebserviceError("{} - {}".format(msg, exc)), + sys.exc_info()[2] + ) + if not response.ok: + log.warning("No limit group retrieved") + return [] + + return response.json() diff --git a/openpype/modules/deadline/plugins/publish/submit_maya_deadline.py b/openpype/modules/deadline/plugins/publish/submit_maya_deadline.py index a6cdcb7e711..763d2ff5741 100644 --- a/openpype/modules/deadline/plugins/publish/submit_maya_deadline.py +++ b/openpype/modules/deadline/plugins/publish/submit_maya_deadline.py @@ -148,6 +148,8 @@ def get_job_info(self): if self.group != "none" and self.group: job_info.Group = self.group + self.limit = instance.data.get('limits') + if self.limit: job_info.LimitGroups = ",".join(self.limit) From ee1209915e5566c67b4d600227eb2d6d32b0be0b Mon Sep 17 00:00:00 2001 From: Thomas Fricard Date: Thu, 12 Oct 2023 15:46:49 +0200 Subject: [PATCH 2/6] remove useless log --- openpype/hosts/maya/plugins/publish/collect_render.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_render.py b/openpype/hosts/maya/plugins/publish/collect_render.py index f1371fa6204..262153f0774 100644 --- a/openpype/hosts/maya/plugins/publish/collect_render.py +++ b/openpype/hosts/maya/plugins/publish/collect_render.py @@ -474,7 +474,6 @@ def get_render_attribute(attr, layer): ) def _get_checked_limit_groups(self, attributes): - self.log.debug(f"SELF METHODS: {dir(self)}") checked_limits = [] deadline_settings = get_system_settings()["modules"]["deadline"] From 9b868d982cac8ac52597fa01a90212b11fbcd8e5 Mon Sep 17 00:00:00 2001 From: Thomas Fricard Date: Thu, 12 Oct 2023 16:30:44 +0200 Subject: [PATCH 3/6] convert get_deadline_limit_groups to a more generic method usable for different endpoints with different arguments --- openpype/modules/deadline/deadline_module.py | 23 ++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/openpype/modules/deadline/deadline_module.py b/openpype/modules/deadline/deadline_module.py index b73872b9ef4..1c5f807fba6 100644 --- a/openpype/modules/deadline/deadline_module.py +++ b/openpype/modules/deadline/deadline_module.py @@ -76,7 +76,7 @@ def get_deadline_pools(webservice, log=None): return response.json() @staticmethod - def get_deadline_limit_groups(webservice, log=None): + def get_deadline_data(webservice, endpoint, log=None, **kwargs): """Get Limits groups for Deadlin Args: webservice (str): Server url @@ -89,9 +89,23 @@ def get_deadline_limit_groups(webservice, log=None): if not log: log = Logger.get_logger(__name__) - argument = "{}/api/limitgroups?NamesOnly=true".format(webservice) + request = "{}/api/{}".format( + webservice, + endpoint + ) + + # Construct the full request with arguments + arguments = [] + for key, value in kwargs.items(): + new_argument = "{}={}".format(key, value) + arguments.append(new_argument) + + if arguments: + arguments = "&".join(arguments) + request = "{}?{}".format(request, arguments) + try: - response = requests_get(argument) + response = requests_get(request) except requests.exceptions.ConnectionError as exc: msg = "Cannot connect to DL web service {}".format(webservice) log.error(msg) @@ -100,8 +114,9 @@ def get_deadline_limit_groups(webservice, log=None): DeadlineWebserviceError("{} - {}".format(msg, exc)), sys.exc_info()[2] ) + print(f"RESPONSE: {response.json()}") if not response.ok: - log.warning("No limit group retrieved") + log.warning("The data requested could not be retrieved") return [] return response.json() From 308d1b7a5d76d0327079055f99dade8fb2ea1ebf Mon Sep 17 00:00:00 2001 From: Thomas Fricard Date: Thu, 12 Oct 2023 16:31:49 +0200 Subject: [PATCH 4/6] adapt method call to method refacto --- openpype/hosts/maya/plugins/create/create_render.py | 7 +++++-- openpype/hosts/maya/plugins/publish/collect_render.py | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/maya/plugins/create/create_render.py b/openpype/hosts/maya/plugins/create/create_render.py index 6e66003c7c9..0933d19d635 100644 --- a/openpype/hosts/maya/plugins/create/create_render.py +++ b/openpype/hosts/maya/plugins/create/create_render.py @@ -297,9 +297,12 @@ def _create_render_settings(self): self.data["secondaryPool"] = self._set_default_pool(pool_names, secondary_pool) - limit_groups = self.deadline_module.get_deadline_limit_groups( + requested_arguments = {"NamesOnly": True} + limit_groups = self.deadline_module.get_deadline_data( deadline_url, - self.log + "limitgroups", + log=self.log, + **requested_arguments ) self.data["limits"] = {"limits": limit_groups} diff --git a/openpype/hosts/maya/plugins/publish/collect_render.py b/openpype/hosts/maya/plugins/publish/collect_render.py index 262153f0774..7dac1961648 100644 --- a/openpype/hosts/maya/plugins/publish/collect_render.py +++ b/openpype/hosts/maya/plugins/publish/collect_render.py @@ -504,9 +504,12 @@ def _get_checked_limit_groups(self, attributes): # get default deadline webservice url from deadline module deadline_servers = deadline_module.deadline_urls - limit_groups = deadline_module.get_deadline_limit_groups( + requested_arguments = {"NamesOnly": True} + limit_groups = deadline_module.get_deadline_data( deadline_settings['deadline_urls']["default"], - self.log + "limitgroups", + log=self.log, + **requested_arguments ) for group, value in zip(limit_groups, attributes['limits'][0]): if value is True: From cb89b9c87e993f875149322a1bc0a51a8d87dde7 Mon Sep 17 00:00:00 2001 From: Thomas Fricard Date: Thu, 12 Oct 2023 16:41:40 +0200 Subject: [PATCH 5/6] remove useless print --- openpype/modules/deadline/deadline_module.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/modules/deadline/deadline_module.py b/openpype/modules/deadline/deadline_module.py index 1c5f807fba6..e85e0cb0a9b 100644 --- a/openpype/modules/deadline/deadline_module.py +++ b/openpype/modules/deadline/deadline_module.py @@ -114,7 +114,6 @@ def get_deadline_data(webservice, endpoint, log=None, **kwargs): DeadlineWebserviceError("{} - {}".format(msg, exc)), sys.exc_info()[2] ) - print(f"RESPONSE: {response.json()}") if not response.ok: log.warning("The data requested could not be retrieved") return [] From 4878bd30f928500990665812589917a71595217d Mon Sep 17 00:00:00 2001 From: Benjamin Souchet Date: Thu, 12 Oct 2023 17:47:53 +0200 Subject: [PATCH 6/6] (#103) enhancement: fix doctring of get_deadline_data --- openpype/modules/deadline/deadline_module.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openpype/modules/deadline/deadline_module.py b/openpype/modules/deadline/deadline_module.py index e85e0cb0a9b..824e9887d9e 100644 --- a/openpype/modules/deadline/deadline_module.py +++ b/openpype/modules/deadline/deadline_module.py @@ -77,12 +77,14 @@ def get_deadline_pools(webservice, log=None): @staticmethod def get_deadline_data(webservice, endpoint, log=None, **kwargs): - """Get Limits groups for Deadlin + """Get Limits groups for Deadline Args: webservice (str): Server url + endpoint (str): Request endpoint log (Logger) + kwargs (Any): Request payload content as key=value pairs Returns: - list: Limits + Any: Returns the json-encoded content of a response, if any. Throws: RuntimeError: If Deadline webservice is unreachable. """