Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set groups limit for deadline #585

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions openpype/hosts/maya/api/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
9 changes: 9 additions & 0 deletions openpype/hosts/maya/plugins/create/create_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,15 @@ def _create_render_settings(self):
self.data["secondaryPool"] = self._set_default_pool(pool_names,
secondary_pool)

requested_arguments = {"NamesOnly": True}
limit_groups = self.deadline_module.get_deadline_data(
deadline_url,
"limitgroups",
log=self.log,
**requested_arguments
)
self.data["limits"] = {"limits": limit_groups}

if muster_enabled:
self.log.info(">>> Loading Muster credentials ...")
self._load_credentials()
Expand Down
49 changes: 49 additions & 0 deletions openpype/hosts/maya/plugins/publish/collect_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -467,3 +472,47 @@ def get_render_attribute(attr, layer):
return lib.get_attr_in_layer(
"defaultRenderGlobals.{}".format(attr), layer=layer
)

def _get_checked_limit_groups(self, attributes):
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

requested_arguments = {"NamesOnly": True}
limit_groups = deadline_module.get_deadline_data(
deadline_settings['deadline_urls']["default"],
"limitgroups",
log=self.log,
**requested_arguments
)
for group, value in zip(limit_groups, attributes['limits'][0]):
if value is True:
checked_limits.append(group)

return checked_limits
47 changes: 47 additions & 0 deletions openpype/modules/deadline/deadline_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,50 @@ def get_deadline_pools(webservice, log=None):
return []

return response.json()

@staticmethod
def get_deadline_data(webservice, endpoint, log=None, **kwargs):
"""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:
Any: Returns the json-encoded content of a response, if any.
Throws:
RuntimeError: If Deadline webservice is unreachable.
"""
if not log:
log = Logger.get_logger(__name__)

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(request)
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("The data requested could not be retrieved")
return []

return response.json()
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down