Skip to content

pre_resolver_init

Pre-launch hook to initialize asset resolver for the application.

InitializeAssetResolver

Bases: PreLaunchHook

Initialize asset resolver for the application.

Asset resolver is used to resolve assets in the application.

Source code in client/ayon_usd/hooks/pre_resolver_init.py
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
class InitializeAssetResolver(PreLaunchHook):
    """Initialize asset resolver for the application.

    Asset resolver is used to resolve assets in the application.
    """

    app_groups = {"maya", "houdini", "unreal"}
    # TODO Use `farm_render` instead of `farm_publish`
    # once this issue is resolved
    # https://github.com/ynput/ayon-applications/issues/2
    launch_types = {LaunchTypes.local, LaunchTypes.farm_publish}

    def execute(self):
        """Pre-launch hook entry method."""
        project_settings = self.data["project_settings"]
        local_resolver = None

        if not project_settings["usd"]["distribution"]["enabled"]:
            self.log.info("USD distribution is disabled; skipping resolver setup.")
            return

        distribution_type = project_settings["usd"]["distribution"]["type"]
        if distribution_type == "lake_fs":
            local_resolver = self._handle_lake_fs_distribution(project_settings)
        elif distribution_type == "local":
            local_resolver = self._handle_local_distribution(project_settings)

        if local_resolver is None:
            self.log.warning(
                "Resolver setup skipped for %s because no resolver directory "
                "was resolved.",
                self.app_name,
            )
            return

        self._setup_resolver(local_resolver, project_settings)

    def _handle_lake_fs_distribution(self, settings) -> Optional[str]:
        resolver_lake_fs_path = utils.get_resolver_to_download(
            settings,
            self.app_name
        )

        if not resolver_lake_fs_path:
            self.log.warning(
                "No USD Resolver could be found but AYON-Usd addon is"
                f" activated for application: {self.app_name}"
            )
            return None

        self.log.info(f"Using resolver from lakeFS: {resolver_lake_fs_path}")
        lake_fs = config.get_global_lake_instance()
        lake_fs_resolver_time_stamp = (
            lake_fs.get_element_info(resolver_lake_fs_path).get(
                "Modified Time"
            )
        )
        if not lake_fs_resolver_time_stamp:
            self.log.error(
                "Could not find resolver timestamp on lakeFS server "
                f"for application: {self.app_name}"
            )
            return

        # Bootstrap addon metadata for launches that happen without tray init.
        addon_data_json = utils.get_addon_data_json()

        if not addon_data_json:
            utils.create_addon_data_json_file()
            addon_data_json = utils.get_addon_data_json()

        key = str(self.app_name).replace("/", "_")
        local_resolver_key = f"resolver_data_{key}"
        local_resolver_timestamp, local_resolver = (
            addon_data_json.get(local_resolver_key, [None, None])
        )

        if (
            local_resolver
            and lake_fs_resolver_time_stamp == local_resolver_timestamp
            and os.path.exists(local_resolver)
        ):
            return local_resolver

        # If no existing match, download the resolver
        local_resolver = utils.lakefs_download_and_extract(
            resolver_lake_fs_path, str(utils.get_download_dir())
        )
        if not local_resolver:
            return None

        addon_data_json[local_resolver_key] = [
            lake_fs_resolver_time_stamp,
            local_resolver,
        ]
        with open(ADDON_DATA_JSON_PATH, "w") as addon_json:
            json.dump(addon_data_json, addon_json)

        return local_resolver

    def _handle_local_distribution(self, settings) -> Optional[str]:
        resolver_path = utils.get_local_resolver_path(settings, self.app_name)

        if not resolver_path or not os.path.isdir(resolver_path):
            self.log.error(f"Invalid local resolver path: {resolver_path}")
            return None

        self.log.info(f"Using local resolver path for {self.app_name}: {resolver_path}")
        return resolver_path

    def _setup_resolver(
        self,
        local_resolver: str,
        settings,
    ):
        self.log.info(
            f"Initializing USD asset resolver for application: {self.app_name}"
        )

        updated_env = utils.get_resolver_setup_info(
            local_resolver, settings, env=self.launch_context.env
        )
        self.launch_context.env.update(updated_env)

execute()

Pre-launch hook entry method.

Source code in client/ayon_usd/hooks/pre_resolver_init.py
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
def execute(self):
    """Pre-launch hook entry method."""
    project_settings = self.data["project_settings"]
    local_resolver = None

    if not project_settings["usd"]["distribution"]["enabled"]:
        self.log.info("USD distribution is disabled; skipping resolver setup.")
        return

    distribution_type = project_settings["usd"]["distribution"]["type"]
    if distribution_type == "lake_fs":
        local_resolver = self._handle_lake_fs_distribution(project_settings)
    elif distribution_type == "local":
        local_resolver = self._handle_local_distribution(project_settings)

    if local_resolver is None:
        self.log.warning(
            "Resolver setup skipped for %s because no resolver directory "
            "was resolved.",
            self.app_name,
        )
        return

    self._setup_resolver(local_resolver, project_settings)