diff --git a/controllers/actions.github.com/autoscalinglistener_controller_test.go b/controllers/actions.github.com/autoscalinglistener_controller_test.go index d5cf3280..487d9eb6 100644 --- a/controllers/actions.github.com/autoscalinglistener_controller_test.go +++ b/controllers/actions.github.com/autoscalinglistener_controller_test.go @@ -28,46 +28,23 @@ const ( var _ = Describe("Test AutoScalingListener controller", func() { var ctx context.Context - var cancel context.CancelFunc - autoscalingNS := new(corev1.Namespace) - autoscalingRunnerSet := new(actionsv1alpha1.AutoscalingRunnerSet) - configSecret := new(corev1.Secret) - autoscalingListener := new(actionsv1alpha1.AutoscalingListener) + var mgr ctrl.Manager + var autoscalingNS *corev1.Namespace + var autoscalingRunnerSet *actionsv1alpha1.AutoscalingRunnerSet + var configSecret *corev1.Secret + var autoscalingListener *actionsv1alpha1.AutoscalingListener BeforeEach(func() { - ctx, cancel = context.WithCancel(context.TODO()) - autoscalingNS = &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling-listener" + RandStringRunes(5)}, - } - - err := k8sClient.Create(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to create test namespace for AutoScalingRunnerSet") - - configSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "github-config-secret", - Namespace: autoscalingNS.Name, - }, - Data: map[string][]byte{ - "github_token": []byte(autoscalingListenerTestGitHubToken), - }, - } - - err = k8sClient.Create(ctx, configSecret) - Expect(err).NotTo(HaveOccurred(), "failed to create config secret") - - mgr, err := ctrl.NewManager(cfg, ctrl.Options{ - Namespace: autoscalingNS.Name, - MetricsBindAddress: "0", - }) - Expect(err).NotTo(HaveOccurred(), "failed to create manager") + ctx = context.Background() + autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient) + configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name) controller := &AutoscalingListenerReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: logf.Log, } - err = controller.SetupWithManager(mgr) + err := controller.SetupWithManager(mgr) Expect(err).NotTo(HaveOccurred(), "failed to setup controller") min := 1 @@ -119,19 +96,7 @@ var _ = Describe("Test AutoScalingListener controller", func() { err = k8sClient.Create(ctx, autoscalingListener) Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingListener") - go func() { - defer GinkgoRecover() - - err := mgr.Start(ctx) - Expect(err).NotTo(HaveOccurred(), "failed to start manager") - }() - }) - - AfterEach(func() { - defer cancel() - - err := k8sClient.Delete(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to delete test namespace for AutoScalingRunnerSet") + startManagers(GinkgoT(), mgr) }) Context("When creating a new AutoScalingListener", func() { @@ -396,11 +361,11 @@ var _ = Describe("Test AutoScalingListener controller", func() { var _ = Describe("Test AutoScalingListener controller with proxy", func() { var ctx context.Context - var cancel context.CancelFunc - autoscalingNS := new(corev1.Namespace) - autoscalingRunnerSet := new(actionsv1alpha1.AutoscalingRunnerSet) - configSecret := new(corev1.Secret) - autoscalingListener := new(actionsv1alpha1.AutoscalingListener) + var mgr ctrl.Manager + var autoscalingNS *corev1.Namespace + var autoscalingRunnerSet *actionsv1alpha1.AutoscalingRunnerSet + var configSecret *corev1.Secret + var autoscalingListener *actionsv1alpha1.AutoscalingListener createRunnerSetAndListener := func(proxy *actionsv1alpha1.ProxyConfig) { min := 1 @@ -456,54 +421,19 @@ var _ = Describe("Test AutoScalingListener controller with proxy", func() { } BeforeEach(func() { - ctx, cancel = context.WithCancel(context.TODO()) - autoscalingNS = &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling-listener" + RandStringRunes(5)}, - } - - err := k8sClient.Create(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to create test namespace for AutoScalingRunnerSet") - - configSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "github-config-secret", - Namespace: autoscalingNS.Name, - }, - Data: map[string][]byte{ - "github_token": []byte(autoscalingListenerTestGitHubToken), - }, - } - - err = k8sClient.Create(ctx, configSecret) - Expect(err).NotTo(HaveOccurred(), "failed to create config secret") - - mgr, err := ctrl.NewManager(cfg, ctrl.Options{ - Namespace: autoscalingNS.Name, - MetricsBindAddress: "0", - }) - Expect(err).NotTo(HaveOccurred(), "failed to create manager") + ctx = context.Background() + autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient) + configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name) controller := &AutoscalingListenerReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: logf.Log, } - err = controller.SetupWithManager(mgr) + err := controller.SetupWithManager(mgr) Expect(err).NotTo(HaveOccurred(), "failed to setup controller") - go func() { - defer GinkgoRecover() - - err := mgr.Start(ctx) - Expect(err).NotTo(HaveOccurred(), "failed to start manager") - }() - }) - - AfterEach(func() { - defer cancel() - - err := k8sClient.Delete(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to delete test namespace for AutoScalingRunnerSet") + startManagers(GinkgoT(), mgr) }) It("should create a secret in the listener namespace containing proxy details, use it to populate env vars on the pod and should delete it as part of cleanup", func() { diff --git a/controllers/actions.github.com/autoscalingrunnerset_controller_test.go b/controllers/actions.github.com/autoscalingrunnerset_controller_test.go index 26918c9e..b0cd4c2c 100644 --- a/controllers/actions.github.com/autoscalingrunnerset_controller_test.go +++ b/controllers/actions.github.com/autoscalingrunnerset_controller_test.go @@ -35,38 +35,15 @@ const ( var _ = Describe("Test AutoScalingRunnerSet controller", func() { var ctx context.Context - var cancel context.CancelFunc - autoscalingNS := new(corev1.Namespace) - autoscalingRunnerSet := new(v1alpha1.AutoscalingRunnerSet) - configSecret := new(corev1.Secret) + var mgr ctrl.Manager + var autoscalingNS *corev1.Namespace + var autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet + var configSecret *corev1.Secret BeforeEach(func() { - ctx, cancel = context.WithCancel(context.TODO()) - autoscalingNS = &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling" + RandStringRunes(5)}, - } - - err := k8sClient.Create(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to create test namespace for AutoScalingRunnerSet") - - configSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "github-config-secret", - Namespace: autoscalingNS.Name, - }, - Data: map[string][]byte{ - "github_token": []byte(autoscalingRunnerSetTestGitHubToken), - }, - } - - err = k8sClient.Create(ctx, configSecret) - Expect(err).NotTo(HaveOccurred(), "failed to create config secret") - - mgr, err := ctrl.NewManager(cfg, ctrl.Options{ - Namespace: autoscalingNS.Name, - MetricsBindAddress: "0", - }) - Expect(err).NotTo(HaveOccurred(), "failed to create manager") + ctx = context.Background() + autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient) + configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name) controller := &AutoscalingRunnerSetReconciler{ Client: mgr.GetClient(), @@ -76,7 +53,7 @@ var _ = Describe("Test AutoScalingRunnerSet controller", func() { DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc", ActionsClient: fake.NewMultiClient(), } - err = controller.SetupWithManager(mgr) + err := controller.SetupWithManager(mgr) Expect(err).NotTo(HaveOccurred(), "failed to setup controller") min := 1 @@ -108,19 +85,7 @@ var _ = Describe("Test AutoScalingRunnerSet controller", func() { err = k8sClient.Create(ctx, autoscalingRunnerSet) Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingRunnerSet") - go func() { - defer GinkgoRecover() - - err := mgr.Start(ctx) - Expect(err).NotTo(HaveOccurred(), "failed to start manager") - }() - }) - - AfterEach(func() { - defer cancel() - - err := k8sClient.Delete(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to delete test namespace for AutoScalingRunnerSet") + startManagers(GinkgoT(), mgr) }) Context("When creating a new AutoScalingRunnerSet", func() { @@ -438,36 +403,12 @@ var _ = Describe("Test AutoScalingRunnerSet controller", func() { var _ = Describe("Test AutoscalingController creation failures", func() { Context("When autoscaling runner set creation fails on the client", func() { var ctx context.Context - var cancel context.CancelFunc - autoscalingNS := new(corev1.Namespace) - configSecret := new(corev1.Secret) + var mgr ctrl.Manager + var autoscalingNS *corev1.Namespace BeforeEach(func() { - ctx, cancel = context.WithCancel(context.TODO()) - autoscalingNS = &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling" + RandStringRunes(5)}, - } - - err := k8sClient.Create(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to create test namespace for AutoScalingRunnerSet") - - configSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "github-config-secret", - Namespace: autoscalingNS.Name, - }, - Data: map[string][]byte{ - "github_token": []byte(autoscalingRunnerSetTestGitHubToken), - }, - } - - err = k8sClient.Create(ctx, configSecret) - Expect(err).NotTo(HaveOccurred(), "failed to create config secret") - - mgr, err := ctrl.NewManager(cfg, ctrl.Options{ - MetricsBindAddress: "0", - }) - Expect(err).NotTo(HaveOccurred(), "failed to create manager") + ctx = context.Background() + autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient) controller := &AutoscalingRunnerSetReconciler{ Client: mgr.GetClient(), @@ -477,22 +418,10 @@ var _ = Describe("Test AutoscalingController creation failures", func() { DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc", ActionsClient: fake.NewMultiClient(), } - err = controller.SetupWithManager(mgr) + err := controller.SetupWithManager(mgr) Expect(err).NotTo(HaveOccurred(), "failed to setup controller") - go func() { - defer GinkgoRecover() - - err := mgr.Start(ctx) - Expect(err).NotTo(HaveOccurred(), "failed to start manager") - }() - }) - - AfterEach(func() { - defer cancel() - - err := k8sClient.Delete(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to delete test namespace for AutoScalingRunnerSet") + startManagers(GinkgoT(), mgr) }) It("It should be able to clean up if annotation related to scale set id does not exist", func() { @@ -583,57 +512,17 @@ var _ = Describe("Test AutoscalingController creation failures", func() { var _ = Describe("Test Client optional configuration", func() { Context("When specifying a proxy", func() { var ctx context.Context - var cancel context.CancelFunc - - autoscalingNS := new(corev1.Namespace) - configSecret := new(corev1.Secret) var mgr ctrl.Manager + var autoscalingNS *corev1.Namespace + var configSecret *corev1.Secret + var controller *AutoscalingRunnerSetReconciler BeforeEach(func() { - ctx, cancel = context.WithCancel(context.TODO()) - autoscalingNS = &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling" + RandStringRunes(5)}, - } + ctx = context.Background() + autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient) + configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name) - err := k8sClient.Create(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to create test namespace for AutoScalingRunnerSet") - - configSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "github-config-secret", - Namespace: autoscalingNS.Name, - }, - Data: map[string][]byte{ - "github_token": []byte(autoscalingRunnerSetTestGitHubToken), - }, - } - - err = k8sClient.Create(ctx, configSecret) - Expect(err).NotTo(HaveOccurred(), "failed to create config secret") - - mgr, err = ctrl.NewManager(cfg, ctrl.Options{ - Namespace: autoscalingNS.Name, - MetricsBindAddress: "0", - }) - Expect(err).NotTo(HaveOccurred(), "failed to create manager") - - go func() { - defer GinkgoRecover() - - err := mgr.Start(ctx) - Expect(err).NotTo(HaveOccurred(), "failed to start manager") - }() - }) - - AfterEach(func() { - defer cancel() - - err := k8sClient.Delete(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to delete test namespace for AutoScalingRunnerSet") - }) - - It("should be able to make requests to a server using a proxy", func() { - controller := &AutoscalingRunnerSetReconciler{ + controller = &AutoscalingRunnerSetReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: logf.Log, @@ -644,6 +533,10 @@ var _ = Describe("Test Client optional configuration", func() { err := controller.SetupWithManager(mgr) Expect(err).NotTo(HaveOccurred(), "failed to setup controller") + startManagers(GinkgoT(), mgr) + }) + + It("should be able to make requests to a server using a proxy", func() { serverSuccessfullyCalled := false proxy := testserver.New(GinkgoT(), http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { serverSuccessfullyCalled = true @@ -681,7 +574,7 @@ var _ = Describe("Test Client optional configuration", func() { }, } - err = k8sClient.Create(ctx, autoscalingRunnerSet) + err := k8sClient.Create(ctx, autoscalingRunnerSet) Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingRunnerSet") // wait for server to be called @@ -695,17 +588,6 @@ var _ = Describe("Test Client optional configuration", func() { }) It("should be able to make requests to a server using a proxy with user info", func() { - controller := &AutoscalingRunnerSetReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: logf.Log, - ControllerNamespace: autoscalingNS.Name, - DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc", - ActionsClient: actions.NewMultiClient("test", logr.Discard()), - } - err := controller.SetupWithManager(mgr) - Expect(err).NotTo(HaveOccurred(), "failed to setup controller") - serverSuccessfullyCalled := false proxy := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { header := r.Header.Get("Proxy-Authorization") @@ -734,7 +616,7 @@ var _ = Describe("Test Client optional configuration", func() { }, } - err = k8sClient.Create(ctx, secretCredentials) + err := k8sClient.Create(ctx, secretCredentials) Expect(err).NotTo(HaveOccurred(), "failed to create secret credentials") min := 1 diff --git a/controllers/actions.github.com/ephemeralrunner_controller_test.go b/controllers/actions.github.com/ephemeralrunner_controller_test.go index 3f1747ab..b5e064b1 100644 --- a/controllers/actions.github.com/ephemeralrunner_controller_test.go +++ b/controllers/actions.github.com/ephemeralrunner_controller_test.go @@ -22,11 +22,9 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/manager" ) const ( - gh_token = "gh_token" timeout = time.Second * 10 interval = time.Millisecond * 250 runnerImage = "ghcr.io/actions/actions-runner:latest" @@ -87,42 +85,16 @@ func newExampleRunner(name, namespace, configSecretName string) *v1alpha1.Epheme var _ = Describe("EphemeralRunner", func() { Describe("Resource manipulation", func() { var ctx context.Context - var cancel context.CancelFunc - - autoscalingNS := new(corev1.Namespace) - configSecret := new(corev1.Secret) - - controller := new(EphemeralRunnerReconciler) - ephemeralRunner := new(v1alpha1.EphemeralRunner) + var mgr ctrl.Manager + var autoscalingNS *corev1.Namespace + var configSecret *corev1.Secret + var controller *EphemeralRunnerReconciler + var ephemeralRunner *v1alpha1.EphemeralRunner BeforeEach(func() { - ctx, cancel = context.WithCancel(context.Background()) - autoscalingNS = &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: "testns-autoscaling-runner" + RandStringRunes(5), - }, - } - err := k8sClient.Create(ctx, autoscalingNS) - Expect(err).To(BeNil(), "failed to create test namespace for EphemeralRunner") - - configSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "github-config-secret", - Namespace: autoscalingNS.Name, - }, - Data: map[string][]byte{ - "github_token": []byte(gh_token), - }, - } - - err = k8sClient.Create(ctx, configSecret) - Expect(err).To(BeNil(), "failed to create config secret") - - mgr, err := ctrl.NewManager(cfg, ctrl.Options{ - Namespace: autoscalingNS.Name, - MetricsBindAddress: "0", - }) - Expect(err).To(BeNil(), "failed to create manager") + ctx = context.Background() + autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient) + configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name) controller = &EphemeralRunnerReconciler{ Client: mgr.GetClient(), @@ -131,26 +103,14 @@ var _ = Describe("EphemeralRunner", func() { ActionsClient: fake.NewMultiClient(), } - err = controller.SetupWithManager(mgr) + err := controller.SetupWithManager(mgr) Expect(err).To(BeNil(), "failed to setup controller") ephemeralRunner = newExampleRunner("test-runner", autoscalingNS.Name, configSecret.Name) err = k8sClient.Create(ctx, ephemeralRunner) Expect(err).To(BeNil(), "failed to create ephemeral runner") - go func() { - defer GinkgoRecover() - - err := mgr.Start(ctx) - Expect(err).To(BeNil(), "failed to start manager") - }() - }) - - AfterEach(func() { - defer cancel() - - err := k8sClient.Delete(ctx, autoscalingNS) - Expect(err).To(BeNil(), "failed to delete test namespace for EphemeralRunner") + startManagers(GinkgoT(), mgr) }) It("It should create/add all required resources for EphemeralRunner (finalizer, jit secret)", func() { @@ -668,52 +628,17 @@ var _ = Describe("EphemeralRunner", func() { Describe("Checking the API", func() { var ctx context.Context - var cancel context.CancelFunc - - autoscalingNS := new(corev1.Namespace) - configSecret := new(corev1.Secret) - - var mgr manager.Manager + var autoscalingNS *corev1.Namespace + var configSecret *corev1.Secret + var controller *EphemeralRunnerReconciler + var mgr ctrl.Manager BeforeEach(func() { - ctx, cancel = context.WithCancel(context.Background()) - autoscalingNS = &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: "testns-autoscaling-runner" + RandStringRunes(5), - }, - } - err := k8sClient.Create(ctx, autoscalingNS) - Expect(err).To(BeNil(), "failed to create test namespace for EphemeralRunner") + ctx = context.Background() + autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient) + configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name) - configSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "github-config-secret", - Namespace: autoscalingNS.Name, - }, - Data: map[string][]byte{ - "github_token": []byte(gh_token), - }, - } - - err = k8sClient.Create(ctx, configSecret) - Expect(err).To(BeNil(), "failed to create config secret") - - mgr, err = ctrl.NewManager(cfg, ctrl.Options{ - Namespace: autoscalingNS.Name, - MetricsBindAddress: "0", - }) - Expect(err).To(BeNil(), "failed to create manager") - }) - - AfterEach(func() { - defer cancel() - - err := k8sClient.Delete(ctx, autoscalingNS) - Expect(err).To(BeNil(), "failed to delete test namespace for EphemeralRunner") - }) - - It("It should set the Phase to Succeeded", func() { - controller := &EphemeralRunnerReconciler{ + controller = &EphemeralRunnerReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: logf.Log, @@ -732,20 +657,16 @@ var _ = Describe("EphemeralRunner", func() { ), ), } - err := controller.SetupWithManager(mgr) Expect(err).To(BeNil(), "failed to setup controller") - go func() { - defer GinkgoRecover() - - err := mgr.Start(ctx) - Expect(err).To(BeNil(), "failed to start manager") - }() + startManagers(GinkgoT(), mgr) + }) + It("It should set the Phase to Succeeded", func() { ephemeralRunner := newExampleRunner("test-runner", autoscalingNS.Name, configSecret.Name) - err = k8sClient.Create(ctx, ephemeralRunner) + err := k8sClient.Create(ctx, ephemeralRunner) Expect(err).To(BeNil()) pod := new(corev1.Pod) @@ -780,40 +701,15 @@ var _ = Describe("EphemeralRunner", func() { Describe("Pod proxy config", func() { var ctx context.Context - var cancel context.CancelFunc - - autoScalingNS := new(corev1.Namespace) - configSecret := new(corev1.Secret) - controller := new(EphemeralRunnerReconciler) + var mgr ctrl.Manager + var autoScalingNS *corev1.Namespace + var configSecret *corev1.Secret + var controller *EphemeralRunnerReconciler BeforeEach(func() { - ctx, cancel = context.WithCancel(context.Background()) - autoScalingNS = &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: "testns-autoscaling-runner" + RandStringRunes(5), - }, - } - err := k8sClient.Create(ctx, autoScalingNS) - Expect(err).To(BeNil(), "failed to create test namespace for EphemeralRunner") - - configSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "github-config-secret", - Namespace: autoScalingNS.Name, - }, - Data: map[string][]byte{ - "github_token": []byte(gh_token), - }, - } - - err = k8sClient.Create(ctx, configSecret) - Expect(err).To(BeNil(), "failed to create config secret") - - mgr, err := ctrl.NewManager(cfg, ctrl.Options{ - Namespace: autoScalingNS.Name, - MetricsBindAddress: "0", - }) - Expect(err).To(BeNil(), "failed to create manager") + ctx = context.Background() + autoScalingNS, mgr = createNamespace(GinkgoT(), k8sClient) + configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoScalingNS.Name) controller = &EphemeralRunnerReconciler{ Client: mgr.GetClient(), @@ -821,23 +717,10 @@ var _ = Describe("EphemeralRunner", func() { Log: logf.Log, ActionsClient: fake.NewMultiClient(), } - - err = controller.SetupWithManager(mgr) + err := controller.SetupWithManager(mgr) Expect(err).To(BeNil(), "failed to setup controller") - go func() { - defer GinkgoRecover() - - err := mgr.Start(ctx) - Expect(err).To(BeNil(), "failed to start manager") - }() - }) - - AfterEach(func() { - defer cancel() - - err := k8sClient.Delete(ctx, autoScalingNS) - Expect(err).To(BeNil(), "failed to delete test namespace for EphemeralRunner") + startManagers(GinkgoT(), mgr) }) It("uses an actions client with proxy transport", func() { diff --git a/controllers/actions.github.com/ephemeralrunnerset_controller_test.go b/controllers/actions.github.com/ephemeralrunnerset_controller_test.go index 571492b9..e2ad842b 100644 --- a/controllers/actions.github.com/ephemeralrunnerset_controller_test.go +++ b/controllers/actions.github.com/ephemeralrunnerset_controller_test.go @@ -34,38 +34,15 @@ const ( var _ = Describe("Test EphemeralRunnerSet controller", func() { var ctx context.Context - var cancel context.CancelFunc - autoscalingNS := new(corev1.Namespace) - ephemeralRunnerSet := new(actionsv1alpha1.EphemeralRunnerSet) - configSecret := new(corev1.Secret) + var mgr ctrl.Manager + var autoscalingNS *corev1.Namespace + var ephemeralRunnerSet *actionsv1alpha1.EphemeralRunnerSet + var configSecret *corev1.Secret BeforeEach(func() { - ctx, cancel = context.WithCancel(context.TODO()) - autoscalingNS = &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling-runnerset" + RandStringRunes(5)}, - } - - err := k8sClient.Create(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to create test namespace for EphemeralRunnerSet") - - configSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "github-config-secret", - Namespace: autoscalingNS.Name, - }, - Data: map[string][]byte{ - "github_token": []byte(ephemeralRunnerSetTestGitHubToken), - }, - } - - err = k8sClient.Create(ctx, configSecret) - Expect(err).NotTo(HaveOccurred(), "failed to create config secret") - - mgr, err := ctrl.NewManager(cfg, ctrl.Options{ - Namespace: autoscalingNS.Name, - MetricsBindAddress: "0", - }) - Expect(err).NotTo(HaveOccurred(), "failed to create manager") + ctx = context.Background() + autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient) + configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name) controller := &EphemeralRunnerSetReconciler{ Client: mgr.GetClient(), @@ -73,7 +50,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { Log: logf.Log, ActionsClient: fake.NewMultiClient(), } - err = controller.SetupWithManager(mgr) + err := controller.SetupWithManager(mgr) Expect(err).NotTo(HaveOccurred(), "failed to setup controller") ephemeralRunnerSet = &actionsv1alpha1.EphemeralRunnerSet{ @@ -103,19 +80,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Create(ctx, ephemeralRunnerSet) Expect(err).NotTo(HaveOccurred(), "failed to create EphemeralRunnerSet") - go func() { - defer GinkgoRecover() - - err := mgr.Start(ctx) - Expect(err).NotTo(HaveOccurred(), "failed to start manager") - }() - }) - - AfterEach(func() { - defer cancel() - - err := k8sClient.Delete(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to delete test namespace for EphemeralRunnerSet") + startManagers(GinkgoT(), mgr) }) Context("When creating a new EphemeralRunnerSet", func() { @@ -595,38 +560,15 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func() { var ctx context.Context - var cancel context.CancelFunc - autoscalingNS := new(corev1.Namespace) - ephemeralRunnerSet := new(actionsv1alpha1.EphemeralRunnerSet) - configSecret := new(corev1.Secret) + var mgr ctrl.Manager + var autoscalingNS *corev1.Namespace + var ephemeralRunnerSet *actionsv1alpha1.EphemeralRunnerSet + var configSecret *corev1.Secret BeforeEach(func() { - ctx, cancel = context.WithCancel(context.TODO()) - autoscalingNS = &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling-runnerset" + RandStringRunes(5)}, - } - - err := k8sClient.Create(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to create test namespace for EphemeralRunnerSet") - - configSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "github-config-secret", - Namespace: autoscalingNS.Name, - }, - Data: map[string][]byte{ - "github_token": []byte(ephemeralRunnerSetTestGitHubToken), - }, - } - - err = k8sClient.Create(ctx, configSecret) - Expect(err).NotTo(HaveOccurred(), "failed to create config secret") - - mgr, err := ctrl.NewManager(cfg, ctrl.Options{ - Namespace: autoscalingNS.Name, - MetricsBindAddress: "0", - }) - Expect(err).NotTo(HaveOccurred(), "failed to create manager") + ctx = context.Background() + autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient) + configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name) controller := &EphemeralRunnerSetReconciler{ Client: mgr.GetClient(), @@ -634,22 +576,10 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func( Log: logf.Log, ActionsClient: actions.NewMultiClient("test", logr.Discard()), } - err = controller.SetupWithManager(mgr) + err := controller.SetupWithManager(mgr) Expect(err).NotTo(HaveOccurred(), "failed to setup controller") - go func() { - defer GinkgoRecover() - - err := mgr.Start(ctx) - Expect(err).NotTo(HaveOccurred(), "failed to start manager") - }() - }) - - AfterEach(func() { - defer cancel() - - err := k8sClient.Delete(ctx, autoscalingNS) - Expect(err).NotTo(HaveOccurred(), "failed to delete test namespace for EphemeralRunnerSet") + startManagers(GinkgoT(), mgr) }) It("should create a proxy secret and delete the proxy secreat after the runner-set is deleted", func() { diff --git a/controllers/actions.github.com/helpers_test.go b/controllers/actions.github.com/helpers_test.go new file mode 100644 index 00000000..4adbec61 --- /dev/null +++ b/controllers/actions.github.com/helpers_test.go @@ -0,0 +1,71 @@ +package actionsgithubcom + +import ( + "context" + + "github.com/onsi/ginkgo/v2" + "github.com/stretchr/testify/require" + "golang.org/x/sync/errgroup" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/manager" +) + +const defaultGitHubToken = "gh_token" + +func startManagers(t ginkgo.GinkgoTInterface, first manager.Manager, others ...manager.Manager) { + for _, mgr := range append([]manager.Manager{first}, others...) { + ctx, cancel := context.WithCancel(context.Background()) + + g, ctx := errgroup.WithContext(ctx) + g.Go(func() error { + return mgr.Start(ctx) + }) + + t.Cleanup(func() { + cancel() + require.NoError(t, g.Wait()) + }) + } +} + +func createNamespace(t ginkgo.GinkgoTInterface, client client.Client) (*corev1.Namespace, manager.Manager) { + ns := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling" + RandStringRunes(5)}, + } + + err := k8sClient.Create(context.Background(), ns) + require.NoError(t, err) + + t.Cleanup(func() { + err := k8sClient.Delete(context.Background(), ns) + require.NoError(t, err) + }) + + mgr, err := ctrl.NewManager(cfg, ctrl.Options{ + Namespace: ns.Name, + MetricsBindAddress: "0", + }) + require.NoError(t, err) + + return ns, mgr +} + +func createDefaultSecret(t ginkgo.GinkgoTInterface, client client.Client, namespace string) *corev1.Secret { + secret := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "github-config-secret", + Namespace: namespace, + }, + Data: map[string][]byte{ + "github_token": []byte(defaultGitHubToken), + }, + } + + err := k8sClient.Create(context.Background(), secret) + require.NoError(t, err) + + return secret +} diff --git a/go.mod b/go.mod index 2e4a792f..c21469d3 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( go.uber.org/zap v1.24.0 golang.org/x/net v0.7.0 golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 gomodules.xyz/jsonpatch/v2 v2.2.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.26.1 diff --git a/go.sum b/go.sum index 7a42ba81..2d2dfbee 100644 --- a/go.sum +++ b/go.sum @@ -473,6 +473,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=