| package main |
| |
| import ( |
| "context" |
| "fmt" |
| "os" |
| |
| "github.com/edwarnicke/exechelper" |
| ) |
| |
| func testProxyHttpTcp(s *NsSuite, dockerInstance, action string, proxySetup func() error) error { |
| const outputFile = "test.data" |
| const srcFile = "10M" |
| stopServer := make(chan struct{}, 1) |
| serverRunning := make(chan struct{}, 1) |
| |
| volumeArgs := fmt.Sprintf("-v shared-vol:/tmp/%s", dockerInstance) |
| s.assertNil(dockerRun(dockerInstance, volumeArgs), "failed to start container") |
| defer func() { exechelper.Run("docker stop " + dockerInstance) }() |
| |
| // start & configure vpp in the container |
| _, err := hstExec(action, dockerInstance) |
| s.assertNil(err) |
| |
| fmt.Println("VPP running and configured...") |
| |
| s.assertNil(proxySetup(), "failed to setup proxy") |
| fmt.Println("Proxy configured...") |
| |
| // create test file |
| err = exechelper.Run(fmt.Sprintf("ip netns exec server truncate -s %s %s", srcFile, srcFile)) |
| s.assertNil(err, "failed to run truncate command") |
| defer func() { os.Remove(srcFile) }() |
| |
| fmt.Println("Test file created...") |
| |
| go startHttpServer(serverRunning, stopServer, ":666", "server") |
| // TODO better error handling and recovery |
| <-serverRunning |
| |
| defer func(chan struct{}) { |
| stopServer <- struct{}{} |
| }(stopServer) |
| |
| fmt.Println("http server started...") |
| |
| c := fmt.Sprintf("ip netns exec client wget --retry-connrefused --retry-on-http-error=503 --tries=10 -O %s 10.0.0.2:555/%s", outputFile, srcFile) |
| _, err = exechelper.CombinedOutput(c) |
| s.assertNil(err, "failed to run wget") |
| stopServer <- struct{}{} |
| |
| defer func() { os.Remove(outputFile) }() |
| |
| s.assertNil(assertFileSize(outputFile, srcFile)) |
| return nil |
| } |
| |
| func setupEnvoy(ctx context.Context, dockerInstance string) error { |
| errCh := startEnvoy(ctx, dockerInstance) |
| select { |
| case err := <-errCh: |
| return err |
| default: |
| } |
| |
| go func(ctx context.Context, errCh <-chan error) { |
| for { |
| select { |
| // handle cancel() call from outside to gracefully stop the routine |
| case <-ctx.Done(): |
| return |
| default: |
| select { |
| case err := <-errCh: |
| fmt.Printf("error while running envoy: %v", err) |
| default: |
| } |
| } |
| } |
| }(ctx, errCh) |
| return nil |
| } |
| |
| func (s *NsSuite) TestVppProxyHttpTcp() { |
| dockerInstance := "vpp-proxy" |
| err := testProxyHttpTcp(s, dockerInstance, "ConfigureVppProxy", configureVppProxy) |
| s.assertNil(err) |
| } |
| |
| func (s *NsSuite) TestEnvoyProxyHttpTcp() { |
| exechelper.Run("docker volume create --name=shared-vol") |
| defer func() { |
| exechelper.Run("docker stop envoy") |
| }() |
| |
| ctx, cancel := context.WithCancel(context.Background()) |
| |
| dockerInstance := "vpp-envoy" |
| err := testProxyHttpTcp(s, dockerInstance, "ConfigureEnvoyProxy", func() error { |
| return setupEnvoy(ctx, dockerInstance) |
| }) |
| s.assertNil(err) |
| cancel() |
| } |