Resource locking module for python.
Originally designed for following projects:
Module provides python API and simple CLI interface.
Resource is released in following cases:
- process ends
- when context ends when
lockable.auto_lock(..)is used - allocation.unlock() is called
- lockable.unlock() is called
Resources data provider support following mechanisms:
resources.jsonfile in file system- python list of dictionaries
- http uri which points to API and is used with HTTP GET method. API should provide
resources.jsondata as json object.
% lockable --help usage: lockable [-h] [--validate-only] [--lock-folder LOCK_FOLDER] [--resources RESOURCES] [--timeout TIMEOUT] [--hostname HOSTNAME] [--requirements REQUIREMENTS] [command [command ...]] run given command while suitable resource is allocated. Usage example: lockable --requirements{"online":true} echo using resource: $ID positional arguments: command Command to be execute during device allocation optional arguments: -h, --help show this help message and exit --validate-only Only validate resources.json --lock-folder LOCK_FOLDER lock folder --resources RESOURCES Resources file (utf-8) or http uri --timeout TIMEOUT Timeout for trying allocate suitable resource --hostname HOSTNAME Hostname --requirements REQUIREMENTS requirements as json string Constructor
lockable=Lockable([hostname], [resource_list_file], [resource_list], [lock_folder])Allocation
allocation_context=lockable.lock(requirements, [timeout_s]) print(allocation_context.resource_info) print(allocation_context.resource_id) allocation_context.unlock() # or using resource infolockable.unlock(allocation_context)Allocation context contains following API:
requirements: dictOriginal requirements for allocationresource_info: dictAllocated resource informationunlock(): funcrelease resource lock functionallocation_queue_time: timedeltaHow long waited before allocationallocation_start_time: datetimewhen allocation was startedrelease_time: datetimewhen allocation was endedalloc_id: strallocation idallocation_durations: timedeltahow long time allocation takes
or using context manager which unlock automatically
withlockable.auto_lock(requirements, [timeout_s]) asallocation: print(allocation.resource_info)Resource requirements are evaluated using mongoquery, so MongoDB-style operators like $in and $gt are supported when selecting resources.
Tips:
You can allocate also offline devices by set requirements "online": None . You can ignore also hostname same same way by setting it to None`