Reordering methods and constants so it is easier to look it up (#2501)
This commit is contained in:
parent
76fe43e8e0
commit
ba1ac0990b
|
|
@ -41,7 +41,6 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
autoscalingListenerContainerName = "autoscaler"
|
autoscalingListenerContainerName = "autoscaler"
|
||||||
autoscalingListenerOwnerKey = ".metadata.controller"
|
|
||||||
autoscalingListenerFinalizerName = "autoscalinglistener.actions.github.com/finalizer"
|
autoscalingListenerFinalizerName = "autoscalinglistener.actions.github.com/finalizer"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -246,65 +245,6 @@ func (r *AutoscalingListenerReconciler) Reconcile(ctx context.Context, req ctrl.
|
||||||
return ctrl.Result{}, nil
|
return ctrl.Result{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetupWithManager sets up the controller with the Manager.
|
|
||||||
func (r *AutoscalingListenerReconciler) SetupWithManager(mgr ctrl.Manager) error {
|
|
||||||
groupVersionIndexer := func(rawObj client.Object) []string {
|
|
||||||
groupVersion := v1alpha1.GroupVersion.String()
|
|
||||||
owner := metav1.GetControllerOf(rawObj)
|
|
||||||
if owner == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ...make sure it is owned by this controller
|
|
||||||
if owner.APIVersion != groupVersion || owner.Kind != "AutoscalingListener" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ...and if so, return it
|
|
||||||
return []string{owner.Name}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &corev1.Pod{}, autoscalingListenerOwnerKey, groupVersionIndexer); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &corev1.ServiceAccount{}, autoscalingListenerOwnerKey, groupVersionIndexer); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
labelBasedWatchFunc := func(obj client.Object) []reconcile.Request {
|
|
||||||
var requests []reconcile.Request
|
|
||||||
labels := obj.GetLabels()
|
|
||||||
namespace, ok := labels["auto-scaling-listener-namespace"]
|
|
||||||
if !ok {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
name, ok := labels["auto-scaling-listener-name"]
|
|
||||||
if !ok {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
requests = append(requests,
|
|
||||||
reconcile.Request{
|
|
||||||
NamespacedName: types.NamespacedName{
|
|
||||||
Name: name,
|
|
||||||
Namespace: namespace,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
|
||||||
return requests
|
|
||||||
}
|
|
||||||
|
|
||||||
return ctrl.NewControllerManagedBy(mgr).
|
|
||||||
For(&v1alpha1.AutoscalingListener{}).
|
|
||||||
Owns(&corev1.Pod{}).
|
|
||||||
Owns(&corev1.ServiceAccount{}).
|
|
||||||
Watches(&source.Kind{Type: &rbacv1.Role{}}, handler.EnqueueRequestsFromMapFunc(labelBasedWatchFunc)).
|
|
||||||
Watches(&source.Kind{Type: &rbacv1.RoleBinding{}}, handler.EnqueueRequestsFromMapFunc(labelBasedWatchFunc)).
|
|
||||||
WithEventFilter(predicate.ResourceVersionChangedPredicate{}).
|
|
||||||
Complete(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AutoscalingListenerReconciler) cleanupResources(ctx context.Context, autoscalingListener *v1alpha1.AutoscalingListener, logger logr.Logger) (done bool, err error) {
|
func (r *AutoscalingListenerReconciler) cleanupResources(ctx context.Context, autoscalingListener *v1alpha1.AutoscalingListener, logger logr.Logger) (done bool, err error) {
|
||||||
logger.Info("Cleaning up the listener pod")
|
logger.Info("Cleaning up the listener pod")
|
||||||
listenerPod := new(corev1.Pod)
|
listenerPod := new(corev1.Pod)
|
||||||
|
|
@ -615,3 +555,62 @@ func (r *AutoscalingListenerReconciler) createRoleBindingForListener(ctx context
|
||||||
"serviceAccount", serviceAccount.Name)
|
"serviceAccount", serviceAccount.Name)
|
||||||
return ctrl.Result{Requeue: true}, nil
|
return ctrl.Result{Requeue: true}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetupWithManager sets up the controller with the Manager.
|
||||||
|
func (r *AutoscalingListenerReconciler) SetupWithManager(mgr ctrl.Manager) error {
|
||||||
|
groupVersionIndexer := func(rawObj client.Object) []string {
|
||||||
|
groupVersion := v1alpha1.GroupVersion.String()
|
||||||
|
owner := metav1.GetControllerOf(rawObj)
|
||||||
|
if owner == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ...make sure it is owned by this controller
|
||||||
|
if owner.APIVersion != groupVersion || owner.Kind != "AutoscalingListener" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ...and if so, return it
|
||||||
|
return []string{owner.Name}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &corev1.Pod{}, resourceOwnerKey, groupVersionIndexer); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &corev1.ServiceAccount{}, resourceOwnerKey, groupVersionIndexer); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
labelBasedWatchFunc := func(obj client.Object) []reconcile.Request {
|
||||||
|
var requests []reconcile.Request
|
||||||
|
labels := obj.GetLabels()
|
||||||
|
namespace, ok := labels["auto-scaling-listener-namespace"]
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
name, ok := labels["auto-scaling-listener-name"]
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
requests = append(requests,
|
||||||
|
reconcile.Request{
|
||||||
|
NamespacedName: types.NamespacedName{
|
||||||
|
Name: name,
|
||||||
|
Namespace: namespace,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
return requests
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctrl.NewControllerManagedBy(mgr).
|
||||||
|
For(&v1alpha1.AutoscalingListener{}).
|
||||||
|
Owns(&corev1.Pod{}).
|
||||||
|
Owns(&corev1.ServiceAccount{}).
|
||||||
|
Watches(&source.Kind{Type: &rbacv1.Role{}}, handler.EnqueueRequestsFromMapFunc(labelBasedWatchFunc)).
|
||||||
|
Watches(&source.Kind{Type: &rbacv1.RoleBinding{}}, handler.EnqueueRequestsFromMapFunc(labelBasedWatchFunc)).
|
||||||
|
WithEventFilter(predicate.ResourceVersionChangedPredicate{}).
|
||||||
|
Complete(r)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -213,7 +213,7 @@ var _ = Describe("Test AutoScalingListener controller", func() {
|
||||||
Eventually(
|
Eventually(
|
||||||
func() error {
|
func() error {
|
||||||
podList := new(corev1.PodList)
|
podList := new(corev1.PodList)
|
||||||
err := k8sClient.List(ctx, podList, client.InNamespace(autoscalingListener.Namespace), client.MatchingFields{autoscalingRunnerSetOwnerKey: autoscalingListener.Name})
|
err := k8sClient.List(ctx, podList, client.InNamespace(autoscalingListener.Namespace), client.MatchingFields{resourceOwnerKey: autoscalingListener.Name})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -231,7 +231,7 @@ var _ = Describe("Test AutoScalingListener controller", func() {
|
||||||
Eventually(
|
Eventually(
|
||||||
func() error {
|
func() error {
|
||||||
serviceAccountList := new(corev1.ServiceAccountList)
|
serviceAccountList := new(corev1.ServiceAccountList)
|
||||||
err := k8sClient.List(ctx, serviceAccountList, client.InNamespace(autoscalingListener.Namespace), client.MatchingFields{autoscalingRunnerSetOwnerKey: autoscalingListener.Name})
|
err := k8sClient.List(ctx, serviceAccountList, client.InNamespace(autoscalingListener.Namespace), client.MatchingFields{resourceOwnerKey: autoscalingListener.Name})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,13 +42,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// TODO: Replace with shared image.
|
labelKeyRunnerSpecHash = "runner-spec-hash"
|
||||||
autoscalingRunnerSetOwnerKey = ".metadata.controller"
|
|
||||||
LabelKeyRunnerSpecHash = "runner-spec-hash"
|
|
||||||
autoscalingRunnerSetFinalizerName = "autoscalingrunnerset.actions.github.com/finalizer"
|
autoscalingRunnerSetFinalizerName = "autoscalingrunnerset.actions.github.com/finalizer"
|
||||||
runnerScaleSetIdAnnotationKey = "runner-scale-set-id"
|
runnerScaleSetIdAnnotationKey = "runner-scale-set-id"
|
||||||
runnerScaleSetNameAnnotationKey = "runner-scale-set-name"
|
runnerScaleSetNameAnnotationKey = "runner-scale-set-name"
|
||||||
autoscalingRunnerSetCleanupFinalizerName = "actions.github.com/cleanup-protection"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AutoscalingRunnerSetReconciler reconciles a AutoscalingRunnerSet object
|
// AutoscalingRunnerSetReconciler reconciles a AutoscalingRunnerSet object
|
||||||
|
|
@ -201,10 +198,10 @@ func (r *AutoscalingRunnerSetReconciler) Reconcile(ctx context.Context, req ctrl
|
||||||
|
|
||||||
desiredSpecHash := autoscalingRunnerSet.RunnerSetSpecHash()
|
desiredSpecHash := autoscalingRunnerSet.RunnerSetSpecHash()
|
||||||
for _, runnerSet := range existingRunnerSets.all() {
|
for _, runnerSet := range existingRunnerSets.all() {
|
||||||
log.Info("Find existing ephemeral runner set", "name", runnerSet.Name, "specHash", runnerSet.Labels[LabelKeyRunnerSpecHash])
|
log.Info("Find existing ephemeral runner set", "name", runnerSet.Name, "specHash", runnerSet.Labels[labelKeyRunnerSpecHash])
|
||||||
}
|
}
|
||||||
|
|
||||||
if desiredSpecHash != latestRunnerSet.Labels[LabelKeyRunnerSpecHash] {
|
if desiredSpecHash != latestRunnerSet.Labels[labelKeyRunnerSpecHash] {
|
||||||
log.Info("Latest runner set spec hash does not match the current autoscaling runner set. Creating a new runner set")
|
log.Info("Latest runner set spec hash does not match the current autoscaling runner set. Creating a new runner set")
|
||||||
return r.createEphemeralRunnerSet(ctx, autoscalingRunnerSet, log)
|
return r.createEphemeralRunnerSet(ctx, autoscalingRunnerSet, log)
|
||||||
}
|
}
|
||||||
|
|
@ -232,7 +229,7 @@ func (r *AutoscalingRunnerSetReconciler) Reconcile(ctx context.Context, req ctrl
|
||||||
}
|
}
|
||||||
|
|
||||||
// Our listener pod is out of date, so we need to delete it to get a new recreate.
|
// Our listener pod is out of date, so we need to delete it to get a new recreate.
|
||||||
if listener.Labels[LabelKeyRunnerSpecHash] != autoscalingRunnerSet.ListenerSpecHash() {
|
if listener.Labels[labelKeyRunnerSpecHash] != autoscalingRunnerSet.ListenerSpecHash() {
|
||||||
log.Info("RunnerScaleSetListener is out of date. Deleting it so that it is recreated", "name", listener.Name)
|
log.Info("RunnerScaleSetListener is out of date. Deleting it so that it is recreated", "name", listener.Name)
|
||||||
if err := r.Delete(ctx, listener); err != nil {
|
if err := r.Delete(ctx, listener); err != nil {
|
||||||
if kerrors.IsNotFound(err) {
|
if kerrors.IsNotFound(err) {
|
||||||
|
|
@ -601,7 +598,7 @@ func (r *AutoscalingRunnerSetReconciler) createAutoScalingListenerForRunnerSet(c
|
||||||
|
|
||||||
func (r *AutoscalingRunnerSetReconciler) listEphemeralRunnerSets(ctx context.Context, autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet) (*EphemeralRunnerSets, error) {
|
func (r *AutoscalingRunnerSetReconciler) listEphemeralRunnerSets(ctx context.Context, autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet) (*EphemeralRunnerSets, error) {
|
||||||
list := new(v1alpha1.EphemeralRunnerSetList)
|
list := new(v1alpha1.EphemeralRunnerSetList)
|
||||||
if err := r.List(ctx, list, client.InNamespace(autoscalingRunnerSet.Namespace), client.MatchingFields{autoscalingRunnerSetOwnerKey: autoscalingRunnerSet.Name}); err != nil {
|
if err := r.List(ctx, list, client.InNamespace(autoscalingRunnerSet.Namespace), client.MatchingFields{resourceOwnerKey: autoscalingRunnerSet.Name}); err != nil {
|
||||||
return nil, fmt.Errorf("failed to list ephemeral runner sets: %v", err)
|
return nil, fmt.Errorf("failed to list ephemeral runner sets: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -694,7 +691,7 @@ func (r *AutoscalingRunnerSetReconciler) SetupWithManager(mgr ctrl.Manager) erro
|
||||||
return []string{owner.Name}
|
return []string{owner.Name}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &v1alpha1.EphemeralRunnerSet{}, autoscalingRunnerSetOwnerKey, groupVersionIndexer); err != nil {
|
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &v1alpha1.EphemeralRunnerSet{}, resourceOwnerKey, groupVersionIndexer); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -754,12 +751,12 @@ func (c *autoscalingRunnerSetFinalizerDependencyCleaner) removeKubernetesModeRol
|
||||||
err := c.client.Get(ctx, types.NamespacedName{Name: roleBindingName, Namespace: c.autoscalingRunnerSet.Namespace}, roleBinding)
|
err := c.client.Get(ctx, types.NamespacedName{Name: roleBindingName, Namespace: c.autoscalingRunnerSet.Namespace}, roleBinding)
|
||||||
switch {
|
switch {
|
||||||
case err == nil:
|
case err == nil:
|
||||||
if !controllerutil.ContainsFinalizer(roleBinding, autoscalingRunnerSetCleanupFinalizerName) {
|
if !controllerutil.ContainsFinalizer(roleBinding, AutoscalingRunnerSetCleanupFinalizerName) {
|
||||||
c.logger.Info("Kubernetes mode role binding finalizer has already been removed", "name", roleBindingName)
|
c.logger.Info("Kubernetes mode role binding finalizer has already been removed", "name", roleBindingName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = patch(ctx, c.client, roleBinding, func(obj *rbacv1.RoleBinding) {
|
err = patch(ctx, c.client, roleBinding, func(obj *rbacv1.RoleBinding) {
|
||||||
controllerutil.RemoveFinalizer(obj, autoscalingRunnerSetCleanupFinalizerName)
|
controllerutil.RemoveFinalizer(obj, AutoscalingRunnerSetCleanupFinalizerName)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.err = fmt.Errorf("failed to patch kubernetes mode role binding without finalizer: %w", err)
|
c.err = fmt.Errorf("failed to patch kubernetes mode role binding without finalizer: %w", err)
|
||||||
|
|
@ -797,12 +794,12 @@ func (c *autoscalingRunnerSetFinalizerDependencyCleaner) removeKubernetesModeRol
|
||||||
err := c.client.Get(ctx, types.NamespacedName{Name: roleName, Namespace: c.autoscalingRunnerSet.Namespace}, role)
|
err := c.client.Get(ctx, types.NamespacedName{Name: roleName, Namespace: c.autoscalingRunnerSet.Namespace}, role)
|
||||||
switch {
|
switch {
|
||||||
case err == nil:
|
case err == nil:
|
||||||
if !controllerutil.ContainsFinalizer(role, autoscalingRunnerSetCleanupFinalizerName) {
|
if !controllerutil.ContainsFinalizer(role, AutoscalingRunnerSetCleanupFinalizerName) {
|
||||||
c.logger.Info("Kubernetes mode role finalizer has already been removed", "name", roleName)
|
c.logger.Info("Kubernetes mode role finalizer has already been removed", "name", roleName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = patch(ctx, c.client, role, func(obj *rbacv1.Role) {
|
err = patch(ctx, c.client, role, func(obj *rbacv1.Role) {
|
||||||
controllerutil.RemoveFinalizer(obj, autoscalingRunnerSetCleanupFinalizerName)
|
controllerutil.RemoveFinalizer(obj, AutoscalingRunnerSetCleanupFinalizerName)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.err = fmt.Errorf("failed to patch kubernetes mode role without finalizer: %w", err)
|
c.err = fmt.Errorf("failed to patch kubernetes mode role without finalizer: %w", err)
|
||||||
|
|
@ -841,12 +838,12 @@ func (c *autoscalingRunnerSetFinalizerDependencyCleaner) removeKubernetesModeSer
|
||||||
err := c.client.Get(ctx, types.NamespacedName{Name: serviceAccountName, Namespace: c.autoscalingRunnerSet.Namespace}, serviceAccount)
|
err := c.client.Get(ctx, types.NamespacedName{Name: serviceAccountName, Namespace: c.autoscalingRunnerSet.Namespace}, serviceAccount)
|
||||||
switch {
|
switch {
|
||||||
case err == nil:
|
case err == nil:
|
||||||
if !controllerutil.ContainsFinalizer(serviceAccount, autoscalingRunnerSetCleanupFinalizerName) {
|
if !controllerutil.ContainsFinalizer(serviceAccount, AutoscalingRunnerSetCleanupFinalizerName) {
|
||||||
c.logger.Info("Kubernetes mode service account finalizer has already been removed", "name", serviceAccountName)
|
c.logger.Info("Kubernetes mode service account finalizer has already been removed", "name", serviceAccountName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = patch(ctx, c.client, serviceAccount, func(obj *corev1.ServiceAccount) {
|
err = patch(ctx, c.client, serviceAccount, func(obj *corev1.ServiceAccount) {
|
||||||
controllerutil.RemoveFinalizer(obj, autoscalingRunnerSetCleanupFinalizerName)
|
controllerutil.RemoveFinalizer(obj, AutoscalingRunnerSetCleanupFinalizerName)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.err = fmt.Errorf("failed to patch kubernetes mode service account without finalizer: %w", err)
|
c.err = fmt.Errorf("failed to patch kubernetes mode service account without finalizer: %w", err)
|
||||||
|
|
@ -885,12 +882,12 @@ func (c *autoscalingRunnerSetFinalizerDependencyCleaner) removeNoPermissionServi
|
||||||
err := c.client.Get(ctx, types.NamespacedName{Name: serviceAccountName, Namespace: c.autoscalingRunnerSet.Namespace}, serviceAccount)
|
err := c.client.Get(ctx, types.NamespacedName{Name: serviceAccountName, Namespace: c.autoscalingRunnerSet.Namespace}, serviceAccount)
|
||||||
switch {
|
switch {
|
||||||
case err == nil:
|
case err == nil:
|
||||||
if !controllerutil.ContainsFinalizer(serviceAccount, autoscalingRunnerSetCleanupFinalizerName) {
|
if !controllerutil.ContainsFinalizer(serviceAccount, AutoscalingRunnerSetCleanupFinalizerName) {
|
||||||
c.logger.Info("No permission service account finalizer has already been removed", "name", serviceAccountName)
|
c.logger.Info("No permission service account finalizer has already been removed", "name", serviceAccountName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = patch(ctx, c.client, serviceAccount, func(obj *corev1.ServiceAccount) {
|
err = patch(ctx, c.client, serviceAccount, func(obj *corev1.ServiceAccount) {
|
||||||
controllerutil.RemoveFinalizer(obj, autoscalingRunnerSetCleanupFinalizerName)
|
controllerutil.RemoveFinalizer(obj, AutoscalingRunnerSetCleanupFinalizerName)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.err = fmt.Errorf("failed to patch service account without finalizer: %w", err)
|
c.err = fmt.Errorf("failed to patch service account without finalizer: %w", err)
|
||||||
|
|
@ -929,12 +926,12 @@ func (c *autoscalingRunnerSetFinalizerDependencyCleaner) removeGitHubSecretFinal
|
||||||
err := c.client.Get(ctx, types.NamespacedName{Name: githubSecretName, Namespace: c.autoscalingRunnerSet.Namespace}, githubSecret)
|
err := c.client.Get(ctx, types.NamespacedName{Name: githubSecretName, Namespace: c.autoscalingRunnerSet.Namespace}, githubSecret)
|
||||||
switch {
|
switch {
|
||||||
case err == nil:
|
case err == nil:
|
||||||
if !controllerutil.ContainsFinalizer(githubSecret, autoscalingRunnerSetCleanupFinalizerName) {
|
if !controllerutil.ContainsFinalizer(githubSecret, AutoscalingRunnerSetCleanupFinalizerName) {
|
||||||
c.logger.Info("GitHub secret finalizer has already been removed", "name", githubSecretName)
|
c.logger.Info("GitHub secret finalizer has already been removed", "name", githubSecretName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = patch(ctx, c.client, githubSecret, func(obj *corev1.Secret) {
|
err = patch(ctx, c.client, githubSecret, func(obj *corev1.Secret) {
|
||||||
controllerutil.RemoveFinalizer(obj, autoscalingRunnerSetCleanupFinalizerName)
|
controllerutil.RemoveFinalizer(obj, AutoscalingRunnerSetCleanupFinalizerName)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.err = fmt.Errorf("failed to patch GitHub secret without finalizer: %w", err)
|
c.err = fmt.Errorf("failed to patch GitHub secret without finalizer: %w", err)
|
||||||
|
|
@ -973,12 +970,12 @@ func (c *autoscalingRunnerSetFinalizerDependencyCleaner) removeManagerRoleBindin
|
||||||
err := c.client.Get(ctx, types.NamespacedName{Name: managerRoleBindingName, Namespace: c.autoscalingRunnerSet.Namespace}, roleBinding)
|
err := c.client.Get(ctx, types.NamespacedName{Name: managerRoleBindingName, Namespace: c.autoscalingRunnerSet.Namespace}, roleBinding)
|
||||||
switch {
|
switch {
|
||||||
case err == nil:
|
case err == nil:
|
||||||
if !controllerutil.ContainsFinalizer(roleBinding, autoscalingRunnerSetCleanupFinalizerName) {
|
if !controllerutil.ContainsFinalizer(roleBinding, AutoscalingRunnerSetCleanupFinalizerName) {
|
||||||
c.logger.Info("Manager role binding finalizer has already been removed", "name", managerRoleBindingName)
|
c.logger.Info("Manager role binding finalizer has already been removed", "name", managerRoleBindingName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = patch(ctx, c.client, roleBinding, func(obj *rbacv1.RoleBinding) {
|
err = patch(ctx, c.client, roleBinding, func(obj *rbacv1.RoleBinding) {
|
||||||
controllerutil.RemoveFinalizer(obj, autoscalingRunnerSetCleanupFinalizerName)
|
controllerutil.RemoveFinalizer(obj, AutoscalingRunnerSetCleanupFinalizerName)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.err = fmt.Errorf("failed to patch manager role binding without finalizer: %w", err)
|
c.err = fmt.Errorf("failed to patch manager role binding without finalizer: %w", err)
|
||||||
|
|
@ -1017,12 +1014,12 @@ func (c *autoscalingRunnerSetFinalizerDependencyCleaner) removeManagerRoleFinali
|
||||||
err := c.client.Get(ctx, types.NamespacedName{Name: managerRoleName, Namespace: c.autoscalingRunnerSet.Namespace}, role)
|
err := c.client.Get(ctx, types.NamespacedName{Name: managerRoleName, Namespace: c.autoscalingRunnerSet.Namespace}, role)
|
||||||
switch {
|
switch {
|
||||||
case err == nil:
|
case err == nil:
|
||||||
if !controllerutil.ContainsFinalizer(role, autoscalingRunnerSetCleanupFinalizerName) {
|
if !controllerutil.ContainsFinalizer(role, AutoscalingRunnerSetCleanupFinalizerName) {
|
||||||
c.logger.Info("Manager role finalizer has already been removed", "name", managerRoleName)
|
c.logger.Info("Manager role finalizer has already been removed", "name", managerRoleName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = patch(ctx, c.client, role, func(obj *rbacv1.Role) {
|
err = patch(ctx, c.client, role, func(obj *rbacv1.Role) {
|
||||||
controllerutil.RemoveFinalizer(obj, autoscalingRunnerSetCleanupFinalizerName)
|
controllerutil.RemoveFinalizer(obj, AutoscalingRunnerSetCleanupFinalizerName)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.err = fmt.Errorf("failed to patch manager role without finalizer: %w", err)
|
c.err = fmt.Errorf("failed to patch manager role without finalizer: %w", err)
|
||||||
|
|
|
||||||
|
|
@ -280,10 +280,10 @@ var _ = Describe("Test AutoScalingRunnerSet controller", func() {
|
||||||
return "", fmt.Errorf("We should have only 1 EphemeralRunnerSet, but got %v", len(runnerSetList.Items))
|
return "", fmt.Errorf("We should have only 1 EphemeralRunnerSet, but got %v", len(runnerSetList.Items))
|
||||||
}
|
}
|
||||||
|
|
||||||
return runnerSetList.Items[0].Labels[LabelKeyRunnerSpecHash], nil
|
return runnerSetList.Items[0].Labels[labelKeyRunnerSpecHash], nil
|
||||||
},
|
},
|
||||||
autoscalingRunnerSetTestTimeout,
|
autoscalingRunnerSetTestTimeout,
|
||||||
autoscalingRunnerSetTestInterval).ShouldNot(BeEquivalentTo(runnerSet.Labels[LabelKeyRunnerSpecHash]), "New EphemeralRunnerSet should be created")
|
autoscalingRunnerSetTestInterval).ShouldNot(BeEquivalentTo(runnerSet.Labels[labelKeyRunnerSpecHash]), "New EphemeralRunnerSet should be created")
|
||||||
|
|
||||||
// We should create a new listener
|
// We should create a new listener
|
||||||
Eventually(
|
Eventually(
|
||||||
|
|
@ -1160,7 +1160,7 @@ var _ = Describe("Test external permissions cleanup", func() {
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: autoscalingRunnerSet.Annotations[AnnotationKeyKubernetesModeRoleName],
|
Name: autoscalingRunnerSet.Annotations[AnnotationKeyKubernetesModeRoleName],
|
||||||
Namespace: autoscalingRunnerSet.Namespace,
|
Namespace: autoscalingRunnerSet.Namespace,
|
||||||
Finalizers: []string{autoscalingRunnerSetCleanupFinalizerName},
|
Finalizers: []string{AutoscalingRunnerSetCleanupFinalizerName},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1171,7 +1171,7 @@ var _ = Describe("Test external permissions cleanup", func() {
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: autoscalingRunnerSet.Annotations[AnnotationKeyKubernetesModeServiceAccountName],
|
Name: autoscalingRunnerSet.Annotations[AnnotationKeyKubernetesModeServiceAccountName],
|
||||||
Namespace: autoscalingRunnerSet.Namespace,
|
Namespace: autoscalingRunnerSet.Namespace,
|
||||||
Finalizers: []string{autoscalingRunnerSetCleanupFinalizerName},
|
Finalizers: []string{AutoscalingRunnerSetCleanupFinalizerName},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1182,7 +1182,7 @@ var _ = Describe("Test external permissions cleanup", func() {
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: autoscalingRunnerSet.Annotations[AnnotationKeyKubernetesModeRoleBindingName],
|
Name: autoscalingRunnerSet.Annotations[AnnotationKeyKubernetesModeRoleBindingName],
|
||||||
Namespace: autoscalingRunnerSet.Namespace,
|
Namespace: autoscalingRunnerSet.Namespace,
|
||||||
Finalizers: []string{autoscalingRunnerSetCleanupFinalizerName},
|
Finalizers: []string{AutoscalingRunnerSetCleanupFinalizerName},
|
||||||
},
|
},
|
||||||
Subjects: []rbacv1.Subject{
|
Subjects: []rbacv1.Subject{
|
||||||
{
|
{
|
||||||
|
|
@ -1317,7 +1317,7 @@ var _ = Describe("Test external permissions cleanup", func() {
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: autoscalingRunnerSet.Annotations[AnnotationKeyGitHubSecretName],
|
Name: autoscalingRunnerSet.Annotations[AnnotationKeyGitHubSecretName],
|
||||||
Namespace: autoscalingRunnerSet.Namespace,
|
Namespace: autoscalingRunnerSet.Namespace,
|
||||||
Finalizers: []string{autoscalingRunnerSetCleanupFinalizerName},
|
Finalizers: []string{AutoscalingRunnerSetCleanupFinalizerName},
|
||||||
},
|
},
|
||||||
Data: map[string][]byte{
|
Data: map[string][]byte{
|
||||||
"github_token": []byte(defaultGitHubToken),
|
"github_token": []byte(defaultGitHubToken),
|
||||||
|
|
@ -1333,7 +1333,7 @@ var _ = Describe("Test external permissions cleanup", func() {
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: autoscalingRunnerSet.Annotations[AnnotationKeyManagerRoleName],
|
Name: autoscalingRunnerSet.Annotations[AnnotationKeyManagerRoleName],
|
||||||
Namespace: autoscalingRunnerSet.Namespace,
|
Namespace: autoscalingRunnerSet.Namespace,
|
||||||
Finalizers: []string{autoscalingRunnerSetCleanupFinalizerName},
|
Finalizers: []string{AutoscalingRunnerSetCleanupFinalizerName},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1344,7 +1344,7 @@ var _ = Describe("Test external permissions cleanup", func() {
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: autoscalingRunnerSet.Annotations[AnnotationKeyManagerRoleBindingName],
|
Name: autoscalingRunnerSet.Annotations[AnnotationKeyManagerRoleBindingName],
|
||||||
Namespace: autoscalingRunnerSet.Namespace,
|
Namespace: autoscalingRunnerSet.Namespace,
|
||||||
Finalizers: []string{autoscalingRunnerSetCleanupFinalizerName},
|
Finalizers: []string{AutoscalingRunnerSetCleanupFinalizerName},
|
||||||
},
|
},
|
||||||
RoleRef: rbacv1.RoleRef{
|
RoleRef: rbacv1.RoleRef{
|
||||||
APIGroup: rbacv1.GroupName,
|
APIGroup: rbacv1.GroupName,
|
||||||
|
|
@ -1360,7 +1360,7 @@ var _ = Describe("Test external permissions cleanup", func() {
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: autoscalingRunnerSet.Annotations[AnnotationKeyNoPermissionServiceAccountName],
|
Name: autoscalingRunnerSet.Annotations[AnnotationKeyNoPermissionServiceAccountName],
|
||||||
Namespace: autoscalingRunnerSet.Namespace,
|
Namespace: autoscalingRunnerSet.Namespace,
|
||||||
Finalizers: []string{autoscalingRunnerSetCleanupFinalizerName},
|
Finalizers: []string{AutoscalingRunnerSetCleanupFinalizerName},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
package actionsgithubcom
|
package actionsgithubcom
|
||||||
|
|
||||||
|
import corev1 "k8s.io/api/core/v1"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
LabelKeyRunnerTemplateHash = "runner-template-hash"
|
LabelKeyRunnerTemplateHash = "runner-template-hash"
|
||||||
LabelKeyPodTemplateHash = "pod-template-hash"
|
LabelKeyPodTemplateHash = "pod-template-hash"
|
||||||
|
|
@ -16,3 +18,47 @@ const (
|
||||||
EnvVarHTTPSProxy = "https_proxy"
|
EnvVarHTTPSProxy = "https_proxy"
|
||||||
EnvVarNoProxy = "no_proxy"
|
EnvVarNoProxy = "no_proxy"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Labels applied to resources
|
||||||
|
const (
|
||||||
|
// Kubernetes labels
|
||||||
|
LabelKeyKubernetesPartOf = "app.kubernetes.io/part-of"
|
||||||
|
LabelKeyKubernetesComponent = "app.kubernetes.io/component"
|
||||||
|
LabelKeyKubernetesVersion = "app.kubernetes.io/version"
|
||||||
|
|
||||||
|
// Github labels
|
||||||
|
LabelKeyGitHubScaleSetName = "actions.github.com/scale-set-name"
|
||||||
|
LabelKeyGitHubScaleSetNamespace = "actions.github.com/scale-set-namespace"
|
||||||
|
LabelKeyGitHubEnterprise = "actions.github.com/enterprise"
|
||||||
|
LabelKeyGitHubOrganization = "actions.github.com/organization"
|
||||||
|
LabelKeyGitHubRepository = "actions.github.com/repository"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Finalizer used to protect resources from deletion while AutoscalingRunnerSet is running
|
||||||
|
const AutoscalingRunnerSetCleanupFinalizerName = "actions.github.com/cleanup-protection"
|
||||||
|
|
||||||
|
const AnnotationKeyGitHubRunnerGroupName = "actions.github.com/runner-group-name"
|
||||||
|
|
||||||
|
// Labels applied to listener roles
|
||||||
|
const (
|
||||||
|
labelKeyListenerName = "auto-scaling-listener-name"
|
||||||
|
labelKeyListenerNamespace = "auto-scaling-listener-namespace"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Annotations applied for later cleanup of resources
|
||||||
|
const (
|
||||||
|
AnnotationKeyManagerRoleBindingName = "actions.github.com/cleanup-manager-role-binding"
|
||||||
|
AnnotationKeyManagerRoleName = "actions.github.com/cleanup-manager-role-name"
|
||||||
|
AnnotationKeyKubernetesModeRoleName = "actions.github.com/cleanup-kubernetes-mode-role-name"
|
||||||
|
AnnotationKeyKubernetesModeRoleBindingName = "actions.github.com/cleanup-kubernetes-mode-role-binding-name"
|
||||||
|
AnnotationKeyKubernetesModeServiceAccountName = "actions.github.com/cleanup-kubernetes-mode-service-account-name"
|
||||||
|
AnnotationKeyGitHubSecretName = "actions.github.com/cleanup-github-secret-name"
|
||||||
|
AnnotationKeyNoPermissionServiceAccountName = "actions.github.com/cleanup-no-permission-service-account-name"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DefaultScaleSetListenerImagePullPolicy is the default pull policy applied
|
||||||
|
// to the listener when ImagePullPolicy is not specified
|
||||||
|
const DefaultScaleSetListenerImagePullPolicy = corev1.PullIfNotPresent
|
||||||
|
|
||||||
|
// ownerKey is field selector matching the owner name of a particular resource
|
||||||
|
const resourceOwnerKey = ".metadata.controller"
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,6 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ephemeralRunnerSetReconcilerOwnerKey = ".metadata.controller"
|
|
||||||
ephemeralRunnerSetFinalizerName = "ephemeralrunner.actions.github.com/finalizer"
|
ephemeralRunnerSetFinalizerName = "ephemeralrunner.actions.github.com/finalizer"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -147,7 +146,7 @@ func (r *EphemeralRunnerSetReconciler) Reconcile(ctx context.Context, req ctrl.R
|
||||||
ctx,
|
ctx,
|
||||||
ephemeralRunnerList,
|
ephemeralRunnerList,
|
||||||
client.InNamespace(req.Namespace),
|
client.InNamespace(req.Namespace),
|
||||||
client.MatchingFields{ephemeralRunnerSetReconcilerOwnerKey: req.Name},
|
client.MatchingFields{resourceOwnerKey: req.Name},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err, "Unable to list child ephemeral runners")
|
log.Error(err, "Unable to list child ephemeral runners")
|
||||||
|
|
@ -243,7 +242,7 @@ func (r *EphemeralRunnerSetReconciler) cleanUpProxySecret(ctx context.Context, e
|
||||||
|
|
||||||
func (r *EphemeralRunnerSetReconciler) cleanUpEphemeralRunners(ctx context.Context, ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet, log logr.Logger) (bool, error) {
|
func (r *EphemeralRunnerSetReconciler) cleanUpEphemeralRunners(ctx context.Context, ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet, log logr.Logger) (bool, error) {
|
||||||
ephemeralRunnerList := new(v1alpha1.EphemeralRunnerList)
|
ephemeralRunnerList := new(v1alpha1.EphemeralRunnerList)
|
||||||
err := r.List(ctx, ephemeralRunnerList, client.InNamespace(ephemeralRunnerSet.Namespace), client.MatchingFields{ephemeralRunnerSetReconcilerOwnerKey: ephemeralRunnerSet.Name})
|
err := r.List(ctx, ephemeralRunnerList, client.InNamespace(ephemeralRunnerSet.Namespace), client.MatchingFields{resourceOwnerKey: ephemeralRunnerSet.Name})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("failed to list child ephemeral runners: %v", err)
|
return false, fmt.Errorf("failed to list child ephemeral runners: %v", err)
|
||||||
}
|
}
|
||||||
|
|
@ -522,7 +521,7 @@ func (r *EphemeralRunnerSetReconciler) actionsClientOptionsFor(ctx context.Conte
|
||||||
// SetupWithManager sets up the controller with the Manager.
|
// SetupWithManager sets up the controller with the Manager.
|
||||||
func (r *EphemeralRunnerSetReconciler) SetupWithManager(mgr ctrl.Manager) error {
|
func (r *EphemeralRunnerSetReconciler) SetupWithManager(mgr ctrl.Manager) error {
|
||||||
// Index EphemeralRunner owned by EphemeralRunnerSet so we can perform faster look ups.
|
// Index EphemeralRunner owned by EphemeralRunnerSet so we can perform faster look ups.
|
||||||
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &v1alpha1.EphemeralRunner{}, ephemeralRunnerSetReconcilerOwnerKey, func(rawObj client.Object) []string {
|
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &v1alpha1.EphemeralRunner{}, resourceOwnerKey, func(rawObj client.Object) []string {
|
||||||
groupVersion := v1alpha1.GroupVersion.String()
|
groupVersion := v1alpha1.GroupVersion.String()
|
||||||
|
|
||||||
// grab the job object, extract the owner...
|
// grab the job object, extract the owner...
|
||||||
|
|
|
||||||
|
|
@ -20,40 +20,6 @@ const (
|
||||||
jitTokenKey = "jitToken"
|
jitTokenKey = "jitToken"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Labels applied to resources
|
|
||||||
const (
|
|
||||||
// Kubernetes labels
|
|
||||||
LabelKeyKubernetesPartOf = "app.kubernetes.io/part-of"
|
|
||||||
LabelKeyKubernetesComponent = "app.kubernetes.io/component"
|
|
||||||
LabelKeyKubernetesVersion = "app.kubernetes.io/version"
|
|
||||||
|
|
||||||
// Github labels
|
|
||||||
LabelKeyGitHubScaleSetName = "actions.github.com/scale-set-name"
|
|
||||||
LabelKeyGitHubScaleSetNamespace = "actions.github.com/scale-set-namespace"
|
|
||||||
LabelKeyGitHubEnterprise = "actions.github.com/enterprise"
|
|
||||||
LabelKeyGitHubOrganization = "actions.github.com/organization"
|
|
||||||
LabelKeyGitHubRepository = "actions.github.com/repository"
|
|
||||||
)
|
|
||||||
|
|
||||||
const AnnotationKeyGitHubRunnerGroupName = "actions.github.com/runner-group-name"
|
|
||||||
|
|
||||||
// Labels applied to listener roles
|
|
||||||
const (
|
|
||||||
labelKeyListenerName = "auto-scaling-listener-name"
|
|
||||||
labelKeyListenerNamespace = "auto-scaling-listener-namespace"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Annotations applied for later cleanup of resources
|
|
||||||
const (
|
|
||||||
AnnotationKeyManagerRoleBindingName = "actions.github.com/cleanup-manager-role-binding"
|
|
||||||
AnnotationKeyManagerRoleName = "actions.github.com/cleanup-manager-role-name"
|
|
||||||
AnnotationKeyKubernetesModeRoleName = "actions.github.com/cleanup-kubernetes-mode-role-name"
|
|
||||||
AnnotationKeyKubernetesModeRoleBindingName = "actions.github.com/cleanup-kubernetes-mode-role-binding-name"
|
|
||||||
AnnotationKeyKubernetesModeServiceAccountName = "actions.github.com/cleanup-kubernetes-mode-service-account-name"
|
|
||||||
AnnotationKeyGitHubSecretName = "actions.github.com/cleanup-github-secret-name"
|
|
||||||
AnnotationKeyNoPermissionServiceAccountName = "actions.github.com/cleanup-no-permission-service-account-name"
|
|
||||||
)
|
|
||||||
|
|
||||||
var commonLabelKeys = [...]string{
|
var commonLabelKeys = [...]string{
|
||||||
LabelKeyKubernetesPartOf,
|
LabelKeyKubernetesPartOf,
|
||||||
LabelKeyKubernetesComponent,
|
LabelKeyKubernetesComponent,
|
||||||
|
|
@ -67,8 +33,6 @@ var commonLabelKeys = [...]string{
|
||||||
|
|
||||||
const labelValueKubernetesPartOf = "gha-runner-scale-set"
|
const labelValueKubernetesPartOf = "gha-runner-scale-set"
|
||||||
|
|
||||||
const DefaultScaleSetListenerImagePullPolicy = corev1.PullIfNotPresent
|
|
||||||
|
|
||||||
// scaleSetListenerImagePullPolicy is applied to all listeners
|
// scaleSetListenerImagePullPolicy is applied to all listeners
|
||||||
var scaleSetListenerImagePullPolicy = DefaultScaleSetListenerImagePullPolicy
|
var scaleSetListenerImagePullPolicy = DefaultScaleSetListenerImagePullPolicy
|
||||||
|
|
||||||
|
|
@ -84,6 +48,62 @@ func SetListenerImagePullPolicy(pullPolicy string) bool {
|
||||||
|
|
||||||
type resourceBuilder struct{}
|
type resourceBuilder struct{}
|
||||||
|
|
||||||
|
func (b *resourceBuilder) newAutoScalingListener(autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet, ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet, namespace, image string, imagePullSecrets []corev1.LocalObjectReference) (*v1alpha1.AutoscalingListener, error) {
|
||||||
|
runnerScaleSetId, err := strconv.Atoi(autoscalingRunnerSet.Annotations[runnerScaleSetIdAnnotationKey])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
effectiveMinRunners := 0
|
||||||
|
effectiveMaxRunners := math.MaxInt32
|
||||||
|
if autoscalingRunnerSet.Spec.MaxRunners != nil {
|
||||||
|
effectiveMaxRunners = *autoscalingRunnerSet.Spec.MaxRunners
|
||||||
|
}
|
||||||
|
if autoscalingRunnerSet.Spec.MinRunners != nil {
|
||||||
|
effectiveMinRunners = *autoscalingRunnerSet.Spec.MinRunners
|
||||||
|
}
|
||||||
|
|
||||||
|
githubConfig, err := actions.ParseGitHubConfigFromURL(autoscalingRunnerSet.Spec.GitHubConfigUrl)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to parse github config from url: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
autoscalingListener := &v1alpha1.AutoscalingListener{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: scaleSetListenerName(autoscalingRunnerSet),
|
||||||
|
Namespace: namespace,
|
||||||
|
Labels: map[string]string{
|
||||||
|
LabelKeyGitHubScaleSetNamespace: autoscalingRunnerSet.Namespace,
|
||||||
|
LabelKeyGitHubScaleSetName: autoscalingRunnerSet.Name,
|
||||||
|
LabelKeyKubernetesPartOf: labelValueKubernetesPartOf,
|
||||||
|
LabelKeyKubernetesComponent: "runner-scale-set-listener",
|
||||||
|
LabelKeyKubernetesVersion: autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion],
|
||||||
|
LabelKeyGitHubEnterprise: githubConfig.Enterprise,
|
||||||
|
LabelKeyGitHubOrganization: githubConfig.Organization,
|
||||||
|
LabelKeyGitHubRepository: githubConfig.Repository,
|
||||||
|
labelKeyRunnerSpecHash: autoscalingRunnerSet.ListenerSpecHash(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Spec: v1alpha1.AutoscalingListenerSpec{
|
||||||
|
GitHubConfigUrl: autoscalingRunnerSet.Spec.GitHubConfigUrl,
|
||||||
|
GitHubConfigSecret: autoscalingRunnerSet.Spec.GitHubConfigSecret,
|
||||||
|
RunnerScaleSetId: runnerScaleSetId,
|
||||||
|
AutoscalingRunnerSetNamespace: autoscalingRunnerSet.Namespace,
|
||||||
|
AutoscalingRunnerSetName: autoscalingRunnerSet.Name,
|
||||||
|
EphemeralRunnerSetName: ephemeralRunnerSet.Name,
|
||||||
|
MinRunners: effectiveMinRunners,
|
||||||
|
MaxRunners: effectiveMaxRunners,
|
||||||
|
Image: image,
|
||||||
|
ImagePullPolicy: scaleSetListenerImagePullPolicy,
|
||||||
|
ImagePullSecrets: imagePullSecrets,
|
||||||
|
Proxy: autoscalingRunnerSet.Spec.Proxy,
|
||||||
|
GitHubServerTLS: autoscalingRunnerSet.Spec.GitHubServerTLS,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return autoscalingListener, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (b *resourceBuilder) newScaleSetListenerPod(autoscalingListener *v1alpha1.AutoscalingListener, serviceAccount *corev1.ServiceAccount, secret *corev1.Secret, envs ...corev1.EnvVar) *corev1.Pod {
|
func (b *resourceBuilder) newScaleSetListenerPod(autoscalingListener *v1alpha1.AutoscalingListener, serviceAccount *corev1.ServiceAccount, secret *corev1.Secret, envs ...corev1.EnvVar) *corev1.Pod {
|
||||||
listenerEnv := []corev1.EnvVar{
|
listenerEnv := []corev1.EnvVar{
|
||||||
{
|
{
|
||||||
|
|
@ -207,54 +227,6 @@ func (b *resourceBuilder) newScaleSetListenerPod(autoscalingListener *v1alpha1.A
|
||||||
return newRunnerScaleSetListenerPod
|
return newRunnerScaleSetListenerPod
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *resourceBuilder) newEphemeralRunnerSet(autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet) (*v1alpha1.EphemeralRunnerSet, error) {
|
|
||||||
runnerScaleSetId, err := strconv.Atoi(autoscalingRunnerSet.Annotations[runnerScaleSetIdAnnotationKey])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
runnerSpecHash := autoscalingRunnerSet.RunnerSetSpecHash()
|
|
||||||
|
|
||||||
newLabels := map[string]string{
|
|
||||||
LabelKeyRunnerSpecHash: runnerSpecHash,
|
|
||||||
LabelKeyKubernetesPartOf: labelValueKubernetesPartOf,
|
|
||||||
LabelKeyKubernetesComponent: "runner-set",
|
|
||||||
LabelKeyKubernetesVersion: autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion],
|
|
||||||
LabelKeyGitHubScaleSetName: autoscalingRunnerSet.Name,
|
|
||||||
LabelKeyGitHubScaleSetNamespace: autoscalingRunnerSet.Namespace,
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := applyGitHubURLLabels(autoscalingRunnerSet.Spec.GitHubConfigUrl, newLabels); err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to apply GitHub URL labels: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
newAnnotations := map[string]string{
|
|
||||||
AnnotationKeyGitHubRunnerGroupName: autoscalingRunnerSet.Annotations[AnnotationKeyGitHubRunnerGroupName],
|
|
||||||
}
|
|
||||||
|
|
||||||
newEphemeralRunnerSet := &v1alpha1.EphemeralRunnerSet{
|
|
||||||
TypeMeta: metav1.TypeMeta{},
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
GenerateName: autoscalingRunnerSet.ObjectMeta.Name + "-",
|
|
||||||
Namespace: autoscalingRunnerSet.ObjectMeta.Namespace,
|
|
||||||
Labels: newLabels,
|
|
||||||
Annotations: newAnnotations,
|
|
||||||
},
|
|
||||||
Spec: v1alpha1.EphemeralRunnerSetSpec{
|
|
||||||
Replicas: 0,
|
|
||||||
EphemeralRunnerSpec: v1alpha1.EphemeralRunnerSpec{
|
|
||||||
RunnerScaleSetId: runnerScaleSetId,
|
|
||||||
GitHubConfigUrl: autoscalingRunnerSet.Spec.GitHubConfigUrl,
|
|
||||||
GitHubConfigSecret: autoscalingRunnerSet.Spec.GitHubConfigSecret,
|
|
||||||
Proxy: autoscalingRunnerSet.Spec.Proxy,
|
|
||||||
GitHubServerTLS: autoscalingRunnerSet.Spec.GitHubServerTLS,
|
|
||||||
PodTemplateSpec: autoscalingRunnerSet.Spec.Template,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
return newEphemeralRunnerSet, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *resourceBuilder) newScaleSetListenerServiceAccount(autoscalingListener *v1alpha1.AutoscalingListener) *corev1.ServiceAccount {
|
func (b *resourceBuilder) newScaleSetListenerServiceAccount(autoscalingListener *v1alpha1.AutoscalingListener) *corev1.ServiceAccount {
|
||||||
return &corev1.ServiceAccount{
|
return &corev1.ServiceAccount{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
|
@ -344,60 +316,52 @@ func (b *resourceBuilder) newScaleSetListenerSecretMirror(autoscalingListener *v
|
||||||
return newListenerSecret
|
return newListenerSecret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *resourceBuilder) newAutoScalingListener(autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet, ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet, namespace, image string, imagePullSecrets []corev1.LocalObjectReference) (*v1alpha1.AutoscalingListener, error) {
|
func (b *resourceBuilder) newEphemeralRunnerSet(autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet) (*v1alpha1.EphemeralRunnerSet, error) {
|
||||||
runnerScaleSetId, err := strconv.Atoi(autoscalingRunnerSet.Annotations[runnerScaleSetIdAnnotationKey])
|
runnerScaleSetId, err := strconv.Atoi(autoscalingRunnerSet.Annotations[runnerScaleSetIdAnnotationKey])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
runnerSpecHash := autoscalingRunnerSet.RunnerSetSpecHash()
|
||||||
|
|
||||||
effectiveMinRunners := 0
|
newLabels := map[string]string{
|
||||||
effectiveMaxRunners := math.MaxInt32
|
labelKeyRunnerSpecHash: runnerSpecHash,
|
||||||
if autoscalingRunnerSet.Spec.MaxRunners != nil {
|
|
||||||
effectiveMaxRunners = *autoscalingRunnerSet.Spec.MaxRunners
|
|
||||||
}
|
|
||||||
if autoscalingRunnerSet.Spec.MinRunners != nil {
|
|
||||||
effectiveMinRunners = *autoscalingRunnerSet.Spec.MinRunners
|
|
||||||
}
|
|
||||||
|
|
||||||
githubConfig, err := actions.ParseGitHubConfigFromURL(autoscalingRunnerSet.Spec.GitHubConfigUrl)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to parse github config from url: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
autoscalingListener := &v1alpha1.AutoscalingListener{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: scaleSetListenerName(autoscalingRunnerSet),
|
|
||||||
Namespace: namespace,
|
|
||||||
Labels: map[string]string{
|
|
||||||
LabelKeyGitHubScaleSetNamespace: autoscalingRunnerSet.Namespace,
|
|
||||||
LabelKeyGitHubScaleSetName: autoscalingRunnerSet.Name,
|
|
||||||
LabelKeyKubernetesPartOf: labelValueKubernetesPartOf,
|
LabelKeyKubernetesPartOf: labelValueKubernetesPartOf,
|
||||||
LabelKeyKubernetesComponent: "runner-scale-set-listener",
|
LabelKeyKubernetesComponent: "runner-set",
|
||||||
LabelKeyKubernetesVersion: autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion],
|
LabelKeyKubernetesVersion: autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion],
|
||||||
LabelKeyGitHubEnterprise: githubConfig.Enterprise,
|
LabelKeyGitHubScaleSetName: autoscalingRunnerSet.Name,
|
||||||
LabelKeyGitHubOrganization: githubConfig.Organization,
|
LabelKeyGitHubScaleSetNamespace: autoscalingRunnerSet.Namespace,
|
||||||
LabelKeyGitHubRepository: githubConfig.Repository,
|
}
|
||||||
LabelKeyRunnerSpecHash: autoscalingRunnerSet.ListenerSpecHash(),
|
|
||||||
|
if err := applyGitHubURLLabels(autoscalingRunnerSet.Spec.GitHubConfigUrl, newLabels); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to apply GitHub URL labels: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
newAnnotations := map[string]string{
|
||||||
|
AnnotationKeyGitHubRunnerGroupName: autoscalingRunnerSet.Annotations[AnnotationKeyGitHubRunnerGroupName],
|
||||||
|
}
|
||||||
|
|
||||||
|
newEphemeralRunnerSet := &v1alpha1.EphemeralRunnerSet{
|
||||||
|
TypeMeta: metav1.TypeMeta{},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
GenerateName: autoscalingRunnerSet.ObjectMeta.Name + "-",
|
||||||
|
Namespace: autoscalingRunnerSet.ObjectMeta.Namespace,
|
||||||
|
Labels: newLabels,
|
||||||
|
Annotations: newAnnotations,
|
||||||
},
|
},
|
||||||
},
|
Spec: v1alpha1.EphemeralRunnerSetSpec{
|
||||||
Spec: v1alpha1.AutoscalingListenerSpec{
|
Replicas: 0,
|
||||||
|
EphemeralRunnerSpec: v1alpha1.EphemeralRunnerSpec{
|
||||||
|
RunnerScaleSetId: runnerScaleSetId,
|
||||||
GitHubConfigUrl: autoscalingRunnerSet.Spec.GitHubConfigUrl,
|
GitHubConfigUrl: autoscalingRunnerSet.Spec.GitHubConfigUrl,
|
||||||
GitHubConfigSecret: autoscalingRunnerSet.Spec.GitHubConfigSecret,
|
GitHubConfigSecret: autoscalingRunnerSet.Spec.GitHubConfigSecret,
|
||||||
RunnerScaleSetId: runnerScaleSetId,
|
|
||||||
AutoscalingRunnerSetNamespace: autoscalingRunnerSet.Namespace,
|
|
||||||
AutoscalingRunnerSetName: autoscalingRunnerSet.Name,
|
|
||||||
EphemeralRunnerSetName: ephemeralRunnerSet.Name,
|
|
||||||
MinRunners: effectiveMinRunners,
|
|
||||||
MaxRunners: effectiveMaxRunners,
|
|
||||||
Image: image,
|
|
||||||
ImagePullPolicy: scaleSetListenerImagePullPolicy,
|
|
||||||
ImagePullSecrets: imagePullSecrets,
|
|
||||||
Proxy: autoscalingRunnerSet.Spec.Proxy,
|
Proxy: autoscalingRunnerSet.Spec.Proxy,
|
||||||
GitHubServerTLS: autoscalingRunnerSet.Spec.GitHubServerTLS,
|
GitHubServerTLS: autoscalingRunnerSet.Spec.GitHubServerTLS,
|
||||||
|
PodTemplateSpec: autoscalingRunnerSet.Spec.Template,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return autoscalingListener, nil
|
return newEphemeralRunnerSet, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *resourceBuilder) newEphemeralRunner(ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet) *v1alpha1.EphemeralRunner {
|
func (b *resourceBuilder) newEphemeralRunner(ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet) *v1alpha1.EphemeralRunner {
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ func TestLabelPropagation(t *testing.T) {
|
||||||
assert.Equal(t, labelValueKubernetesPartOf, ephemeralRunnerSet.Labels[LabelKeyKubernetesPartOf])
|
assert.Equal(t, labelValueKubernetesPartOf, ephemeralRunnerSet.Labels[LabelKeyKubernetesPartOf])
|
||||||
assert.Equal(t, "runner-set", ephemeralRunnerSet.Labels[LabelKeyKubernetesComponent])
|
assert.Equal(t, "runner-set", ephemeralRunnerSet.Labels[LabelKeyKubernetesComponent])
|
||||||
assert.Equal(t, autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion], ephemeralRunnerSet.Labels[LabelKeyKubernetesVersion])
|
assert.Equal(t, autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion], ephemeralRunnerSet.Labels[LabelKeyKubernetesVersion])
|
||||||
assert.NotEmpty(t, ephemeralRunnerSet.Labels[LabelKeyRunnerSpecHash])
|
assert.NotEmpty(t, ephemeralRunnerSet.Labels[labelKeyRunnerSpecHash])
|
||||||
assert.Equal(t, autoscalingRunnerSet.Name, ephemeralRunnerSet.Labels[LabelKeyGitHubScaleSetName])
|
assert.Equal(t, autoscalingRunnerSet.Name, ephemeralRunnerSet.Labels[LabelKeyGitHubScaleSetName])
|
||||||
assert.Equal(t, autoscalingRunnerSet.Namespace, ephemeralRunnerSet.Labels[LabelKeyGitHubScaleSetNamespace])
|
assert.Equal(t, autoscalingRunnerSet.Namespace, ephemeralRunnerSet.Labels[LabelKeyGitHubScaleSetNamespace])
|
||||||
assert.Equal(t, "", ephemeralRunnerSet.Labels[LabelKeyGitHubEnterprise])
|
assert.Equal(t, "", ephemeralRunnerSet.Labels[LabelKeyGitHubEnterprise])
|
||||||
|
|
@ -49,7 +49,7 @@ func TestLabelPropagation(t *testing.T) {
|
||||||
assert.Equal(t, labelValueKubernetesPartOf, listener.Labels[LabelKeyKubernetesPartOf])
|
assert.Equal(t, labelValueKubernetesPartOf, listener.Labels[LabelKeyKubernetesPartOf])
|
||||||
assert.Equal(t, "runner-scale-set-listener", listener.Labels[LabelKeyKubernetesComponent])
|
assert.Equal(t, "runner-scale-set-listener", listener.Labels[LabelKeyKubernetesComponent])
|
||||||
assert.Equal(t, autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion], listener.Labels[LabelKeyKubernetesVersion])
|
assert.Equal(t, autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion], listener.Labels[LabelKeyKubernetesVersion])
|
||||||
assert.NotEmpty(t, ephemeralRunnerSet.Labels[LabelKeyRunnerSpecHash])
|
assert.NotEmpty(t, ephemeralRunnerSet.Labels[labelKeyRunnerSpecHash])
|
||||||
assert.Equal(t, autoscalingRunnerSet.Name, listener.Labels[LabelKeyGitHubScaleSetName])
|
assert.Equal(t, autoscalingRunnerSet.Name, listener.Labels[LabelKeyGitHubScaleSetName])
|
||||||
assert.Equal(t, autoscalingRunnerSet.Namespace, listener.Labels[LabelKeyGitHubScaleSetNamespace])
|
assert.Equal(t, autoscalingRunnerSet.Namespace, listener.Labels[LabelKeyGitHubScaleSetNamespace])
|
||||||
assert.Equal(t, "", listener.Labels[LabelKeyGitHubEnterprise])
|
assert.Equal(t, "", listener.Labels[LabelKeyGitHubEnterprise])
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue