[CRIU] [PATCH 8/8] test: libcriu

Ruslan Kuprieiev kupruser at gmail.com
Wed Dec 4 11:16:39 PST 2013


On 04.12.2013 19:31, Ruslan Kuprieiev wrote:
> On 04.12.2013 16:13, Andrew Vagin wrote:
>> On Wed, Dec 04, 2013 at 05:53:39PM +0400, Ruslan Kuprieiev wrote:
>>> On 04.12.2013 14:24, Andrew Vagin wrote:
>>>> On Wed, Dec 04, 2013 at 02:57:31PM +0400, Ruslan Kuprieiev wrote:
>>>>> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
>>>>> ---
>>>>>   Makefile              |  1 +
>>>>>   test/libcriu/Makefile | 10 +++++++
>>>>>   test/libcriu/loop.sh  |  4 +++
>>>>>   test/libcriu/run.sh   | 63 +++++++++++++++++++++++++++++++++++++++
>>>>>   test/libcriu/test.c   | 82 
>>>>> +++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>   5 files changed, 160 insertions(+)
>>>>>   create mode 100644 test/libcriu/Makefile
>>>>>   create mode 100755 test/libcriu/loop.sh
>>>>>   create mode 100755 test/libcriu/run.sh
>>>>>   create mode 100644 test/libcriu/test.c
>>>>>
>>>>> diff --git a/Makefile b/Makefile
>>>>> index cd312e7..347c4f0 100644
>>>>> --- a/Makefile
>>>>> +++ b/Makefile
>>>>> @@ -202,6 +202,7 @@ clean: clean-built
>>>>>       $(Q) $(RM) -r ./test/lib64/
>>>>>       $(Q) $(RM) protobuf-desc-gen.h
>>>>>       $(Q) $(MAKE) -C test/zdtm cleandep clean cleanout
>>>>> +    $(Q) $(MAKE) -C test/libcriu clean
>>>>>   distclean: clean
>>>>>       $(E) "  DISTCLEAN"
>>>>> diff --git a/test/libcriu/Makefile b/test/libcriu/Makefile
>>>>> new file mode 100644
>>>>> index 0000000..830eec1
>>>>> --- /dev/null
>>>>> +++ b/test/libcriu/Makefile
>>>>> @@ -0,0 +1,10 @@
>>>>> +all: build/test
>>>>> +
>>>>> +build/test: build/test.o
>>>>> +    gcc $^ -lprotobuf -L ../../lib -lcriu -o $@
>>>>> +
>>>>> +build/test.o: test.c
>>>>> +    gcc -c $^ -I ../../lib -I ../../protobuf -o $@
>>>>> +
>>>>> +clean:
>>>>> +    rm -rf build
>>>>> diff --git a/test/libcriu/loop.sh b/test/libcriu/loop.sh
>>>>> new file mode 100755
>>>>> index 0000000..0ab34ce
>>>>> --- /dev/null
>>>>> +++ b/test/libcriu/loop.sh
>>>>> @@ -0,0 +1,4 @@
>>>>> +#!/bin/bash
>>>>> +while :; do
>>>>> +    sleep 1
>>>>> +done
>>>>> diff --git a/test/libcriu/run.sh b/test/libcriu/run.sh
>>>>> new file mode 100755
>>>>> index 0000000..04a8c10
>>>>> --- /dev/null
>>>>> +++ b/test/libcriu/run.sh
>>>>> @@ -0,0 +1,63 @@
>>>>> +#!/bin/bash
>>>>> +
>>>>> +source ../env.sh || exit 1
>>>>> +
>>>>> +export PROTODIR=`readlink -f "${PWD}/../../protobuf"`
>>>>> +
>>>>> +echo $PROTODIR
>>>>> +
>>>>> +LOOP_PID=0
>>>>> +
>>>>> +function title_print {
>>>>> +    echo -e "\n**************************************************"
>>>>> +    echo -e "\t\t"$1
>>>>> +    echo -e "**************************************************\n"
>>>>> +
>>>>> +}
>>>>> +
>>>>> +function _exit {
>>>>> +    if [ $1 -ne 0 ]; then
>>>>> +        echo "FAIL"
>>>>> +    fi
>>>>> +
>>>>> +    if [ $LOOP_PID -ne 0 ]; then
>>>>> +        kill -SIGTERM $LOOP_PID
>>>>> +    fi
>>>>> +
>>>>> +    title_print "Shutdown service server"
>>>>> +    kill -SIGTERM `cat pidfile`
>>>>> +
>>>>> +    exit $1
>>>>> +}
>>>>> +
>>>>> +function check_and_term {
>>>>> +    title_print "Check and term $1"
>>>>> +    ps -C $1
>>>>> +    pkill $1
>>>>> +}
>>>>> +
>>>>> +title_print "Build programs"
>>>>> +make clean
>>>>> +mkdir build
>>>>> +cd build
>>>>> +mkdir imgs_loop
>>>>> +mkdir imgs_test
>>>>> +make -C ../ || { echo "FAIL"; exit 1; }
>>>>> +
>>>>> +title_print "Start service server"
>>>>> +${CRIU} service -v4 -o service.log --address criu_service.socket 
>>>>> -d --pidfile `pwd`/pidfile || { echo "FAIL"; exit 1; }
>>>>> +
>>>>> +title_print "Run loop.sh"
>>>>> +setsid ../loop.sh < /dev/null &> loop.log &
>>>>> +LOOP_PID=${!}
>>>>> +echo "pid ${LOOP_PID}"
>>>>> +
>>>>> +title_print "Run test.c"
>>>>> +LD_LIBRARY_PATH=../../../lib
>>>>> +export LD_LIBRARY_PATH
>>>>> +./test ${LOOP_PID} || _exit $?
>>>>> +
>>>>> +title_print "Restore test.c"
>>>>> +${CRIU} restore -v4 -o restore-test.log -D imgs_test --shell-job 
>>>>> || _exit $?
>>>>> +
>>>>> +_exit 0
>>>>> diff --git a/test/libcriu/test.c b/test/libcriu/test.c
>>>>> new file mode 100644
>>>>> index 0000000..e45abbc
>>>>> --- /dev/null
>>>>> +++ b/test/libcriu/test.c
>>>>> @@ -0,0 +1,82 @@
>>>>> +#include "criu.h"
>>>>> +#include <fcntl.h>
>>>>> +
>>>>> +static void criu_error(int ret)
>>>>> +{
>>>>> +    switch (ret) {
>>>>> +    case CRIU_ECONNECT:
>>>>> +        puts("CRIU_ECONNECT");
>>>>> +        break;
>>>>> +    case CRIU_EREQ:
>>>>> +        puts("CRIU_EREQ");
>>>>> +        break;
>>>>> +    case CRIU_ERESP:
>>>>> +        puts("CRIU_ERESP");
>>>>> +        break;
>>>>> +    case CRIU_ECHECK:
>>>>> +        puts("CRIU_ECONNECT");
>>>>> +        break;
>>>>> +
>>>>> +    default:
>>>>> +        puts("Unknown error");
>>>>> +    }
>>>>> +}
>>>>> +
>>>>> +int main(int argc, char *argv[])
>>>>> +{
>>>>> +    int ret;
>>>>> +    CriuOpts opts    = CRIU_OPTS__INIT;
>>>>> +    CriuResp *resp    = NULL;
>>>> protobuf guarantees compatibility only for packed objects
>>> Excuse me, could you please explain what do you mean?
>> If you add a new field in the CriuResp protobuf, you can't be sure, that
>> all old applications will continue work with a new CRIU binaries.
>>
>> Old applications was compiled with old headers, but they will load
>> the new CRIU library.
>
> Oh, good point. So, I suppose, we just need to return packet resp?

So, we can't pack\unpack anything in libcriu without ruining compatibility.
Looks like the only thing libcriu may be used for is connect to socket and
send\recv data, without processing it. But isn't it pointless to create 
library like this?
I honestly can't see any further a reason to create libcriu. Maybe just let
people use RPC?

>
>>
>>>>> +
>>>>> +    criu_set_service_address("criu_service.socket");
>>>>> +
>>>>> +    puts("--- Check ---");
>>>>> +    ret = criu_check();
>>>>> +    if (ret < 0) {
>>>>> +        criu_error(ret);
>>>>> +        return -1;
>>>>> +    } else
>>>>> +        puts("Success");
>>>>> +
>>>>> +    puts("--- Dump loop ---");
>>>>> +    opts.has_pid        = true;
>>>>> +    opts.pid        = atoi(argv[1]);
>>>>> +    opts.has_log_level    = true;
>>>>> +    opts.log_level        = 4;
>>>>> +    opts.images_dir_fd    = open("imgs_loop", O_DIRECTORY);
>>>>> +
>>>>> +    ret = criu_dump(&opts, &resp);
>>>>> +    if (ret < 0) {
>>>>> +        criu_error(ret);
>>>>> +        return -1;
>>>>> +    } else if (resp->success)
>>>>> +        puts("Success");
>>>>> +
>>>>> +    puts("--- Restore loop ---");
>>>>> +    ret = criu_restore(&opts, &resp);
>>>>> +    if (ret < 0) {
>>>>> +        criu_error(ret);
>>>>> +        return -1;
>>>>> +    } else if (resp->success)
>>>>> +        puts("Success");
>>>>> +
>>>>> +    puts("--- Dump myself ---");
>>>>> +    opts.has_pid        = false; /* unset pid, so criu will dump 
>>>>> requesting process */
>>>>> +    opts.has_leave_running    = true;
>>>>> +    opts.leave_running    = true;
>>>>> +    opts.has_shell_job    = true;
>>>>> +    opts.shell_job        = true;
>>>>> +    opts.images_dir_fd    = open("imgs_test", O_DIRECTORY);
>>>>> +
>>>>> +    ret = criu_dump(&opts, &resp);
>>>>> +    if (ret < 0) {
>>>>> +        criu_error(ret);
>>>>> +        return -1;
>>>>> +    } else if (resp->success) {
>>>>> +        puts("Success");
>>>>> +        if (resp->dump->has_restored && resp->dump->restored)
>>>>> +            puts("Restored");
>>>>> +    }
>>>>> +
>>>>> +    return 0;
>>>>> +}
>>>>> -- 
>>>>> 1.8.1.2
>>>>>
>>>>> _______________________________________________
>>>>> CRIU mailing list
>>>>> CRIU at openvz.org
>>>>> https://lists.openvz.org/mailman/listinfo/criu
>



More information about the CRIU mailing list