diff --git a/README.md b/README.md index 1d7c75260a..035bca2891 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,2 @@ -# Addon template -This is a boilerplate git repository for creating new ayon addons. - -## Folder structure -All addons must have server code which is located in `server` subfolder. Server side addon definition is entrypoint for each addon. Can define settings, frontend, custom endpoints, etc. Root by default contains `create_package.py` which is a helper script that prepares package structure for server. The script may be modified or expanded by needs of addon (e.g. when frontend needs to be build first). File with `version.py` is kept at the root and is copied to server and client code with script -> The reason is to make sure both parts contain same version. - -### Server content -Default base of server addon is `__init__.py` file in root of repository which define addon for server. Most of addons have settings that's why `settings.py` is by default in the structure. Settings can be changed to folder/module when more than one file is needed. - -### Server frontend -Addons may have their frontend. By default, server looks into `/frontend/dist` for `index.html` and addon have to have specified scopes where the frontend should be showed (check documentation of `frontend_scopes` on server addon implementation for more information). - -### Private server files -Root of addon may contain subfolder `private` where can be added files that are accessible via ayon server. Url schema is `{server url}/addons/{addon name}/{addon_version}/private/*`. By default it is place where client zip file is created (during package creation). The endpoint requires authorized user. - -### Public server files -Public files works the same as private files but does not require authorized user. Subfolder name is `public`. Url schema is `{server url}/addons/{addon name}/{addon_version}/public/*`. Endpoint is helpful for images/icons or other static content. - -### Client content -Addons that have code for desktop client application should create subfolder `client` where a client content is located. It is expected the directory has only one file or folder in it which is named the way how should be imported on a client side (e.g. `ayon_core`). - - -### Example strucutre -``` -├─ server -│ ├─ __init__.py -│ └─ settings.py -│ -├─ frontend -│ └─ dist -│ └─ index.html -│ -├─ public -│ └─ my_icon.png -│ -├─ private -│ └─ kittens.png -│ -├─ client -│ ├─ ayon_core -│ │ ├─ pipeline -│ │ ├─ lib -│ │ └─ ... -│ └─ pyproject.toml -│ -├─ create_package.py -├─ LICENSE -├─ package.py -└─ README.md -``` +# Deadline addon +Deadline integration for AYON. diff --git a/client/ayon_deadline/addon.py b/client/ayon_deadline/addon.py index 87fc2ad665..3af92dffeb 100644 --- a/client/ayon_deadline/addon.py +++ b/client/ayon_deadline/addon.py @@ -10,6 +10,9 @@ from .version import __version__ +DEADLINE_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) + + class DeadlineWebserviceError(Exception): """ Exception to throw when connection to Deadline server fails. @@ -37,10 +40,18 @@ def initialize(self, studio_settings): def get_plugin_paths(self): """Deadline plugin paths.""" - current_dir = os.path.dirname(os.path.abspath(__file__)) - return { - "publish": [os.path.join(current_dir, "plugins", "publish")] - } + # Note: We are not returning `publish` key because we have overridden + # `get_publish_plugin_paths` to return paths host-specific. However, + # `get_plugin_paths` still needs to be implemented because it's + # abstract on the parent class + return {} + + def get_publish_plugin_paths(self, host_name=None): + publish_dir = os.path.join(DEADLINE_ADDON_ROOT, "plugins", "publish") + paths = [os.path.join(publish_dir, "global")] + if host_name: + paths.append(os.path.join(publish_dir, host_name)) + return paths @staticmethod def get_deadline_pools(webservice, auth=None, log=None): diff --git a/client/ayon_deadline/plugins/publish/submit_aftereffects_deadline.py b/client/ayon_deadline/plugins/publish/aftereffects/submit_aftereffects_deadline.py similarity index 99% rename from client/ayon_deadline/plugins/publish/submit_aftereffects_deadline.py rename to client/ayon_deadline/plugins/publish/aftereffects/submit_aftereffects_deadline.py index 45d907cbba..1cbffa787b 100644 --- a/client/ayon_deadline/plugins/publish/submit_aftereffects_deadline.py +++ b/client/ayon_deadline/plugins/publish/aftereffects/submit_aftereffects_deadline.py @@ -37,6 +37,7 @@ class AfterEffectsSubmitDeadline( families = ["render.farm"] # cannot be "render' as that is integrated use_published = True targets = ["local"] + settings_category = "deadline" priority = 50 chunk_size = 1000000 diff --git a/client/ayon_deadline/plugins/publish/submit_blender_deadline.py b/client/ayon_deadline/plugins/publish/blender/submit_blender_deadline.py similarity index 100% rename from client/ayon_deadline/plugins/publish/submit_blender_deadline.py rename to client/ayon_deadline/plugins/publish/blender/submit_blender_deadline.py diff --git a/client/ayon_deadline/plugins/publish/submit_celaction_deadline.py b/client/ayon_deadline/plugins/publish/celaction/submit_celaction_deadline.py similarity index 100% rename from client/ayon_deadline/plugins/publish/submit_celaction_deadline.py rename to client/ayon_deadline/plugins/publish/celaction/submit_celaction_deadline.py diff --git a/client/ayon_deadline/plugins/publish/submit_fusion_deadline.py b/client/ayon_deadline/plugins/publish/fusion/submit_fusion_deadline.py similarity index 100% rename from client/ayon_deadline/plugins/publish/submit_fusion_deadline.py rename to client/ayon_deadline/plugins/publish/fusion/submit_fusion_deadline.py diff --git a/client/ayon_deadline/plugins/publish/collect_deadline_server_from_instance.py b/client/ayon_deadline/plugins/publish/global/collect_deadline_server_from_instance.py similarity index 100% rename from client/ayon_deadline/plugins/publish/collect_deadline_server_from_instance.py rename to client/ayon_deadline/plugins/publish/global/collect_deadline_server_from_instance.py diff --git a/client/ayon_deadline/plugins/publish/collect_default_deadline_server.py b/client/ayon_deadline/plugins/publish/global/collect_default_deadline_server.py similarity index 100% rename from client/ayon_deadline/plugins/publish/collect_default_deadline_server.py rename to client/ayon_deadline/plugins/publish/global/collect_default_deadline_server.py diff --git a/client/ayon_deadline/plugins/publish/collect_pools.py b/client/ayon_deadline/plugins/publish/global/collect_pools.py similarity index 100% rename from client/ayon_deadline/plugins/publish/collect_pools.py rename to client/ayon_deadline/plugins/publish/global/collect_pools.py diff --git a/client/ayon_deadline/plugins/publish/collect_user_credentials.py b/client/ayon_deadline/plugins/publish/global/collect_user_credentials.py similarity index 100% rename from client/ayon_deadline/plugins/publish/collect_user_credentials.py rename to client/ayon_deadline/plugins/publish/global/collect_user_credentials.py diff --git a/client/ayon_deadline/plugins/publish/help/validate_deadline_connection.xml b/client/ayon_deadline/plugins/publish/global/help/validate_deadline_connection.xml similarity index 100% rename from client/ayon_deadline/plugins/publish/help/validate_deadline_connection.xml rename to client/ayon_deadline/plugins/publish/global/help/validate_deadline_connection.xml diff --git a/client/ayon_deadline/plugins/publish/help/validate_deadline_pools.xml b/client/ayon_deadline/plugins/publish/global/help/validate_deadline_pools.xml similarity index 100% rename from client/ayon_deadline/plugins/publish/help/validate_deadline_pools.xml rename to client/ayon_deadline/plugins/publish/global/help/validate_deadline_pools.xml diff --git a/client/ayon_deadline/plugins/publish/submit_publish_cache_job.py b/client/ayon_deadline/plugins/publish/global/submit_publish_cache_job.py similarity index 100% rename from client/ayon_deadline/plugins/publish/submit_publish_cache_job.py rename to client/ayon_deadline/plugins/publish/global/submit_publish_cache_job.py diff --git a/client/ayon_deadline/plugins/publish/submit_publish_job.py b/client/ayon_deadline/plugins/publish/global/submit_publish_job.py similarity index 100% rename from client/ayon_deadline/plugins/publish/submit_publish_job.py rename to client/ayon_deadline/plugins/publish/global/submit_publish_job.py diff --git a/client/ayon_deadline/plugins/publish/validate_deadline_connection.py b/client/ayon_deadline/plugins/publish/global/validate_deadline_connection.py similarity index 100% rename from client/ayon_deadline/plugins/publish/validate_deadline_connection.py rename to client/ayon_deadline/plugins/publish/global/validate_deadline_connection.py diff --git a/client/ayon_deadline/plugins/publish/validate_deadline_pools.py b/client/ayon_deadline/plugins/publish/global/validate_deadline_pools.py similarity index 100% rename from client/ayon_deadline/plugins/publish/validate_deadline_pools.py rename to client/ayon_deadline/plugins/publish/global/validate_deadline_pools.py diff --git a/client/ayon_deadline/plugins/publish/validate_expected_and_rendered_files.py b/client/ayon_deadline/plugins/publish/global/validate_expected_and_rendered_files.py similarity index 99% rename from client/ayon_deadline/plugins/publish/validate_expected_and_rendered_files.py rename to client/ayon_deadline/plugins/publish/global/validate_expected_and_rendered_files.py index 3fd13cfa10..4a8d3b3b34 100644 --- a/client/ayon_deadline/plugins/publish/validate_expected_and_rendered_files.py +++ b/client/ayon_deadline/plugins/publish/global/validate_expected_and_rendered_files.py @@ -14,6 +14,7 @@ class ValidateExpectedFiles(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder families = ["render"] targets = ["deadline"] + settings_category = "deadline" # check if actual frame range on render job wasn't different # case when artists wants to render only subset of frames diff --git a/client/ayon_deadline/plugins/publish/submit_harmony_deadline.py b/client/ayon_deadline/plugins/publish/harmony/submit_harmony_deadline.py similarity index 100% rename from client/ayon_deadline/plugins/publish/submit_harmony_deadline.py rename to client/ayon_deadline/plugins/publish/harmony/submit_harmony_deadline.py diff --git a/client/ayon_deadline/plugins/publish/submit_houdini_cache_deadline.py b/client/ayon_deadline/plugins/publish/houdini/submit_houdini_cache_deadline.py similarity index 98% rename from client/ayon_deadline/plugins/publish/submit_houdini_cache_deadline.py rename to client/ayon_deadline/plugins/publish/houdini/submit_houdini_cache_deadline.py index ac9ad570c3..f98f7ea0e4 100644 --- a/client/ayon_deadline/plugins/publish/submit_houdini_cache_deadline.py +++ b/client/ayon_deadline/plugins/publish/houdini/submit_houdini_cache_deadline.py @@ -101,12 +101,15 @@ def get_job_info(self): "FTRACK_API_USER", "FTRACK_SERVER", "OPENPYPE_SG_USER", + "AYON_BUNDLE_NAME", + "AYON_DEFAULT_SETTINGS_VARIANT", "AYON_PROJECT_NAME", "AYON_FOLDER_PATH", "AYON_TASK_NAME", "AYON_WORKDIR", "AYON_APP_NAME", "AYON_LOG_NO_COLORS", + "AYON_IN_TESTS" ] environment = { diff --git a/client/ayon_deadline/plugins/publish/submit_houdini_render_deadline.py b/client/ayon_deadline/plugins/publish/houdini/submit_houdini_render_deadline.py similarity index 97% rename from client/ayon_deadline/plugins/publish/submit_houdini_render_deadline.py rename to client/ayon_deadline/plugins/publish/houdini/submit_houdini_render_deadline.py index 7956108e77..9772329ab1 100644 --- a/client/ayon_deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/client/ayon_deadline/plugins/publish/houdini/submit_houdini_render_deadline.py @@ -224,7 +224,9 @@ def get_job_info(self, dependency_job_ids=None): job_info.ChunkSize = attribute_values.get( "export_chunk", self.export_chunk_size ) - job_info.Group = self.export_group + job_info.Group = attribute_values.get( + "export_group", self.export_group + ) else: job_info.Priority = attribute_values.get( "priority", self.priority @@ -232,7 +234,9 @@ def get_job_info(self, dependency_job_ids=None): job_info.ChunkSize = attribute_values.get( "chunk", self.chunk_size ) - job_info.Group = self.group + job_info.Group = attribute_values.get( + "group", self.group + ) # Apply render globals, like e.g. data from collect machine list render_globals = instance.data.get("renderGlobals", {}) @@ -248,12 +252,15 @@ def get_job_info(self, dependency_job_ids=None): "FTRACK_API_USER", "FTRACK_SERVER", "OPENPYPE_SG_USER", + "AYON_BUNDLE_NAME", + "AYON_DEFAULT_SETTINGS_VARIANT", "AYON_PROJECT_NAME", "AYON_FOLDER_PATH", "AYON_TASK_NAME", "AYON_WORKDIR", "AYON_APP_NAME", "AYON_LOG_NO_COLORS", + "AYON_IN_TESTS" ] environment = { @@ -396,8 +403,10 @@ def _get_husk_standalone_plugin_info(self, instance, hou_major_minor): class HoudiniSubmitDeadlineUsdRender(HoudiniSubmitDeadline): + label = "Submit Render to Deadline (USD)" + families = ["usdrender"] + # Do not use published workfile paths for USD Render ROP because the # Export Job doesn't seem to occur using the published path either, so # output paths then do not match the actual rendered paths use_published = False - families = ["usdrender"] diff --git a/client/ayon_deadline/plugins/publish/submit_max_deadline.py b/client/ayon_deadline/plugins/publish/max/submit_max_deadline.py similarity index 100% rename from client/ayon_deadline/plugins/publish/submit_max_deadline.py rename to client/ayon_deadline/plugins/publish/max/submit_max_deadline.py diff --git a/client/ayon_deadline/plugins/publish/submit_maya_deadline.py b/client/ayon_deadline/plugins/publish/maya/submit_maya_deadline.py similarity index 100% rename from client/ayon_deadline/plugins/publish/submit_maya_deadline.py rename to client/ayon_deadline/plugins/publish/maya/submit_maya_deadline.py diff --git a/client/ayon_deadline/plugins/publish/submit_nuke_deadline.py b/client/ayon_deadline/plugins/publish/nuke/submit_nuke_deadline.py similarity index 100% rename from client/ayon_deadline/plugins/publish/submit_nuke_deadline.py rename to client/ayon_deadline/plugins/publish/nuke/submit_nuke_deadline.py diff --git a/client/ayon_deadline/repository/custom/plugins/GlobalJobPreLoad.py b/client/ayon_deadline/repository/custom/plugins/GlobalJobPreLoad.py index dbd1798608..894049fb2a 100644 --- a/client/ayon_deadline/repository/custom/plugins/GlobalJobPreLoad.py +++ b/client/ayon_deadline/repository/custom/plugins/GlobalJobPreLoad.py @@ -13,7 +13,7 @@ FileUtils, DirectoryUtils, ) -__version__ = "1.1.1" +__version__ = "1.1.2" VERSION_REGEX = re.compile( r"(?P0|[1-9]\d*)" r"\.(?P0|[1-9]\d*)" @@ -496,6 +496,13 @@ def inject_ayon_environment(deadlinePlugin): "extractenvironments", export_url ] + + # staging requires passing argument + # TODO could be switched to env var after https://github.com/ynput/ayon-launcher/issues/123 + settings_variant = job.GetJobEnvironmentKeyValue("AYON_DEFAULT_SETTINGS_VARIANT") # noqa + if settings_variant == "staging": + args.append("--use-staging") + # Backwards compatibility for older versions legacy_args = [ "--headless", diff --git a/client/ayon_deadline/version.py b/client/ayon_deadline/version.py index b443a47e77..264f4f5ad8 100644 --- a/client/ayon_deadline/version.py +++ b/client/ayon_deadline/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON addon 'deadline' version.""" -__version__ = "0.2.4-dev.1" +__version__ = "0.2.5-dev.1" diff --git a/create_package.py b/create_package.py index 7f9a1909f9..fad0c44e1d 100644 --- a/create_package.py +++ b/create_package.py @@ -132,10 +132,7 @@ def safe_copy_file(src_path: str, dst_path: str): return dst_dir: str = os.path.dirname(dst_path) - try: - os.makedirs(dst_dir) - except Exception: - pass + os.makedirs(dst_dir, exist_ok=True) shutil.copy2(src_path, dst_path) @@ -355,6 +352,8 @@ def copy_addon_package( # Copy server content for src_file, dst_subpath in files_mapping: dst_path: str = os.path.join(addon_output_dir, dst_subpath) + dst_dir: str = os.path.dirname(dst_path) + os.makedirs(dst_dir, exist_ok=True) if isinstance(src_file, io.BytesIO): with open(dst_path, "wb") as stream: stream.write(src_file.getvalue()) diff --git a/package.py b/package.py index e5c4cec4f5..531815cb3b 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "deadline" title = "Deadline" -version = "0.2.4-dev.1" +version = "0.2.5-dev.1" client_dir = "ayon_deadline"