This is so cool! I hope we can integrate this in the bigdata Charms. Letting users install additional dependencies is something that would come in handy!
2016-01-28 16:48 GMT+01:00 Stuart Bishop <[email protected]>: > The Apt layer is more code broken out from my PostgreSQL charm work > that will be used by future Cassandra charm work. > > It provides a simple, charms.reactive friendly interface for dealing > with apt sources and deb packages. But I think its main utility is > providing consistent configuration for those extra features required > for real world production deploys without charmers needing to add a > single line of code; specifying custom apt sources, package signing > keys, package version pinning, and a list of arbitrary additional > packages to install. It also finally documents these options, > previously only found in the bowels of charmhelpers.core.fetch (which > provides the underlying implementation). > > > > # Apt layer > > The Apt layer for Juju enables layered charms to more easily deal with > deb packages and apt sources in a simple and efficient manner. It > provides consistent configuration for operators, allowing them to > easily specify custom apt sources and additional debs required for > their particular installations. > > ## Configuration > > The charm may provide defaults for these service configuration > (config.yaml) options, and the operator may override them as required. > > * `extra_packages` > > A space separated list of additional deb packages to install on > each unit. > > * `package_status` > > 'install' or 'hold'. When set to hold, packages installed using > the Apt layer API will be pinned, so that they will not be > automatically upgraded when package updates are performed. 'hold' > is particularly useful for allowing a service such as Landscape > to automatically apply security updates to most of the system, > whilst holding back any potentially service affecting updates. > > * `install_sources` > > A list of apt sources containing the packages that need to be > installed. > Each source may be either a line that can be added directly to > sources.list(5), or in the form ppa:<user>/<ppa-name> for adding > Personal Package Archives, or a distribution component to enable. > The list is a yaml list, encoded as a string. The nicest way of > declaring this in a yaml file looks like the following (in > particular, > the | character indicates that the value is a multiline string): > > ``` > install_sources: | > - ppa:stub/cassandra > - deb http://www.apache.org/dist/cassandra/debian 21x main > ``` > > * `install_keys` > > A list of GPG signing keys to accept. There needs to be one entry > per entry in install_sources. null may be used if no keep is > needed, which is the case for PPAs and for the standard Ubuntu > archives. Keys should be full ASCII armoured GPG public keys. > GPG key ids are also accepted, but in most environments this > mechanism is not secure. The install_keys list, like > install_sources, must also be a yaml formatted list encoded as > a string: > > ``` > install_keys: | > - null > - | > -----BEGIN PGP PUBLIC KEY BLOCK----- > Version: GnuPG v1 > > > mQINBFQJvgUBEAC0KcYCTj0hd15p4fiXBsbob0sKgsvN5Lm7N9jzJWlGshJ0peMi > > kH8YhDXw5Lh+mPEHksL7t1L8CIr1a+ntns/Opt65ZPO38ENVkOqEVAn9Z5sIoZsb > > AUeLlJzSeRLTKhcOugK7UcsQD2FHnMBJz50bxis9X7pjmnc/tWpjAGJfaWdjDIo= > =yiQ4 > -----END PGP PUBLIC KEY BLOCK----- > ``` > > ## Usage > > Queue packages for installation, and have handlers waiting for > these packages to finish being installed: > > ``` > from reactive import apt > > @hook('install') > def install(): > apt.queue_install(['git']) > > @when_not('apt.installed.gnupg') > def install_gnupg(): > apt.queue_install(['gnupg']) > > @when('apt.installed.git') > @when('apt.installed.gnupg') > def grabit(): > clone_repo() > validate_repo() > ``` > > ### API > > Several methods are exposed in the reactive.apt Python package. > > * `add_source(source, key=None)` > > Add an apt source. > > A source may be either a line that can be added directly to > sources.list(5), or in the form ppa:<user>/<ppa-name> for adding > Personal Package Archives, or a distribution component to enable. > > The package signing key should be an ASCII armoured GPG key. While > GPG key ids are also supported, the retrieval mechanism is insecure. > There is no need to specify the package signing key for PPAs or for > the main Ubuntu archives. > > It is preferable if charms do not call this directly to hard > coded apt sources, but instead have these sources listed > as defaults in the install_sources config option. This allows > operators to mirror your packages to internal archives and > deploy your charm in environments without network access. > > Sets the `apt.needs_update` reactive state. > > * `queue_install(packages, options=None)` > > Queue one or more deb packages for install. The actual package > installation will be performed later by a handler in the > apt layer. The `apt.installed.{name}` state will be set once > the package installed (one state for each package). > > If a package has already been installed it will not be reinstalled. > > If a package has already been queued it will not be requeued, and > the install options will not be changed. > > * `installed()` > > Returns the set of deb packages installed by this layer. > > * `purge(packages)` > > Purge one or more deb packages from the system > > -- > Stuart Bishop <[email protected]> > > -- > Juju mailing list > [email protected] > Modify settings or unsubscribe at: > https://lists.ubuntu.com/mailman/listinfo/juju >
-- Juju mailing list [email protected] Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/juju
