735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen#!/bin/sh
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen# Do an end to end checkpoint and restore with criu.
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenset -e
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho AndersenFAIL() {
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen echo -n "Failed " >&2
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen echo "$*" >&2
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen exit 1
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen}
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenif [ "$(id -u)" != "0" ]; then
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen echo "ERROR: Must run as root."
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen exit 1
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenfi
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen
5f845c928afc5c36f4c06771ce1814a16df3f5a5Tycho Andersenverlte() {
5f845c928afc5c36f4c06771ce1814a16df3f5a5Tycho Andersen ! [ "$1" = "$(printf "$1\n$2" | sort -V | tail -n1)" ]
5f845c928afc5c36f4c06771ce1814a16df3f5a5Tycho Andersen}
5f845c928afc5c36f4c06771ce1814a16df3f5a5Tycho Andersen
5f845c928afc5c36f4c06771ce1814a16df3f5a5Tycho Andersencriu_version="$(criu --version | head -n1 | cut -d' ' -f 2)"
5f845c928afc5c36f4c06771ce1814a16df3f5a5Tycho Andersen
d48d22299d4fc5635f289e4a34967e6cd99cd743Tycho Andersenif verlte "$criu_version" "1.3.1"; then
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen echo "SKIP: skipping test because no (or wrong) criu installed."
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen exit 0
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenfi
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenname=lxc-test-criu
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenlxc-create -t ubuntu -n $name || FAIL "creating container"
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersencat >> "$(lxc-config lxc.lxcpath)/$name/config" <<EOF
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen# hax for criu
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenlxc.console = none
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenlxc.tty = 0
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenlxc.cgroup.devices.deny = c 5:1 rwm
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho AndersenEOF
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenlxc-start -n $name -d || FAIL "starting container"
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenlxc-wait -n $name -s RUNNING || FAIL "waiting for container to run"
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen# Let the container boot and get into a steady state.
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersensleep 5s
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen# The first time this usually fails because CRIU cannot checkpoint things with
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen# data on a socket.
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenlxc-checkpoint -n $name -v -s -D /tmp/checkpoint || FAIL "failed checkpointing"
da0e298c675005c690769b05b9ed03fe643fd726Laurence Rowelxc-wait -n $name -s STOPPED
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenlxc-checkpoint -n $name -v -r -D /tmp/checkpoint || FAIL "failed restoring"
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersen
8bb165038d60d59084c1fafee171948244f0f86aStéphane Graberlxc-stop -n $name -k
735f2c6e504a541cbb2592a3f94858bf337a24ffTycho Andersenlxc-destroy -f -n $name