Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions internal/exporter/exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,11 +209,6 @@ func (e *healthExporter) exportToHTTP(ctx context.Context, data *collector.Healt
return nil
}

if e.options.config.AuthToken == "" {
log.Logger.Infow("No auth token configured, skipping HTTP export")
return nil
}

newToken, err := e.httpWriter.Send(ctx, data, e.options.config.MetricsEndpoint, e.options.config.LogsEndpoint, e.options.config.RetryMaxAttempts, e.options.config.AuthToken)
if err != nil {
return fmt.Errorf("failed to send data: %w", err)
Expand Down
75 changes: 51 additions & 24 deletions internal/exporter/exporter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"net/http/httptest"
"os"
"path/filepath"
"sync/atomic"
"testing"
"time"

Expand Down Expand Up @@ -560,17 +561,36 @@ func TestExportToHTTP(t *testing.T) {
require.NoError(t, err)
})

t.Run("skips when no auth token configured", func(t *testing.T) {
t.Run("updates token from server response", func(t *testing.T) {
newToken := "new-test-token"

// Create mock server that returns new token
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("jwt_assertion", newToken)
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("SUCCESS"))
}))
defer server.Close()

cfg := &config.HealthExporterConfig{
Interval: metav1.Duration{Duration: 1 * time.Minute},
Timeout: metav1.Duration{Duration: 30 * time.Second},
MetricsEndpoint: "http://example.com",
LogsEndpoint: "http://example.com",
AuthToken: "",
MetricsEndpoint: server.URL,
LogsEndpoint: server.URL,
AuthToken: "old-token",
}

ctx := context.Background()
exporter, err := New(ctx, WithConfig(cfg), WithMachineID("test-machine-id"))

// Create temporary database for testing token updates
tmpDB := setupTestDB(t)
defer tmpDB.Close()

exporter, err := New(ctx,
WithConfig(cfg),
WithDatabaseConnections(tmpDB, tmpDB),
WithMachineID("test-machine-id"),
)
require.NoError(t, err)
require.NotNil(t, exporter)

Expand All @@ -579,24 +599,39 @@ func TestExportToHTTP(t *testing.T) {
healthData := &collector.HealthData{
MachineID: "test-machine",
Timestamp: time.Now(),
Metrics: []pkgmetrics.Metric{
{
Name: "test_metric",
Value: 42.0,
UnixMilliseconds: time.Now().UnixMilli(),
},
},
}

err = he.exportToHTTP(ctx, healthData)
require.NoError(t, err) // Should not error, just skip gracefully
require.NoError(t, err)

// Verify token was updated in config
assert.Equal(t, newToken, he.options.config.AuthToken, "token should be refreshed in config")

// Verify token was persisted to DB
storedToken, err := pkgmetadata.ReadMetadata(ctx, tmpDB, pkgmetadata.MetadataKeyToken)
require.NoError(t, err)
assert.Equal(t, newToken, storedToken, "token should be persisted to database")

// Cleanup
err = exporter.Stop()
require.NoError(t, err)
})

t.Run("updates token from server response", func(t *testing.T) {
newToken := "new-test-token"

// Create mock server that returns new token
t.Run("exports without auth token when endpoints configured", func(t *testing.T) {
// Create mock server that accepts requests without Authorization header
var requestCount atomic.Int32
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("X-New-JWT-Token", newToken)
requestCount.Add(1)
assert.Equal(t, http.MethodPost, r.Method)
assert.Empty(t, r.Header.Get("Authorization"), "should not send Authorization header when token is empty")
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("SUCCESS"))
}))
defer server.Close()

Expand All @@ -605,20 +640,11 @@ func TestExportToHTTP(t *testing.T) {
Timeout: metav1.Duration{Duration: 30 * time.Second},
MetricsEndpoint: server.URL,
LogsEndpoint: server.URL,
AuthToken: "old-token",
AuthToken: "", // No auth token - should still export
}

ctx := context.Background()

// Create temporary database for testing token updates
tmpDB := setupTestDB(t)
defer tmpDB.Close()

exporter, err := New(ctx,
WithConfig(cfg),
WithDatabaseConnections(tmpDB, tmpDB),
WithMachineID("test-machine-id"),
)
exporter, err := New(ctx, WithConfig(cfg), WithMachineID("test-machine-id"))
require.NoError(t, err)
require.NotNil(t, exporter)

Expand All @@ -638,11 +664,12 @@ func TestExportToHTTP(t *testing.T) {

err = he.exportToHTTP(ctx, healthData)
require.NoError(t, err)
assert.Greater(t, requestCount.Load(), int32(0), "expected at least one request to the server")

// Cleanup
err = exporter.Stop()
require.NoError(t, err)
})

}

// TestExportNow tests the ExportNow function
Expand Down