118 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| # Systemd services for openvswitch
 | |
| 
 | |
| { config, lib, pkgs, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
|   cfg = config.virtualisation.vswitch;
 | |
| 
 | |
| in
 | |
| 
 | |
| {
 | |
| 
 | |
|   options = {
 | |
| 
 | |
|     virtualisation.vswitch.enable = mkOption {
 | |
|       type = types.bool;
 | |
|       default = false;
 | |
|       description =
 | |
|         ''
 | |
|         Enable Open vSwitch. A configuration 
 | |
|         daemon (ovs-server) will be started.
 | |
|         '';
 | |
|     };
 | |
| 
 | |
| 
 | |
|     virtualisation.vswitch.package = mkOption {
 | |
|       type = types.package;
 | |
|       default = pkgs.openvswitch;
 | |
|       description =
 | |
|         ''
 | |
|         Open vSwitch package to use.
 | |
|         '';
 | |
|     };
 | |
| 
 | |
|   };
 | |
| 
 | |
|   config = mkIf cfg.enable (let 
 | |
| 
 | |
|     # Where the communication sockets live
 | |
|     runDir = "/var/run/openvswitch";
 | |
| 
 | |
|     # Where the config database live (can't be in nix-store)
 | |
|     stateDir = "/var/db/openvswitch";
 | |
| 
 | |
|     # The path to the an initialized version of the database 
 | |
|     db = pkgs.stdenv.mkDerivation {
 | |
|       name = "vswitch.db";
 | |
|       unpackPhase = "true";
 | |
|       buildPhase = "true";
 | |
|       buildInputs = with pkgs; [
 | |
|         cfg.package
 | |
|       ];
 | |
|       installPhase = 
 | |
|         ''
 | |
|         ensureDir $out/
 | |
|         '';
 | |
|     };
 | |
| 
 | |
|   in {
 | |
| 
 | |
|     environment.systemPackages = [ cfg.package ]; 
 | |
| 
 | |
|     boot.kernelModules = [ "tun" "openvswitch" ];
 | |
| 
 | |
|     boot.extraModulePackages = [ cfg.package ];
 | |
| 
 | |
|     systemd.services.ovsdb = {
 | |
|       description = "Open_vSwitch Database Server";
 | |
|       wantedBy = [ "multi-user.target" ];
 | |
|       after = [ "systemd-udev-settle.service" ];
 | |
|       wants = [ "vswitchd.service" ];
 | |
|       path = [ cfg.package ];
 | |
|       restartTriggers = [ db cfg.package ];
 | |
|       # Create the config database
 | |
|       preStart = 
 | |
|         ''
 | |
|         mkdir -p ${runDir}
 | |
|         mkdir -p /var/db/openvswitch
 | |
|         chmod +w /var/db/openvswitch
 | |
|         if [[ ! -e /var/db/openvswitch/conf.db ]]; then
 | |
|           ${cfg.package}/bin/ovsdb-tool create \
 | |
|             "/var/db/openvswitch/conf.db" \
 | |
|             "${cfg.package}/share/openvswitch/vswitch.ovsschema"
 | |
|         fi
 | |
|         chmod -R +w /var/db/openvswitch
 | |
|         '';
 | |
|       serviceConfig.ExecStart = 
 | |
|         ''
 | |
|         ${cfg.package}/bin/ovsdb-server \
 | |
|           --remote=punix:${runDir}/db.sock \
 | |
|           --private-key=db:Open_vSwitch,SSL,private_key \
 | |
|           --certificate=db:Open_vSwitch,SSL,certificate \
 | |
|           --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
 | |
|           --unixctl=ovsdb.ctl.sock \
 | |
|           /var/db/openvswitch/conf.db
 | |
|         '';       
 | |
|       serviceConfig.Restart = "always";
 | |
|       serviceConfig.RestartSec = 3;
 | |
|       postStart =
 | |
|         ''
 | |
|         ${cfg.package}/bin/ovs-vsctl --timeout 3 --retry --no-wait init
 | |
|         '';
 | |
| 
 | |
|     };
 | |
| 
 | |
|     systemd.services.vswitchd = {
 | |
|       description = "Open_vSwitch Daemon";
 | |
|       bindsTo = [ "ovsdb.service" ];
 | |
|       after = [ "ovsdb.service" ];
 | |
|       path = [ cfg.package ];
 | |
|       serviceConfig.ExecStart = ''${cfg.package}/bin/ovs-vswitchd'';
 | |
|     };
 | |
| 
 | |
|   });
 | |
| 
 | |
| }
 | 
