Skip to content

Commit 5fe8f6c

Browse files
authored
test: output if domain is in allowed domain list (#2776)
1 parent 9bce11d commit 5fe8f6c

File tree

2 files changed

+60
-35
lines changed

2 files changed

+60
-35
lines changed

e2e/cluster/cmx/cluster.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -382,12 +382,17 @@ func (c *Cluster) SetupPlaywrightAndRunTest(testName string, args ...string) (st
382382
return c.RunPlaywrightTest(testName, args...)
383383
}
384384

385-
func (c *Cluster) SetupPlaywright(envs ...map[string]string) error {
385+
func (c *Cluster) BypassKurlProxy(envs ...map[string]string) error {
386386
c.t.Logf("%s: bypassing kurl-proxy", time.Now().Format(time.RFC3339))
387387
_, stderr, err := c.RunCommandOnNode(0, []string{"/usr/local/bin/bypass-kurl-proxy.sh"}, envs...)
388388
if err != nil {
389389
return fmt.Errorf("bypass kurl-proxy: %v: %s", err, string(stderr))
390390
}
391+
392+
return nil
393+
}
394+
395+
func (c *Cluster) NPMInstallPlaywright(envs ...map[string]string) error {
391396
c.t.Logf("%s: installing playwright", time.Now().Format(time.RFC3339))
392397
output, err := exec.Command("sh", "-c", "cd playwright && npm ci && npx playwright install --with-deps").CombinedOutput()
393398
if err != nil {
@@ -396,6 +401,14 @@ func (c *Cluster) SetupPlaywright(envs ...map[string]string) error {
396401
return nil
397402
}
398403

404+
func (c *Cluster) SetupPlaywright(envs ...map[string]string) error {
405+
if err := c.BypassKurlProxy(envs...); err != nil {
406+
return err
407+
}
408+
409+
return c.NPMInstallPlaywright(envs...)
410+
}
411+
399412
func (c *Cluster) RunPlaywrightTest(testName string, args ...string) (string, string, error) {
400413
c.t.Logf("%s: running playwright test %s", time.Now().Format(time.RFC3339), testName)
401414
cmdArgs := []string{testName}
@@ -568,13 +581,12 @@ func (c *Cluster) waitUntilRunning(node Node, nodeNum int, timeoutDuration time.
568581
}
569582
}
570583

571-
func (c *Cluster) CollectNetworkReport() ([]NetworkEvent, []byte, error) {
584+
func (c *Cluster) CollectNetworkReport() ([]NetworkEvent, error) {
572585
output, err := exec.Command("replicated", "network", "report", fmt.Sprintf("--id=%v", c.network.ID), "-ojson").Output()
573586
if err != nil {
574-
return nil, nil, fmt.Errorf("collect network report: %v", err)
587+
return nil, fmt.Errorf("collect network report: %v", err)
575588
}
576589

577-
// TODO: investigate CLI changes to make event_data a json object instead of a string
578590
type eventWrapper struct {
579591
EventData string `json:"event_data"`
580592
}
@@ -585,18 +597,18 @@ func (c *Cluster) CollectNetworkReport() ([]NetworkEvent, []byte, error) {
585597

586598
report := networkReport{}
587599
if err := json.Unmarshal(output, &report); err != nil {
588-
return nil, nil, fmt.Errorf("unmarshal network events: %v", err)
600+
return nil, fmt.Errorf("unmarshal network events: %v", err)
589601
}
590602

591603
networkEvents := make([]NetworkEvent, 0, len(report.Events))
592604
for _, e := range report.Events {
593605
ne := NetworkEvent{}
594606
if err := json.Unmarshal([]byte(e.EventData), &ne); err != nil {
595-
return nil, nil, fmt.Errorf("unmarshal network event data: %v", err)
607+
return nil, fmt.Errorf("unmarshal network event data: %v", err)
596608
}
597609

598610
networkEvents = append(networkEvents, ne)
599611
}
600612

601-
return networkEvents, output, nil
613+
return networkEvents, nil
602614
}

e2e/install_test.go

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package e2e
33
import (
44
"encoding/base64"
55
"fmt"
6+
"net"
67
"os"
78
"strings"
89
"testing"
@@ -2072,60 +2073,72 @@ func TestSingleNodeNetworkReport(t *testing.T) {
20722073
})
20732074
defer tc.Cleanup()
20742075

2076+
if err := tc.NPMInstallPlaywright(); err != nil {
2077+
t.Fatalf("fail to setup playwright: %v", err)
2078+
}
2079+
20752080
if err := tc.SetNetworkReport(true); err != nil {
20762081
t.Fatalf("failed to enable network reporting: %v", err)
20772082
}
20782083

20792084
downloadECRelease(t, tc, 0)
20802085
installSingleNode(t, tc)
2081-
if stdout, stderr, err := tc.SetupPlaywrightAndRunTest("deploy-app"); err != nil {
2086+
2087+
if err := tc.BypassKurlProxy(); err != nil {
2088+
t.Fatalf("fail to bypass kurl-proxy: %v", err)
2089+
}
2090+
2091+
if stdout, stderr, err := tc.RunPlaywrightTest("deploy-app"); err != nil {
20822092
t.Fatalf("fail to run playwright test deploy-app: %v: %s: %s", err, stdout, stderr)
20832093
}
20842094

20852095
checkInstallationState(t, tc)
20862096
checkNodeJoinCommand(t, tc, 0)
20872097

2098+
// TODO: network events can came a few seconds to flow from cluster-provisioner, should look into ways to signal when a report has finished
2099+
time.Sleep(20 * time.Second)
2100+
20882101
if err := tc.SetNetworkReport(false); err != nil {
20892102
t.Fatalf("failed to disable network reporting: %v", err)
20902103
}
20912104

2092-
// TODO: network events can came a few seconds to flow from cluster-provisioner, should look into ways to signal when a report has finished
2093-
time.Sleep(5 * time.Second)
2094-
2095-
networkEvents, _, err := tc.CollectNetworkReport()
2105+
networkEvents, err := tc.CollectNetworkReport()
20962106
if err != nil {
20972107
t.Fatalf("failed to collect network report: %v", err)
20982108
}
20992109

2100-
domainsByIps := make(map[string]map[string]struct{})
2101-
for _, ne := range networkEvents {
2102-
// filter out local traffic
2103-
if ne.DstIP == "0.0.0.0" {
2104-
continue
2105-
}
2110+
allowedDomains := map[string]struct{}{
2111+
"ec-e2e-proxy.testcluster.net": {},
2112+
"ec-e2e-replicated-app.testcluster.net": {},
21062113

2107-
domains := domainsByIps[ne.DstIP]
2108-
if domains == nil {
2109-
domains = make(map[string]struct{})
2110-
}
2114+
// these two appear due to the install_cots_cli function in single-node-install.sh
2115+
"kots.io": {},
2116+
"release-assets.githubusercontent.com": {},
2117+
}
21112118

2112-
if len(strings.TrimSpace(ne.DNSQueryName)) > 0 {
2113-
domains[ne.DNSQueryName] = struct{}{}
2119+
seenAllowedDomains := map[string]struct{}{}
2120+
t.Log("Logged outbound external network accesses:")
2121+
for _, ne := range networkEvents {
2122+
if ne.DNSQueryName == "" {
2123+
continue
21142124
}
21152125

2116-
domainsByIps[ne.DstIP] = domains
2117-
}
2118-
2119-
t.Log("Logged outbound external network accesses:\n")
2120-
for ip, domains := range domainsByIps {
2121-
domainOutput := ""
2122-
for domain := range domains {
2123-
domainOutput += fmt.Sprintf("\t- %v\n", domain)
2126+
// TODO: currently cmx reporting will return an ip as a domain, remove this once fixed
2127+
if ip := net.ParseIP(ne.DNSQueryName); ip != nil {
2128+
continue
21242129
}
21252130

2126-
t.Logf("IP: %v", ip)
2127-
if len(domainOutput) > 0 {
2128-
t.Logf("\n%v", domainOutput)
2131+
_, allowed := allowedDomains[ne.DNSQueryName]
2132+
// only print allowed domains once to reduce test output noise, but print every violation we see
2133+
if allowed {
2134+
if _, ok := seenAllowedDomains[ne.DNSQueryName]; !ok {
2135+
t.Logf("%v - ALLOWED", ne.DNSQueryName)
2136+
seenAllowedDomains[ne.DNSQueryName] = struct{}{}
2137+
}
2138+
} else {
2139+
t.Logf("%v - UNALLOWED\n", ne.DNSQueryName)
2140+
t.Logf("\tUnallowed event details: %+v", ne)
2141+
t.Fail()
21292142
}
21302143
}
21312144
}

0 commit comments

Comments
 (0)