Interacting with Charm Configuration

The charmhelpers.core.hookenv.config(), when called with no arguments, returns a charmhelpers.core.hookenv.Config instance - a dictionary representation of a charm’s config.yaml file. This object can be used to:

  • get a charm’s current config values
  • check if a config value has changed since the last hook invocation
  • view the previous value of a changed config item
  • save arbitrary key/value data for use in a later hook

For the following examples we’ll assume our charm has a config.yaml file that looks like this:

options:
  app-name:
    type: string
    default: "My App"
    description: "Name of your app."

Getting charm config values

# hooks/hooks.py

from charmhelpers.core import hookenv

hooks = hookenv.Hooks()

@hooks.hook('install')
def install():
    config = hookenv.config()

    assert config['app-name'] == 'My App'

Checking if a config value has changed

Let’s say the user changes the app-name config value at runtime by executing the following juju command:

juju set mycharm app-name="My New App"

which triggers a config-changed hook:

# hooks/hooks.py

from charmhelpers.core import hookenv

hooks = hookenv.Hooks()

@hooks.hook('config-changed')
def config_changed():
    config = hookenv.config()

    assert config.changed('app-name')
    assert config['app-name'] == 'My New App'
    assert config.previous('app-name') == 'My App'

Saving arbitrary key/value data

The Config object maybe also be used to store arbitrary data that you want to persist across hook invocations:

# hooks/hooks.py

from charmhelpers.core import hookenv

hooks = hookenv.Hooks()

@hooks.hook('install')
def install():
    config = hookenv.config()

    config['mykey'] = 'myval'

@hooks.hook('config-changed')
def config_changed():
    config = hookenv.config()

    assert config['mykey'] == 'myval'