~george-edison55/charms/precise/uwsgi/trunk

« back to all changes in this revision

Viewing changes to hooks/hooks.py

  • Committer: Nathan Osman
  • Date: 2014-04-06 22:15:37 UTC
  • Revision ID: admin@quickmediasolutions.com-20140406221537-fwchtsbw0zqo1mv8
Finished draft implementation of initial hooks - not yet tested.

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
 
6
6
from charmhelpers import fetch
7
7
from charmhelpers.core import hookenv
 
8
from charmhelpers.core import host
8
9
 
9
10
#####################
10
11
# UTILITY FUNCTIONS #
12
13
 
13
14
UWSGI_CONFIG_DIR = '/etc/uwsgi/apps-enabled'
14
15
 
15
 
def update_uwsgi_app_config(app, config):
16
 
    """Update the specified uWSGI app with the new config."""
17
 
    with open(os.path.join(UWSGI_CONFIG_DIR, app), 'r+') as f:
18
 
        app_config = json.loads(f.read())
19
 
        app_config['uwsgi'].update({
20
 
            'processes': config['uwsgi_processes'],
21
 
            'threads':   config['uwsgi_threads'],
22
 
            'uid':       config['uwsgi_uid'],
23
 
            'gid':       config['uwsgi_gid'],
24
 
        })
 
16
def get_app_filename(app=None)
 
17
    """Return the filename for an app."""
 
18
    if app is None:
 
19
        app = '%s.json' % hookenv.remote_unit().split('/')[0]
 
20
    return os.path.join(UWSGI_CONFIG_DIR, app)
 
21
 
 
22
# Translates data coming from the WSGI relation to
 
23
# configuration settings that uWSGI understands.
 
24
UWSGI_CONFIG_MAP = {
 
25
    'python_path':    'python-path',
 
26
    'working_dir':    'chdir',
 
27
    'wsgi_group':     'gid',
 
28
    'wsgi_timeout':   'harakiri',
 
29
    'wsgi_user':      'uid',
 
30
    'wsgi_wsgi_file': 'wsgi',
 
31
}
 
32
 
 
33
def get_unit_app_config():
 
34
    """Return the unit config settings."""
 
35
    config = hookenv.config()
 
36
    return {
 
37
        'processes': config['uwsgi_processes'],
 
38
        'threads':   config['uwsgi_threads'],
 
39
    }
 
40
 
 
41
def get_relation_app_config():
 
42
    """Return the config settings provided by the relation."""
 
43
    relation = hookenv.relation_get()
 
44
    config = {
 
45
        'uwsgi': {
 
46
            'socket': '%s:%d' % (
 
47
                relation.get('listen_ip', '0.0.0.0'),
 
48
                relation.get('port', 8080),
 
49
            ),
 
50
        },
 
51
    }
 
52
    for key, value in relation.items():
 
53
        if key in UWSGI_CONFIG_MAP:
 
54
            config[value] = relation[key]
 
55
    return config
 
56
 
 
57
def update_uwsgi_app(app, new_config):
 
58
    """Update an app with new config values."""
 
59
    with open(get_app_filename(), 'a+') as f:
 
60
        try:
 
61
            config = json.loads(f.read())
 
62
            config['uwsgi']
 
63
        except (KeyError, ValueError,):
 
64
            config = {}
 
65
        config['uwsgi'].update(new_config)
25
66
        f.seek(0)
26
 
        f.write(json.dumps(app_config))
 
67
        f.write(json.dumps(config))
27
68
        f.truncate()
28
69
 
29
 
def update_all_uwsgi_apps(config):
 
70
def update_all_uwsgi_apps():
30
71
    """Write the updated config to all uWSGI apps."""
31
72
    for app in os.listdir(UWSGI_CONFIG_DIR):
32
 
        update_uwsgi_app_config(app, config)
 
73
        update_uwsgi_app(app, get_unit_app_config())
33
74
 
34
75
##################
35
76
# HOOK FUNCTIONS #
44
85
@hooks.hook('config-changed')
45
86
def config_changed():
46
87
    """Update all configuration files."""
47
 
    update_all_uwsgi_files(hookenv.config())
 
88
    update_all_uwsgi_files()
 
89
    host.service_restart('uwsgi')
 
90
 
 
91
@hooks.hook('wsgi-file-relation-changed')
 
92
def wsgi_file_relation_changed():
 
93
    """Invoked when a WSGI relation has changed."""
 
94
    update_uwsgi_app(get_app_filename(), get_relation_app_config())
 
95
    
 
96
if __name__ == "__main__":
 
97
    hooks.execute(sys.argv)
48
98