Skip to content

Commit 741fa45

Browse files
authored
test(e2e): stabilize kafka and serviceintegration suites (#1089)
1 parent 6450c52 commit 741fa45

8 files changed

Lines changed: 140 additions & 198 deletions

tests/cassandra_test.go

Lines changed: 0 additions & 132 deletions
This file was deleted.

tests/kafkaacl_test.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import (
66
"context"
77
"fmt"
88
"testing"
9+
"time"
910

1011
avngen "github.com/aiven/go-client-codegen"
1112
"github.com/aiven/go-client-codegen/handler/kafka"
13+
"github.com/aiven/go-client-codegen/handler/kafkatopic"
1214
"github.com/stretchr/testify/assert"
1315
"github.com/stretchr/testify/require"
1416
"k8s.io/apimachinery/pkg/api/meta"
@@ -92,8 +94,13 @@ func TestKafkaACL(t *testing.T) {
9294
assert.Contains(t, serviceRunningStatesAiven, kafkaAvn.State)
9395

9496
// KafkaTopic
95-
topicAvn, err := avnGen.ServiceKafkaTopicGet(ctx, cfg.Project, kafkaName, topic.GetTopicName())
96-
require.NoError(t, err)
97+
var topicAvn *kafkatopic.ServiceKafkaTopicGetOut
98+
// Kafka topics are eventually consistent in Aiven API, so we poll until they become readable
99+
require.EventuallyWithT(t, func(collect *assert.CollectT) {
100+
topicAvn, err = avnGen.ServiceKafkaTopicGet(ctx, cfg.Project, kafkaName, topic.GetTopicName())
101+
assert.NoError(collect, err)
102+
}, 2*time.Minute, 10*time.Second)
103+
97104
assert.Equal(t, topicName, topic.GetName())
98105
assert.Equal(t, topicName, topic.GetTopicName())
99106
assert.Equal(t, topicAvn.TopicName, topic.GetTopicName())

tests/kafkaconnector_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func TestKafkaConnector(t *testing.T) {
7575
kcAvn, err := controllers.GetKafkaConnectorByName(ctx, avnGen, cfg.Project, kafkaName, connectorName)
7676
require.NoError(t, err)
7777
assert.Equal(t, kcAvn.Name, kafkaConnector.GetName())
78-
assert.Equal(t, kcAvn.Config.ConnectorClass, kafkaConnector.Spec.ConnectorClass)
78+
assert.Equal(t, kcAvn.Config["connector.class"], kafkaConnector.Spec.ConnectorClass)
7979

8080
// Validates Kafka Connector status
8181
status, err := avnGen.ServiceKafkaConnectGetConnectorStatus(ctx, cfg.Project, kafkaName, connectorName)

tests/kafkatopic_test.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ package tests
55
import (
66
"fmt"
77
"testing"
8+
"time"
89

10+
"github.com/aiven/go-client-codegen/handler/kafkatopic"
911
"github.com/stretchr/testify/assert"
1012
"github.com/stretchr/testify/require"
1113
"k8s.io/apimachinery/pkg/api/meta"
@@ -94,8 +96,13 @@ func TestKafkaTopic(t *testing.T) {
9496
assert.True(t, meta.IsStatusConditionTrue(barTopic.Status.Conditions, "Running"))
9597

9698
// KafkaTopic with dynamic name
97-
fooAvn, err := avnGen.ServiceKafkaTopicGet(ctx, cfg.Project, ksName, fooTopic.GetTopicName())
98-
require.NoError(t, err)
99+
var fooAvn *kafkatopic.ServiceKafkaTopicGetOut
100+
// Kafka topics are eventually consistent in Aiven API, so we poll until they become readable
101+
require.EventuallyWithT(t, func(collect *assert.CollectT) {
102+
fooAvn, err = avnGen.ServiceKafkaTopicGet(ctx, cfg.Project, ksName, fooTopic.GetTopicName())
103+
assert.NoError(collect, err)
104+
}, 2*time.Minute, 10*time.Second)
105+
99106
assert.Equal(t, fooTopicName, fooTopic.GetName())
100107
assert.Equal(t, fooTopicName, fooTopic.GetTopicName())
101108
assert.Equal(t, fooAvn.TopicName, fooTopic.GetTopicName())
@@ -112,8 +119,13 @@ func TestKafkaTopic(t *testing.T) {
112119
assert.Nil(t, fooTopic.Spec.Config.MaxMessageBytes)
113120

114121
// KafkaTopic with name `bar_topic_name_with_underscores`
115-
barAvn, err := avnGen.ServiceKafkaTopicGet(ctx, cfg.Project, ksName, barTopic.GetTopicName())
116-
require.NoError(t, err)
122+
var barAvn *kafkatopic.ServiceKafkaTopicGetOut
123+
// Kafka topics are eventually consistent in Aiven API, so we poll until they become readable
124+
require.EventuallyWithT(t, func(collect *assert.CollectT) {
125+
barAvn, err = avnGen.ServiceKafkaTopicGet(ctx, cfg.Project, ksName, barTopic.GetTopicName())
126+
assert.NoError(collect, err)
127+
}, 2*time.Minute, 10*time.Second)
128+
117129
assert.Equal(t, barTopicName, barTopic.GetName())
118130
assert.Equal(t, "bar_topic_name_with_underscores", barTopic.GetTopicName())
119131
assert.Equal(t, barAvn.TopicName, barTopic.GetTopicName())

tests/kafkschemaregistryacl_test.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ package tests
55
import (
66
"fmt"
77
"testing"
8+
"time"
89

910
"github.com/aiven/go-client-codegen/handler/kafkaschemaregistry"
11+
"github.com/aiven/go-client-codegen/handler/kafkatopic"
1012
"github.com/stretchr/testify/assert"
1113
"github.com/stretchr/testify/require"
1214
"k8s.io/apimachinery/pkg/api/meta"
@@ -110,8 +112,14 @@ func TestKafkaSchemaRegistryACL(t *testing.T) {
110112
// KafkaTopic
111113
// todo: replace with code-generated client, when the API schema is fixed:
112114
// json: cannot unmarshal string into Go struct field SynonymOut.topic.config.cleanup_policy.synonyms.value of type bool
113-
topicAvn, err := avnGen.ServiceKafkaTopicGet(ctx, cfg.Project, kafkaName, topic.GetTopicName())
114-
require.NoError(t, err)
115+
var topicAvn *kafkatopic.ServiceKafkaTopicGetOut
116+
// Kafka topics are eventually consistent in Aiven API, so we poll until they become readable
117+
require.EventuallyWithT(t, func(collect *assert.CollectT) {
118+
var getErr error
119+
topicAvn, getErr = avnGen.ServiceKafkaTopicGet(ctx, cfg.Project, kafkaName, topic.GetTopicName())
120+
assert.NoError(collect, getErr)
121+
}, 2*time.Minute, 10*time.Second)
122+
115123
assert.Equal(t, topicName, topic.GetName())
116124
assert.Equal(t, topicName, topic.GetTopicName())
117125
assert.Equal(t, topicAvn.TopicName, topic.GetTopicName())

tests/serviceintegration_test.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import (
77
"fmt"
88
"os"
99
"testing"
10+
"time"
1011

12+
"github.com/aiven/go-client-codegen/handler/kafkatopic"
1113
"github.com/aiven/go-client-codegen/handler/service"
1214
"github.com/stretchr/testify/assert"
1315
"github.com/stretchr/testify/require"
@@ -151,8 +153,14 @@ func TestServiceIntegrationKafkaLogs(t *testing.T) {
151153
assert.Equal(t, ksAvn.CloudName, ks.Spec.CloudName)
152154

153155
// Validates KafkaTopic
154-
ktAvn, err := avnGen.ServiceKafkaTopicGet(ctx, cfg.Project, ksName, ktName)
155-
require.NoError(t, err)
156+
var ktAvn *kafkatopic.ServiceKafkaTopicGetOut
157+
// Kafka topics are eventually consistent in Aiven API, so we poll until they become readable
158+
require.EventuallyWithT(t, func(collect *assert.CollectT) {
159+
var getErr error
160+
ktAvn, getErr = avnGen.ServiceKafkaTopicGet(ctx, cfg.Project, ksName, ktName)
161+
assert.NoError(collect, getErr)
162+
}, 2*time.Minute, 10*time.Second)
163+
156164
assert.Equal(t, ktAvn.TopicName, kt.GetName())
157165
assert.Equal(t, ktAvn.State, kt.Status.State)
158166
assert.Equal(t, ktAvn.Replication, kt.Spec.Replication)

tests/serviceuser_test.go

Lines changed: 60 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -299,52 +299,6 @@ func TestServiceUserCustomCredentials(t *testing.T) {
299299
}))
300300
})
301301

302-
t.Run("AvnadminPasswordReset", func(t *testing.T) {
303-
// Tests password reset functionality for the built-in 'avnadmin' user.
304-
// Verifies that the operator can modify credentials for system user and that
305-
// built-in users persist after ServiceUser resource deletion.
306-
yml := getServiceUserAvnadminResetYaml(cfg.Project, pgName, cfg.PrimaryCloudName)
307-
308-
require.NoError(t, s.Apply(yml))
309-
310-
user := new(v1alpha1.ServiceUser)
311-
require.NoError(t, s.GetRunning(user, "avnadmin"))
312-
313-
userAvn, err := getServiceUserWithRetry(ctx, avnGen, cfg.Project, pgName, "avnadmin")
314-
require.NoError(t, err)
315-
assert.Equal(t, "avnadmin", user.GetName())
316-
assert.Equal(t, "avnadmin", userAvn.Username)
317-
assert.Equal(t, pgName, user.Spec.ServiceName)
318-
319-
secret, err := s.GetSecret("my-avnadmin-secret")
320-
require.NoError(t, err)
321-
assert.NotEmpty(t, secret.Data["SERVICEUSER_HOST"])
322-
assert.NotEmpty(t, secret.Data["SERVICEUSER_PORT"])
323-
assert.NotEmpty(t, secret.Data["SERVICEUSER_USERNAME"])
324-
assert.NotEmpty(t, secret.Data["SERVICEUSER_PASSWORD"])
325-
assert.NotEmpty(t, secret.Data["SERVICEUSER_CA_CERT"])
326-
327-
actualUsernameInSecret := string(secret.Data["SERVICEUSER_USERNAME"])
328-
assert.Equal(t, "avnadmin", actualUsernameInSecret, "Username should be avnadmin")
329-
330-
// verify the password was reset to custom value
331-
actualPassword := string(secret.Data["SERVICEUSER_PASSWORD"])
332-
assert.Equal(t, "NewAvnadminPassword999!", actualPassword, "Password should match our custom avnadmin password")
333-
334-
assert.Equal(t, map[string]string{"test": "avnadmin-reset"}, secret.Annotations)
335-
assert.Equal(t, map[string]string{"type": "admin-password"}, secret.Labels)
336-
337-
// validate that built-in users persist after ServiceUser deletion
338-
assert.NoError(t, s.Delete(user, func() error {
339-
// avnadmin user should still exist after ServiceUser deletion since it's a built-in user
340-
_, err = avnGen.ServiceUserGet(ctx, cfg.Project, pgName, "avnadmin")
341-
if err != nil {
342-
return fmt.Errorf("avnadmin user should still exist after ServiceUser deletion: %w", err)
343-
}
344-
return nil
345-
}))
346-
})
347-
348302
t.Run("EmptyPasswordValidation", func(t *testing.T) {
349303
// Tests validation of empty passwords in connInfoSecretSource.
350304
// Verifies that the operator properly validates password requirements
@@ -363,6 +317,66 @@ func TestServiceUserCustomCredentials(t *testing.T) {
363317
})
364318
}
365319

320+
func TestServiceUserAvnadminPasswordReset(t *testing.T) {
321+
// Tests password reset functionality for the built-in 'avnadmin' user.
322+
// Verifies that the operator can modify credentials for system user and that
323+
// built-in users persist after ServiceUser resource deletion.
324+
defer recoverPanic(t)
325+
326+
ctx, cancel := testCtx()
327+
defer cancel()
328+
329+
pg, releasePG, err := sharedResources.AcquirePostgreSQL(ctx)
330+
require.NoError(t, err)
331+
defer releasePG()
332+
333+
pgName := pg.GetName()
334+
s := NewSession(ctx, k8sClient)
335+
336+
defer s.Destroy(t)
337+
338+
yml := getServiceUserAvnadminResetYaml(cfg.Project, pgName, cfg.PrimaryCloudName)
339+
340+
require.NoError(t, s.Apply(yml))
341+
342+
user := new(v1alpha1.ServiceUser)
343+
require.NoError(t, s.GetRunning(user, "avnadmin"))
344+
345+
userAvn, err := getServiceUserWithRetry(ctx, avnGen, cfg.Project, pgName, "avnadmin")
346+
require.NoError(t, err)
347+
assert.Equal(t, "avnadmin", user.GetName())
348+
assert.Equal(t, "avnadmin", userAvn.Username)
349+
assert.Equal(t, pgName, user.Spec.ServiceName)
350+
351+
secret, err := s.GetSecret("my-avnadmin-secret")
352+
require.NoError(t, err)
353+
assert.NotEmpty(t, secret.Data["SERVICEUSER_HOST"])
354+
assert.NotEmpty(t, secret.Data["SERVICEUSER_PORT"])
355+
assert.NotEmpty(t, secret.Data["SERVICEUSER_USERNAME"])
356+
assert.NotEmpty(t, secret.Data["SERVICEUSER_PASSWORD"])
357+
assert.NotEmpty(t, secret.Data["SERVICEUSER_CA_CERT"])
358+
359+
actualUsernameInSecret := string(secret.Data["SERVICEUSER_USERNAME"])
360+
assert.Equal(t, "avnadmin", actualUsernameInSecret, "Username should be avnadmin")
361+
362+
// verify the password was reset to custom value
363+
actualPassword := string(secret.Data["SERVICEUSER_PASSWORD"])
364+
assert.Equal(t, "NewAvnadminPassword999!", actualPassword, "Password should match our custom avnadmin password")
365+
366+
assert.Equal(t, map[string]string{"test": "avnadmin-reset"}, secret.Annotations)
367+
assert.Equal(t, map[string]string{"type": "admin-password"}, secret.Labels)
368+
369+
// validate that built-in users persist after ServiceUser deletion
370+
assert.NoError(t, s.Delete(user, func() error {
371+
// avnadmin user should still exist after ServiceUser deletion since it's a built-in user
372+
_, err = avnGen.ServiceUserGet(ctx, cfg.Project, pgName, "avnadmin")
373+
if err != nil {
374+
return fmt.Errorf("avnadmin user should still exist after ServiceUser deletion: %w", err)
375+
}
376+
return nil
377+
}))
378+
}
379+
366380
func getServiceUserWithSourceSecretYaml(project, pgName, userName, cloudName string) string {
367381
// secret name based on userName to avoid conflicts
368382
secretName := userName + "-secret"

0 commit comments

Comments
 (0)