517
517
def relation_to_role_and_interface(relation_name):
519
519
Given the name of a relation, return the role and the name of the interface
520
that relation uses (where role is one of ``provides``, ``requires``, or ``peer``).
520
that relation uses (where role is one of ``provides``, ``requires``, or ``peers``).
522
522
:returns: A tuple containing ``(role, interface)``, or ``(None, None)``.
524
524
_metadata = metadata()
525
for role in ('provides', 'requires', 'peer'):
525
for role in ('provides', 'requires', 'peers'):
526
526
interface = _metadata.get(role, {}).get(relation_name, {}).get('interface')
528
528
return role, interface
535
535
Given a role and interface name, return a list of relation names for the
536
536
current charm that use that interface under that role (where role is one
537
of ``provides``, ``requires``, or ``peer``).
537
of ``provides``, ``requires``, or ``peers``).
539
539
:returns: A list of relation names.
555
555
:returns: A list of relation names.
558
for role in ('provides', 'requires', 'peer'):
558
for role in ('provides', 'requires', 'peers'):
559
559
results.extend(role_and_interface_to_relations(role, interface_name))
640
def storage_get(attribute="", storage_id=""):
640
def storage_get(attribute=None, storage_id=None):
641
641
"""Get storage attributes"""
642
642
_args = ['storage-get', '--format=json']
878
878
subprocess.check_call(cmd)
881
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
882
def payload_register(ptype, klass, pid):
883
""" is used while a hook is running to let Juju know that a
884
payload has been started."""
885
cmd = ['payload-register']
886
for x in [ptype, klass, pid]:
888
subprocess.check_call(cmd)
891
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
892
def payload_unregister(klass, pid):
893
""" is used while a hook is running to let Juju know
894
that a payload has been manually stopped. The <class> and <id> provided
895
must match a payload that has been previously registered with juju using
897
cmd = ['payload-unregister']
898
for x in [klass, pid]:
900
subprocess.check_call(cmd)
903
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
904
def payload_status_set(klass, pid, status):
905
"""is used to update the current status of a registered payload.
906
The <class> and <id> provided must match a payload that has been previously
907
registered with juju using payload-register. The <status> must be one of the
908
follow: starting, started, stopping, stopped"""
909
cmd = ['payload-status-set']
910
for x in [klass, pid, status]:
912
subprocess.check_call(cmd)
915
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
916
def resource_get(name):
917
"""used to fetch the resource path of the given name.
919
<name> must match a name of defined resource in metadata.yaml
921
returns either a path or False if resource not available
926
cmd = ['resource-get', name]
928
return subprocess.check_output(cmd).decode('UTF-8')
929
except subprocess.CalledProcessError:
882
934
def juju_version():
883
935
"""Full version string (eg. '1.23.3.1-trusty-amd64')"""
942
994
for callback, args, kwargs in reversed(_atexit):
943
995
callback(*args, **kwargs)
999
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
1000
def network_get_primary_address(binding):
1002
Retrieve the primary network address for a named binding
1004
:param binding: string. The name of a relation of extra-binding
1005
:return: string. The primary IP address for the named binding
1006
:raise: NotImplementedError if run on Juju < 2.0
1008
cmd = ['network-get', '--primary-address', binding]
1009
return subprocess.check_output(cmd).strip()