~ibmcharmers/charms/trusty/ibm-mobilefirst-server/trunk

« back to all changes in this revision

Viewing changes to lib/charms/layer/basic.py

  • Committer: Suchitra Venugopal
  • Date: 2017-03-03 10:32:15 UTC
  • Revision ID: suchvenu@in.ibm.com-20170303103215-26ihfwfx9vucorr2
Review comments

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
import os
2
2
import sys
3
3
import shutil
4
 
import platform
5
4
from glob import glob
6
5
from subprocess import check_call
7
6
 
8
7
from charms.layer.execd import execd_preinstall
9
8
 
10
9
 
 
10
def lsb_release():
 
11
    """Return /etc/lsb-release in a dict"""
 
12
    d = {}
 
13
    with open('/etc/lsb-release', 'r') as lsb:
 
14
        for l in lsb:
 
15
            k, v = l.split('=')
 
16
            d[k.strip()] = v.strip()
 
17
    return d
 
18
 
 
19
 
11
20
def bootstrap_charm_deps():
12
21
    """
13
22
    Set up the base charm dependencies so that the reactive system can run.
25
34
    vpip = os.path.join(vbin, 'pip')
26
35
    vpy = os.path.join(vbin, 'python')
27
36
    if os.path.exists('wheelhouse/.bootstrapped'):
28
 
        from charms import layer
29
 
        cfg = layer.options('basic')
30
 
        if cfg.get('use_venv') and '.venv' not in sys.executable:
31
 
            # activate the venv
32
 
            os.environ['PATH'] = ':'.join([vbin, os.environ['PATH']])
33
 
            reload_interpreter(vpy)
 
37
        activate_venv()
34
38
        return
35
39
    # bootstrap wheelhouse
36
40
    if os.path.exists('wheelhouse'):
43
47
                "allow_hosts = ''\n",
44
48
                "find_links = file://{}/wheelhouse/\n".format(charm_dir),
45
49
            ])
46
 
        apt_install(['python3-pip', 'python3-setuptools', 'python3-yaml'])
 
50
        apt_install([
 
51
            'python3-pip',
 
52
            'python3-setuptools',
 
53
            'python3-yaml',
 
54
            'python3-dev',
 
55
        ])
47
56
        from charms import layer
48
57
        cfg = layer.options('basic')
49
58
        # include packages defined in layer.yaml
51
60
        # if we're using a venv, set it up
52
61
        if cfg.get('use_venv'):
53
62
            if not os.path.exists(venv):
54
 
                distname, version, series = platform.linux_distribution()
 
63
                series = lsb_release()['DISTRIB_CODENAME']
55
64
                if series in ('precise', 'trusty'):
56
65
                    apt_install(['python-virtualenv'])
57
66
                else:
91
100
        reload_interpreter(vpy if cfg.get('use_venv') else sys.argv[0])
92
101
 
93
102
 
 
103
def activate_venv():
 
104
    """
 
105
    Activate the venv if enabled in ``layer.yaml``.
 
106
 
 
107
    This is handled automatically for normal hooks, but actions might
 
108
    need to invoke this manually, using something like:
 
109
 
 
110
        # Load modules from $CHARM_DIR/lib
 
111
        import sys
 
112
        sys.path.append('lib')
 
113
 
 
114
        from charms.layer.basic import activate_venv
 
115
        activate_venv()
 
116
 
 
117
    This will ensure that modules installed in the charm's
 
118
    virtual environment are available to the action.
 
119
    """
 
120
    venv = os.path.abspath('../.venv')
 
121
    vbin = os.path.join(venv, 'bin')
 
122
    vpy = os.path.join(vbin, 'python')
 
123
    from charms import layer
 
124
    cfg = layer.options('basic')
 
125
    if cfg.get('use_venv') and '.venv' not in sys.executable:
 
126
        # activate the venv
 
127
        os.environ['PATH'] = ':'.join([vbin, os.environ['PATH']])
 
128
        reload_interpreter(vpy)
 
129
 
 
130
 
94
131
def reload_interpreter(python):
95
132
    """
96
133
    Reload the python interpreter to ensure that all deps are available.