diff options
Diffstat (limited to 'nixos/modules/virtualisation/nova.nix')
-rw-r--r-- | nixos/modules/virtualisation/nova.nix | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/nixos/modules/virtualisation/nova.nix b/nixos/modules/virtualisation/nova.nix new file mode 100644 index 000000000000..05c68e2bbff9 --- /dev/null +++ b/nixos/modules/virtualisation/nova.nix @@ -0,0 +1,174 @@ +# Module for Nova, a.k.a. OpenStack Compute. + +{ config, pkgs, ... }: + +with pkgs.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}"; + }; + + }; + +} |