Note that doing development on a machine which already has Ganeti
installed is problematic, as PYTHONPATH behaviour can be confusing
(see Issue 170 for a bit of history/details; in general it works if
the installed and developed versions are very similar, and/or if
PYTHONPATH is customised correctly). As such, in general it’s
recommended to use a “clean” machine for ganeti development.

There are a few things which can help writing or debugging the Haskell
code.

You can run the Haskell linter hlint via:

$ makehlint

This is not enabled by default (as the htools component is
optional). The above command will generate both output on the terminal
and, if any warnings are found, also an HTML report at
doc/hs-lint.html.

When writing or debugging TemplateHaskell code, it’s useful to see
what the splices are converted to. This can be done via:

$ makeHEXTRA="-ddump-splices"

Or, more interactively:

$ ghci
λ> :set -ddump-splices
λ> :l src/Ganeti/Objects.hs

And you will get the spliced code as the module is loaded.

To build profiling code you must install the ghc-prof (or
gch6-prof) package, and all the relevant libraries with their
-prof counterparts. If installing libraries through cabal the config
file should include library-profiling:True or the -p flag
should be used. Any library already installed can be updated by passing
--reinstall as well.

Due to the way TemplateHaskell works, it’s not straightforward to
build profiling code. The recommended way is to run makehs-prof,
or alternatively the manual sequence is:

When developing code, running the entire test suite can be
slow. Running individual tests is possible. There are different
Makefile targets for running individual Python and Haskell tests.

For Python tests:

$ exportPYTHONPATH=$PWD
$ python./test/py/ganeti.mytest

For Haskell tests:

$ makehs-test-pattern

Where pattern can be a simple test pattern (e.g. comma,
matching any test whose name contains comma), a test pattern
denoting a group (ending with a slash, e.g. Utils/), or more
complex glob pattern. For more details, search for glob patterns in
the documentation of test-framework).

For individual Haskell shelltests:

$ makehs-shell-name

which runs the test test/hs/shelltests/htools-%name%.test. For
example, to run the test test/hs/shelltests/htools-balancing.test,
use:

$ makehs-shell-balancing

For combined Haskell shelltests:

$ makehs-shell-{name1,name2,...}

for example:

$ makehs-shell-{balancing,basic}

Checking for the correct style of the NEWS file is also possible, by running:

This script, in the source code as daemons/daemon-util.in, is used
to start/stop Ganeti and do a few other things related to system
daemons. It is recommended to use daemon-util also from the system’s
init scripts. That way the code starting and stopping daemons is shared
and future changes have to be made in only one place.

daemon-util reads extra arguments from variables (*_ARGS) in
/etc/default/ganeti. When modifying daemon-util, keep in mind to
not remove support for the EXTRA_*_ARGS variables for starting
daemons. Some parts of Ganeti use them to pass additional arguments when
starting a daemon.

The reload_ssh_keys function can be adjusted to use another command
for reloading the OpenSSH daemon’s host keys.