362
363
"""Set relation information for the current unit"""
363
364
relation_settings = relation_settings if relation_settings else {}
364
365
relation_cmd_line = ['relation-set']
366
accepts_file = "--file" in subprocess.check_output(
367
relation_cmd_line + ["--help"], universal_newlines=True)
365
368
if relation_id is not None:
366
369
relation_cmd_line.extend(('-r', relation_id))
367
for k, v in (list(relation_settings.items()) + list(kwargs.items())):
369
relation_cmd_line.append('{}='.format(k))
371
relation_cmd_line.append('{}={}'.format(k, v))
372
subprocess.check_call(relation_cmd_line)
370
settings = relation_settings.copy()
371
settings.update(kwargs)
372
for key, value in settings.items():
373
# Force value to be a string: it always should, but some call
374
# sites pass in things like dicts or numbers.
375
if value is not None:
376
settings[key] = "{}".format(value)
378
# --file was introduced in Juju 1.23.2. Use it by default if
379
# available, since otherwise we'll break if the relation data is
380
# too big. Ideally we should tell relation-set to read the data from
381
# stdin, but that feature is broken in 1.23.2: Bug #1454678.
382
with tempfile.NamedTemporaryFile(delete=False) as settings_file:
383
settings_file.write(yaml.safe_dump(settings).encode("utf-8"))
384
subprocess.check_call(
385
relation_cmd_line + ["--file", settings_file.name])
386
os.remove(settings_file.name)
388
for key, value in settings.items():
390
relation_cmd_line.append('{}='.format(key))
392
relation_cmd_line.append('{}={}'.format(key, value))
393
subprocess.check_call(relation_cmd_line)
373
394
# Flush cache of any relation-gets for local unit
374
395
flush(local_unit())
606
627
return os.environ.get('CHARM_DIR')
609
def translate_exc(from_exc, to_exc):
610
def inner_translate_exc1(f):
611
def inner_translate_exc2(*args, **kwargs):
613
return f(*args, **kwargs)
617
return inner_translate_exc2
619
return inner_translate_exc1
622
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
624
"""Does the current unit hold the juju leadership
626
Uses juju to determine whether the current unit is the leader of its peers
630
subprocess.check_output(['is-leader', '--format=json'])
632
return (leader is True)
634
raise NotImplementedError
637
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
638
def leader_get(attribute=None):
639
"""Juju leader get value(s)"""
640
cmd = ['leader-get', '--format=json'] + [attribute or '-']
642
ret = json.loads(subprocess.check_output(cmd).decode('UTF-8'))
643
log("Juju leader-get '%s' = '%s'" % (attribute, ret), level=DEBUG)
647
except CalledProcessError as e:
648
if e.returncode == 2:
654
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
655
def leader_set(settings=None, **kwargs):
656
"""Juju leader set value(s)"""
657
log("Juju leader-set '%s'" % (settings), level=DEBUG)
659
settings = settings or {}
660
settings.update(kwargs)
661
for k, v in settings.iteritems():
663
cmd.append('{}='.format(k))
665
cmd.append('{}={}'.format(k, v))
667
subprocess.check_call(cmd)
671
631
def action_get(key=None):
672
632
"""Gets the value of an action parameter, or all key/value param pairs"""
702
def translate_exc(from_exc, to_exc):
703
def inner_translate_exc1(f):
704
def inner_translate_exc2(*args, **kwargs):
706
return f(*args, **kwargs)
710
return inner_translate_exc2
712
return inner_translate_exc1
715
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
717
"""Does the current unit hold the juju leadership
719
Uses juju to determine whether the current unit is the leader of its peers
721
cmd = ['is-leader', '--format=json']
722
return json.loads(subprocess.check_output(cmd).decode('UTF-8'))
725
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
726
def leader_get(attribute=None):
727
"""Juju leader get value(s)"""
728
cmd = ['leader-get', '--format=json'] + [attribute or '-']
729
return json.loads(subprocess.check_output(cmd).decode('UTF-8'))
732
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
733
def leader_set(settings=None, **kwargs):
734
"""Juju leader set value(s)"""
735
log("Juju leader-set '%s'" % (settings), level=DEBUG)
737
settings = settings or {}
738
settings.update(kwargs)
739
for k, v in settings.iteritems():
741
cmd.append('{}='.format(k))
743
cmd.append('{}={}'.format(k, v))
744
subprocess.check_call(cmd)