Simplify the setup of controller tests (#2352)

This commit is contained in:
Francesco Renzi 2023-03-02 18:55:49 +00:00 committed by GitHub
parent 2984de912c
commit 40c905f25d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 171 additions and 472 deletions

View File

@ -28,46 +28,23 @@ const (
var _ = Describe("Test AutoScalingListener controller", func() { var _ = Describe("Test AutoScalingListener controller", func() {
var ctx context.Context var ctx context.Context
var cancel context.CancelFunc var mgr ctrl.Manager
autoscalingNS := new(corev1.Namespace) var autoscalingNS *corev1.Namespace
autoscalingRunnerSet := new(actionsv1alpha1.AutoscalingRunnerSet) var autoscalingRunnerSet *actionsv1alpha1.AutoscalingRunnerSet
configSecret := new(corev1.Secret) var configSecret *corev1.Secret
autoscalingListener := new(actionsv1alpha1.AutoscalingListener) var autoscalingListener *actionsv1alpha1.AutoscalingListener
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.TODO()) ctx = context.Background()
autoscalingNS = &corev1.Namespace{ autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient)
ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling-listener" + RandStringRunes(5)}, 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(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")
controller := &AutoscalingListenerReconciler{ controller := &AutoscalingListenerReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
Scheme: mgr.GetScheme(), Scheme: mgr.GetScheme(),
Log: logf.Log, Log: logf.Log,
} }
err = controller.SetupWithManager(mgr) err := controller.SetupWithManager(mgr)
Expect(err).NotTo(HaveOccurred(), "failed to setup controller") Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
min := 1 min := 1
@ -119,19 +96,7 @@ var _ = Describe("Test AutoScalingListener controller", func() {
err = k8sClient.Create(ctx, autoscalingListener) err = k8sClient.Create(ctx, autoscalingListener)
Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingListener") Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingListener")
go func() { startManagers(GinkgoT(), mgr)
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")
}) })
Context("When creating a new AutoScalingListener", func() { 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 _ = Describe("Test AutoScalingListener controller with proxy", func() {
var ctx context.Context var ctx context.Context
var cancel context.CancelFunc var mgr ctrl.Manager
autoscalingNS := new(corev1.Namespace) var autoscalingNS *corev1.Namespace
autoscalingRunnerSet := new(actionsv1alpha1.AutoscalingRunnerSet) var autoscalingRunnerSet *actionsv1alpha1.AutoscalingRunnerSet
configSecret := new(corev1.Secret) var configSecret *corev1.Secret
autoscalingListener := new(actionsv1alpha1.AutoscalingListener) var autoscalingListener *actionsv1alpha1.AutoscalingListener
createRunnerSetAndListener := func(proxy *actionsv1alpha1.ProxyConfig) { createRunnerSetAndListener := func(proxy *actionsv1alpha1.ProxyConfig) {
min := 1 min := 1
@ -456,54 +421,19 @@ var _ = Describe("Test AutoScalingListener controller with proxy", func() {
} }
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.TODO()) ctx = context.Background()
autoscalingNS = &corev1.Namespace{ autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient)
ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling-listener" + RandStringRunes(5)}, 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(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")
controller := &AutoscalingListenerReconciler{ controller := &AutoscalingListenerReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
Scheme: mgr.GetScheme(), Scheme: mgr.GetScheme(),
Log: logf.Log, Log: logf.Log,
} }
err = controller.SetupWithManager(mgr) err := controller.SetupWithManager(mgr)
Expect(err).NotTo(HaveOccurred(), "failed to setup controller") Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
go func() { startManagers(GinkgoT(), mgr)
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 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() { 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() {

View File

@ -35,38 +35,15 @@ const (
var _ = Describe("Test AutoScalingRunnerSet controller", func() { var _ = Describe("Test AutoScalingRunnerSet controller", func() {
var ctx context.Context var ctx context.Context
var cancel context.CancelFunc var mgr ctrl.Manager
autoscalingNS := new(corev1.Namespace) var autoscalingNS *corev1.Namespace
autoscalingRunnerSet := new(v1alpha1.AutoscalingRunnerSet) var autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet
configSecret := new(corev1.Secret) var configSecret *corev1.Secret
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.TODO()) ctx = context.Background()
autoscalingNS = &corev1.Namespace{ autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient)
ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling" + RandStringRunes(5)}, 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")
controller := &AutoscalingRunnerSetReconciler{ controller := &AutoscalingRunnerSetReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
@ -76,7 +53,7 @@ var _ = Describe("Test AutoScalingRunnerSet controller", func() {
DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc", DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc",
ActionsClient: fake.NewMultiClient(), ActionsClient: fake.NewMultiClient(),
} }
err = controller.SetupWithManager(mgr) err := controller.SetupWithManager(mgr)
Expect(err).NotTo(HaveOccurred(), "failed to setup controller") Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
min := 1 min := 1
@ -108,19 +85,7 @@ var _ = Describe("Test AutoScalingRunnerSet controller", func() {
err = k8sClient.Create(ctx, autoscalingRunnerSet) err = k8sClient.Create(ctx, autoscalingRunnerSet)
Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingRunnerSet") Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingRunnerSet")
go func() { startManagers(GinkgoT(), mgr)
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")
}) })
Context("When creating a new AutoScalingRunnerSet", func() { Context("When creating a new AutoScalingRunnerSet", func() {
@ -438,36 +403,12 @@ var _ = Describe("Test AutoScalingRunnerSet controller", func() {
var _ = Describe("Test AutoscalingController creation failures", func() { var _ = Describe("Test AutoscalingController creation failures", func() {
Context("When autoscaling runner set creation fails on the client", func() { Context("When autoscaling runner set creation fails on the client", func() {
var ctx context.Context var ctx context.Context
var cancel context.CancelFunc var mgr ctrl.Manager
autoscalingNS := new(corev1.Namespace) var autoscalingNS *corev1.Namespace
configSecret := new(corev1.Secret)
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.TODO()) ctx = context.Background()
autoscalingNS = &corev1.Namespace{ autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient)
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")
controller := &AutoscalingRunnerSetReconciler{ controller := &AutoscalingRunnerSetReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
@ -477,22 +418,10 @@ var _ = Describe("Test AutoscalingController creation failures", func() {
DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc", DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc",
ActionsClient: fake.NewMultiClient(), ActionsClient: fake.NewMultiClient(),
} }
err = controller.SetupWithManager(mgr) err := controller.SetupWithManager(mgr)
Expect(err).NotTo(HaveOccurred(), "failed to setup controller") Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
go func() { startManagers(GinkgoT(), mgr)
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("It should be able to clean up if annotation related to scale set id does not exist", func() { 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() { var _ = Describe("Test Client optional configuration", func() {
Context("When specifying a proxy", func() { Context("When specifying a proxy", func() {
var ctx context.Context var ctx context.Context
var cancel context.CancelFunc
autoscalingNS := new(corev1.Namespace)
configSecret := new(corev1.Secret)
var mgr ctrl.Manager var mgr ctrl.Manager
var autoscalingNS *corev1.Namespace
var configSecret *corev1.Secret
var controller *AutoscalingRunnerSetReconciler
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.TODO()) ctx = context.Background()
autoscalingNS = &corev1.Namespace{ autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient)
ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling" + RandStringRunes(5)}, configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
}
err := k8sClient.Create(ctx, autoscalingNS) controller = &AutoscalingRunnerSetReconciler{
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{
Client: mgr.GetClient(), Client: mgr.GetClient(),
Scheme: mgr.GetScheme(), Scheme: mgr.GetScheme(),
Log: logf.Log, Log: logf.Log,
@ -644,6 +533,10 @@ var _ = Describe("Test Client optional configuration", func() {
err := controller.SetupWithManager(mgr) err := controller.SetupWithManager(mgr)
Expect(err).NotTo(HaveOccurred(), "failed to setup controller") 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 serverSuccessfullyCalled := false
proxy := testserver.New(GinkgoT(), http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { proxy := testserver.New(GinkgoT(), http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
serverSuccessfullyCalled = true 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") Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingRunnerSet")
// wait for server to be called // 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() { 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 serverSuccessfullyCalled := false
proxy := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { proxy := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
header := r.Header.Get("Proxy-Authorization") 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") Expect(err).NotTo(HaveOccurred(), "failed to create secret credentials")
min := 1 min := 1

View File

@ -22,11 +22,9 @@ import (
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
logf "sigs.k8s.io/controller-runtime/pkg/log" logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/manager"
) )
const ( const (
gh_token = "gh_token"
timeout = time.Second * 10 timeout = time.Second * 10
interval = time.Millisecond * 250 interval = time.Millisecond * 250
runnerImage = "ghcr.io/actions/actions-runner:latest" runnerImage = "ghcr.io/actions/actions-runner:latest"
@ -87,42 +85,16 @@ func newExampleRunner(name, namespace, configSecretName string) *v1alpha1.Epheme
var _ = Describe("EphemeralRunner", func() { var _ = Describe("EphemeralRunner", func() {
Describe("Resource manipulation", func() { Describe("Resource manipulation", func() {
var ctx context.Context var ctx context.Context
var cancel context.CancelFunc var mgr ctrl.Manager
var autoscalingNS *corev1.Namespace
autoscalingNS := new(corev1.Namespace) var configSecret *corev1.Secret
configSecret := new(corev1.Secret) var controller *EphemeralRunnerReconciler
var ephemeralRunner *v1alpha1.EphemeralRunner
controller := new(EphemeralRunnerReconciler)
ephemeralRunner := new(v1alpha1.EphemeralRunner)
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.Background()) ctx = context.Background()
autoscalingNS = &corev1.Namespace{ autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient)
ObjectMeta: metav1.ObjectMeta{ configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
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")
controller = &EphemeralRunnerReconciler{ controller = &EphemeralRunnerReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
@ -131,26 +103,14 @@ var _ = Describe("EphemeralRunner", func() {
ActionsClient: fake.NewMultiClient(), ActionsClient: fake.NewMultiClient(),
} }
err = controller.SetupWithManager(mgr) err := controller.SetupWithManager(mgr)
Expect(err).To(BeNil(), "failed to setup controller") Expect(err).To(BeNil(), "failed to setup controller")
ephemeralRunner = newExampleRunner("test-runner", autoscalingNS.Name, configSecret.Name) ephemeralRunner = newExampleRunner("test-runner", autoscalingNS.Name, configSecret.Name)
err = k8sClient.Create(ctx, ephemeralRunner) err = k8sClient.Create(ctx, ephemeralRunner)
Expect(err).To(BeNil(), "failed to create ephemeral runner") Expect(err).To(BeNil(), "failed to create ephemeral runner")
go func() { startManagers(GinkgoT(), mgr)
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")
}) })
It("It should create/add all required resources for EphemeralRunner (finalizer, jit secret)", func() { 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() { Describe("Checking the API", func() {
var ctx context.Context var ctx context.Context
var cancel context.CancelFunc var autoscalingNS *corev1.Namespace
var configSecret *corev1.Secret
autoscalingNS := new(corev1.Namespace) var controller *EphemeralRunnerReconciler
configSecret := new(corev1.Secret) var mgr ctrl.Manager
var mgr manager.Manager
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.Background()) ctx = context.Background()
autoscalingNS = &corev1.Namespace{ autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient)
ObjectMeta: metav1.ObjectMeta{ configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
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{ controller = &EphemeralRunnerReconciler{
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{
Client: mgr.GetClient(), Client: mgr.GetClient(),
Scheme: mgr.GetScheme(), Scheme: mgr.GetScheme(),
Log: logf.Log, Log: logf.Log,
@ -732,20 +657,16 @@ var _ = Describe("EphemeralRunner", func() {
), ),
), ),
} }
err := controller.SetupWithManager(mgr) err := controller.SetupWithManager(mgr)
Expect(err).To(BeNil(), "failed to setup controller") Expect(err).To(BeNil(), "failed to setup controller")
go func() { startManagers(GinkgoT(), mgr)
defer GinkgoRecover() })
err := mgr.Start(ctx)
Expect(err).To(BeNil(), "failed to start manager")
}()
It("It should set the Phase to Succeeded", func() {
ephemeralRunner := newExampleRunner("test-runner", autoscalingNS.Name, configSecret.Name) ephemeralRunner := newExampleRunner("test-runner", autoscalingNS.Name, configSecret.Name)
err = k8sClient.Create(ctx, ephemeralRunner) err := k8sClient.Create(ctx, ephemeralRunner)
Expect(err).To(BeNil()) Expect(err).To(BeNil())
pod := new(corev1.Pod) pod := new(corev1.Pod)
@ -780,40 +701,15 @@ var _ = Describe("EphemeralRunner", func() {
Describe("Pod proxy config", func() { Describe("Pod proxy config", func() {
var ctx context.Context var ctx context.Context
var cancel context.CancelFunc var mgr ctrl.Manager
var autoScalingNS *corev1.Namespace
autoScalingNS := new(corev1.Namespace) var configSecret *corev1.Secret
configSecret := new(corev1.Secret) var controller *EphemeralRunnerReconciler
controller := new(EphemeralRunnerReconciler)
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.Background()) ctx = context.Background()
autoScalingNS = &corev1.Namespace{ autoScalingNS, mgr = createNamespace(GinkgoT(), k8sClient)
ObjectMeta: metav1.ObjectMeta{ configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoScalingNS.Name)
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")
controller = &EphemeralRunnerReconciler{ controller = &EphemeralRunnerReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
@ -821,23 +717,10 @@ var _ = Describe("EphemeralRunner", func() {
Log: logf.Log, Log: logf.Log,
ActionsClient: fake.NewMultiClient(), ActionsClient: fake.NewMultiClient(),
} }
err := controller.SetupWithManager(mgr)
err = controller.SetupWithManager(mgr)
Expect(err).To(BeNil(), "failed to setup controller") Expect(err).To(BeNil(), "failed to setup controller")
go func() { startManagers(GinkgoT(), mgr)
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")
}) })
It("uses an actions client with proxy transport", func() { It("uses an actions client with proxy transport", func() {

View File

@ -34,38 +34,15 @@ const (
var _ = Describe("Test EphemeralRunnerSet controller", func() { var _ = Describe("Test EphemeralRunnerSet controller", func() {
var ctx context.Context var ctx context.Context
var cancel context.CancelFunc var mgr ctrl.Manager
autoscalingNS := new(corev1.Namespace) var autoscalingNS *corev1.Namespace
ephemeralRunnerSet := new(actionsv1alpha1.EphemeralRunnerSet) var ephemeralRunnerSet *actionsv1alpha1.EphemeralRunnerSet
configSecret := new(corev1.Secret) var configSecret *corev1.Secret
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.TODO()) ctx = context.Background()
autoscalingNS = &corev1.Namespace{ autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient)
ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling-runnerset" + RandStringRunes(5)}, configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
}
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")
controller := &EphemeralRunnerSetReconciler{ controller := &EphemeralRunnerSetReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
@ -73,7 +50,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
Log: logf.Log, Log: logf.Log,
ActionsClient: fake.NewMultiClient(), ActionsClient: fake.NewMultiClient(),
} }
err = controller.SetupWithManager(mgr) err := controller.SetupWithManager(mgr)
Expect(err).NotTo(HaveOccurred(), "failed to setup controller") Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
ephemeralRunnerSet = &actionsv1alpha1.EphemeralRunnerSet{ ephemeralRunnerSet = &actionsv1alpha1.EphemeralRunnerSet{
@ -103,19 +80,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
err = k8sClient.Create(ctx, ephemeralRunnerSet) err = k8sClient.Create(ctx, ephemeralRunnerSet)
Expect(err).NotTo(HaveOccurred(), "failed to create EphemeralRunnerSet") Expect(err).NotTo(HaveOccurred(), "failed to create EphemeralRunnerSet")
go func() { startManagers(GinkgoT(), mgr)
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")
}) })
Context("When creating a new EphemeralRunnerSet", func() { 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 _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func() {
var ctx context.Context var ctx context.Context
var cancel context.CancelFunc var mgr ctrl.Manager
autoscalingNS := new(corev1.Namespace) var autoscalingNS *corev1.Namespace
ephemeralRunnerSet := new(actionsv1alpha1.EphemeralRunnerSet) var ephemeralRunnerSet *actionsv1alpha1.EphemeralRunnerSet
configSecret := new(corev1.Secret) var configSecret *corev1.Secret
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.TODO()) ctx = context.Background()
autoscalingNS = &corev1.Namespace{ autoscalingNS, mgr = createNamespace(GinkgoT(), k8sClient)
ObjectMeta: metav1.ObjectMeta{Name: "testns-autoscaling-runnerset" + RandStringRunes(5)}, configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
}
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")
controller := &EphemeralRunnerSetReconciler{ controller := &EphemeralRunnerSetReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
@ -634,22 +576,10 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func(
Log: logf.Log, Log: logf.Log,
ActionsClient: actions.NewMultiClient("test", logr.Discard()), ActionsClient: actions.NewMultiClient("test", logr.Discard()),
} }
err = controller.SetupWithManager(mgr) err := controller.SetupWithManager(mgr)
Expect(err).NotTo(HaveOccurred(), "failed to setup controller") Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
go func() { startManagers(GinkgoT(), mgr)
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")
}) })
It("should create a proxy secret and delete the proxy secreat after the runner-set is deleted", func() { It("should create a proxy secret and delete the proxy secreat after the runner-set is deleted", func() {

View File

@ -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
}

1
go.mod
View File

@ -28,6 +28,7 @@ require (
go.uber.org/zap v1.24.0 go.uber.org/zap v1.24.0
golang.org/x/net v0.7.0 golang.org/x/net v0.7.0
golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 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 gomodules.xyz/jsonpatch/v2 v2.2.0
gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v2 v2.4.0
k8s.io/api v0.26.1 k8s.io/api v0.26.1

2
go.sum
View File

@ -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-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-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-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-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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=