Skip to content

Commit adba80e

Browse files
committed
E2E: RDX: Add tests for POST
- For the E2E/BATS testing image: switch to registry.opensuse.org base images because that doesn't have pull limits. - For the same: switch to golang backend instead of python, because we already need golang to build for Windows; this leads to smaller images to pull. Also, we don't use python as much in this project. - Add POST handler for the backend (just returning the POST request body), and test it in E2E to ensure `ddClient.extension.vm.service.post` is working correctly. Signed-off-by: Mark Yen <mark.yen@suse.com>
1 parent 7fbb358 commit adba80e

File tree

5 files changed

+91
-62
lines changed

5 files changed

+91
-62
lines changed

.github/actions/spelling/expect.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ basedisk
6868
bassano
6969
batslib
7070
bcdfghjklmnpqrstvwxz
71+
bci
7172
bellingham
7273
bindir
7374
binfmt
Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
1-
FROM golang:1 AS builder
1+
FROM registry.opensuse.org/opensuse/bci/golang:stable AS builder
22
WORKDIR /usr/src/app
33
COPY bin/dummy.go .
44
ENV GOOS=windows
55
RUN go build -o /dummy.exe -ldflags '-s -w' dummy.go
66

7-
FROM python:3-alpine
7+
FROM registry.opensuse.org/opensuse/bci/golang:stable AS server-builder
8+
WORKDIR /usr/src/app
9+
COPY bin/server.go .
10+
ENV GOOS=linux
11+
RUN go build -o /server -ldflags '-s -w' server.go
12+
13+
FROM registry.opensuse.org/opensuse/bci/bci-minimal
814
ARG variant=basic
915

1016
ADD ${variant}.json /metadata.json
1117
ADD extension-icon.svg /extension-icon.svg
1218
ADD ui /ui/
1319
ADD bin /bin/
1420
COPY --from=builder /dummy.exe /bin/
21+
COPY --from=server-builder /server /bin/
1522
ADD compose.yaml /compose/
1623
RUN ln -s does/not/exist /compose/dangling-link
1724
RUN ln -s compose.yaml /compose/link
1825

19-
ENTRYPOINT ["/usr/local/bin/python3", "/bin/server.py"]
26+
ENTRYPOINT ["/bin/server"]
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// command server listens on the Unix socket `/run/guest-services/hello.sock`
2+
// (see `everything.json`) to exercise the ability for the front end to talk to
3+
// the back end.
4+
package main
5+
6+
import (
7+
"context"
8+
"errors"
9+
"fmt"
10+
"io"
11+
"log/slog"
12+
"net"
13+
"net/http"
14+
"os"
15+
"os/signal"
16+
"syscall"
17+
)
18+
19+
const (
20+
addr = "/run/guest-services/hello.sock"
21+
)
22+
23+
// Listen on a port and return the listener
24+
func listen() (net.Listener, error) {
25+
err := os.Remove(addr)
26+
if err != nil && !errors.Is(err, os.ErrNotExist) {
27+
slog.Error("failed to remove old socket", "socket", addr, "error", err)
28+
}
29+
listener, err := net.Listen("unix", addr)
30+
if err == nil {
31+
return listener, nil
32+
}
33+
listener, err = net.Listen("tcp", "")
34+
if err != nil {
35+
return nil, fmt.Errorf("failed to listen on fallback TCP: %w", err)
36+
}
37+
return listener, nil
38+
}
39+
40+
// Handle HTTP POST requests
41+
func handlePost(w http.ResponseWriter, req *http.Request) {
42+
_, _ = io.Copy(w, req.Body)
43+
}
44+
45+
func main() {
46+
listener, err := listen()
47+
if err != nil {
48+
slog.Error("failed to listen", "error", err)
49+
os.Exit(1)
50+
}
51+
http.DefaultServeMux.Handle("GET /", http.FileServer(http.Dir("/")))
52+
http.DefaultServeMux.HandleFunc("POST /", handlePost)
53+
54+
server := &http.Server{}
55+
ch := make(chan os.Signal)
56+
errCh := make(chan error)
57+
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
58+
go func() {
59+
<-ch
60+
errCh <- server.Shutdown(context.Background())
61+
}()
62+
63+
slog.Info("Serving HTTP", "address", listener.Addr().String())
64+
err = server.Serve(listener)
65+
if err != nil && !errors.Is(err, http.ErrServerClosed) {
66+
slog.Error("server closed", "error", err)
67+
os.Exit(1)
68+
}
69+
if err = <-errCh; err != nil {
70+
slog.Error("failed to shutdown server", "error", err)
71+
os.Exit(1)
72+
}
73+
}

bats/tests/extensions/testdata/bin/server.py

Lines changed: 0 additions & 59 deletions
This file was deleted.

e2e/extensions.e2e.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,13 @@ test.describe.serial('Extensions', () => {
384384
await expect(result).resolves.toContain('<title>Rancher</title>');
385385
});
386386
});
387+
test('can post values', async() => {
388+
await retry(async() => {
389+
const result = evalInView(`ddClient.extension.vm.service.post("/foo", "hello")`);
390+
391+
await expect(result).resolves.toEqual('hello');
392+
});
393+
});
387394
});
388395
});
389396
});

0 commit comments

Comments
 (0)