~ibmcharmers/charms/trusty/layer-ibm-mobilefirst-server/devel

« back to all changes in this revision

Viewing changes to deps/layer/layer-apt/reactive/apt.py

  • Committer: Suchitra Venugopal
  • Date: 2016-09-06 09:48:53 UTC
  • Revision ID: suchvenu@in.ibm.com-20160906094853-1n09myeisek096nm
IBM MobileFirst Server

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright 2015-2016 Canonical Ltd.
 
2
#
 
3
# This file is part of the Apt layer for Juju.
 
4
#
 
5
# This program is free software: you can redistribute it and/or modify
 
6
# it under the terms of the GNU General Public License version 3, as
 
7
# published by the Free Software Foundation.
 
8
#
 
9
# This program is distributed in the hope that it will be useful, but
 
10
# WITHOUT ANY WARRANTY; without even the implied warranties of
 
11
# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
 
12
# PURPOSE.  See the GNU General Public License for more details.
 
13
#
 
14
# You should have received a copy of the GNU General Public License
 
15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
16
 
 
17
'''
 
18
charms.reactive helpers for dealing with deb packages.
 
19
 
 
20
Add apt package sources using add_source(). Queue deb packages for
 
21
installation with install(). Configure and work with your software
 
22
once the apt.installed.{packagename} state is set.
 
23
'''
 
24
from charmhelpers import fetch
 
25
from charmhelpers.core import hookenv
 
26
from charms import reactive
 
27
from charms.reactive import when, when_not
 
28
 
 
29
import charms.apt
 
30
# Aliases for backwards compatibility
 
31
from charms.apt import add_source, queue_install, installed, purge
 
32
 
 
33
 
 
34
__all__ = ['add_source', 'update', 'queue_install', 'install_queued',
 
35
           'installed', 'purge', 'ensure_package_status']
 
36
 
 
37
 
 
38
@when('apt.needs_update')
 
39
def update():
 
40
    charms.apt.update()
 
41
 
 
42
 
 
43
@when('apt.queued_installs')
 
44
@when_not('apt.needs_update')
 
45
def install_queued():
 
46
    charms.apt.install_queued()
 
47
 
 
48
 
 
49
@when_not('apt.queued_installs')
 
50
def ensure_package_status():
 
51
    charms.apt.ensure_package_status()
 
52
 
 
53
 
 
54
def configure_sources():
 
55
    """Add user specified package sources from the service configuration.
 
56
 
 
57
    See charmhelpers.fetch.configure_sources for details.
 
58
    """
 
59
    hookenv.log('Initializing Apt Layer')
 
60
    config = hookenv.config()
 
61
 
 
62
    # We don't have enums, so we need to validate this ourselves.
 
63
    package_status = config.get('package_status')
 
64
    if package_status not in ('hold', 'install'):
 
65
        charms.apt.status_set('blocked',
 
66
                              'Unknown package_status {}'
 
67
                              ''.format(package_status))
 
68
        # Die before further hooks are run. This isn't very nice, but
 
69
        # there is no other way to inform the operator that they have
 
70
        # invalid configuration.
 
71
        raise SystemExit(0)
 
72
 
 
73
    sources = config.get('install_sources')
 
74
    keys = config.get('install_keys')
 
75
    if reactive.helpers.data_changed('apt.configure_sources', (sources, keys)):
 
76
        fetch.configure_sources(update=False,
 
77
                                sources_var='install_sources',
 
78
                                keys_var='install_keys')
 
79
        reactive.set_state('apt.needs_update')
 
80
 
 
81
    extra_packages = sorted(config.get('extra_packages', '').split())
 
82
    if extra_packages:
 
83
        queue_install(extra_packages)
 
84
 
 
85
 
 
86
# Per https://github.com/juju-solutions/charms.reactive/issues/33,
 
87
# this module may be imported multiple times so ensure the
 
88
# initialization hook is only registered once. I have to piggy back
 
89
# onto the namespace of a module imported before reactive discovery
 
90
# to do this.
 
91
if not hasattr(reactive, '_apt_registered'):
 
92
    # We need to register this to run every hook, not just during install
 
93
    # and config-changed, to protect against race conditions. If we don't
 
94
    # do this, then the config in the hook environment may show updates
 
95
    # to running hooks well before the config-changed hook has been invoked
 
96
    # and the intialization provided an opertunity to be run.
 
97
    hookenv.atstart(configure_sources)
 
98
    reactive._apt_registered = True