diff --git a/pkg/dataloader/featuregateloader/featuregateloader.go b/pkg/dataloader/featuregateloader/featuregateloader.go index 0f0232b882..ab2ef4cc8f 100644 --- a/pkg/dataloader/featuregateloader/featuregateloader.go +++ b/pkg/dataloader/featuregateloader/featuregateloader.go @@ -175,13 +175,15 @@ func processFeatureGateFile(path, release, filename string) ([]models.FeatureGat return convertAPIToDB(fg, release, topology, featureSet, path), nil } -// parseFeatureGateFilename extracts topology and feature set from the filename +// parseFeatureGateFilename extracts topology and feature set from the filename. +// Handles both old format (featureGate-{topology}-{featureSet}.yaml) and +// new versioned format (featureGate-{majorStart}-{majorEnd}-{topology}-{featureSet}.yaml). func parseFeatureGateFilename(filename string) (string, string, bool) { parts := strings.Split(strings.TrimSuffix(filename, ".yaml"), "-") if len(parts) < 3 { return "", "", false } - return parts[1], parts[2], true + return parts[len(parts)-2], parts[len(parts)-1], true } // convertAPIToDB converts the parsed feature gate data into db models diff --git a/pkg/dataloader/featuregateloader/featuregateloader_test.go b/pkg/dataloader/featuregateloader/featuregateloader_test.go new file mode 100644 index 0000000000..685a8723c6 --- /dev/null +++ b/pkg/dataloader/featuregateloader/featuregateloader_test.go @@ -0,0 +1,79 @@ +package featuregateloader + +import ( + "testing" +) + +func TestParseFeatureGateFilename(t *testing.T) { + tests := []struct { + name string + filename string + wantTopo string + wantFeatSet string + wantValid bool + }{ + { + name: "old format Hypershift Default", + filename: "featureGate-Hypershift-Default.yaml", + wantTopo: "Hypershift", + wantFeatSet: "Default", + wantValid: true, + }, + { + name: "old format SelfManagedHA TechPreviewNoUpgrade", + filename: "featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml", + wantTopo: "SelfManagedHA", + wantFeatSet: "TechPreviewNoUpgrade", + wantValid: true, + }, + { + name: "versioned format Hypershift Default", + filename: "featureGate-4-10-Hypershift-Default.yaml", + wantTopo: "Hypershift", + wantFeatSet: "Default", + wantValid: true, + }, + { + name: "versioned format SelfManagedHA DevPreviewNoUpgrade", + filename: "featureGate-4-10-SelfManagedHA-DevPreviewNoUpgrade.yaml", + wantTopo: "SelfManagedHA", + wantFeatSet: "DevPreviewNoUpgrade", + wantValid: true, + }, + { + name: "versioned format Hypershift OKD", + filename: "featureGate-4-10-Hypershift-OKD.yaml", + wantTopo: "Hypershift", + wantFeatSet: "OKD", + wantValid: true, + }, + { + name: "too few parts", + filename: "featureGate-Default.yaml", + wantValid: false, + }, + { + name: "just prefix", + filename: "featureGate.yaml", + wantValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotTopo, gotFeatSet, gotValid := parseFeatureGateFilename(tt.filename) + if gotValid != tt.wantValid { + t.Fatalf("valid = %v, want %v", gotValid, tt.wantValid) + } + if !gotValid { + return + } + if gotTopo != tt.wantTopo { + t.Errorf("topology = %q, want %q", gotTopo, tt.wantTopo) + } + if gotFeatSet != tt.wantFeatSet { + t.Errorf("featureSet = %q, want %q", gotFeatSet, tt.wantFeatSet) + } + }) + } +}