Deadline in Pype 3 - Hound & Cleanup

Events and plugins should be in 'vendor' dir only for now
This commit is contained in:
Petr Kalis 2021-02-26 11:02:46 +01:00
parent 1dcddc9b4e
commit 598266bb6d
4 changed files with 21 additions and 273 deletions

View file

@ -1,37 +0,0 @@
[State]
Type=Enum
Items=Global Enabled;Opt-In;Disabled
Category=Options
CategoryOrder=0
CategoryIndex=0
Label=State
Default=Disabled
Description=How this event plug-in should respond to events. If Global, all jobs and slaves will trigger the events for this plugin. If Opt-In, jobs and slaves can choose to trigger the events for this plugin. If Disabled, no events are triggered for this plugin.
[PythonSearchPaths]
Type=MultiLineMultiFolder
Label=Additional Python Search Paths
Category=Options
CategoryOrder=0
CategoryIndex=1
Default=
Description=The list of paths to append to the PYTHONPATH environment variable. This allows the Python job to find custom modules in non-standard locations.
[LoggingLevel]
Type=Enum
Label=Logging Level
Category=Options
CategoryOrder=0
CategoryIndex=2
Items=DEBUG;INFO;WARNING;ERROR
Default=DEBUG
Description=Logging level where printing will start.
[Pype Executable]
Type=MultiLineMultiFolder
Label=Path to Pype executable
Category=Job Plugins
CategoryOrder=1
CategoryIndex=1
Default=
Description=

View file

@ -1,215 +0,0 @@
import os
import sys
import logging
import json
import Deadline.Events
import Deadline.Scripting
def GetDeadlineEventListener():
return PypeEventListener()
def CleanupDeadlineEventListener(eventListener):
eventListener.Cleanup()
class PypeEventListener(Deadline.Events.DeadlineEventListener):
def __init__(self):
self.OnJobSubmittedCallback += self.OnJobSubmitted
self.OnJobStartedCallback += self.OnJobStarted
self.OnJobFinishedCallback += self.OnJobFinished
self.OnJobRequeuedCallback += self.OnJobRequeued
self.OnJobFailedCallback += self.OnJobFailed
self.OnJobSuspendedCallback += self.OnJobSuspended
self.OnJobResumedCallback += self.OnJobResumed
self.OnJobPendedCallback += self.OnJobPended
self.OnJobReleasedCallback += self.OnJobReleased
self.OnJobDeletedCallback += self.OnJobDeleted
self.OnJobErrorCallback += self.OnJobError
self.OnJobPurgedCallback += self.OnJobPurged
self.OnHouseCleaningCallback += self.OnHouseCleaning
self.OnRepositoryRepairCallback += self.OnRepositoryRepair
self.OnSlaveStartedCallback += self.OnSlaveStarted
self.OnSlaveStoppedCallback += self.OnSlaveStopped
self.OnSlaveIdleCallback += self.OnSlaveIdle
self.OnSlaveRenderingCallback += self.OnSlaveRendering
self.OnSlaveStartingJobCallback += self.OnSlaveStartingJob
self.OnSlaveStalledCallback += self.OnSlaveStalled
self.OnIdleShutdownCallback += self.OnIdleShutdown
self.OnMachineStartupCallback += self.OnMachineStartup
self.OnThermalShutdownCallback += self.OnThermalShutdown
self.OnMachineRestartCallback += self.OnMachineRestart
def Cleanup(self):
del self.OnJobSubmittedCallback
del self.OnJobStartedCallback
del self.OnJobFinishedCallback
del self.OnJobRequeuedCallback
del self.OnJobFailedCallback
del self.OnJobSuspendedCallback
del self.OnJobResumedCallback
del self.OnJobPendedCallback
del self.OnJobReleasedCallback
del self.OnJobDeletedCallback
del self.OnJobErrorCallback
del self.OnJobPurgedCallback
del self.OnHouseCleaningCallback
del self.OnRepositoryRepairCallback
del self.OnSlaveStartedCallback
del self.OnSlaveStoppedCallback
del self.OnSlaveIdleCallback
del self.OnSlaveRenderingCallback
del self.OnSlaveStartingJobCallback
del self.OnSlaveStalledCallback
del self.OnIdleShutdownCallback
del self.OnMachineStartupCallback
del self.OnThermalShutdownCallback
del self.OnMachineRestartCallback
def inject_pype_environment(self, job, additonalData={}):
# returning early if no plugins are configured
# if not self.GetConfigEntryWithDefault(config_entry, ""):
# return
# adding python search paths
paths = self.GetConfigEntryWithDefault("PythonSearchPaths", "").strip()
paths = paths.split(";")
for path in paths:
self.LogInfo("Extending sys.path with: " + str(path))
sys.path.append(path)
# setup logging
level_item = self.GetConfigEntryWithDefault("LoggingLevel", "DEBUG")
level = logging.DEBUG
if level_item == "INFO":
level = logging.INFO
if level_item == "WARNING":
level = logging.WARNING
if level_item == "ERROR":
level = logging.ERROR
logging.basicConfig(level=level)
logger = logging.getLogger()
self.LogInfo("TESTING LOGGING")
# setup username
os.environ["LOGNAME"] = job.UserName
def updateFtrackStatus(self, job, statusName, createIfMissing=False):
"Updates version status on ftrack"
pass
def OnJobSubmitted(self, job):
self.updateFtrackStatus(job, "Render Queued")
def OnJobStarted(self, job):
self.inject_pype_environment(job)
self.updateFtrackStatus(job, "Rendering")
def OnJobFinished(self, job):
self.updateFtrackStatus(job, "Artist Review")
def OnJobRequeued(self, job):
pass
def OnJobFailed(self, job):
pass
def OnJobSuspended(self, job):
self.updateFtrackStatus(job, "Render Queued")
def OnJobResumed(self, job):
self.inject_pype_environment(job)
self.updateFtrackStatus(job, "Rendering")
def OnJobPended(self, job):
pass
def OnJobReleased(self, job):
pass
def OnJobDeleted(self, job):
pass
def OnJobError(self, job, task, report):
data = {"task": task, "report": report}
self.inject_pype_environment(job, data)
def OnJobPurged(self, job):
pass
def OnHouseCleaning(self):
pass
def OnRepositoryRepair(self, job):
pass
def OnSlaveStarted(self, job):
pass
def OnSlaveStopped(self, job):
pass
def OnSlaveIdle(self, job):
pass
def OnSlaveRendering(self, job):
pass
def OnSlaveStartingJob(self, job):
pass
def OnSlaveStalled(self, job):
pass
def OnIdleShutdown(self, job):
pass
def OnMachineStartup(self, job):
pass
def OnThermalShutdown(self, job):
pass
def OnMachineRestart(self, job):
pass

View file

@ -1,6 +1,4 @@
import os
import sys
import logging
import json
import subprocess
import platform
@ -11,7 +9,6 @@ import time
import Deadline.Events
import Deadline.Scripting
from System import Environment
def GetDeadlineEventListener():
return PypeEventListener()
@ -71,7 +68,6 @@ class PypeEventListener(Deadline.Events.DeadlineEventListener):
self.ALREADY_INJECTED = False
def Cleanup(self):
del self.OnJobSubmittedCallback
del self.OnJobStartedCallback
@ -101,7 +97,7 @@ class PypeEventListener(Deadline.Events.DeadlineEventListener):
del self.OnThermalShutdownCallback
del self.OnMachineRestartCallback
def inject_pype_environment(self, job, additonalData={}):
def inject_pype_environment(self, job, additonalData=None):
if self.ALREADY_INJECTED:
self.LogInfo("Environment injected previously")
@ -117,16 +113,19 @@ class PypeEventListener(Deadline.Events.DeadlineEventListener):
self.LogInfo("inject_pype_environment start")
try:
pype_command = "pype_console"
if platform.system().lower() == "linux":
pype_command = "pype_console.sh"
elif platform.system().lower() == "windows":
if platform.system().lower() == "windows":
pype_command = "pype_console.exe"
pype_root = self.GetConfigEntryWithDefault("PypeExecutable", "").strip()
pype_root = self.GetConfigEntryWithDefault("PypeExecutable", "")
pype_app = os.path.join(pype_root , pype_command)
pype_app = os.path.join(pype_root.strip(), pype_command)
if not os.path.exists(pype_app):
raise RuntimeError("App '{}' doesn't exist. Fix it in Tools > Configure Events > pype".format(pype_app))
raise RuntimeError("App '{}' doesn't exist. " +
"Fix it in Tools > Configure Events > " +
"pype".format(pype_app))
# tempfile.TemporaryFile cannot be used because of locking
export_url = os.path.join(tempfile.gettempdir(),
@ -134,20 +133,21 @@ class PypeEventListener(Deadline.Events.DeadlineEventListener):
'env.json') # add HHMMSS + delete later
self.LogInfo("export_url {}".format(export_url))
additional_args = {}
additional_args['project'] = job.GetJobEnvironmentKeyValue('AVALON_PROJECT')
additional_args['asset'] = job.GetJobEnvironmentKeyValue('AVALON_ASSET')
additional_args['task'] = job.GetJobEnvironmentKeyValue('AVALON_TASK')
additional_args['app'] = job.GetJobEnvironmentKeyValue('AVALON_APP_NAME')
self.LogInfo("args::{}".format(additional_args))
add_args = {}
add_args['project'] = \
job.GetJobEnvironmentKeyValue('AVALON_PROJECT')
add_args['asset'] = job.GetJobEnvironmentKeyValue('AVALON_ASSET')
add_args['task'] = job.GetJobEnvironmentKeyValue('AVALON_TASK')
add_args['app'] = job.GetJobEnvironmentKeyValue('AVALON_APP_NAME')
self.LogInfo("args::{}".format(add_args))
args = [
pype_app,
'extractenvironments',
export_url
]
if all(additional_args.values()):
for key, value in additional_args.items():
if all(add_args.values()):
for key, value in add_args.items():
args.append("--{}".format(key))
args.append(value)
@ -163,13 +163,13 @@ class PypeEventListener(Deadline.Events.DeadlineEventListener):
for key, value in contents.items():
job.SetJobEnvironmentKeyValue(key, value)
Deadline.Scripting.RepositoryUtils.SaveJob(job) # IMPORTANT
Deadline.Scripting.RepositoryUtils.SaveJob(job) # IMPORTANT
self.ALREADY_INJECTED = True
os.remove(export_url)
self.LogInfo("inject_pype_environment end")
except Exception as error:
except Exception:
import traceback
self.LogInfo(traceback.format_exc())
self.LogInfo("inject_pype_environment failed")
@ -177,7 +177,7 @@ class PypeEventListener(Deadline.Events.DeadlineEventListener):
raise
def updateFtrackStatus(self, job, statusName, createIfMissing=False):
"Updates version status on ftrack"
"""Updates version status on ftrack"""
pass
def OnJobSubmitted(self, job):
@ -220,7 +220,7 @@ class PypeEventListener(Deadline.Events.DeadlineEventListener):
def OnJobError(self, job, task, report):
self.LogInfo("OnJobError LOGGING")
data = {"task": task, "report": report}
#data = {"task": task, "report": report}
def OnJobPurged(self, job):
pass