~james-page/charms/trusty/glance/tox

« back to all changes in this revision

Viewing changes to hooks/charmhelpers/core/hookenv.py

  • Committer: Liam Young
  • Date: 2015-06-04 08:44:46 UTC
  • mfrom: (117 glance)
  • mto: This revision was merged to the branch mainline in revision 118.
  • Revision ID: liam.young@canonical.com-20150604084446-xsroavxpfefmfynj
Resync le charm helpers

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
import subprocess
29
29
import sys
30
30
import errno
 
31
import tempfile
31
32
from subprocess import CalledProcessError
32
33
 
33
34
import six
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())):
368
 
        if v is None:
369
 
            relation_cmd_line.append('{}='.format(k))
370
 
        else:
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)
 
377
    if accepts_file:
 
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)
 
387
    else:
 
388
        for key, value in settings.items():
 
389
            if value is None:
 
390
                relation_cmd_line.append('{}='.format(key))
 
391
            else:
 
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())
375
396
 
606
627
    return os.environ.get('CHARM_DIR')
607
628
 
608
629
 
609
 
def translate_exc(from_exc, to_exc):
610
 
    def inner_translate_exc1(f):
611
 
        def inner_translate_exc2(*args, **kwargs):
612
 
            try:
613
 
                return f(*args, **kwargs)
614
 
            except from_exc:
615
 
                raise to_exc
616
 
 
617
 
        return inner_translate_exc2
618
 
 
619
 
    return inner_translate_exc1
620
 
 
621
 
 
622
 
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
623
 
def is_leader():
624
 
    """Does the current unit hold the juju leadership
625
 
 
626
 
    Uses juju to determine whether the current unit is the leader of its peers
627
 
    """
628
 
    try:
629
 
        leader = json.loads(
630
 
            subprocess.check_output(['is-leader', '--format=json'])
631
 
        )
632
 
        return (leader is True)
633
 
    except ValueError:
634
 
        raise NotImplementedError
635
 
 
636
 
 
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 '-']
641
 
    try:
642
 
        ret = json.loads(subprocess.check_output(cmd).decode('UTF-8'))
643
 
        log("Juju leader-get '%s' = '%s'" % (attribute, ret), level=DEBUG)
644
 
        return ret
645
 
    except ValueError:
646
 
        return None
647
 
    except CalledProcessError as e:
648
 
        if e.returncode == 2:
649
 
            return None
650
 
 
651
 
        raise
652
 
 
653
 
 
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)
658
 
    cmd = ['leader-set']
659
 
    settings = settings or {}
660
 
    settings.update(kwargs)
661
 
    for k, v in settings.iteritems():
662
 
        if v is None:
663
 
            cmd.append('{}='.format(k))
664
 
        else:
665
 
            cmd.append('{}={}'.format(k, v))
666
 
 
667
 
    subprocess.check_call(cmd)
668
 
 
669
 
 
670
630
@cached
671
631
def action_get(key=None):
672
632
    """Gets the value of an action parameter, or all key/value param pairs"""
737
697
            return 'unknown'
738
698
        else:
739
699
            raise
 
700
 
 
701
 
 
702
def translate_exc(from_exc, to_exc):
 
703
    def inner_translate_exc1(f):
 
704
        def inner_translate_exc2(*args, **kwargs):
 
705
            try:
 
706
                return f(*args, **kwargs)
 
707
            except from_exc:
 
708
                raise to_exc
 
709
 
 
710
        return inner_translate_exc2
 
711
 
 
712
    return inner_translate_exc1
 
713
 
 
714
 
 
715
@translate_exc(from_exc=OSError, to_exc=NotImplementedError)
 
716
def is_leader():
 
717
    """Does the current unit hold the juju leadership
 
718
 
 
719
    Uses juju to determine whether the current unit is the leader of its peers
 
720
    """
 
721
    cmd = ['is-leader', '--format=json']
 
722
    return json.loads(subprocess.check_output(cmd).decode('UTF-8'))
 
723
 
 
724
 
 
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'))
 
730
 
 
731
 
 
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)
 
736
    cmd = ['leader-set']
 
737
    settings = settings or {}
 
738
    settings.update(kwargs)
 
739
    for k, v in settings.iteritems():
 
740
        if v is None:
 
741
            cmd.append('{}='.format(k))
 
742
        else:
 
743
            cmd.append('{}={}'.format(k, v))
 
744
    subprocess.check_call(cmd)