Juju Resources provides helpers for charms to load binary resources from external sources, as well as tools for creating mirrors of external resources for network-restricted deployments.
This is intended as a stop-gap until Juju has core support for resources, as well as to prototype what features are needed.
The full documentation is available online at: http://pythonhosted.org/jujuresources/
Install Juju Resources using pip:
pip install jujuresources
A charm using Juju Resources will need to define a resources.yaml
,
such as:
resources: my_resource: url: http://example.com/path/to/my_resource.tgz hash: b377b7cccdd281bc5e4c4071f80e84a3 hash_type: sha256 my_py: pypi: jujuresources>=0.2 optional_resources: my_optional_resource: url: http://example.com/path/to/my_optional_resource.tgz hash: 476881ef4012262dfc8adc645ee786c4 hash_type: sha256
Then, once the charm has installed Juju Resources, it can fetch and verify resources, either in Python:
from jujuresources import fetch, verify, install, config_get if not fetch(mirror_url=config_get('resources_mirror')): print "Mandatory resources did not download; check resources_mirror option" sys.exit(1) install('my_py') fetch('my_optional_resource', mirror_url=config_get('resources_mirror')) if verify('my_optional_resource'): install('my_optional_resource', destination='/usr/lib/myres', skip_top_level=True)
Or via the command-line / bash:
if ! juju-resources fetch -u `config-get resources_mirror`; then echo "Mandatory resources did not download; check resources_mirror option" exit 1 fi juju-resources install my_py juju-resources fetch -u `config-get resources_mirror` my_optional_resource if juju-resources verify my_optional_resource; then juju-resources install my_optional_resource -D /usr/lib/myres -s fi
If you will need to deploy charms in an environment with limited network access, you can create a mirror ahead of time, or on a gateway node which has access:
mkdir local_mirror juju-resources fetch --all -d local_mirror -r http://github.com/me/my-charm/blob/master/resources.yaml juju-resources serve -d local_mirror
You will then have a lightweight HTTP server running to which you can set the
charm's resources_mirror
(or equivalent) config option to point to,
serving all (--all
, optional as well as required) resources defined in the
remote resources.yaml
(-r <url-or-file>
), which are cached in the
local_mirror
directory (-d local_mirror
).
Note that the charms will need to be able to access the machine and port you run the mirror on, and the charms must support a config option to point Juju Resources to the mirror (as well as handle the possibility that their resources may not be available when they are first deployed).