Skip to content

Commit 8c21eb0

Browse files
committed
fix readiness bug
Signed-off-by: Timur Tuktamyshev <timur.tuktamyshev@flant.com>
1 parent e5dd964 commit 8c21eb0

File tree

2 files changed

+45
-16
lines changed

2 files changed

+45
-16
lines changed

pkg/module_manager/models/modules/basic.go

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ func (bm *BasicModule) RegisterHooks(logger *log.Logger) ([]*hooks.ModuleHook, e
246246
return nil, nil
247247
}
248248

249-
hks, err := bm.searchModuleHooks()
249+
hks, hasReadiness, err := bm.searchModuleHooks()
250250
if err != nil {
251251
return nil, fmt.Errorf("search module hooks failed: %w", err)
252252
}
@@ -267,26 +267,27 @@ func (bm *BasicModule) RegisterHooks(logger *log.Logger) ([]*hooks.ModuleHook, e
267267
}
268268

269269
bm.hooks.registered = true
270+
bm.hasReadiness = hasReadiness
270271

271272
return hks, nil
272273
}
273274

274-
func (bm *BasicModule) searchModuleHooks() ([]*hooks.ModuleHook, error) {
275+
func (bm *BasicModule) searchModuleHooks() ([]*hooks.ModuleHook, bool, error) {
275276
shellHooks, err := bm.searchModuleShellHooks()
276277
if err != nil {
277-
return nil, fmt.Errorf("search module shell hooks: %w", err)
278+
return nil, false, fmt.Errorf("search module shell hooks: %w", err)
278279
}
279280

280281
goHooks := bm.searchModuleGoHooks()
281282

282-
batchHooks, err := bm.searchModuleBatchHooks()
283+
batchHooks, hasReadiness, err := bm.searchModuleBatchHooks()
283284
if err != nil {
284-
return nil, fmt.Errorf("search module batch hooks: %w", err)
285+
return nil, false, fmt.Errorf("search module batch hooks: %w", err)
285286
}
286287

287288
if len(shellHooks)+len(batchHooks) > 0 {
288289
if err := bm.AssembleEnvironmentForModule(environmentmanager.ShellHookEnvironment); err != nil {
289-
return nil, fmt.Errorf("Assemble %q module's environment: %w", bm.GetName(), err)
290+
return nil, false, fmt.Errorf("Assemble %q module's environment: %w", bm.GetName(), err)
290291
}
291292
}
292293

@@ -311,7 +312,7 @@ func (bm *BasicModule) searchModuleHooks() ([]*hooks.ModuleHook, error) {
311312
return mHooks[i].GetPath() < mHooks[j].GetPath()
312313
})
313314

314-
return mHooks, nil
315+
return mHooks, hasReadiness, nil
315316
}
316317

317318
func (bm *BasicModule) searchModuleShellHooks() ([]*kind.ShellHook, error) {
@@ -373,18 +374,22 @@ func (bm *BasicModule) searchModuleShellHooks() ([]*kind.ShellHook, error) {
373374
return hks, nil
374375
}
375376

376-
func (bm *BasicModule) searchModuleBatchHooks() ([]*kind.BatchHook, error) {
377+
// searchModuleBatchHooks searches for batch hooks and returns them along with hasReadiness flag.
378+
// This function has no side effects - it doesn't modify bm.hasReadiness directly.
379+
// The caller (RegisterHooks) is responsible for setting bm.hasReadiness after successful registration.
380+
func (bm *BasicModule) searchModuleBatchHooks() ([]*kind.BatchHook, bool, error) {
377381
hooksDir := filepath.Join(bm.Path, "hooks")
378382
if _, err := os.Stat(hooksDir); os.IsNotExist(err) {
379-
return nil, nil
383+
return nil, false, nil
380384
}
381385

382386
hooksRelativePaths, err := RecursiveGetBatchHookExecutablePaths(bm.safeName(), hooksDir, bm.logger, hooksExcludedDir...)
383387
if err != nil {
384-
return nil, err
388+
return nil, false, err
385389
}
386390

387391
hks := make([]*kind.BatchHook, 0)
392+
hasReadiness := false
388393

389394
// sort hooks by path
390395
sort.Strings(hooksRelativePaths)
@@ -393,20 +398,20 @@ func (bm *BasicModule) searchModuleBatchHooks() ([]*kind.BatchHook, error) {
393398
for _, hookPath := range hooksRelativePaths {
394399
hookName, err := normalizeHookPath(filepath.Dir(bm.Path), hookPath)
395400
if err != nil {
396-
return nil, fmt.Errorf("could not get hook name: %w", err)
401+
return nil, false, fmt.Errorf("could not get hook name: %w", err)
397402
}
398403

399404
sdkcfgs, err := kind.GetBatchHookConfig(bm.safeName(), hookPath)
400405
if err != nil {
401-
return nil, fmt.Errorf("getting sdk config for '%s': %w", hookName, err)
406+
return nil, false, fmt.Errorf("getting sdk config for '%s': %w", hookName, err)
402407
}
403408

404409
if sdkcfgs.Readiness != nil {
405-
if bm.hasReadiness {
406-
return nil, fmt.Errorf("multiple readiness hooks found in %s", hookPath)
410+
if hasReadiness {
411+
return nil, false, fmt.Errorf("multiple readiness hooks found in %s", hookPath)
407412
}
408413

409-
bm.hasReadiness = true
414+
hasReadiness = true
410415

411416
// add readiness hook
412417
nestedHookName := fmt.Sprintf("%s-readiness", hookName)
@@ -422,7 +427,7 @@ func (bm *BasicModule) searchModuleBatchHooks() ([]*kind.BatchHook, error) {
422427
}
423428
}
424429

425-
return hks, nil
430+
return hks, hasReadiness, nil
426431
}
427432

428433
func RecursiveGetBatchHookExecutablePaths(moduleName, dir string, logger *log.Logger, excludedDirs ...string) ([]string, error) {

pkg/module_manager/models/modules/basic_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,3 +306,27 @@ exit 0
306306
require.NotNil(t, erGetter)
307307
require.Equal(t, "Kubernetes version is too low", *erGetter)
308308
}
309+
310+
// TestHasReadinessNotSetOnFailedRegistration tests that hasReadiness is only set
311+
// after successful hook registration. This prevents stale hasReadiness state when
312+
// registration is retried after an error (e.g., in AssembleEnvironmentForModule).
313+
func TestHasReadinessNotSetOnFailedRegistration(t *testing.T) {
314+
tmpModuleDir := t.TempDir()
315+
316+
bm, err := NewBasicModule("test-readiness-registration", tmpModuleDir, 1, utils.Values{}, nil, nil)
317+
require.NoError(t, err)
318+
319+
logger := log.NewLogger()
320+
bm.WithLogger(logger)
321+
bm.WithDependencies(stubDeps(logger))
322+
323+
// Simulate stale state from a previous failed registration attempt
324+
bm.hasReadiness = true
325+
326+
// RegisterHooks should overwrite hasReadiness based on actual search results
327+
_, err = bm.RegisterHooks(logger)
328+
require.NoError(t, err)
329+
330+
// hasReadiness should be false (no hooks in empty module)
331+
require.False(t, bm.hasReadiness, "hasReadiness should reflect actual hooks found")
332+
}

0 commit comments

Comments
 (0)