1
"""Charm Helpers saltstack - declare the state of your machines.
3
This helper enables you to declare your machine state, rather than
4
program it procedurally (and have to test each change to your procedures).
5
Your install hook can be as simple as:
8
from charmhelpers.contrib.saltstack import (
15
install_salt_support()
16
update_machine_state('machine_states/dependencies.yaml')
17
update_machine_state('machine_states/installed.yaml')
20
and won't need to change (nor will its tests) when you change the machine
23
It's using a python package called salt-minion which allows various formats for
24
specifying resources, such as:
48
The docs for all the different state definitions are at:
49
http://docs.saltstack.com/ref/states/all/
53
* Add test helpers which will ensure that machine state definitions
54
are functionally (but not necessarily logically) correct (ie. getting
55
salt to parse all state defs.
56
* Add a link to a public bootstrap charm example / blogpost.
57
* Find a way to obviate the need to use the grains['charm_dir'] syntax
60
# Copyright 2013 Canonical Ltd.
63
# Charm Helpers Developers <juju@lists.ubuntu.com>
66
import charmhelpers.contrib.templating.contexts
67
import charmhelpers.core.host
68
import charmhelpers.core.hookenv
71
salt_grains_path = '/etc/salt/grains'
74
def install_salt_support(from_ppa=True):
75
"""Installs the salt-minion helper for machine state.
77
By default the salt-minion package is installed from
78
the saltstack PPA. If from_ppa is False you must ensure
79
that the salt-minion package is available in the apt cache.
82
subprocess.check_call([
83
'/usr/bin/add-apt-repository',
87
subprocess.check_call(['/usr/bin/apt-get', 'update'])
88
# We install salt-common as salt-minion would run the salt-minion
90
charmhelpers.fetch.apt_install('salt-common')
93
def update_machine_state(state_path):
94
"""Update the machine state using the provided state declaration."""
95
charmhelpers.contrib.templating.contexts.juju_state_to_yaml(
97
subprocess.check_call([