Refactor main.go and introduce make run-scaleset to be able to run manager locally (#2337)

This commit is contained in:
Nikola Jokic
2023-03-10 18:05:51 +01:00
committed by GitHub
parent 1d24d3b00d
commit a5f98dea75
7 changed files with 106 additions and 119 deletions

173
main.go
View File

@@ -17,7 +17,6 @@ limitations under the License.
package main
import (
"context"
"flag"
"fmt"
"os"
@@ -33,9 +32,7 @@ import (
"github.com/actions/actions-runner-controller/github/actions"
"github.com/actions/actions-runner-controller/logging"
"github.com/kelseyhightower/envconfig"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
ctrl "sigs.k8s.io/controller-runtime"
@@ -47,9 +44,7 @@ const (
defaultDockerImage = "docker:dind"
)
var (
scheme = runtime.NewScheme()
)
var scheme = runtime.NewScheme()
func init() {
_ = clientgoscheme.AddToScheme(scheme)
@@ -68,6 +63,7 @@ func (i *stringSlice) Set(value string) error {
*i = append(*i, value)
return nil
}
func main() {
var (
err error
@@ -170,17 +166,69 @@ func main() {
os.Exit(1)
}
multiClient := actionssummerwindnet.NewMultiGitHubClient(
mgr.GetClient(),
ghClient,
)
if autoScalingRunnerSetOnly {
managerImage := os.Getenv("CONTROLLER_MANAGER_CONTAINER_IMAGE")
if managerImage == "" {
log.Error(err, "unable to obtain listener image")
os.Exit(1)
}
managerNamespace := os.Getenv("CONTROLLER_MANAGER_POD_NAMESPACE")
if managerNamespace == "" {
log.Error(err, "unable to obtain manager pod namespace")
os.Exit(1)
}
actionsMultiClient := actions.NewMultiClient(
"actions-runner-controller/"+build.Version,
log.WithName("actions-clients"),
)
actionsMultiClient := actions.NewMultiClient(
"actions-runner-controller/"+build.Version,
log.WithName("actions-clients"),
)
if err = (&actionsgithubcom.AutoscalingRunnerSetReconciler{
Client: mgr.GetClient(),
Log: log.WithName("AutoscalingRunnerSet"),
Scheme: mgr.GetScheme(),
ControllerNamespace: managerNamespace,
DefaultRunnerScaleSetListenerImage: managerImage,
ActionsClient: actionsMultiClient,
DefaultRunnerScaleSetListenerImagePullSecrets: autoScalerImagePullSecrets,
}).SetupWithManager(mgr); err != nil {
log.Error(err, "unable to create controller", "controller", "AutoscalingRunnerSet")
os.Exit(1)
}
if err = (&actionsgithubcom.EphemeralRunnerReconciler{
Client: mgr.GetClient(),
Log: log.WithName("EphemeralRunner"),
Scheme: mgr.GetScheme(),
ActionsClient: actionsMultiClient,
}).SetupWithManager(mgr); err != nil {
log.Error(err, "unable to create controller", "controller", "EphemeralRunner")
os.Exit(1)
}
if err = (&actionsgithubcom.EphemeralRunnerSetReconciler{
Client: mgr.GetClient(),
Log: log.WithName("EphemeralRunnerSet"),
Scheme: mgr.GetScheme(),
ActionsClient: actionsMultiClient,
}).SetupWithManager(mgr); err != nil {
log.Error(err, "unable to create controller", "controller", "EphemeralRunnerSet")
os.Exit(1)
}
if err = (&actionsgithubcom.AutoscalingListenerReconciler{
Client: mgr.GetClient(),
Log: log.WithName("AutoscalingListener"),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
log.Error(err, "unable to create controller", "controller", "AutoscalingListener")
os.Exit(1)
}
} else {
multiClient := actionssummerwindnet.NewMultiGitHubClient(
mgr.GetClient(),
ghClient,
)
if !autoScalingRunnerSetOnly {
runnerReconciler := &actionssummerwindnet.RunnerReconciler{
Client: mgr.GetClient(),
Log: log.WithName("runner"),
@@ -314,94 +362,15 @@ func main() {
log.Error(err, "unable to create webhook", "webhook", "RunnerReplicaSet")
os.Exit(1)
}
}
}
// We use this environment avariable to turn on the ScaleSet related controllers.
// Otherwise ARC's legacy chart is unable to deploy a working ARC controller-manager pod,
// due to that the chart does not contain new actions.* CRDs while ARC requires those CRDs.
//
// We might have used a more explicitly named environment variable for this,
// e.g. "CONTROLLER_MANAGER_ENABLE_SCALE_SET" to explicitly enable the new controllers,
// or "CONTROLLER_MANAGER_DISABLE_SCALE_SET" to explicitly disable the new controllers.
// However, doing so would affect either private ARC testers or current ARC users
// who run ARC without those variabls.
mgrPodName := os.Getenv("CONTROLLER_MANAGER_POD_NAME")
if mgrPodName != "" {
mgrPodNamespace := os.Getenv("CONTROLLER_MANAGER_POD_NAMESPACE")
var mgrPod corev1.Pod
err = mgr.GetAPIReader().Get(context.Background(), types.NamespacedName{Namespace: mgrPodNamespace, Name: mgrPodName}, &mgrPod)
if err != nil {
log.Error(err, fmt.Sprintf("unable to obtain manager pod: %s (%s)", mgrPodName, mgrPodNamespace))
os.Exit(1)
}
var mgrContainer *corev1.Container
for _, container := range mgrPod.Spec.Containers {
if container.Name == "manager" {
mgrContainer = &container
break
injector := &actionssummerwindnet.PodRunnerTokenInjector{
Client: mgr.GetClient(),
GitHubClient: multiClient,
Log: ctrl.Log.WithName("webhook").WithName("PodRunnerTokenInjector"),
}
if err = injector.SetupWithManager(mgr); err != nil {
log.Error(err, "unable to create webhook server", "webhook", "PodRunnerTokenInjector")
os.Exit(1)
}
}
if mgrContainer != nil {
log.Info("Detected manager container", "image", mgrContainer.Image)
} else {
log.Error(err, "unable to obtain manager container image")
os.Exit(1)
}
if err = (&actionsgithubcom.AutoscalingRunnerSetReconciler{
Client: mgr.GetClient(),
Log: log.WithName("AutoscalingRunnerSet"),
Scheme: mgr.GetScheme(),
ControllerNamespace: mgrPodNamespace,
DefaultRunnerScaleSetListenerImage: mgrContainer.Image,
ActionsClient: actionsMultiClient,
DefaultRunnerScaleSetListenerImagePullSecrets: autoScalerImagePullSecrets,
}).SetupWithManager(mgr); err != nil {
log.Error(err, "unable to create controller", "controller", "AutoscalingRunnerSet")
os.Exit(1)
}
if err = (&actionsgithubcom.EphemeralRunnerReconciler{
Client: mgr.GetClient(),
Log: log.WithName("EphemeralRunner"),
Scheme: mgr.GetScheme(),
ActionsClient: actionsMultiClient,
}).SetupWithManager(mgr); err != nil {
log.Error(err, "unable to create controller", "controller", "EphemeralRunner")
os.Exit(1)
}
if err = (&actionsgithubcom.EphemeralRunnerSetReconciler{
Client: mgr.GetClient(),
Log: log.WithName("EphemeralRunnerSet"),
Scheme: mgr.GetScheme(),
ActionsClient: actionsMultiClient,
}).SetupWithManager(mgr); err != nil {
log.Error(err, "unable to create controller", "controller", "EphemeralRunnerSet")
os.Exit(1)
}
if err = (&actionsgithubcom.AutoscalingListenerReconciler{
Client: mgr.GetClient(),
Log: log.WithName("AutoscalingListener"),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
log.Error(err, "unable to create controller", "controller", "AutoscalingListener")
os.Exit(1)
}
// +kubebuilder:scaffold:builder
}
if !disableAdmissionWebhook && !autoScalingRunnerSetOnly {
injector := &actionssummerwindnet.PodRunnerTokenInjector{
Client: mgr.GetClient(),
GitHubClient: multiClient,
Log: ctrl.Log.WithName("webhook").WithName("PodRunnerTokenInjector"),
}
if err = injector.SetupWithManager(mgr); err != nil {
log.Error(err, "unable to create webhook server", "webhook", "PodRunnerTokenInjector")
os.Exit(1)
}
}