Dynamic Resource Resolution

Introduced in version 2.1.3.

The idea is to decouple resource identification from resource discovery. Workloads/instruments/devices/etc state what resources they need, and not where to look for them – this instead is left to the resource resolver that is now part of the execution context. The actual discovery of resources is performed by resource getters that are registered with the resolver.

A resource type is defined by a subclass of wlauto.core.resource.Resource. An instance of this class describes a resource that is to be obtained. At minimum, a Resource instance has an owner (which is typically the object that is looking for the resource), but specific resource types may define other parameters that describe an instance of that resource (such as file names, URLs, etc).

An object looking for a resource invokes a resource resolver with an instance of Resource describing the resource it is after. The resolver goes through the getters registered for that resource type in priority order attempting to obtain the resource; once the resource is obtained, it is returned to the calling object. If none of the registered getters could find the resource, None is returned instead.

The most common kind of object looking for resources is a Workload, and since v2.1.3, Workload class defines wlauto.core.workload.Workload.init_resources() method that may be overridden by subclasses to perform resource resolution. For example, a workload looking for an APK file would do so like this:

from wlauto import Workload
from wlauto.common.resources import ApkFile

class AndroidBenchmark(Workload):

    # ...

    def init_resources(self, context):
            self.apk_file = context.resource.get(ApkFile(self))

    # ...

Currently available resource types are defined in wlauto.common.resources.