A configuration management service with support for secrets.
Go to file
Felipe Monteiro b0c2f1c4e2 Allow unit tests to be run against in-memory sqlite
Recently JSONB replaced a back-end agnostic data type
for the "data" column in the Document model. This
made it necessary to drop support for running Deckhand
unit tests with any other database store.

However, this arragenement is undesirable as a user
shouldn't need to have postgresql installed just to
kick off unit tests.

So, this PS re-adds support for running unit tests
via an in-memory sqlite database.

To run unit tests with sqlite:

    tox -e py35

Unit tests still run against postgresql via:

    tox -e py35-postgresql

Both jobs are executed in CICD already.

This PS also updates the remaining DB columns to use JSONB if
postgresql is enabled; else fallback columns are used for testing
with sqlite. This is a necessary change to make the column data
types consistent.

Change-Id: I951f2f04fd013d635bb7653a238ff1eb3725b5e1
2018-02-12 22:10:29 -05:00
charts/deckhand Bug Fix - DeckHand/Barbican URI Lookup 2018-02-08 07:28:41 +00:00
deckhand Allow unit tests to be run against in-memory sqlite 2018-02-12 22:10:29 -05:00
doc Documentation for Exceptions 2018-02-09 15:33:30 -05:00
etc/deckhand Rename Deckhand bucket endpoint to buckets for consistency 2017-10-27 19:21:03 +01:00
releasenotes Only allow one LayeringPolicy to exist in the system. 2017-10-26 17:38:24 -04:00
tools Merge "Improve document validation module." 2018-01-19 13:04:06 -05:00
.coveragerc Add Deckhand coverage job 2017-08-15 16:11:35 -04:00
.gitignore Deckhand Negative RBAC test scenarios 2017-10-31 17:37:39 +00:00
.gitreview Add gitreview file 2017-08-11 01:22:26 -05:00
.testr.conf Allow unit tests to be run against in-memory sqlite 2018-02-12 22:10:29 -05:00
AUTHORS [docs] Document schemas used for document validation 2017-11-30 16:36:27 -04:00
Dockerfile DeckHand Dockerfile 2017-09-14 16:50:06 +00:00
HACKING.rst Add sphinx job for auto-generating docs 2017-09-21 16:16:23 +01:00
LICENSE Initial commit 2017-06-16 08:29:03 -07:00
Makefile Fix initial 'make charts' failure 2017-11-09 16:23:32 -07:00
README.rst Update Deckhand README 2018-02-02 10:59:53 -05:00
entrypoint.sh Make the uWSGI http-timeout configurable 2018-01-17 15:16:06 -06:00
requirements.txt Use DAG to resolve substitution dependency chain 2018-02-12 20:54:54 +00:00
setup.cfg Integrate Deckhand with keystone auth 2017-10-16 19:54:46 +01:00
setup.py Oslo config integration (#1) 2017-06-26 16:57:50 -07:00
test-requirements.txt Revert fix pifpaf run postgresql failing 2018-01-12 11:57:44 -04:00
tox.ini Allow unit tests to be run against in-memory sqlite 2018-02-12 22:10:29 -05:00
uwsgi.ini Add health resource for ucp-integration API convention 2017-10-23 17:34:03 +01:00

README.rst

Deckhand

Deckhand is a storage service for YAML-based configuration documents, which are managed through version control and automatically validated. Deckhand provides users with a variety of different document types that describe complex configurations using the features listed below.

Core Responsibilities

  • layering - helps reduce duplication in configuration while maintaining auditability across many sites
  • substitution - provides separation between secret data and other configuration data, while allowing a simple interface for clients
  • revision history - improves auditability and enables services to provide functional validation of a well-defined collection of documents that are meant to operate together
  • validation - allows services to implement and register different kinds of validations and report errors

Getting Started

Pre-requisites

  • tox

    To install tox run:

    $ sudo apt-get install tox
  • PostgreSQL

    Deckhand only supports PostgreSQL. Install it by running:

    $ sudo apt-get update
    $ sudo apt-get install postgresql postgresql-contrib

Quick Start

Docker can be used to quickly instantiate the Deckhand image. After installing Docker, create a basic configuration file:

$ tox -e genconfig

Resulting deckhand.conf.sample file is output to :path:etc/deckhand/deckhand.conf.sample

Move the sample configuration file into a desired directory (i.e. $CONF_DIR).

At a minimum the [database].connection config option must be set. Provide it with a PostgreSQL database connection. Or to conveniently create an ephemeral PostgreSQL DB run:

$ eval `pifpaf run postgresql`

Substitute the connection information (which can be retrieved by running export | grep PIFPAF_POSTGRESQL_URL) into the config file inside etc/deckhand/deckhand.conf.sample:

.. code-block:: ini

[database]

# # From oslo.db #

# The SQLAlchemy connection string to use to connect to the database. # (string value) connection = postgresql://localhost/postgres?host=/tmp/tmpsg6tn3l9&port=9824

Finally, run Deckhand:

$ [sudo] docker run --rm \
    --net=host \
    -p 9000:9000 \
    -v $CONF_DIR:/etc/deckhand
    quay.io/attcomdev/deckhand:latest

To kill the ephemeral DB afterward:

$ pifpaf_stop

Manual Installation

Note

The commands below assume that they are being executed from the root Deckhand directory.

Install dependencies needed to spin up Deckhand via uwsgi:

$ sudo pip install uwsgi
$ virtualenv -p python3 /var/tmp/deckhand
$ . /var/tmp/deckhand/bin/activate
$ pip install -r requirements.txt test-requirements.txt
$ python setup.py install

Afterward, create a sample configuration file automatically:

$ tox -e genconfig

Resulting deckhand.conf.sample file is output to :path:etc/deckhand/deckhand.conf.sample

Create the directory /etc/deckhand and copy the config file there:

$ [sudo] cp etc/deckhand/deckhand.conf.sample /etc/deckhand/deckhand.conf

To specify an alternative directory for the config file, run:

$ export OS_DECKHAND_CONFIG_DIR=<PATH>
$ [sudo] cp etc/deckhand/deckhand.conf.sample ${OS_DECKHAND_CONFIG_DIR}/deckhand.conf

To conveniently create an ephemeral PostgreSQL DB run:

$ eval `pifpaf run postgresql`

Retrieve the environment variable which contains connection information:

$ export | grep PIFPAF_POSTGRESQL_URL
declare -x PIFPAF_POSTGRESQL_URL="postgresql://localhost/postgres?host=/tmp/tmpsg6tn3l9&port=9824"

Substitute the connection information into the config file in ${OS_DECKHAND_CONFIG_DIR}:

.. code-block:: ini

[database]

# # From oslo.db #

# The SQLAlchemy connection string to use to connect to the database. # (string value) connection = postgresql://localhost/postgres?host=/tmp/tmpsg6tn3l9&port=9824

Finally, run Deckhand:

$ uwsgi --ini wsgi.ini

To kill the ephemeral DB afterward:

$ pifpaf_stop

Testing

Automated Testing

To run unit tests using sqlite, execute:

$ tox -epy27
$ tox -epy35

against a py27- or py35-backed environment, respectively. To run individual unit tests, run:

$ tox -e py27 -- deckhand.tests.unit.db.test_revisions

for example.

To run functional tests:

$ tox -e functional

You can also run a subset of tests via a regex:

$ tox -e functional -- gabbi.suitemaker.test_gabbi_document-crud-success-multi-bucket

Intgration Points

Deckhand has the following integration points:

Note

Currently, other database backends are not supported.

Though, being a low-level service, has many other UCP services that integrate with it, including:

  • Drydock is orchestrated by Shipyard to perform bare metal node provisioning.
  • Promenade is indirectly orchestrated by Shipyard to configure and join Kubernetes nodes.
  • Armada is orchestrated by Shipyard to deploy and test Kubernetes workloads.

Further Reading

Undercloud Platform (UCP).