Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions cmd/thv-operator/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
"fmt"
"log/slog"
"os"
"strconv"
"strings"

"github.com/go-logr/logr"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
Expand Down Expand Up @@ -42,10 +44,17 @@
setupLog = log.Log.WithName("setup")
)

// envEnableStorageVersionMigrator is the opt-in for the StorageVersionMigrator
// controller. The controller defaults to OFF in this release so the change can
// ship safely without functional impact. Set to "true" (or "1", "t") to enable.
// A follow-up release will flip the chart default to true.
const envEnableStorageVersionMigrator = "ENABLE_STORAGE_VERSION_MIGRATOR"
Comment thread
ChrisJBurns marked this conversation as resolved.
Outdated

func init() {
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
utilruntime.Must(mcpv1alpha1.AddToScheme(scheme))
utilruntime.Must(mcpv1beta1.AddToScheme(scheme))
utilruntime.Must(apiextensionsv1.AddToScheme(scheme))
//+kubebuilder:scaffold:scheme
}

Expand Down Expand Up @@ -150,10 +159,53 @@
if err := setupAggregationControllers(mgr, imagePullSecretsDefaults); err != nil {
return err
}
if isStorageVersionMigratorEnabled() {
if err := setupStorageVersionMigrator(mgr); err != nil {
return err
}
} else {
setupLog.Info("StorageVersionMigrator disabled", "envVar", envEnableStorageVersionMigrator)
Comment thread
ChrisJBurns marked this conversation as resolved.
Outdated
}
//+kubebuilder:scaffold:builder
return nil
}

// setupStorageVersionMigrator wires the StorageVersionMigrator controller into
// the manager. The controller reconciles status.storedVersions on opted-in
// toolhive.stacklok.dev CRDs so a future operator release can drop deprecated
// versions from spec.versions without orphaning etcd objects.
func setupStorageVersionMigrator(mgr ctrl.Manager) error {
if err := (&controllers.StorageVersionMigratorReconciler{
Client: mgr.GetClient(),
APIReader: mgr.GetAPIReader(),
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorderFor("storageversionmigrator-controller"),
}).SetupWithManager(mgr); err != nil {
return fmt.Errorf("unable to create controller StorageVersionMigrator: %w", err)
}
return nil
}

// isStorageVersionMigratorEnabled reports whether the StorageVersionMigrator
// controller should be registered. Defaults to false in this release — admins
// must explicitly opt in via ENABLE_STORAGE_VERSION_MIGRATOR=true. An
// unparseable value logs a warning and uses the default (disabled).

Check failure on line 192 in cmd/thv-operator/app/app.go

View workflow job for this annotation

GitHub Actions / Spellcheck / Codespell

unparseable ==> unparsable
func isStorageVersionMigratorEnabled() bool {
value, found := os.LookupEnv(envEnableStorageVersionMigrator)
if !found {
return false
}
enabled, err := strconv.ParseBool(value)
if err != nil {
setupLog.Info(
"invalid boolean value for "+envEnableStorageVersionMigrator+", using default (disabled)",
"value", value,
)
return false
Comment thread
ChrisJBurns marked this conversation as resolved.
Outdated
}
return enabled
}

// setupGroupRefFieldIndexes sets up field indexing for spec.groupRef on all resource types
// that can reference an MCPGroup. This enables efficient lookups by groupRef in controllers.
func setupGroupRefFieldIndexes(mgr ctrl.Manager) error {
Expand Down
Loading
Loading