@@ -11,7 +11,6 @@ import (
1111 "cloud.google.com/go/bigquery"
1212 "github.com/openshift/sippy/pkg/api"
1313 "github.com/openshift/sippy/pkg/api/componentreadiness"
14- sippyv1 "github.com/openshift/sippy/pkg/apis/sippy/v1"
1514 "github.com/openshift/sippy/pkg/dataloader/regressioncacheloader"
1615 "github.com/pkg/errors"
1716 "github.com/prometheus/client_golang/prometheus"
@@ -37,9 +36,11 @@ import (
3736 "github.com/openshift/sippy/pkg/dataloader/prowloader"
3837 "github.com/openshift/sippy/pkg/dataloader/prowloader/gcs"
3938 "github.com/openshift/sippy/pkg/dataloader/prowloader/github"
39+ releasedefloader "github.com/openshift/sippy/pkg/dataloader/releasedefloader"
4040 "github.com/openshift/sippy/pkg/dataloader/releaseloader"
4141 "github.com/openshift/sippy/pkg/dataloader/testownershiploader"
4242 "github.com/openshift/sippy/pkg/db"
43+ "github.com/openshift/sippy/pkg/db/models"
4344 "github.com/openshift/sippy/pkg/flags"
4445 "github.com/openshift/sippy/pkg/github/commenter"
4546)
@@ -99,7 +100,7 @@ func (f *LoadFlags) BindFlags(fs *pflag.FlagSet) {
99100 f .JiraFlags .BindFlags (fs )
100101
101102 fs .BoolVar (& f .InitDatabase , "init-database" , false , "Migrate the DB before loading" )
102- fs .StringArrayVar (& f .Loaders , "loader" , []string {"prow" , "releases" , "jira" , "github" , "bugs" , "test-mapping" , "feature-gates" }, "Which data sources to use for data loading" )
103+ fs .StringArrayVar (& f .Loaders , "loader" , []string {"release-definitions" , " prow" , "releases" , "jira" , "github" , "bugs" , "test-mapping" , "feature-gates" }, "Which data sources to use for data loading" )
103104 fs .StringArrayVar (& f .Releases , "release" , f .Releases , "Which releases to load (one per arg instance)" )
104105 fs .StringArrayVar (& f .Architectures , "arch" , f .Architectures , "Which architectures to load (one per arg instance)" )
105106 fs .StringVar (& f .JobVariantsInputFile , "job-variants-input-file" , "expected-job-variants.json" , "JSON input file for the job-variants loader" )
@@ -151,8 +152,6 @@ func NewLoadCommand() *cobra.Command {
151152 cacheClient = nil // error hygiene, since we pass this down to quite a few functions
152153 }
153154
154- releaseConfigs := []sippyv1.Release {}
155-
156155 // initializing a bigquery client different from the normal one
157156 opCtx , ctx := bqcachedclient .OpCtxForCronEnv (ctx , "load" )
158157 bqc , bigqueryErr := bqcachedclient .New (
@@ -163,26 +162,14 @@ func NewLoadCommand() *cobra.Command {
163162 if f .CacheFlags .EnablePersistentCaching {
164163 bqc = f .CacheFlags .DecorateBiqQueryClientWithPersistentCache (bqc )
165164 }
166- releaseConfigs , err = api .GetReleasesFromBigQuery (context .Background (), bqc )
167- if err != nil {
168- return errors .Wrapf (err , "error querying releases from bq" )
169- }
170165 }
171166
172- // Ensure partitions exist for all releases (only when InitDatabase is true)
173- if f .InitDatabase && dbErr == nil {
174- err = ensurePartitionsForReleases (dbc , releaseConfigs )
175- if err != nil {
176- return errors .Wrapf (err , "error ensuring partitions" )
177- }
178-
179- // Clean up old partitions
180- detached , dropped , err := dbc .CleanupPartitions (false )
181- if err != nil {
182- log .WithError (err ).Warning ("failed to cleanup old partitions, continuing with load" )
183- } else {
184- log .Infof ("Partition cleanup complete: detached %d, dropped %d" , detached , dropped )
185- }
167+ // Read release definitions from PG for downstream loader construction.
168+ // On the first run the table may be empty; the release-definitions
169+ // loader will populate it for subsequent runs.
170+ var releaseDefs []models.ReleaseDefinition
171+ if dbErr == nil {
172+ releaseDefs , _ = api .GetReleasesFromDB (context .Background (), dbc )
186173 }
187174
188175 // Sippy Config
@@ -200,6 +187,17 @@ func NewLoadCommand() *cobra.Command {
200187
201188 var regressionCacheAdded bool
202189 for _ , l := range f .Loaders {
190+ if l == "release-definitions" {
191+ if bigqueryErr != nil {
192+ return errors .Wrap (bigqueryErr , "CRITICAL error getting BigQuery client which prevents release-definitions loading" )
193+ }
194+ if dbErr != nil {
195+ return errors .Wrap (dbErr , "CRITICAL error getting postgres client which prevents release-definitions loading" )
196+ }
197+ rdl := releasedefloader .NewReleaseDefinitionLoader (ctx , dbc , bqc )
198+ loaders = append (loaders , rdl )
199+ }
200+
203201 // TODO: remove "component-readiness-cache" and "regression-tracker" once the cronjob
204202 // manifests are updated to use "regression-cache".
205203 if l == "component-readiness-cache" || l == "regression-tracker" || l == "regression-cache" {
@@ -236,7 +234,7 @@ func NewLoadCommand() *cobra.Command {
236234 regressionStore := componentreadiness .NewPostgresRegressionStore (dbc , jiraClient )
237235
238236 rcl , err := regressioncacheloader .New (
239- dbc , bqc , config , views .ComponentReadiness , releaseConfigs ,
237+ dbc , bqc , config , views .ComponentReadiness , releaseDefs ,
240238 f .ComponentReadinessFlags .CRTimeRoundingFactor ,
241239 f .ComponentReadinessFlags .CRTimeRoundingOffset ,
242240 regressionStore ,
@@ -251,7 +249,7 @@ func NewLoadCommand() *cobra.Command {
251249 if dbErr != nil {
252250 return dbErr
253251 }
254- loaders = append (loaders , releaseloader .New (ctx , dbc , bqc , f .Releases , f .Architectures , releaseConfigs ))
252+ loaders = append (loaders , releaseloader .New (ctx , dbc , bqc , f .Releases , f .Architectures , releaseDefs ))
255253 }
256254
257255 // Prow Loader
@@ -260,7 +258,7 @@ func NewLoadCommand() *cobra.Command {
260258 if dbErr != nil {
261259 return dbErr
262260 }
263- prowLoader , err := f .prowLoader (ctx , dbc , config , releaseConfigs , promPusher )
261+ prowLoader , err := f .prowLoader (ctx , dbc , config , releaseDefs , promPusher )
264262 if err != nil {
265263 return err
266264 }
@@ -330,7 +328,7 @@ func NewLoadCommand() *cobra.Command {
330328 // Feature gates
331329 if l == "feature-gates" {
332330 refreshMatviews = true
333- fgLoader := featuregateloader .New (dbc , releaseConfigs )
331+ fgLoader := featuregateloader .New (dbc , releaseDefs )
334332 loaders = append (loaders , fgLoader )
335333 }
336334
@@ -343,6 +341,23 @@ func NewLoadCommand() *cobra.Command {
343341 allErrs = append (allErrs , l .Errors ()... )
344342 }
345343
344+ // Ensure partitions exist for all releases (only when InitDatabase is true).
345+ // Done after loaders run so the release-definitions loader has populated the table.
346+ if f .InitDatabase && dbErr == nil {
347+ releaseDefs , _ := api .GetReleasesFromDB (context .Background (), dbc )
348+ err = ensurePartitionsForReleases (dbc , releaseDefs )
349+ if err != nil {
350+ return errors .Wrapf (err , "error ensuring partitions" )
351+ }
352+
353+ detached , dropped , err := dbc .CleanupPartitions (false )
354+ if err != nil {
355+ log .WithError (err ).Warning ("failed to cleanup old partitions, continuing with load" )
356+ } else {
357+ log .Infof ("Partition cleanup complete: detached %d, dropped %d" , detached , dropped )
358+ }
359+ }
360+
346361 elapsed := time .Since (start )
347362 log .WithField ("elapsed" , elapsed ).Info ("database load complete" )
348363
@@ -417,7 +432,7 @@ func (f *LoadFlags) jobVariantsLoader(ctx context.Context) (dataloader.DataLoade
417432
418433}
419434
420- func (f * LoadFlags ) prowLoader (ctx context.Context , dbc * db.DB , sippyConfig * v1.SippyConfig , releaseConfigs []sippyv1. Release , promPusher * push.Pusher ) (dataloader.DataLoader , error ) {
435+ func (f * LoadFlags ) prowLoader (ctx context.Context , dbc * db.DB , sippyConfig * v1.SippyConfig , releaseDefs []models. ReleaseDefinition , promPusher * push.Pusher ) (dataloader.DataLoader , error ) {
421436 gcsClient , err := gcs .NewGCSClient (ctx ,
422437 f .GoogleCloudFlags .ServiceAccountCredentialFile ,
423438 f .GoogleCloudFlags .OAuthClientCredentialFile ,
@@ -452,8 +467,8 @@ func (f *LoadFlags) prowLoader(ctx context.Context, dbc *db.DB, sippyConfig *v1.
452467
453468 releases := f .Releases
454469 if len (releases ) == 0 { // if not specified, use those defined in the Releases table
455- for _ , config := range releaseConfigs {
456- releases = append (releases , config .Release ) // could filter by capability if needed
470+ for _ , def := range releaseDefs {
471+ releases = append (releases , def .Release ) // could filter by capability if needed
457472 }
458473 }
459474
@@ -503,10 +518,9 @@ func parseProwLoadSince(val string) (time.Time, error) {
503518// ensurePartitionsForReleases creates partitions for all configured releases.
504519// It uses a 7 day lookback window plus 2 days forward from today.
505520// Errors are logged but ignored to prevent blocking the load process.
506- func ensurePartitionsForReleases (dbc * db.DB , releaseConfigs []sippyv1.Release ) error {
507- // Extract release names from release configs
508- releases := make ([]string , 0 , len (releaseConfigs ))
509- for _ , r := range releaseConfigs {
521+ func ensurePartitionsForReleases (dbc * db.DB , releaseDefs []models.ReleaseDefinition ) error {
522+ releases := make ([]string , 0 , len (releaseDefs ))
523+ for _ , r := range releaseDefs {
510524 releases = append (releases , r .Release )
511525 }
512526
0 commit comments