diff --git a/pkg/client/client.go b/pkg/client/client.go index 63a80420..d1cb1d2e 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -117,3 +117,20 @@ func (c *Client) AddDNS(req *types.Zone) error { } return nil } + +func (c *Client) ListDHCPLeases() (map[string]string, error) { + res, err := c.client.Get(fmt.Sprintf("%s%s", c.base, "/services/dhcp/leases")) + if err != nil { + return nil, err + } + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status: %d", res.StatusCode) + } + dec := json.NewDecoder(res.Body) + var leases map[string]string + if err := dec.Decode(&leases); err != nil { + return nil, err + } + return leases, nil +} diff --git a/test-qemu/basic_test.go b/test-qemu/basic_test.go index 93078050..1fdefc5b 100644 --- a/test-qemu/basic_test.go +++ b/test-qemu/basic_test.go @@ -20,6 +20,13 @@ var _ = ginkgo.Describe("dns with qemu", func() { }) }) +var _ = ginkgo.Describe("dhcp with qemu", func() { + e2e.BasicDHCPTests(e2e.BasicTestProps{ + SSHExec: sshExec, + Sock: sock, + }) +}) + var _ = ginkgo.Describe("command-line format", func() { ginkgo.It("should convert Command to command line format", func() { command := types.NewGvproxyCommand() diff --git a/test-vfkit/basic_test.go b/test-vfkit/basic_test.go index 9c8fefb6..b883003c 100644 --- a/test-vfkit/basic_test.go +++ b/test-vfkit/basic_test.go @@ -31,6 +31,13 @@ var _ = ginkgo.Describe("dns with vfkit", func() { }) }) +var _ = ginkgo.Describe("dhcp with vfkit", func() { + e2e.BasicDHCPTests(e2e.BasicTestProps{ + SSHExec: sshExec, + Sock: sock, + }) +}) + var _ = ginkgo.Describe("upload and download with vfkit", func() { tmpDir, err := os.MkdirTemp("", "vfkit") gomega.Expect(err).NotTo(gomega.HaveOccurred()) diff --git a/test/basic_tests.go b/test/basic_tests.go index fec6d277..a6aa3050 100644 --- a/test/basic_tests.go +++ b/test/basic_tests.go @@ -52,6 +52,23 @@ func BasicConnectivityTests(props BasicTestProps) { }) } +func BasicDHCPTests(props BasicTestProps) { + ginkgo.It("should return DHCP leases", func() { + client := gvproxyclient.New(&http.Client{ + Transport: &http.Transport{ + DialContext: func(_ context.Context, _, _ string) (net.Conn, error) { + return net.Dial("unix", props.Sock) + }, + }, + }, "http://base") + leases, err := client.ListDHCPLeases() + gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) + gomega.Expect(leases).Should(gomega.HaveKeyWithValue("192.168.127.1", "5a:94:ef:e4:0c:dd")) + gomega.Expect(leases).Should(gomega.HaveKeyWithValue("192.168.127.2", "5a:94:ef:e4:0c:ee")) + }) + +} + func BasicDNSTests(props BasicTestProps) { ginkgo.It("should resolve redhat.com", func() { out, err := props.SSHExec("nslookup redhat.com")