29027fd1e1
Using pkgs.lib on the spine of module evaluation is problematic because the pkgs argument depends on the result of module evaluation. To prevent an infinite recursion, pkgs and some of the modules are evaluated twice, which is inefficient. Using ‘with lib’ prevents this problem.
174 lines
4.3 KiB
Nix
174 lines
4.3 KiB
Nix
# Module for Nova, a.k.a. OpenStack Compute.
|
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
|
|
cfg = config.virtualisation.nova;
|
|
|
|
nova = pkgs.nova;
|
|
|
|
novaConf = pkgs.writeText "nova.conf"
|
|
''
|
|
--nodaemon
|
|
--verbose
|
|
${cfg.extraConfig}
|
|
'';
|
|
|
|
in
|
|
|
|
{
|
|
|
|
###### interface
|
|
|
|
options = {
|
|
|
|
virtualisation.nova.enableSingleNode =
|
|
mkOption {
|
|
default = false;
|
|
description =
|
|
''
|
|
This option enables Nova, also known as OpenStack Compute,
|
|
a cloud computing system, as a single-machine
|
|
installation. That is, all of Nova's components are
|
|
enabled on this machine, using SQLite as Nova's database.
|
|
This is useful for evaluating and experimenting with Nova.
|
|
However, for a real cloud computing environment, you'll
|
|
want to enable some of Nova's services on other machines,
|
|
and use a database such as MySQL.
|
|
'';
|
|
};
|
|
|
|
virtualisation.nova.extraConfig =
|
|
mkOption {
|
|
default = "";
|
|
description =
|
|
''
|
|
Additional text appended to <filename>nova.conf</filename>,
|
|
the main Nova configuration file.
|
|
'';
|
|
};
|
|
|
|
};
|
|
|
|
|
|
###### implementation
|
|
|
|
config = mkIf cfg.enableSingleNode {
|
|
|
|
environment.systemPackages = [ nova pkgs.euca2ools pkgs.novaclient ];
|
|
|
|
environment.etc =
|
|
[ { source = novaConf;
|
|
target = "nova/nova.conf";
|
|
}
|
|
];
|
|
|
|
# Nova requires libvirtd and RabbitMQ.
|
|
virtualisation.libvirtd.enable = true;
|
|
services.rabbitmq.enable = true;
|
|
|
|
# `qemu-nbd' required the `nbd' kernel module.
|
|
boot.kernelModules = [ "nbd" ];
|
|
|
|
system.activationScripts.nova =
|
|
''
|
|
mkdir -m 755 -p /var/lib/nova
|
|
mkdir -m 755 -p /var/lib/nova/networks
|
|
mkdir -m 700 -p /var/lib/nova/instances
|
|
mkdir -m 700 -p /var/lib/nova/keys
|
|
|
|
# Allow the CA certificate generation script (called by
|
|
# nova-api) to work.
|
|
mkdir -m 700 -p /var/lib/nova/CA /var/lib/nova/CA/private
|
|
|
|
# Initialise the SQLite database.
|
|
${nova}/bin/nova-manage db sync
|
|
'';
|
|
|
|
# `nova-api' receives and executes external client requests from
|
|
# tools such as euca2ools. It listens on port 8773 (XML) and 8774
|
|
# (JSON).
|
|
jobs.nova_api =
|
|
{ name = "nova-api";
|
|
|
|
description = "Nova API service";
|
|
|
|
startOn = "ip-up";
|
|
|
|
# `openssl' is required to generate the CA. `openssh' is
|
|
# required to generate key pairs.
|
|
path = [ pkgs.openssl pkgs.openssh pkgs.bash ];
|
|
|
|
respawn = false;
|
|
|
|
exec = "${nova}/bin/nova-api --flagfile=${novaConf} --api_paste_config=${nova}/etc/nova/api-paste.ini";
|
|
};
|
|
|
|
# `nova-objectstore' is a simple image server. Useful if you're
|
|
# not running the OpenStack Imaging Service (Swift). It serves
|
|
# images placed in /var/lib/nova/images/.
|
|
jobs.nova_objectstore =
|
|
{ name = "nova-objectstore";
|
|
|
|
description = "Nova Simple Object Store Service";
|
|
|
|
startOn = "ip-up";
|
|
|
|
preStart =
|
|
''
|
|
mkdir -m 700 -p /var/lib/nova/images
|
|
'';
|
|
|
|
exec = "${nova}/bin/nova-objectstore --flagfile=${novaConf}";
|
|
};
|
|
|
|
# `nova-scheduler' schedules VM execution requests.
|
|
jobs.nova_scheduler =
|
|
{ name = "nova-scheduler";
|
|
|
|
description = "Nova Scheduler Service";
|
|
|
|
startOn = "ip-up";
|
|
|
|
exec = "${nova}/bin/nova-scheduler --flagfile=${novaConf}";
|
|
};
|
|
|
|
# `nova-compute' starts and manages virtual machines.
|
|
jobs.nova_compute =
|
|
{ name = "nova-compute";
|
|
|
|
description = "Nova Compute Service";
|
|
|
|
startOn = "ip-up";
|
|
|
|
path =
|
|
[ pkgs.sudo pkgs.vlan pkgs.nettools pkgs.iptables pkgs.qemu_kvm
|
|
pkgs.e2fsprogs pkgs.utillinux pkgs.multipath_tools pkgs.iproute
|
|
pkgs.bridge_utils
|
|
];
|
|
|
|
exec = "${nova}/bin/nova-compute --flagfile=${novaConf}";
|
|
};
|
|
|
|
# `nova-network' manages networks and allocates IP addresses.
|
|
jobs.nova_network =
|
|
{ name = "nova-network";
|
|
|
|
description = "Nova Network Service";
|
|
|
|
startOn = "ip-up";
|
|
|
|
path =
|
|
[ pkgs.sudo pkgs.vlan pkgs.dnsmasq pkgs.nettools pkgs.iptables
|
|
pkgs.iproute pkgs.bridge_utils pkgs.radvd
|
|
];
|
|
|
|
exec = "${nova}/bin/nova-network --flagfile=${novaConf}";
|
|
};
|
|
|
|
};
|
|
|
|
}
|