tests: networking: Add tests for Open vSwitch.
* gnu/tests/networking.scm (openvswitch-configuration-service, %openvswitch-os): New variables. (setup-openvswitch, run-openvswitch-test): New procedures. (%test-openvswitch): New public variable.
This commit is contained in:
parent
db8ed7cee8
commit
671dbdb9d5
|
@ -1,5 +1,6 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2017 Thomas Danckaert <post@thomasdanckaert.be>
|
;;; Copyright © 2017 Thomas Danckaert <post@thomasdanckaert.be>
|
||||||
|
;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -26,7 +27,9 @@
|
||||||
#:use-module (guix store)
|
#:use-module (guix store)
|
||||||
#:use-module (guix monads)
|
#:use-module (guix monads)
|
||||||
#:use-module (gnu packages bash)
|
#:use-module (gnu packages bash)
|
||||||
#:export (%test-inetd))
|
#:use-module (gnu packages networking)
|
||||||
|
#:use-module (gnu services shepherd)
|
||||||
|
#:export (%test-inetd %test-openvswitch))
|
||||||
|
|
||||||
(define %inetd-os
|
(define %inetd-os
|
||||||
;; Operating system with 2 inetd services.
|
;; Operating system with 2 inetd services.
|
||||||
|
@ -135,3 +138,108 @@ port 7, and a dict service on port 2628."
|
||||||
(name "inetd")
|
(name "inetd")
|
||||||
(description "Connect to a host with an INETD server.")
|
(description "Connect to a host with an INETD server.")
|
||||||
(value (run-inetd-test))))
|
(value (run-inetd-test))))
|
||||||
|
|
||||||
|
|
||||||
|
;;;
|
||||||
|
;;; Open vSwitch
|
||||||
|
;;;
|
||||||
|
|
||||||
|
(define setup-openvswitch
|
||||||
|
#~(let ((ovs-vsctl (lambda (str)
|
||||||
|
(zero? (apply system*
|
||||||
|
#$(file-append openvswitch "/bin/ovs-vsctl")
|
||||||
|
(string-tokenize str)))))
|
||||||
|
(add-native-port (lambda (if)
|
||||||
|
(string-append "--may-exist add-port br0 " if
|
||||||
|
" vlan_mode=native-untagged"
|
||||||
|
" -- set Interface " if
|
||||||
|
" type=internal"))))
|
||||||
|
(and (ovs-vsctl "--may-exist add-br br0")
|
||||||
|
;; Connect eth0 as an "untagged" port (no VLANs).
|
||||||
|
(ovs-vsctl "--may-exist add-port br0 eth0 vlan_mode=native-untagged")
|
||||||
|
(ovs-vsctl (add-native-port "ovs0")))))
|
||||||
|
|
||||||
|
(define openvswitch-configuration-service
|
||||||
|
(simple-service 'openvswitch-configuration shepherd-root-service-type
|
||||||
|
(list (shepherd-service
|
||||||
|
(provision '(openvswitch-configuration))
|
||||||
|
(requirement '(vswitchd))
|
||||||
|
(start #~(lambda ()
|
||||||
|
#$setup-openvswitch))
|
||||||
|
(respawn? #f)))))
|
||||||
|
|
||||||
|
(define %openvswitch-os
|
||||||
|
(simple-operating-system
|
||||||
|
(static-networking-service "ovs0" "10.1.1.1"
|
||||||
|
#:netmask "255.255.255.252"
|
||||||
|
#:requirement '(openvswitch-configuration))
|
||||||
|
(service openvswitch-service-type
|
||||||
|
(openvswitch-configuration
|
||||||
|
(package openvswitch)))
|
||||||
|
openvswitch-configuration-service))
|
||||||
|
|
||||||
|
(define (run-openvswitch-test)
|
||||||
|
(define os
|
||||||
|
(marionette-operating-system %openvswitch-os
|
||||||
|
#:imported-modules '((gnu services herd))))
|
||||||
|
|
||||||
|
(define test
|
||||||
|
(with-imported-modules '((gnu build marionette))
|
||||||
|
#~(begin
|
||||||
|
(use-modules (gnu build marionette)
|
||||||
|
(ice-9 popen)
|
||||||
|
(ice-9 rdelim)
|
||||||
|
(srfi srfi-64))
|
||||||
|
|
||||||
|
(define marionette
|
||||||
|
(make-marionette (list #$(virtual-machine os))))
|
||||||
|
|
||||||
|
(mkdir #$output)
|
||||||
|
(chdir #$output)
|
||||||
|
|
||||||
|
(test-begin "openvswitch")
|
||||||
|
|
||||||
|
;; Make sure the bridge is created.
|
||||||
|
(test-assert "br0 exists"
|
||||||
|
(marionette-eval
|
||||||
|
'(zero? (system* "ovs-vsctl" "br-exists" "br0"))
|
||||||
|
marionette))
|
||||||
|
|
||||||
|
;; Make sure eth0 is connected to the bridge.
|
||||||
|
(test-equal "eth0 is connected to br0"
|
||||||
|
"br0"
|
||||||
|
(marionette-eval
|
||||||
|
'(begin
|
||||||
|
(use-modules (ice-9 popen) (ice-9 rdelim))
|
||||||
|
(let* ((port (open-pipe*
|
||||||
|
OPEN_READ
|
||||||
|
(string-append #$openvswitch "/bin/ovs-vsctl")
|
||||||
|
"port-to-br" "eth0"))
|
||||||
|
(output (read-line port)))
|
||||||
|
(close-pipe port)
|
||||||
|
output))
|
||||||
|
marionette))
|
||||||
|
|
||||||
|
;; Make sure the virtual interface got a static IP.
|
||||||
|
(test-assert "networking has started on ovs0"
|
||||||
|
(marionette-eval
|
||||||
|
'(begin
|
||||||
|
(use-modules (gnu services herd)
|
||||||
|
(srfi srfi-1))
|
||||||
|
(live-service-running
|
||||||
|
(find (lambda (live)
|
||||||
|
(memq 'networking-ovs0
|
||||||
|
(live-service-provision live)))
|
||||||
|
(current-services))))
|
||||||
|
marionette))
|
||||||
|
|
||||||
|
(test-end)
|
||||||
|
(exit (= (test-runner-fail-count (test-runner-current)) 0)))))
|
||||||
|
|
||||||
|
(gexp->derivation "openvswitch-test" test))
|
||||||
|
|
||||||
|
(define %test-openvswitch
|
||||||
|
(system-test
|
||||||
|
(name "openvswitch")
|
||||||
|
(description "Test a running OpenvSwitch configuration.")
|
||||||
|
(value (run-openvswitch-test))))
|
||||||
|
|
Loading…
Reference in New Issue