Enhancement: Deadline plugins optimize, cleanup and fix optional support for validate deadline pools (#5531)

* Fix optional support

* Query deadline only once per url

* Report both pools if both are invalid instead of only primary pool

* Fix formatting in UI

* Re-use existing implementation of `requests_get`

* Cosmetics

* Cache deadline url responses to avoid the need of request per instance

* Only format error message when needed + convert to `KnownPublishError`

* Allow deadline url per instance, similar to `ValidateDeadlineConnections`

* Tweak grammar/readability

* Fix title

* Remove instance data from right side in Publish report since it's available in logs
This commit is contained in:
Roy Nieterau 2023-08-29 16:16:31 +02:00 committed by GitHub
parent 61a8ff26f0
commit 6014cc6549
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 79 additions and 62 deletions

View file

@ -8,6 +8,7 @@ attribute or using default server if that attribute doesn't exists.
from maya import cmds
import pyblish.api
from openpype.pipeline.publish import KnownPublishError
class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin):
@ -81,13 +82,14 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin):
if k in default_servers
}
msg = (
"\"{}\" server on instance is not enabled in project settings."
" Enabled project servers:\n{}".format(
instance_server, project_enabled_servers
if instance_server not in project_enabled_servers:
msg = (
"\"{}\" server on instance is not enabled in project settings."
" Enabled project servers:\n{}".format(
instance_server, project_enabled_servers
)
)
)
assert instance_server in project_enabled_servers, msg
raise KnownPublishError(msg)
self.log.debug("Using project approved server.")
return project_enabled_servers[instance_server]

View file

@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<root>
<error id="main">
<title>Scene setting</title>
<title>Deadline Pools</title>
<description>
## Invalid Deadline pools found
## Invalid Deadline pools found
Configured pools don't match what is set in Deadline.
Configured pools don't match available pools in Deadline.
{invalid_value_str}
### How to repair?
### How to repair?
If your instance had deadline pools set on creation, remove or
change them.
If your instance had deadline pools set on creation, remove or
change them.
In other cases inform admin to change them in Settings.
In other cases inform admin to change them in Settings.
Available deadline pools:
{pools_str}
Available deadline pools {pools_str}.
</description>
<detail>
### __Detailed Info__
### __Detailed Info__
This error is shown when deadline pool is not on Deadline anymore. It
could happen in case of republish old workfile which was created with
previous deadline pools,
or someone changed pools on Deadline side, but didn't modify Openpype
Settings.
This error is shown when a configured pool is not available on Deadline. It
can happen when publishing old workfiles which were created with previous
deadline pools, or someone changed the available pools in Deadline,
but didn't modify Openpype Settings to match the changes.
</detail>
</error>
</root>

View file

@ -1,8 +1,7 @@
import os
import requests
import pyblish.api
from openpype_modules.deadline.abstract_submit_deadline import requests_get
class ValidateDeadlineConnection(pyblish.api.InstancePlugin):
"""Validate Deadline Web Service is running"""
@ -12,34 +11,25 @@ class ValidateDeadlineConnection(pyblish.api.InstancePlugin):
hosts = ["maya", "nuke"]
families = ["renderlayer", "render"]
# cache
responses = {}
def process(self, instance):
# 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")
self.log.info(
"We have deadline URL on instance {}".format(
deadline_url))
self.log.debug(
"We have deadline URL on instance {}".format(deadline_url)
)
assert deadline_url, "Requires Deadline Webservice URL"
# Check response
response = self._requests_get(deadline_url)
if deadline_url not in self.responses:
self.responses[deadline_url] = requests_get(deadline_url)
response = self.responses[deadline_url]
assert response.ok, "Response must be ok"
assert response.text.startswith("Deadline Web Service "), (
"Web service did not respond with 'Deadline Web Service'"
)
def _requests_get(self, *args, **kwargs):
""" Wrapper for requests, disabling SSL certificate validation if
DONT_VERIFY_SSL environment variable is found. This is useful when
Deadline or Muster server are running with self-signed certificates
and their certificate is not added to trusted certificates on
client machines.
WARNING: disabling SSL certificate validation is defeating one line
of defense SSL is providing and it is not recommended.
"""
if 'verify' not in kwargs:
kwargs['verify'] = False if os.getenv("OPENPYPE_DONT_VERIFY_SSL", True) else True # noqa
return requests.get(*args, **kwargs)

View file

@ -25,33 +25,58 @@ class ValidateDeadlinePools(OptionalPyblishPluginMixin,
"maxrender"]
optional = True
# cache
pools_per_url = {}
def process(self, instance):
if not self.is_active(instance.data):
return
if not instance.data.get("farm"):
self.log.debug("Skipping local instance.")
return
# get default deadline webservice url from deadline module
deadline_url = instance.context.data["defaultDeadline"]
self.log.info("deadline_url::{}".format(deadline_url))
pools = DeadlineModule.get_deadline_pools(deadline_url, log=self.log)
self.log.info("pools::{}".format(pools))
formatting_data = {
"pools_str": ",".join(pools)
}
deadline_url = self.get_deadline_url(instance)
pools = self.get_pools(deadline_url)
invalid_pools = {}
primary_pool = instance.data.get("primaryPool")
if primary_pool and primary_pool not in pools:
msg = "Configured primary '{}' not present on Deadline".format(
instance.data["primaryPool"])
formatting_data["invalid_value_str"] = msg
raise PublishXmlValidationError(self, msg,
formatting_data=formatting_data)
invalid_pools["primary"] = primary_pool
secondary_pool = instance.data.get("secondaryPool")
if secondary_pool and secondary_pool not in pools:
msg = "Configured secondary '{}' not present on Deadline".format(
instance.data["secondaryPool"])
formatting_data["invalid_value_str"] = msg
raise PublishXmlValidationError(self, msg,
formatting_data=formatting_data)
invalid_pools["secondary"] = secondary_pool
if invalid_pools:
message = "\n".join(
"{} pool '{}' not available on Deadline".format(key.title(),
pool)
for key, pool in invalid_pools.items()
)
raise PublishXmlValidationError(
plugin=self,
message=message,
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):
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,
log=self.log)
self.log.info("Available pools: {}".format(pools))
self.pools_per_url[deadline_url] = pools
return self.pools_per_url[deadline_url]