nixpkgs/modules/virtualisation/nova.nix

147 lines
3.6 KiB
Nix
Raw Normal View History

# Module for Nova, a.k.a. OpenStack Compute.
{ config, pkgs, ... }:
with pkgs.lib;
let
cfg = config.virtualisation.nova;
nova = pkgs.nova;
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.
'';
};
};
###### implementation
config = mkIf cfg.enableSingleNode {
environment.systemPackages = [ nova pkgs.euca2ools ];
environment.etc =
[ # The Paste configuration file for nova-api.
{ source = "${nova}/etc/nova/nova-api.conf";
target = "nova/nova-api.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 700 -p /var/lib/nova
# 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
cp -p ${nova}/libexec/nova/openssl.cnf.tmpl /var/lib/nova/CA/
# 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";
path = [ pkgs.openssl ];
exec = "${nova}/bin/nova-api";
};
# `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";
exec = "${nova}/bin/nova-objectstore --nodaemon";
};
# `nova-scheduler' schedules VM execution requests.
jobs.nova_scheduler =
{ name = "nova-scheduler";
description = "Nova scheduler service";
startOn = "ip-up";
exec = "${nova}/bin/nova-scheduler --nodaemon --verbose";
};
# `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
];
exec = "${nova}/bin/nova-compute --nodaemon --verbose";
};
# `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 --nodaemon --verbose";
};
};
}