diff --git a/integration_test/pytransformer_contract/backwards_compatibility_test.go b/integration_test/pytransformer_contract/backwards_compatibility_test.go index f975655109..98b2864b2f 100644 --- a/integration_test/pytransformer_contract/backwards_compatibility_test.go +++ b/integration_test/pytransformer_contract/backwards_compatibility_test.go @@ -11,8 +11,6 @@ import ( "github.com/ory/dockertest/v3" "github.com/stretchr/testify/require" - kithelper "github.com/rudderlabs/rudder-go-kit/testhelper" - backendconfig "github.com/rudderlabs/rudder-server/backend-config" "github.com/rudderlabs/rudder-server/processor/types" utilstypes "github.com/rudderlabs/rudder-server/utils/types" @@ -1729,10 +1727,7 @@ def transformEvent(event, metadata): t.Cleanup(mockGateway.Close) // Start shared rudder-transformer. - transformerPort, err := kithelper.GetFreePort() - require.NoError(t, err) - transformerURL := fmt.Sprintf("http://localhost:%d", transformerPort) - transformerContainer := startRudderTransformer(t, pool, transformerPort, configBackend.URL, mockGateway.URL) + transformerContainer, transformerURL := startRudderTransformer(t, pool, configBackend.URL, mockGateway.URL) t.Cleanup(func() { if err := pool.Purge(transformerContainer); err != nil { t.Logf("Failed to purge rudder-transformer: %v", err) @@ -1740,10 +1735,7 @@ def transformEvent(event, metadata): }) // Start shared rudder-pytransformer. - pyTransformerPort, err := kithelper.GetFreePort() - require.NoError(t, err) - pyTransformerURL := fmt.Sprintf("http://localhost:%d", pyTransformerPort) - pyTransformerContainer := startRudderPytransformer(t, pool, pyTransformerPort, configBackend.URL) + pyTransformerContainer, pyTransformerURL := startRudderPytransformer(t, pool, configBackend.URL) t.Cleanup(func() { if err := pool.Purge(pyTransformerContainer); err != nil { t.Logf("Failed to purge rudder-pytransformer: %v", err) @@ -1765,12 +1757,8 @@ def transformEvent(event, metadata): env := newBCTestEnv(t, transformerURL, pyTransformerURL) if st.config.code != "" { - openFaasPort, err := kithelper.GetFreePort() - require.NoError(t, err) - openFaasURL := fmt.Sprintf("http://localhost:%d", openFaasPort) - t.Logf("Starting openfaas-flask-base for %s (versionID=%s)...", st.name, st.versionID) - container := startOpenFaasFlask(t, pool, openFaasPort, st.versionID, configBackend.URL) + container, openFaasURL := startOpenFaasFlask(t, pool, st.versionID, configBackend.URL) t.Cleanup(func() { if err := pool.Purge(container); err != nil { t.Logf("Failed to purge openfaas-flask-base: %v", err) diff --git a/integration_test/pytransformer_contract/base_test.go b/integration_test/pytransformer_contract/base_test.go index ffc2869fad..f86cd76a93 100644 --- a/integration_test/pytransformer_contract/base_test.go +++ b/integration_test/pytransformer_contract/base_test.go @@ -2,7 +2,6 @@ package pytransformer_contract import ( "context" - "fmt" "testing" "github.com/ory/dockertest/v3" @@ -11,7 +10,6 @@ import ( "github.com/rudderlabs/rudder-go-kit/config" "github.com/rudderlabs/rudder-go-kit/logger" "github.com/rudderlabs/rudder-go-kit/stats" - kithelper "github.com/rudderlabs/rudder-go-kit/testhelper" backendconfig "github.com/rudderlabs/rudder-server/backend-config" "github.com/rudderlabs/rudder-server/processor/types" @@ -98,20 +96,8 @@ def transformEvent(event, metadata): defer configBackend.Close() t.Logf("Config backend at %s", configBackend.URL) - t.Log("Allocating free ports...") - openFaasPort, err := kithelper.GetFreePort() - require.NoError(t, err) - transformerPort, err := kithelper.GetFreePort() - require.NoError(t, err) - pyTransformerPort, err := kithelper.GetFreePort() - require.NoError(t, err) - - openFaasURL := fmt.Sprintf("http://localhost:%d", openFaasPort) - transformerURL := fmt.Sprintf("http://localhost:%d", transformerPort) - pyTransformerURL := fmt.Sprintf("http://localhost:%d", pyTransformerPort) - t.Log("Starting openfaas-flask-base container...") - openFaasContainer := startOpenFaasFlask(t, pool, openFaasPort, versionID, configBackend.URL) + openFaasContainer, openFaasURL := startOpenFaasFlask(t, pool, versionID, configBackend.URL) defer func() { if err := pool.Purge(openFaasContainer); err != nil { t.Logf("Failed to purge openfaas-flask-base container: %v", err) @@ -125,7 +111,7 @@ def transformEvent(event, metadata): t.Logf("Mock OpenFaaS gateway at %s", mockGateway.URL) t.Log("Starting rudder-transformer container...") - transformerContainer := startRudderTransformer(t, pool, transformerPort, configBackend.URL, mockGateway.URL) + transformerContainer, transformerURL := startRudderTransformer(t, pool, configBackend.URL, mockGateway.URL) defer func() { if err := pool.Purge(transformerContainer); err != nil { t.Logf("Failed to purge rudder-transformer container: %v", err) @@ -133,7 +119,7 @@ def transformEvent(event, metadata): }() t.Log("Starting rudder-pytransformer container...") - pyTransformerContainer := startRudderPytransformer(t, pool, pyTransformerPort, configBackend.URL) + pyTransformerContainer, pyTransformerURL := startRudderPytransformer(t, pool, configBackend.URL) defer func() { if err := pool.Purge(pyTransformerContainer); err != nil { t.Logf("Failed to purge rudder-pytransformer container: %v", err) diff --git a/integration_test/pytransformer_contract/bc_helpers_test.go b/integration_test/pytransformer_contract/bc_helpers_test.go index facb0e77b9..487a24a46e 100644 --- a/integration_test/pytransformer_contract/bc_helpers_test.go +++ b/integration_test/pytransformer_contract/bc_helpers_test.go @@ -6,7 +6,6 @@ import ( "io" "net/http" "net/http/httptest" - "strconv" "strings" "sync" "sync/atomic" @@ -23,7 +22,7 @@ import ( "github.com/rudderlabs/rudder-go-kit/jsonrs" "github.com/rudderlabs/rudder-go-kit/logger" "github.com/rudderlabs/rudder-go-kit/stats/memstats" - kithelper "github.com/rudderlabs/rudder-go-kit/testhelper" + dockertesthelper "github.com/rudderlabs/rudder-go-kit/testhelper/docker" miniodocker "github.com/rudderlabs/rudder-go-kit/testhelper/docker/resource/minio" "github.com/rudderlabs/rudder-go-kit/testhelper/docker/resource/registry" @@ -309,78 +308,100 @@ func newMockOpenFaaSGateway(t *testing.T, getTarget func() string) (*httptest.Se // startOpenFaasFlask starts an openfaas-flask-base container with transformation code // loaded at startup via --vid and --config-backend-url. Optional extra environment // variables can be passed (e.g. "geolocation_url=http://..."). +// Returns the container and the host-accessible URL. func startOpenFaasFlask( t *testing.T, pool *dockertest.Pool, - port int, versionID, configBackendURL string, + versionID, configBackendURL string, extraEnv ...string, -) *dockertest.Resource { +) (*dockertest.Resource, string) { t.Helper() + const internalPort = "8080" env := []string{ - fmt.Sprintf("fprocess=python index.py --vid %s --config-backend-url %s", versionID, configBackendURL), - fmt.Sprintf("port=%d", port), + fmt.Sprintf("fprocess=python index.py --vid %s --config-backend-url %s", versionID, dockertesthelper.ToInternalDockerHost(configBackendURL)), + "port=" + internalPort, + } + for _, e := range extraEnv { + env = append(env, dockertesthelper.ToInternalDockerHost(e)) } - env = append(env, extraEnv...) container, err := pool.RunWithOptions(&dockertest.RunOptions{ - Repository: "422074288268.dkr.ecr.us-east-1.amazonaws.com/rudderstack/openfaas-flask", - Tag: "latest", - Auth: registry.AuthConfiguration(), - Env: env, - }, func(hc *docker.HostConfig) { - hc.NetworkMode = "host" + Repository: "422074288268.dkr.ecr.us-east-1.amazonaws.com/rudderstack/openfaas-flask", + Tag: "latest", + Auth: registry.AuthConfiguration(), + Env: env, + ExtraHosts: []string{"host.docker.internal:host-gateway"}, + ExposedPorts: []string{internalPort}, + PortBindings: map[docker.Port][]docker.PortBinding{ + docker.Port(internalPort + "/tcp"): {{HostIP: "127.0.0.1", HostPort: "0"}}, + }, }) require.NoError(t, err, "failed to start openfaas-flask-base container") - return container + url := fmt.Sprintf("http://localhost:%s", container.GetPort(internalPort+"/tcp")) + return container, url } // startRudderTransformer starts a rudder-transformer container configured to use // the mock config backend and mock OpenFaaS gateway. +// Returns the container and the host-accessible URL. func startRudderTransformer( t *testing.T, pool *dockertest.Pool, - port int, configBackendURL, openfaasGatewayURL string, -) *dockertest.Resource { + configBackendURL, openfaasGatewayURL string, +) (*dockertest.Resource, string) { t.Helper() + const internalPort = "9090" container, err := pool.RunWithOptions(&dockertest.RunOptions{ Repository: "rudderstack/rudder-transformer", Tag: "latest", Env: []string{ - "CONFIG_BACKEND_URL=" + configBackendURL, - "OPENFAAS_GATEWAY_URL=" + openfaasGatewayURL, - "PORT=" + strconv.Itoa(port), + "CONFIG_BACKEND_URL=" + dockertesthelper.ToInternalDockerHost(configBackendURL), + "OPENFAAS_GATEWAY_URL=" + dockertesthelper.ToInternalDockerHost(openfaasGatewayURL), + "PORT=" + internalPort, "NODE_OPTIONS=--no-node-snapshot", }, - }, func(hc *docker.HostConfig) { - hc.NetworkMode = "host" + ExtraHosts: []string{"host.docker.internal:host-gateway"}, + ExposedPorts: []string{internalPort}, + PortBindings: map[docker.Port][]docker.PortBinding{ + docker.Port(internalPort + "/tcp"): {{HostIP: "127.0.0.1", HostPort: "0"}}, + }, }) require.NoError(t, err, "failed to start rudder-transformer container") - return container + url := fmt.Sprintf("http://localhost:%s", container.GetPort(internalPort+"/tcp")) + return container, url } // startRudderPytransformer starts a rudder-pytransformer container configured // to use the mock config backend. Optional extra environment variables can be // passed (e.g. "GEOLOCATION_URL=http://..."). +// Returns the container and the host-accessible URL. func startRudderPytransformer( t *testing.T, pool *dockertest.Pool, - port int, configBackendURL string, + configBackendURL string, extraEnv ...string, -) *dockertest.Resource { +) (*dockertest.Resource, string) { t.Helper() + const internalPort = "8080" env := []string{ - "CONFIG_BACKEND_URL=" + configBackendURL, + "CONFIG_BACKEND_URL=" + dockertesthelper.ToInternalDockerHost(configBackendURL), "GUNICORN_WORKERS=1", "GUNICORN_TIMEOUT=120", - "GUNICORN_BIND=0.0.0.0:" + strconv.Itoa(port), + "GUNICORN_BIND=0.0.0.0:" + internalPort, + } + for _, e := range extraEnv { + env = append(env, dockertesthelper.ToInternalDockerHost(e)) } - env = append(env, extraEnv...) container, err := pool.RunWithOptions(&dockertest.RunOptions{ - Repository: "422074288268.dkr.ecr.us-east-1.amazonaws.com/rudderstack/rudder-pytransformer", - Tag: "latest", - Auth: registry.AuthConfiguration(), - Env: env, - }, func(hc *docker.HostConfig) { - hc.NetworkMode = "host" + Repository: "422074288268.dkr.ecr.us-east-1.amazonaws.com/rudderstack/rudder-pytransformer", + Tag: "latest", + Auth: registry.AuthConfiguration(), + Env: env, + ExtraHosts: []string{"host.docker.internal:host-gateway"}, + ExposedPorts: []string{internalPort}, + PortBindings: map[docker.Port][]docker.PortBinding{ + docker.Port(internalPort + "/tcp"): {{HostIP: "127.0.0.1", HostPort: "0"}}, + }, }) require.NoError(t, err, "failed to start rudder-pytransformer container") - return container + url := fmt.Sprintf("http://localhost:%s", container.GetPort(internalPort+"/tcp")) + return container, url } // waitForHealthy polls a service's /health endpoint until it returns 200 OK. @@ -475,30 +496,31 @@ func startRudderGeolocation(t *testing.T, pool *dockertest.Pool) (*dockertest.Re ) require.NoError(t, err, "failed to upload city_test.mmdb to MinIO") - geoPort, err := kithelper.GetFreePort() - require.NoError(t, err, "failed to get free port for rudder-geolocation") - + const internalPort = "8080" container, err := pool.RunWithOptions(&dockertest.RunOptions{ Repository: "422074288268.dkr.ecr.us-east-1.amazonaws.com/rudderstack/rudder-geolocation", Tag: "main", Auth: registry.AuthConfiguration(), Env: []string{ - "PORT=" + strconv.Itoa(geoPort), + "PORT=" + internalPort, "BUCKET=" + minioResource.BucketName, "KEY=city_test.mmdb", "OUTPUT_PATH=/tmp/city.mmdb", "REGION=us-east-1", - "S3_ENDPOINT=" + "http://" + minioResource.Endpoint, + "S3_ENDPOINT=" + dockertesthelper.ToInternalDockerHost("http://"+minioResource.Endpoint), "S3_FORCE_PATH_STYLE=true", "AWS_ACCESS_KEY_ID=" + minioResource.AccessKeyID, "AWS_SECRET_ACCESS_KEY=" + minioResource.AccessKeySecret, }, - }, func(hc *docker.HostConfig) { - hc.NetworkMode = "host" + ExtraHosts: []string{"host.docker.internal:host-gateway"}, + ExposedPorts: []string{internalPort}, + PortBindings: map[docker.Port][]docker.PortBinding{ + docker.Port(internalPort + "/tcp"): {{HostIP: "127.0.0.1", HostPort: "0"}}, + }, }) require.NoError(t, err, "failed to start rudder-geolocation container") - geoURL := fmt.Sprintf("http://localhost:%d", geoPort) + geoURL := fmt.Sprintf("http://localhost:%s", container.GetPort(internalPort+"/tcp")) return container, geoURL } diff --git a/integration_test/pytransformer_contract/geolocation_backwards_compatibility_test.go b/integration_test/pytransformer_contract/geolocation_backwards_compatibility_test.go index 513e99eeb5..2adf068bed 100644 --- a/integration_test/pytransformer_contract/geolocation_backwards_compatibility_test.go +++ b/integration_test/pytransformer_contract/geolocation_backwards_compatibility_test.go @@ -2,15 +2,12 @@ package pytransformer_contract import ( "context" - "fmt" "sync" "testing" "github.com/ory/dockertest/v3" "github.com/stretchr/testify/require" - kithelper "github.com/rudderlabs/rudder-go-kit/testhelper" - backendconfig "github.com/rudderlabs/rudder-server/backend-config" "github.com/rudderlabs/rudder-server/processor/types" ) @@ -1347,10 +1344,7 @@ def transformEvent(event, metadata): t.Cleanup(mockGateway.Close) // Start shared rudder-transformer. - transformerPort, err := kithelper.GetFreePort() - require.NoError(t, err) - transformerURL := fmt.Sprintf("http://localhost:%d", transformerPort) - transformerContainer := startRudderTransformer(t, pool, transformerPort, configBackend.URL, mockGateway.URL) + transformerContainer, transformerURL := startRudderTransformer(t, pool, configBackend.URL, mockGateway.URL) t.Cleanup(func() { if err := pool.Purge(transformerContainer); err != nil { t.Logf("Failed to purge rudder-transformer: %v", err) @@ -1358,10 +1352,7 @@ def transformEvent(event, metadata): }) // Start shared rudder-pytransformer with geolocation URL. - pyTransformerPort, err := kithelper.GetFreePort() - require.NoError(t, err) - pyTransformerURL := fmt.Sprintf("http://localhost:%d", pyTransformerPort) - pyTransformerContainer := startRudderPytransformer(t, pool, pyTransformerPort, configBackend.URL, "GEOLOCATION_URL="+geoURL) + pyTransformerContainer, pyTransformerURL := startRudderPytransformer(t, pool, configBackend.URL, "GEOLOCATION_URL="+geoURL) t.Cleanup(func() { if err := pool.Purge(pyTransformerContainer); err != nil { t.Logf("Failed to purge rudder-pytransformer: %v", err) @@ -1379,12 +1370,8 @@ def transformEvent(event, metadata): env := newBCTestEnv(t, transformerURL, pyTransformerURL) if st.config.code != "" { - openFaasPort, err := kithelper.GetFreePort() - require.NoError(t, err) - openFaasURL := fmt.Sprintf("http://localhost:%d", openFaasPort) - t.Logf("Starting openfaas-flask-base for %s (versionID=%s)...", st.name, st.versionID) - container := startOpenFaasFlask(t, pool, openFaasPort, st.versionID, configBackend.URL, "geolocation_url="+geoURL) + container, openFaasURL := startOpenFaasFlask(t, pool, st.versionID, configBackend.URL, "geolocation_url="+geoURL) t.Cleanup(func() { if err := pool.Purge(container); err != nil { t.Logf("Failed to purge openfaas-flask-base: %v", err) @@ -1623,10 +1610,7 @@ def transformBatch(events, metadata): t.Cleanup(mockGateway.Close) // Start shared rudder-transformer (WITHOUT geolocation URL). - transformerPort, err := kithelper.GetFreePort() - require.NoError(t, err) - transformerURL := fmt.Sprintf("http://localhost:%d", transformerPort) - transformerContainer := startRudderTransformer(t, pool, transformerPort, configBackend.URL, mockGateway.URL) + transformerContainer, transformerURL := startRudderTransformer(t, pool, configBackend.URL, mockGateway.URL) t.Cleanup(func() { if err := pool.Purge(transformerContainer); err != nil { t.Logf("Failed to purge rudder-transformer: %v", err) @@ -1634,10 +1618,7 @@ def transformBatch(events, metadata): }) // Start shared rudder-pytransformer (WITHOUT geolocation URL). - pyTransformerPort, err := kithelper.GetFreePort() - require.NoError(t, err) - pyTransformerURL := fmt.Sprintf("http://localhost:%d", pyTransformerPort) - pyTransformerContainer := startRudderPytransformer(t, pool, pyTransformerPort, configBackend.URL) + pyTransformerContainer, pyTransformerURL := startRudderPytransformer(t, pool, configBackend.URL) t.Cleanup(func() { if err := pool.Purge(pyTransformerContainer); err != nil { t.Logf("Failed to purge rudder-pytransformer: %v", err) @@ -1653,12 +1634,8 @@ def transformBatch(events, metadata): env := newBCTestEnv(t, transformerURL, pyTransformerURL) if st.config.code != "" { - openFaasPort, err := kithelper.GetFreePort() - require.NoError(t, err) - openFaasURL := fmt.Sprintf("http://localhost:%d", openFaasPort) - // Start openfaas WITHOUT geolocation URL (not configured test). - container := startOpenFaasFlask(t, pool, openFaasPort, st.versionID, configBackend.URL) + container, openFaasURL := startOpenFaasFlask(t, pool, st.versionID, configBackend.URL) t.Cleanup(func() { if err := pool.Purge(container); err != nil { t.Logf("Failed to purge openfaas-flask-base: %v", err) @@ -2496,10 +2473,7 @@ def transformBatch(events, metadata): t.Cleanup(mockGateway.Close) // Start shared rudder-transformer. - transformerPort, err := kithelper.GetFreePort() - require.NoError(t, err) - transformerURL := fmt.Sprintf("http://localhost:%d", transformerPort) - transformerContainer := startRudderTransformer(t, pool, transformerPort, configBackend.URL, mockGateway.URL) + transformerContainer, transformerURL := startRudderTransformer(t, pool, configBackend.URL, mockGateway.URL) t.Cleanup(func() { if err := pool.Purge(transformerContainer); err != nil { t.Logf("Failed to purge rudder-transformer: %v", err) @@ -2507,10 +2481,7 @@ def transformBatch(events, metadata): }) // Start shared rudder-pytransformer with configurable mock geolocation URL. - pyTransformerPort, err := kithelper.GetFreePort() - require.NoError(t, err) - pyTransformerURL := fmt.Sprintf("http://localhost:%d", pyTransformerPort) - pyTransformerContainer := startRudderPytransformer(t, pool, pyTransformerPort, configBackend.URL, "GEOLOCATION_URL="+geoURL) + pyTransformerContainer, pyTransformerURL := startRudderPytransformer(t, pool, configBackend.URL, "GEOLOCATION_URL="+geoURL) t.Cleanup(func() { if err := pool.Purge(pyTransformerContainer); err != nil { t.Logf("Failed to purge rudder-pytransformer: %v", err) @@ -2528,12 +2499,8 @@ def transformBatch(events, metadata): env := newBCTestEnv(t, transformerURL, pyTransformerURL) if st.config.code != "" { - openFaasPort, err := kithelper.GetFreePort() - require.NoError(t, err) - openFaasURL := fmt.Sprintf("http://localhost:%d", openFaasPort) - t.Logf("Starting openfaas-flask-base for %s (versionID=%s)...", st.name, st.versionID) - container := startOpenFaasFlask(t, pool, openFaasPort, st.versionID, configBackend.URL, "geolocation_url="+geoURL) + container, openFaasURL := startOpenFaasFlask(t, pool, st.versionID, configBackend.URL, "geolocation_url="+geoURL) t.Cleanup(func() { if err := pool.Purge(container); err != nil { t.Logf("Failed to purge openfaas-flask-base: %v", err) diff --git a/integration_test/pytransformer_contract/pytransformer_contract_test.go b/integration_test/pytransformer_contract/pytransformer_contract_test.go index 480d6cfabe..062f5c517b 100644 --- a/integration_test/pytransformer_contract/pytransformer_contract_test.go +++ b/integration_test/pytransformer_contract/pytransformer_contract_test.go @@ -86,13 +86,8 @@ def transformEvent(event, metadata): })) defer pyConfigBackend.Close() - // 4. Get a free port for pytransformer - pyTransformerPort, err := kithelper.GetFreePort() - require.NoError(t, err) - pyTransformerURL := fmt.Sprintf("http://localhost:%d", pyTransformerPort) - - // 5. Start rudder-pytransformer container with host network (Linux) - pyTransformerContainer := startRudderPytransformer(t, pool, pyTransformerPort, pyConfigBackend.URL) + // 4. Start rudder-pytransformer container + pyTransformerContainer, pyTransformerURL := startRudderPytransformer(t, pool, pyConfigBackend.URL) defer func() { if err := pool.Purge(pyTransformerContainer); err != nil { t.Logf("Failed to purge pytransformer container: %v", err) diff --git a/utils/crash/default.go b/utils/crash/default.go index dc822060a2..1ebdc89174 100644 --- a/utils/crash/default.go +++ b/utils/crash/default.go @@ -2,11 +2,15 @@ package crash import ( "net/http" + "sync" "github.com/rudderlabs/rudder-go-kit/logger" ) -var Default panicHandler = &NOOP{} +var ( + defaultMu sync.RWMutex + defaultHandler panicHandler = &NOOP{} +) type panicHandler interface { Notify(team string) func() @@ -19,28 +23,36 @@ type PanicWrapperOpts struct { AppType string } +func getDefault() panicHandler { + defaultMu.RLock() + defer defaultMu.RUnlock() + return defaultHandler +} + func Configure(logger logger.Logger, opts PanicWrapperOpts) { - Default = UsingLogger(logger, opts) + defaultMu.Lock() + defer defaultMu.Unlock() + defaultHandler = UsingLogger(logger, opts) } func NotifyWarehouse(fn func() error) func() error { return func() error { - defer Default.Notify("Warehouse")() + defer getDefault().Notify("Warehouse")() return fn() } } func Wrapper(fn func() error) func() error { return func() error { - defer Default.Notify("Core")() + defer getDefault().Notify("Core")() return fn() } } func Notify(team string) func() { - return Default.Notify(team) + return getDefault().Notify(team) } func Handler(h http.Handler) http.Handler { - return Default.Handler(h) + return getDefault().Handler(h) }