func TestServiceFile(t *testing.T) { if !sd_util.IsRunningSystemd() { t.Skip("Systemd is not running on the host.") } ctx := newRktRunCtx() defer ctx.cleanup() r := rand.New(rand.NewSource(time.Now().UnixNano())) conn, err := sd_dbus.New() if err != nil { t.Fatal(err) } imageFile := os.Getenv("RKT_INSPECT_IMAGE") if imageFile == "" { t.Fatal("RKT_INSPECT_IMAGE is not set") } image, err := filepath.Abs(imageFile) if err != nil { t.Fatal(err) } opts := "-- --print-msg=HelloWorld --sleep=1000" cmd := fmt.Sprintf("%s --insecure-skip-verify run --mds-register=false --set-env=MESSAGE_LOOP=1000 %s %s", ctx.cmd(), image, opts) props := []sd_dbus.Property{ sd_dbus.PropExecStart(strings.Split(cmd, " "), false), } target := fmt.Sprintf("rkt-testing-transient-%d.service", r.Int()) reschan := make(chan string) _, err = conn.StartTransientUnit(target, "replace", props, reschan) if err != nil { t.Fatal(err) } job := <-reschan if job != "done" { t.Fatal("Job is not done:", job) } units, err := conn.ListUnits() var found bool for _, u := range units { if u.Name == target { found = true if u.ActiveState != "active" { t.Fatalf("Test unit %s not active: %s (target: %s)", u.Name, u.ActiveState, target) } } } if !found { t.Fatalf("Test unit not found in list") } // Run the unit for 10 seconds. You can check the logs manually in journalctl time.Sleep(10 * time.Second) // Stop the unit _, err = conn.StopUnit(target, "replace", reschan) if err != nil { t.Fatal(err) } // wait for StopUnit job to complete <-reschan units, err = conn.ListUnits() found = false for _, u := range units { if u.Name == target { found = true } } if found { t.Fatalf("Test unit found in list, should be stopped") } }
func TestSocketActivation(t *testing.T) { if !sd_util.IsRunningSystemd() { t.Skip("Systemd is not running on the host.") } r := rand.New(rand.NewSource(time.Now().UnixNano())) port, err := randomFreePort(t) if err != nil { t.Fatal(err) } echoImage := patchTestACI("rkt-inspect-echo.aci", "--exec=/echo-socket-activated", fmt.Sprintf("--ports=%d-tcp,protocol=tcp,port=%d,socketActivated=true", port, port)) defer os.Remove(echoImage) ctx := testutils.NewRktRunCtx() defer ctx.Cleanup() conn, err := sd_dbus.New() if err != nil { t.Fatal(err) } rktTestingEchoService := ` [Unit] Description=Socket-activated echo server [Service] ExecStart=%s KillMode=process ` rnd := r.Int() // Write unit files directly to runtime system units directory // (/run/systemd/system) to avoid calling LinkUnitFiles - it is buggy in // systemd v219 as it does not work with absolute paths. unitsDir := "/run/systemd/system" cmd := fmt.Sprintf("%s --insecure-skip-verify run --mds-register=false %s", ctx.Cmd(), echoImage) serviceContent := fmt.Sprintf(rktTestingEchoService, cmd) serviceTargetBase := fmt.Sprintf("rkt-testing-socket-activation-%d.service", rnd) serviceTarget := filepath.Join(unitsDir, serviceTargetBase) if err := ioutil.WriteFile(serviceTarget, []byte(serviceContent), 0666); err != nil { t.Fatal(err) } defer os.Remove(serviceTarget) rktTestingEchoSocket := ` [Unit] Description=Socket-activated netcat server socket [Socket] ListenStream=%d ` socketContent := fmt.Sprintf(rktTestingEchoSocket, port) socketTargetBase := fmt.Sprintf("rkt-testing-socket-activation-%d.socket", rnd) socketTarget := filepath.Join(unitsDir, socketTargetBase) if err := ioutil.WriteFile(socketTarget, []byte(socketContent), 0666); err != nil { t.Fatal(err) } defer os.Remove(socketTarget) reschan := make(chan string) doJob := func() { job := <-reschan if job != "done" { t.Fatal("Job is not done:", job) } } if _, err := conn.StartUnit(socketTargetBase, "replace", reschan); err != nil { t.Fatal(err) } doJob() defer func() { if _, err := conn.StopUnit(socketTargetBase, "replace", reschan); err != nil { t.Fatal(err) } doJob() if _, err := conn.StopUnit(serviceTargetBase, "replace", reschan); err != nil { t.Fatal(err) } doJob() }() expected := "HELO\n" sockConn, err := net.Dial("tcp", fmt.Sprintf("localhost:%d", port)) if err != nil { t.Fatal(err) } if _, err := fmt.Fprintf(sockConn, expected); err != nil { t.Fatal(err) } answer, err := bufio.NewReader(sockConn).ReadString('\n') if err != nil { t.Fatal(err) } if answer != expected { t.Fatalf("Expected %q, Got %q", expected, answer) } return }