[node operator] main.go: switch over CSP flag to generate cloud provider API client to inject into controllers.

Signed-off-by: Malte Poll <mp@edgeless.systems>
This commit is contained in:
Malte Poll 2022-07-05 10:27:12 +02:00 committed by Malte Poll
parent 904d3cba0a
commit 0b0a3454fa

View File

@ -2,8 +2,10 @@
package main package main
import ( import (
"context"
"flag" "flag"
"os" "os"
"strings"
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
// to ensure that exec-entrypoint and run can make use of them. // to ensure that exec-entrypoint and run can make use of them.
@ -35,9 +37,11 @@ func init() {
} }
func main() { func main() {
var csp string
var metricsAddr string var metricsAddr string
var enableLeaderElection bool var enableLeaderElection bool
var probeAddr string var probeAddr string
flag.StringVar(&csp, "csp", "", "Cloud Service Provider the image is running on")
flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.") flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.")
flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
flag.BoolVar(&enableLeaderElection, "leader-elect", false, flag.BoolVar(&enableLeaderElection, "leader-elect", false,
@ -51,6 +55,17 @@ func main() {
ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
var cspClient cspAPI
switch strings.ToLower(csp) {
case "azure":
panic("Azure is not supported yet")
case "gcp":
panic("GCP is not supported yet")
default:
setupLog.Info("Unknown CSP", "csp", csp)
os.Exit(1)
}
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
Scheme: scheme, Scheme: scheme,
MetricsBindAddress: metricsAddr, MetricsBindAddress: metricsAddr,
@ -64,10 +79,9 @@ func main() {
os.Exit(1) os.Exit(1)
} }
if err = (&controllers.NodeImageReconciler{ if err = controllers.NewNodeImageReconciler(
Client: mgr.GetClient(), cspClient, mgr.GetClient(), mgr.GetScheme(),
Scheme: mgr.GetScheme(), ).SetupWithManager(mgr); err != nil {
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "Unable to create controller", "controller", "NodeImage") setupLog.Error(err, "Unable to create controller", "controller", "NodeImage")
os.Exit(1) os.Exit(1)
} }
@ -78,17 +92,15 @@ func main() {
setupLog.Error(err, "Unable to create controller", "controller", "AutoscalingStrategy") setupLog.Error(err, "Unable to create controller", "controller", "AutoscalingStrategy")
os.Exit(1) os.Exit(1)
} }
if err = (&controllers.ScalingGroupReconciler{ if err = controllers.NewScalingGroupReconciler(
Client: mgr.GetClient(), cspClient, mgr.GetClient(), mgr.GetScheme(),
Scheme: mgr.GetScheme(), ).SetupWithManager(mgr); err != nil {
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "Unable to create controller", "controller", "ScalingGroup") setupLog.Error(err, "Unable to create controller", "controller", "ScalingGroup")
os.Exit(1) os.Exit(1)
} }
if err = (&controllers.PendingNodeReconciler{ if err = controllers.NewPendingNodeReconciler(
Client: mgr.GetClient(), cspClient, mgr.GetClient(), mgr.GetScheme(),
Scheme: mgr.GetScheme(), ).SetupWithManager(mgr); err != nil {
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "Unable to create controller", "controller", "PendingNode") setupLog.Error(err, "Unable to create controller", "controller", "PendingNode")
os.Exit(1) os.Exit(1)
} }
@ -109,3 +121,20 @@ func main() {
os.Exit(1) os.Exit(1)
} }
} }
type cspAPI interface {
// GetNodeImage retrieves the image currently used by a node.
GetNodeImage(ctx context.Context, providerID string) (string, error)
// GetScalingGroupID retrieves the scaling group that a node is part of.
GetScalingGroupID(ctx context.Context, providerID string) (string, error)
// CreateNode creates a new node inside a specified scaling group at the CSP and returns its future name and provider id.
CreateNode(ctx context.Context, scalingGroupID string) (nodeName, providerID string, err error)
// DeleteNode starts the termination of the node at the CSP.
DeleteNode(ctx context.Context, providerID string) error
// GetNodeState retrieves the state of a pending node from a CSP.
GetNodeState(ctx context.Context, providerID string) (updatev1alpha1.CSPNodeState, error)
// GetScalingGroupImage retrieves the image currently used by a scaling group.
GetScalingGroupImage(ctx context.Context, scalingGroupID string) (string, error)
// SetScalingGroupImage sets the image to be used by newly created nodes in a scaling group.
SetScalingGroupImage(ctx context.Context, scalingGroupID, imageURI string) error
}