diff --git a/integrations/operator/controllers/resources/appv3_controller_test.go b/integrations/operator/controllers/resources/appv3_controller_test.go index d84c41822c4..7f66e26bf4a 100644 --- a/integrations/operator/controllers/resources/appv3_controller_test.go +++ b/integrations/operator/controllers/resources/appv3_controller_test.go @@ -30,6 +30,7 @@ import ( "github.com/gravitational/teleport/api/types" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -125,15 +126,15 @@ func (g *appV3TestingPrimitives) CompareTeleportAndKubernetesResource(tResource func TestTeleportAppV3Creation(t *testing.T) { test := &appV3TestingPrimitives{} - testlib.ResourceCreationTest[types.Application, *resourcesv1.TeleportAppV3](t, test) + testlib.ResourceCreationSynchronousTest[types.Application, *resourcesv1.TeleportAppV3](t, resources.NewAppV3Reconciler, test) } func TestTeleportAppV3DeletionDrift(t *testing.T) { test := &appV3TestingPrimitives{} - testlib.ResourceDeletionDriftTest[types.Application, *resourcesv1.TeleportAppV3](t, test) + testlib.ResourceDeletionDriftSynchronousTest[types.Application, *resourcesv1.TeleportAppV3](t, resources.NewAppV3Reconciler, test) } func TestTeleportAppV3Update(t *testing.T) { test := &appV3TestingPrimitives{} - testlib.ResourceUpdateTest[types.Application, *resourcesv1.TeleportAppV3](t, test) + testlib.ResourceUpdateTestSynchronous[types.Application, *resourcesv1.TeleportAppV3](t, resources.NewAppV3Reconciler, test) } diff --git a/integrations/operator/controllers/resources/autoupdateconfig_controller_test.go b/integrations/operator/controllers/resources/autoupdateconfig_controller_test.go index e8c3a9724c8..d8b90e30a71 100644 --- a/integrations/operator/controllers/resources/autoupdateconfig_controller_test.go +++ b/integrations/operator/controllers/resources/autoupdateconfig_controller_test.go @@ -34,6 +34,7 @@ import ( "github.com/gravitational/teleport/api/types/autoupdate" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -168,15 +169,30 @@ func (g *autoUpdateConfigTestingPrimitives) CompareTeleportAndKubernetesResource func TestAutoUpdateConfigCreation(t *testing.T) { test := &autoUpdateConfigTestingPrimitives{} - testlib.ResourceCreationTest[*autoupdatev1pb.AutoUpdateConfig, *resourcesv1.TeleportAutoupdateConfigV1](t, test) + testlib.ResourceCreationSynchronousTest[*autoupdatev1pb.AutoUpdateConfig, *resourcesv1.TeleportAutoupdateConfigV1]( + t, + resources.NewAutoUpdateConfigV1Reconciler, + test, + testlib.WithResourceName(types.MetaNameAutoUpdateConfig), + ) } func TestAutoUpdateConfigDeletionDrift(t *testing.T) { test := &autoUpdateConfigTestingPrimitives{} - testlib.ResourceDeletionDriftTest[*autoupdatev1pb.AutoUpdateConfig, *resourcesv1.TeleportAutoupdateConfigV1](t, test) + testlib.ResourceDeletionDriftSynchronousTest[*autoupdatev1pb.AutoUpdateConfig, *resourcesv1.TeleportAutoupdateConfigV1]( + t, + resources.NewAutoUpdateConfigV1Reconciler, + test, + testlib.WithResourceName(types.MetaNameAutoUpdateConfig), + ) } func TestAutoUpdateConfigUpdate(t *testing.T) { test := &autoUpdateConfigTestingPrimitives{} - testlib.ResourceUpdateTest[*autoupdatev1pb.AutoUpdateConfig, *resourcesv1.TeleportAutoupdateConfigV1](t, test) + testlib.ResourceUpdateTestSynchronous[*autoupdatev1pb.AutoUpdateConfig, *resourcesv1.TeleportAutoupdateConfigV1]( + t, + resources.NewAutoUpdateConfigV1Reconciler, + test, + testlib.WithResourceName(types.MetaNameAutoUpdateConfig), + ) } diff --git a/integrations/operator/controllers/resources/autoupdateversion_controller_test.go b/integrations/operator/controllers/resources/autoupdateversion_controller_test.go index 71eafcb42a2..734306f0ba9 100644 --- a/integrations/operator/controllers/resources/autoupdateversion_controller_test.go +++ b/integrations/operator/controllers/resources/autoupdateversion_controller_test.go @@ -34,6 +34,7 @@ import ( "github.com/gravitational/teleport/api/types/autoupdate" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -148,15 +149,30 @@ func (g *autoUpdateVersionTestingPrimitives) CompareTeleportAndKubernetesResourc func TestAutoUpdateVersionCreation(t *testing.T) { test := &autoUpdateVersionTestingPrimitives{} - testlib.ResourceCreationTest[*autoupdatev1pb.AutoUpdateVersion, *resourcesv1.TeleportAutoupdateVersionV1](t, test) + testlib.ResourceCreationSynchronousTest[*autoupdatev1pb.AutoUpdateVersion, *resourcesv1.TeleportAutoupdateVersionV1]( + t, + resources.NewAutoUpdateVersionV1Reconciler, + test, + testlib.WithResourceName("autoupdate-version"), + ) } func TestAutoUpdateVersionDeletionDrift(t *testing.T) { test := &autoUpdateVersionTestingPrimitives{} - testlib.ResourceDeletionDriftTest[*autoupdatev1pb.AutoUpdateVersion, *resourcesv1.TeleportAutoupdateVersionV1](t, test) + testlib.ResourceDeletionDriftSynchronousTest[*autoupdatev1pb.AutoUpdateVersion, *resourcesv1.TeleportAutoupdateVersionV1]( + t, + resources.NewAutoUpdateVersionV1Reconciler, + test, + testlib.WithResourceName("autoupdate-version"), + ) } func TestAutoUpdateVersionUpdate(t *testing.T) { test := &autoUpdateVersionTestingPrimitives{} - testlib.ResourceUpdateTest[*autoupdatev1pb.AutoUpdateVersion, *resourcesv1.TeleportAutoupdateVersionV1](t, test) + testlib.ResourceUpdateTestSynchronous[*autoupdatev1pb.AutoUpdateVersion, *resourcesv1.TeleportAutoupdateVersionV1]( + t, + resources.NewAutoUpdateVersionV1Reconciler, + test, + testlib.WithResourceName("autoupdate-version"), + ) } diff --git a/integrations/operator/controllers/resources/botv1_controller_test.go b/integrations/operator/controllers/resources/botv1_controller_test.go index 07fe4dcee66..70b79d0c914 100644 --- a/integrations/operator/controllers/resources/botv1_controller_test.go +++ b/integrations/operator/controllers/resources/botv1_controller_test.go @@ -35,6 +35,7 @@ import ( "github.com/gravitational/teleport/api/types" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" "github.com/gravitational/teleport/lib/defaults" ) @@ -164,15 +165,15 @@ func (g *botTestingPrimitives) CompareTeleportAndKubernetesResource( func TestBotCreation(t *testing.T) { test := &botTestingPrimitives{} - testlib.ResourceCreationTest[*machineidv1.Bot, *resourcesv1.TeleportBotV1](t, test) + testlib.ResourceCreationSynchronousTest[*machineidv1.Bot, *resourcesv1.TeleportBotV1](t, resources.NewBotV1Reconciler, test) } func TestBotDeletionDrift(t *testing.T) { test := &botTestingPrimitives{} - testlib.ResourceDeletionDriftTest[*machineidv1.Bot, *resourcesv1.TeleportBotV1](t, test) + testlib.ResourceDeletionDriftSynchronousTest[*machineidv1.Bot, *resourcesv1.TeleportBotV1](t, resources.NewBotV1Reconciler, test) } func TestBotUpdate(t *testing.T) { test := &botTestingPrimitives{} - testlib.ResourceUpdateTest[*machineidv1.Bot, *resourcesv1.TeleportBotV1](t, test) + testlib.ResourceUpdateTestSynchronous[*machineidv1.Bot, *resourcesv1.TeleportBotV1](t, resources.NewBotV1Reconciler, test) } diff --git a/integrations/operator/controllers/resources/databasev3_controller_test.go b/integrations/operator/controllers/resources/databasev3_controller_test.go index 73c899da1a7..a9ff1760797 100644 --- a/integrations/operator/controllers/resources/databasev3_controller_test.go +++ b/integrations/operator/controllers/resources/databasev3_controller_test.go @@ -30,6 +30,7 @@ import ( "github.com/gravitational/teleport/api/types" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -118,15 +119,15 @@ func (g *databaseV3TestingPrimitives) CompareTeleportAndKubernetesResource(tReso func TestTeleportDatabaseV3Creation(t *testing.T) { test := &databaseV3TestingPrimitives{} - testlib.ResourceCreationTest[types.Database, *resourcesv1.TeleportDatabaseV3](t, test) + testlib.ResourceCreationSynchronousTest[types.Database, *resourcesv1.TeleportDatabaseV3](t, resources.NewDatabaseV3Reconciler, test) } func TestTeleportDatabaseV3DeletionDrift(t *testing.T) { test := &databaseV3TestingPrimitives{} - testlib.ResourceDeletionDriftTest[types.Database, *resourcesv1.TeleportDatabaseV3](t, test) + testlib.ResourceDeletionDriftSynchronousTest[types.Database, *resourcesv1.TeleportDatabaseV3](t, resources.NewDatabaseV3Reconciler, test) } func TestTeleportDatabaseV3Update(t *testing.T) { test := &databaseV3TestingPrimitives{} - testlib.ResourceUpdateTest[types.Database, *resourcesv1.TeleportDatabaseV3](t, test) + testlib.ResourceUpdateTestSynchronous[types.Database, *resourcesv1.TeleportDatabaseV3](t, resources.NewDatabaseV3Reconciler, test) } diff --git a/integrations/operator/controllers/resources/github_connector_controller_test.go b/integrations/operator/controllers/resources/github_connector_controller_test.go index 2bc074a1825..7fd801756bd 100644 --- a/integrations/operator/controllers/resources/github_connector_controller_test.go +++ b/integrations/operator/controllers/resources/github_connector_controller_test.go @@ -27,11 +27,14 @@ import ( "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + apimachinerytypes "k8s.io/apimachinery/pkg/types" kclient "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/gravitational/teleport/api/types" resourcesv3 "github.com/gravitational/teleport/integrations/operator/apis/resources/v3" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/secretlookup" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -127,22 +130,22 @@ func (g *githubTestingPrimitives) CompareTeleportAndKubernetesResource(tResource func TestGithubConnectorCreation(t *testing.T) { test := &githubTestingPrimitives{} - testlib.ResourceCreationTest[types.GithubConnector, *resourcesv3.TeleportGithubConnector](t, test) + testlib.ResourceCreationSynchronousTest[types.GithubConnector, *resourcesv3.TeleportGithubConnector](t, resources.NewGithubConnectorReconciler, test) } func TestGithubConnectorDeletionDrift(t *testing.T) { test := &githubTestingPrimitives{} - testlib.ResourceDeletionDriftTest[types.GithubConnector, *resourcesv3.TeleportGithubConnector](t, test) + testlib.ResourceDeletionDriftSynchronousTest[types.GithubConnector, *resourcesv3.TeleportGithubConnector](t, resources.NewGithubConnectorReconciler, test) } func TestGithubConnectorUpdate(t *testing.T) { test := &githubTestingPrimitives{} - testlib.ResourceUpdateTest[types.GithubConnector, *resourcesv3.TeleportGithubConnector](t, test) + testlib.ResourceUpdateTestSynchronous[types.GithubConnector, *resourcesv3.TeleportGithubConnector](t, resources.NewGithubConnectorReconciler, test) } func TestGithubConnectorSecretLookup(t *testing.T) { test := &githubTestingPrimitives{} - setup := testlib.SetupTestEnv(t) + setup := testlib.SetupFakeKubeTestEnv(t) test.Init(setup) ctx := context.Background() @@ -159,6 +162,11 @@ func TestGithubConnectorSecretLookup(t *testing.T) { secretlookup.AllowLookupAnnotation: crName, }, }, + // Real kube servers convert stringData into data. + // The fake client does not, so we must use Data instead. + Data: map[string][]byte{ + secretKey: []byte(secretValue), + }, StringData: map[string]string{ secretKey: secretValue, }, @@ -179,6 +187,24 @@ func TestGithubConnectorSecretLookup(t *testing.T) { require.NoError(t, kubeClient.Create(ctx, github)) + reconciler, err := resources.NewGithubConnectorReconciler(kubeClient, setup.TeleportClient) + require.NoError(t, err) + // Test execution: Kick off the reconciliation. + req := reconcile.Request{ + NamespacedName: apimachinerytypes.NamespacedName{ + Namespace: setup.Namespace.Name, + Name: crName, + }, + } + // First reconciliation should set the finalizer and exit. + _, err = reconciler.Reconcile(ctx, req) + require.NoError(t, err) + // Second reconciliation should create the Teleport resource. + // In a real cluster we should receive the event of our own finalizer change + // and this wakes us for a second round. + _, err = reconciler.Reconcile(ctx, req) + require.NoError(t, err) + testlib.FastEventually(t, func() bool { gh, err := test.GetTeleportResource(ctx, crName) if err != nil { diff --git a/integrations/operator/controllers/resources/oidc_connector_controller_test.go b/integrations/operator/controllers/resources/oidc_connector_controller_test.go index 39359c27049..cdb57421ba9 100644 --- a/integrations/operator/controllers/resources/oidc_connector_controller_test.go +++ b/integrations/operator/controllers/resources/oidc_connector_controller_test.go @@ -28,11 +28,14 @@ import ( "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + apimachinerytypes "k8s.io/apimachinery/pkg/types" kclient "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/gravitational/teleport/api/types" resourcesv3 "github.com/gravitational/teleport/integrations/operator/apis/resources/v3" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/secretlookup" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -128,22 +131,22 @@ func (g *oidcTestingPrimitives) CompareTeleportAndKubernetesResource(tResource t func TestOIDCConnectorCreation(t *testing.T) { test := &oidcTestingPrimitives{} - testlib.ResourceCreationTest[types.OIDCConnector, *resourcesv3.TeleportOIDCConnector](t, test) + testlib.ResourceCreationSynchronousTest[types.OIDCConnector, *resourcesv3.TeleportOIDCConnector](t, resources.NewOIDCConnectorReconciler, test) } func TestOIDCConnectorDeletionDrift(t *testing.T) { test := &oidcTestingPrimitives{} - testlib.ResourceDeletionDriftTest[types.OIDCConnector, *resourcesv3.TeleportOIDCConnector](t, test) + testlib.ResourceDeletionDriftSynchronousTest[types.OIDCConnector, *resourcesv3.TeleportOIDCConnector](t, resources.NewOIDCConnectorReconciler, test) } func TestOIDCConnectorUpdate(t *testing.T) { test := &oidcTestingPrimitives{} - testlib.ResourceUpdateTest[types.OIDCConnector, *resourcesv3.TeleportOIDCConnector](t, test) + testlib.ResourceUpdateTestSynchronous[types.OIDCConnector, *resourcesv3.TeleportOIDCConnector](t, resources.NewOIDCConnectorReconciler, test) } func TestOIDCConnectorSecretLookup(t *testing.T) { test := &oidcTestingPrimitives{} - setup := testlib.SetupTestEnv(t) + setup := testlib.SetupFakeKubeTestEnv(t) test.Init(setup) ctx := context.Background() @@ -160,8 +163,10 @@ func TestOIDCConnectorSecretLookup(t *testing.T) { secretlookup.AllowLookupAnnotation: crName, }, }, - StringData: map[string]string{ - secretKey: secretValue, + // Real kube servers convert stringData into data. + // The fake client does not, so we must use Data instead. + Data: map[string][]byte{ + secretKey: []byte(secretValue), }, Type: v1.SecretTypeOpaque, } @@ -177,9 +182,26 @@ func TestOIDCConnectorSecretLookup(t *testing.T) { } oidc.Spec.ClientSecret = "secret://" + secretName + "/" + secretKey - require.NoError(t, kubeClient.Create(ctx, oidc)) + reconciler, err := resources.NewOIDCConnectorReconciler(kubeClient, setup.TeleportClient) + require.NoError(t, err) + // Test execution: Kick off the reconciliation. + req := reconcile.Request{ + NamespacedName: apimachinerytypes.NamespacedName{ + Namespace: setup.Namespace.Name, + Name: crName, + }, + } + // First reconciliation should set the finalizer and exit. + _, err = reconciler.Reconcile(ctx, req) + require.NoError(t, err) + // Second reconciliation should create the Teleport resource. + // In a real cluster we should receive the event of our own finalizer change + // and this wakes us for a second round. + _, err = reconciler.Reconcile(ctx, req) + require.NoError(t, err) + testlib.FastEventually(t, func() bool { oidc, err := test.GetTeleportResource(ctx, crName) if err != nil { diff --git a/integrations/operator/controllers/resources/okta_import_rule_controller_test.go b/integrations/operator/controllers/resources/okta_import_rule_controller_test.go index c12a522b09e..29a127f5d19 100644 --- a/integrations/operator/controllers/resources/okta_import_rule_controller_test.go +++ b/integrations/operator/controllers/resources/okta_import_rule_controller_test.go @@ -31,6 +31,7 @@ import ( "github.com/gravitational/teleport/api/types" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -162,17 +163,17 @@ func (g *oktaImportRuleTestingPrimitives) CompareTeleportAndKubernetesResource(t func TestOktaImportRuleCreation(t *testing.T) { t.Skip("Skipping test since okta reconsider is not available in OSS") test := &oktaImportRuleTestingPrimitives{} - testlib.ResourceCreationTest[types.OktaImportRule, *resourcesv1.TeleportOktaImportRule](t, test) + testlib.ResourceCreationSynchronousTest[types.OktaImportRule, *resourcesv1.TeleportOktaImportRule](t, resources.NewOktaImportRuleReconciler, test) } func TestOktaImportRuleDeletionDrift(t *testing.T) { t.Skip("Skipping test since okta reconsider is not available in OSS") test := &oktaImportRuleTestingPrimitives{} - testlib.ResourceDeletionDriftTest[types.OktaImportRule, *resourcesv1.TeleportOktaImportRule](t, test) + testlib.ResourceDeletionDriftSynchronousTest[types.OktaImportRule, *resourcesv1.TeleportOktaImportRule](t, resources.NewOktaImportRuleReconciler, test) } func TestOktaImportRuleUpdate(t *testing.T) { t.Skip("Skipping test since okta reconsider is not available in OSS") test := &oktaImportRuleTestingPrimitives{} - testlib.ResourceUpdateTest[types.OktaImportRule, *resourcesv1.TeleportOktaImportRule](t, test) + testlib.ResourceUpdateTestSynchronous[types.OktaImportRule, *resourcesv1.TeleportOktaImportRule](t, resources.NewOktaImportRuleReconciler, test) } diff --git a/integrations/operator/controllers/resources/openssheiceserverv2_controller_test.go b/integrations/operator/controllers/resources/openssheiceserverv2_controller_test.go index fbfdebdc617..ed497226069 100644 --- a/integrations/operator/controllers/resources/openssheiceserverv2_controller_test.go +++ b/integrations/operator/controllers/resources/openssheiceserverv2_controller_test.go @@ -31,6 +31,7 @@ import ( "github.com/gravitational/teleport/api/types" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -125,15 +126,15 @@ func (g *opensshEICEServerV2TestingPrimitives) CompareTeleportAndKubernetesResou func TestTeleportOpensshEICEServerV2Creation(t *testing.T) { test := &opensshEICEServerV2TestingPrimitives{} - testlib.ResourceCreationTest[types.Server, *resourcesv1.TeleportOpenSSHEICEServerV2](t, test) + testlib.ResourceCreationSynchronousTest[types.Server, *resourcesv1.TeleportOpenSSHEICEServerV2](t, resources.NewOpenSSHEICEServerV2Reconciler, test) } func TestTeleportOpensshEICEServerV2DeletionDrift(t *testing.T) { test := &opensshEICEServerV2TestingPrimitives{} - testlib.ResourceDeletionDriftTest[types.Server, *resourcesv1.TeleportOpenSSHEICEServerV2](t, test) + testlib.ResourceDeletionDriftSynchronousTest[types.Server, *resourcesv1.TeleportOpenSSHEICEServerV2](t, resources.NewOpenSSHEICEServerV2Reconciler, test) } func TestTeleportOpensshEICEServerV2Update(t *testing.T) { test := &opensshEICEServerV2TestingPrimitives{} - testlib.ResourceUpdateTest[types.Server, *resourcesv1.TeleportOpenSSHEICEServerV2](t, test) + testlib.ResourceUpdateTestSynchronous[types.Server, *resourcesv1.TeleportOpenSSHEICEServerV2](t, resources.NewOpenSSHEICEServerV2Reconciler, test) } diff --git a/integrations/operator/controllers/resources/opensshserverv2_controller_test.go b/integrations/operator/controllers/resources/opensshserverv2_controller_test.go index fc0c353ce8e..76bc561e585 100644 --- a/integrations/operator/controllers/resources/opensshserverv2_controller_test.go +++ b/integrations/operator/controllers/resources/opensshserverv2_controller_test.go @@ -31,6 +31,7 @@ import ( "github.com/gravitational/teleport/api/types" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -117,15 +118,15 @@ func (g *opensshServerV2TestingPrimitives) CompareTeleportAndKubernetesResource( func TestTeleportOpensshServerV2Creation(t *testing.T) { test := &opensshServerV2TestingPrimitives{} - testlib.ResourceCreationTest[types.Server, *resourcesv1.TeleportOpenSSHServerV2](t, test) + testlib.ResourceCreationSynchronousTest[types.Server, *resourcesv1.TeleportOpenSSHServerV2](t, resources.NewOpenSSHServerV2Reconciler, test) } func TestTeleportOpensshServerV2DeletionDrift(t *testing.T) { test := &opensshServerV2TestingPrimitives{} - testlib.ResourceDeletionDriftTest[types.Server, *resourcesv1.TeleportOpenSSHServerV2](t, test) + testlib.ResourceDeletionDriftSynchronousTest[types.Server, *resourcesv1.TeleportOpenSSHServerV2](t, resources.NewOpenSSHServerV2Reconciler, test) } func TestTeleportOpensshServerV2Update(t *testing.T) { test := &opensshServerV2TestingPrimitives{} - testlib.ResourceUpdateTest[types.Server, *resourcesv1.TeleportOpenSSHServerV2](t, test) + testlib.ResourceUpdateTestSynchronous[types.Server, *resourcesv1.TeleportOpenSSHServerV2](t, resources.NewOpenSSHServerV2Reconciler, test) } diff --git a/integrations/operator/controllers/resources/provision_token_controller_test.go b/integrations/operator/controllers/resources/provision_token_controller_test.go index 8a6ee0b54b5..f6e9f994d14 100644 --- a/integrations/operator/controllers/resources/provision_token_controller_test.go +++ b/integrations/operator/controllers/resources/provision_token_controller_test.go @@ -27,12 +27,15 @@ import ( "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" + apimachinerytypes "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/yaml" kclient "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/gravitational/teleport/api/types" resourcesv2 "github.com/gravitational/teleport/integrations/operator/apis/resources/v2" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -148,17 +151,17 @@ func (g *tokenTestingPrimitives) CompareTeleportAndKubernetesResource(tResource func TestProvisionTokenCreation(t *testing.T) { test := &tokenTestingPrimitives{} - testlib.ResourceCreationTest[types.ProvisionToken, *resourcesv2.TeleportProvisionToken](t, test) + testlib.ResourceCreationSynchronousTest[types.ProvisionToken, *resourcesv2.TeleportProvisionToken](t, resources.NewProvisionTokenReconciler, test) } func TestProvisionTokenDeletionDrift(t *testing.T) { test := &tokenTestingPrimitives{} - testlib.ResourceDeletionDriftTest[types.ProvisionToken, *resourcesv2.TeleportProvisionToken](t, test) + testlib.ResourceDeletionDriftSynchronousTest[types.ProvisionToken, *resourcesv2.TeleportProvisionToken](t, resources.NewProvisionTokenReconciler, test) } func TestProvisionTokenUpdate(t *testing.T) { test := &tokenTestingPrimitives{} - testlib.ResourceUpdateTest[types.ProvisionToken, *resourcesv2.TeleportProvisionToken](t, test) + testlib.ResourceUpdateTestSynchronous[types.ProvisionToken, *resourcesv2.TeleportProvisionToken](t, resources.NewProvisionTokenReconciler, test) } // This test checks the operator can create Token resources in Teleport for a @@ -172,7 +175,7 @@ func TestProvisionTokenUpdate(t *testing.T) { func TestProvisionTokenCreation_GitHubBot(t *testing.T) { // Test setup ctx := context.Background() - setup := setupTestEnv(t) + setup := testlib.SetupFakeKubeTestEnv(t) require.NoError(t, teleportCreateDummyRole(ctx, "a", setup.TeleportClient)) tokenSpecYAML := ` @@ -204,10 +207,29 @@ github: obj.SetName(tokenName) obj.SetNamespace(setup.Namespace.Name) - // Doing the test: we create the TeleportProvisionToken in Kubernetes + // Text execution: create the TeleportProvisionToken in Kubernetes err = setup.K8sClient.Create(ctx, obj) require.NoError(t, err) + reconciler, err := resources.NewProvisionTokenReconciler(setup.K8sClient, setup.TeleportClient) + require.NoError(t, err) + + // Test execution: Kick off the reconciliation. + req := reconcile.Request{ + NamespacedName: apimachinerytypes.NamespacedName{ + Namespace: setup.Namespace.Name, + Name: tokenName, + }, + } + // First reconciliation should set the finalizer and exit. + _, err = reconciler.Reconcile(ctx, req) + require.NoError(t, err) + // Second reconciliation should create the Teleport resource. + // In a real cluster we should receive the event of our own finalizer change + // and this wakes us for a second round. + _, err = reconciler.Reconcile(ctx, req) + require.NoError(t, err) + // Then we wait for the token to be created in Teleport fastEventually(t, func() bool { tToken, err := setup.TeleportClient.GetToken(ctx, tokenName) @@ -229,14 +251,13 @@ github: return true }) - // Test Teardown + // Test cleanup: Delete the resource to avoid leftover state if we were running on a real instance. require.NoError(t, setup.K8sClient.Delete(ctx, obj)) - // We wait for the role deletion in Teleport - fastEventually(t, func() bool { - _, err := setup.TeleportClient.GetToken(ctx, tokenName) - return trace.IsNotFound(err) - }) + require.NoError(t, setup.TeleportClient.DeleteToken(ctx, tokenName)) + // Kicking of a reconciliation to remove the finalizer and let Kube remove the resource. + _, err = reconciler.Reconcile(ctx, req) + require.NoError(t, err) } func compareTokenSpecs(t *testing.T, expectedUser, actualUser types.ProvisionToken) { diff --git a/integrations/operator/controllers/resources/rolev6_controller_test.go b/integrations/operator/controllers/resources/rolev6_controller_test.go index 35b913cbbb2..485415b27e6 100644 --- a/integrations/operator/controllers/resources/rolev6_controller_test.go +++ b/integrations/operator/controllers/resources/rolev6_controller_test.go @@ -31,6 +31,7 @@ import ( "github.com/gravitational/teleport/api/types" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -134,15 +135,15 @@ func (g *roleV6TestingPrimitives) CompareTeleportAndKubernetesResource(tResource func TestTeleportRoleV6Creation(t *testing.T) { test := &roleV6TestingPrimitives{} - testlib.ResourceCreationTest[types.Role, *resourcesv1.TeleportRoleV6](t, test) + testlib.ResourceCreationSynchronousTest[types.Role, *resourcesv1.TeleportRoleV6](t, resources.NewRoleV6Reconciler, test) } func TestTeleportRoleV6DeletionDrift(t *testing.T) { test := &roleV6TestingPrimitives{} - testlib.ResourceDeletionDriftTest[types.Role, *resourcesv1.TeleportRoleV6](t, test) + testlib.ResourceDeletionDriftSynchronousTest[types.Role, *resourcesv1.TeleportRoleV6](t, resources.NewRoleV6Reconciler, test) } func TestTeleportRoleV6Update(t *testing.T) { test := &roleV6TestingPrimitives{} - testlib.ResourceUpdateTest[types.Role, *resourcesv1.TeleportRoleV6](t, test) + testlib.ResourceUpdateTestSynchronous[types.Role, *resourcesv1.TeleportRoleV6](t, resources.NewRoleV6Reconciler, test) } diff --git a/integrations/operator/controllers/resources/rolev7_controller_test.go b/integrations/operator/controllers/resources/rolev7_controller_test.go index 181c930b0ac..016b56f0444 100644 --- a/integrations/operator/controllers/resources/rolev7_controller_test.go +++ b/integrations/operator/controllers/resources/rolev7_controller_test.go @@ -31,6 +31,7 @@ import ( "github.com/gravitational/teleport/api/types" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -131,15 +132,15 @@ func (g *roleV7TestingPrimitives) CompareTeleportAndKubernetesResource(tResource func TestTeleportRoleV7Creation(t *testing.T) { test := &roleV7TestingPrimitives{} - testlib.ResourceCreationTest[types.Role, *resourcesv1.TeleportRoleV7](t, test) + testlib.ResourceCreationSynchronousTest[types.Role, *resourcesv1.TeleportRoleV7](t, resources.NewRoleV7Reconciler, test) } func TestTeleportRoleV7DeletionDrift(t *testing.T) { test := &roleV7TestingPrimitives{} - testlib.ResourceDeletionDriftTest[types.Role, *resourcesv1.TeleportRoleV7](t, test) + testlib.ResourceDeletionDriftSynchronousTest[types.Role, *resourcesv1.TeleportRoleV7](t, resources.NewRoleV7Reconciler, test) } func TestTeleportRoleV7Update(t *testing.T) { test := &roleV7TestingPrimitives{} - testlib.ResourceUpdateTest[types.Role, *resourcesv1.TeleportRoleV7](t, test) + testlib.ResourceUpdateTestSynchronous[types.Role, *resourcesv1.TeleportRoleV7](t, resources.NewRoleV7Reconciler, test) } diff --git a/integrations/operator/controllers/resources/rolev8_controller_test.go b/integrations/operator/controllers/resources/rolev8_controller_test.go index 7ca36c297ab..693ba3b91b8 100644 --- a/integrations/operator/controllers/resources/rolev8_controller_test.go +++ b/integrations/operator/controllers/resources/rolev8_controller_test.go @@ -31,6 +31,7 @@ import ( "github.com/gravitational/teleport/api/types" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -133,15 +134,15 @@ func (g *roleV8TestingPrimitives) CompareTeleportAndKubernetesResource(tResource func TestTeleportRoleV8Creation(t *testing.T) { test := &roleV8TestingPrimitives{} - testlib.ResourceCreationTest[types.Role, *resourcesv1.TeleportRoleV8](t, test) + testlib.ResourceCreationSynchronousTest[types.Role, *resourcesv1.TeleportRoleV8](t, resources.NewRoleV8Reconciler, test) } func TestTeleportRoleV8DeletionDrift(t *testing.T) { test := &roleV8TestingPrimitives{} - testlib.ResourceDeletionDriftTest[types.Role, *resourcesv1.TeleportRoleV8](t, test) + testlib.ResourceDeletionDriftSynchronousTest[types.Role, *resourcesv1.TeleportRoleV8](t, resources.NewRoleV8Reconciler, test) } func TestTeleportRoleV8Update(t *testing.T) { test := &roleV8TestingPrimitives{} - testlib.ResourceUpdateTest[types.Role, *resourcesv1.TeleportRoleV8](t, test) + testlib.ResourceUpdateTestSynchronous[types.Role, *resourcesv1.TeleportRoleV8](t, resources.NewRoleV8Reconciler, test) } diff --git a/integrations/operator/controllers/resources/testlib/accesslist_controller_tests.go b/integrations/operator/controllers/resources/testlib/accesslist_controller_tests.go index caba7e10a26..4532ea87b58 100644 --- a/integrations/operator/controllers/resources/testlib/accesslist_controller_tests.go +++ b/integrations/operator/controllers/resources/testlib/accesslist_controller_tests.go @@ -165,17 +165,32 @@ func (g *accessListTestingPrimitives) CompareTeleportAndKubernetesResource(tReso func AccessListCreationTest(t *testing.T, clt *client.Client) { test := &accessListTestingPrimitives{} - ResourceCreationTest[*accesslist.AccessList, *resourcesv1.TeleportAccessList](t, test, WithTeleportClient(clt)) + ResourceCreationSynchronousTest[*accesslist.AccessList, *resourcesv1.TeleportAccessList]( + t, + resources.NewAccessListReconciler, + test, + WithTeleportClient(clt), + ) } func AccessListDeletionDriftTest(t *testing.T, clt *client.Client) { test := &accessListTestingPrimitives{} - ResourceDeletionDriftTest[*accesslist.AccessList, *resourcesv1.TeleportAccessList](t, test, WithTeleportClient(clt)) + ResourceDeletionDriftSynchronousTest[*accesslist.AccessList, *resourcesv1.TeleportAccessList]( + t, + resources.NewAccessListReconciler, + test, + WithTeleportClient(clt), + ) } func AccessListUpdateTest(t *testing.T, clt *client.Client) { test := &accessListTestingPrimitives{} - ResourceUpdateTest[*accesslist.AccessList, *resourcesv1.TeleportAccessList](t, test, WithTeleportClient(clt)) + ResourceUpdateTestSynchronous[*accesslist.AccessList, *resourcesv1.TeleportAccessList]( + t, + resources.NewAccessListReconciler, + test, + WithTeleportClient(clt), + ) } // AccessListMutateExistingTest checks that the operator propagates the expiry diff --git a/integrations/operator/controllers/resources/testlib/login_rule_controller_tests.go b/integrations/operator/controllers/resources/testlib/login_rule_controller_tests.go index 743e059faf9..624c2b5ca1e 100644 --- a/integrations/operator/controllers/resources/testlib/login_rule_controller_tests.go +++ b/integrations/operator/controllers/resources/testlib/login_rule_controller_tests.go @@ -35,6 +35,7 @@ import ( "github.com/gravitational/teleport/api/types/wrappers" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" ) type loginRuleTestingPrimitives struct { @@ -146,15 +147,30 @@ func (l *loginRuleTestingPrimitives) CompareTeleportAndKubernetesResource( func LoginRuleCreationTest(t *testing.T, clt *client.Client) { test := &loginRuleTestingPrimitives{} - ResourceCreationTest[*resourcesv1.LoginRuleResource, *resourcesv1.TeleportLoginRule](t, test, WithTeleportClient(clt)) + ResourceCreationSynchronousTest[*resourcesv1.LoginRuleResource, *resourcesv1.TeleportLoginRule]( + t, + resources.NewLoginRuleReconciler, + test, + WithTeleportClient(clt), + ) } func LoginRuleDeletionDriftTest(t *testing.T, clt *client.Client) { test := &loginRuleTestingPrimitives{} - ResourceDeletionDriftTest[*resourcesv1.LoginRuleResource, *resourcesv1.TeleportLoginRule](t, test, WithTeleportClient(clt)) + ResourceDeletionDriftSynchronousTest[*resourcesv1.LoginRuleResource, *resourcesv1.TeleportLoginRule]( + t, + resources.NewLoginRuleReconciler, + test, + WithTeleportClient(clt), + ) } func LoginRuleUpdateTest(t *testing.T, clt *client.Client) { test := &loginRuleTestingPrimitives{} - ResourceUpdateTest[*resourcesv1.LoginRuleResource, *resourcesv1.TeleportLoginRule](t, test, WithTeleportClient(clt)) + ResourceUpdateTestSynchronous[*resourcesv1.LoginRuleResource, *resourcesv1.TeleportLoginRule]( + t, + resources.NewLoginRuleReconciler, + test, + WithTeleportClient(clt), + ) } diff --git a/integrations/operator/controllers/resources/workload_identityv1_controller_test.go b/integrations/operator/controllers/resources/workload_identityv1_controller_test.go index 3b66d811c86..a2c371d06d5 100644 --- a/integrations/operator/controllers/resources/workload_identityv1_controller_test.go +++ b/integrations/operator/controllers/resources/workload_identityv1_controller_test.go @@ -32,6 +32,7 @@ import ( "github.com/gravitational/teleport/api/types" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" "github.com/gravitational/teleport/integrations/operator/controllers/reconcilers" + "github.com/gravitational/teleport/integrations/operator/controllers/resources" "github.com/gravitational/teleport/integrations/operator/controllers/resources/testlib" ) @@ -187,24 +188,24 @@ func (g *workloadIdentityTestingPrimitives) CompareTeleportAndKubernetesResource func TestWorkloadIdentityCreation(t *testing.T) { test := &workloadIdentityTestingPrimitives{} - testlib.ResourceCreationTest[ + testlib.ResourceCreationSynchronousTest[ *workloadidentityv1.WorkloadIdentity, *resourcesv1.TeleportWorkloadIdentityV1, - ](t, test) + ](t, resources.NewWorkloadIdentityV1Reconciler, test) } func TestWorkloadIdentityDeletionDrift(t *testing.T) { test := &workloadIdentityTestingPrimitives{} - testlib.ResourceDeletionDriftTest[ + testlib.ResourceDeletionDriftSynchronousTest[ *workloadidentityv1.WorkloadIdentity, *resourcesv1.TeleportWorkloadIdentityV1, - ](t, test) + ](t, resources.NewWorkloadIdentityV1Reconciler, test) } func TestWorkloadIdentityUpdate(t *testing.T) { test := &workloadIdentityTestingPrimitives{} - testlib.ResourceUpdateTest[ + testlib.ResourceUpdateTestSynchronous[ *workloadidentityv1.WorkloadIdentity, *resourcesv1.TeleportWorkloadIdentityV1, - ](t, test) + ](t, resources.NewWorkloadIdentityV1Reconciler, test) }