config-backend.dox 9 KB
Newer Older
// Copyright (C) 2014, 2015  Internet Systems Consortium, Inc. ("ISC")
3 4 5
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at
6 7 8


 @page configBackend Kea Configuration Backends

@section configBackendIntro Introduction
12 13

Kea is a flexible DHCP protocol engine. It offers a selection of lease database
backends, extensibility via the hooks API and the definition of custom options.
Depending on the environment, one lease database backend may be better than
16 17 18 19 20 21 22 23 24 25 26 27
other. Similarly, because the best way of configuring the server can depend on
the environment, Kea provides different ways of obtaining configuration
information, through the Configuration Backend. Since the means by which
configuration information is received cannot be part of the configuration itself, it
has to be chosen at the compilation time (when configuring the sources).

This page explains the background to the Configuration Backend and how
it is implemented. It is aimed at people who want to develop and
maintain their own backends.

@section configBackendMotivation Motivation for Different Backends

BIND10 (the project under which the first stages of Kea were developed)
29 30 31 32 33 34 35 36
used to maintain an extensive framework that was responsible for the
configuration of components.  After BIND10 was cancelled, two projects
were created: <a href="">Kea</a> (focused on DHCP)
and <a href="">Bundy</a> (aimed at DNS). The
Kea team decided to remove the BIND10 framework, while the Bundy team
decided to keep it. However, even though the Kea team is focused on a
backend that reads a JSON configuration file from disk, it decided to
make it easy for others to use different backends.

While ISC currently (May 2015) maintains only one configuration backend
39 40 41
(a JSON file read from disk), it is quite possible that additional backends
(e.g. using LDAP or XML) will be developed in the future by ISC or other

43 44
@section configBackendAdding How to Add a New Configuration Backend

45 46 47 48
The configuration backend concept was designed to make external (i.e. not
maintained by ISC) configurations backends easy to maintain. In particular,
the set of patches vs. separate files required strongly favors separate
files. This is important if an external organization wants to develop its
own configuration backend and then needs to apply it to every ISC release
50 51 52
of Kea.

The following steps are needed to add new configuration backend (it is assumed
53 54
that the modified component is DHCPv4. Similar approach applies to the other
components: DHCPv6 or DHCP-DDNS):
55 56

-# Write your own implementation of isc::dhcp::ControlledDhcpv4Srv::init(),
Tomek Mrugalski's avatar
Tomek Mrugalski committed
   isc::dhcp::ControlledDhcpv4Srv::init() and isc::dhcp::ControlledDhcpv4Srv::cleanup()
58 59 60 61 62 63 64 65 66
   and put it in the src/bin/dhcp4 directory (e.g. as
-# Modify src/bin/dhcp4/ to include your file (e.g. in
   the build.
-# Modify the AC_ARG_WITH(kea-config,...) macro in to include an
   entry for your configuration backend.
   AC_DEFINE(CONFIG_BACKEND_FOO, ...) macros to (following the
   above-mentioned AC_ARG_WITH macro) to set the C++ macro for your backend.
-# Modify the sanity check in to allow your configuration backend name.
67 68 69

Optionally you can also:

70 71 72
-# Implement unit tests for your backend in the src/bin/dhcp4/tests directory.
-# Modify src/bin/dhcp4/tests/ to include the file(s) containing the
   unit tests.

@section configBackendJSONDesign The JSON Configuration Backend

The following are some details of the JSON backend framework.

-# A switch called --with-kea-config has been implemented in the
Tomek Mrugalski's avatar
Tomek Mrugalski committed
79 80
   configure script. It allows the selection at compilation time of how the
   servers will be configured. Currently (June 2014),
81 82 83 84 85 86
   there is one value: JSON (read configuration from a JSON file)
   Although the Bundy/BIND10 framework has been removed from Kea, the
   configuration choice is available for other projects (e.g. Bundy)
   that want to include an implementation of Kea using that backend.
   Such projects are advised to import the Kea modules and compile
   them with the Bundy backend enabled.<br/><br/>
   This switchable backend concept is quite simple. There are different
Tomek Mrugalski's avatar
Tomek Mrugalski committed
88 89
   implementations of ControlledXSrv class, each backend keeping its code
   in a separate file. It is a matter of compiling/linking
   one file or another. Hence it is easy to remove the old backend (and for
91 92 93
   external projects, like Bundy, to keep it if they desire). It is also easy
   for other organizations to add and maintain their own backends (e.g. LDAP).<br/><br/>
-# Each backend uses the common code for configuration and command
94 95
   processing callbacks. They all assume that JSON formatted parameters are sent
   and they are expected to return well formatted JSON responses. The exact
96 97
   format of configuration and commands is module-specific.<br/><br/>
-# A command handler handles the reading the configuration from a
98 99
   file. Its main responsibility is to load the configuration and process
   it. The JSON backend must call that handler when starting up the server.
100 101 102 103 104 105
   This is implemented in configure() in the files
   in src/bin/dhcp4 and src/bin/dhcp6 directories.<br/><br/>
-# The current JSON parser in @ref
   isc::data::Element::fromJSON() has been extended to allow optional
   preprocessing.  For now, that capability simply removes  whole-line
   comments starting with the hash character, but it is expected to grow over
   time (in-line comments and file inclusions are the obvious envisaged
   additions). This is implemented in @ref isc::data::Element::fromJSONFile.<br/><br/>
Tomek Mrugalski's avatar
Tomek Mrugalski committed
-# The current format of the BIND10 configuration file (BIND 10 stored its
   configuration in (installation directory) /var/bind10/b10-config.db) has been
Tomek Mrugalski's avatar
Tomek Mrugalski committed
110 111 112 113
   retained as the configuration file format. Its actual naming is now arbitrary
   and left up to the user (it is passed as a parameter to the -c command line
   option). From the implementation perspective, this is slight change
   from the BIND10 days, as back then a subset of the configuration was received by
Jeremy C. Reed's avatar
Jeremy C. Reed committed
   the daemon processes. Nowadays the whole configuration is passed. To take a
Tomek Mrugalski's avatar
Tomek Mrugalski committed
   specific example, the following is how b10-config.db looks today:
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
     "Init": { ... }
     "Dhcp4": {
       "subnet4" { subnet definitions here },
       "option-data" { option data here },
       "interfaces": [ "eth0" ],
     "Dhcp6": {
       "subnet6" { subnet definitions here },
       "option-data" { option data here },
       "interfaces": [ "eth0" ],
     "Logging": {
       "Loggers": [{"name": *, "severity": "DEBUG" }]
   The Kea components used to receive only relevant parts of it (e.g. Kea4
137 138 139 140 141 142
   received configuration data that only contained the content of the Dhcp4 element).
   Now each component receives all of it: the code
   iterates over the top level elements and picks the appropriate
   tree (or get the element by name). That approach makes the common configuration
   (such as the logging initialization code) very easy to share among Kea4, Kea6 and
-# The .spec files used in BIND 10 by the control program to validate commands
144 145
   have been retained. They will be kept and maintained even though no use of
   them is currently planned. At some future time syntax validation may be implemented,
   although it is out of scope for Kea 0.9 (and probably
147 148
   for 1.0 as well, as it is a pretty big task).<br/><br/>
-# A shell script has been added (as src/bin/keactrl/keactrl) to
   start, stop and reconfigure the daemons. Its only
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
   job is to pass the configuration file to each daemon and remember its PID file, so
   that sending signals is possible (for configuration reload or shutdown). It is also
   able to print out a status.

Future changes planned for this part of the code are:

-# Implement a common base class for the Kea4, Kea6, and D2 servers. Some
   operations will be common for all three components: logger initialization,
   handling and, at some future point, control socket. This calls for a small
   base class that @ref isc::dhcp::Dhcpv4Srv "Dhcpv4Srv", @ref
   isc::dhcp::Dhcpv6Srv "Dhcpv6Srv" and the @ref isc::d2::D2Controller
   "D2Controller" classes can use.  It is expected that the base class (@ref
   isc::dhcp::Daemon) will be a small one but will grow over time as the code is
   unified. This has been implemented in @ref isc::dhcp::Daemon.<br/><br/>
-# After Kea 0.9 is released, a form of secure socket will be implemented
   through which commands can be sent. Whatever the design, it will allow the
   sending of configurations and commands in JSON format and the receiving of
   responses.  Once that is done, Kea will have the same capability the BIND10
   framework to send additional parameters. One obvious use case will be to send
   a new configuration file name as the parameter for "reload".
Tomek Mrugalski's avatar
Tomek Mrugalski committed