From 5ec81f6c22aebede9f741a95341605c59baaa07c Mon Sep 17 00:00:00 2001 From: Jeffrey Chen Date: Sat, 22 Nov 2025 00:12:55 +0000 Subject: [PATCH 1/3] Allow hooks to init environment Co-authored-by: Wei Lim --- cli/azd/cmd/middleware/hooks.go | 89 +++++++++++----------------- cli/azd/cmd/middleware/hooks_test.go | 19 +----- 2 files changed, 38 insertions(+), 70 deletions(-) diff --git a/cli/azd/cmd/middleware/hooks.go b/cli/azd/cmd/middleware/hooks.go index 1d2a657c815..fa26767e229 100644 --- a/cli/azd/cmd/middleware/hooks.go +++ b/cli/azd/cmd/middleware/hooks.go @@ -14,27 +14,26 @@ import ( "github.com/azure/azure-dev/cli/azd/pkg/ext" "github.com/azure/azure-dev/cli/azd/pkg/input" "github.com/azure/azure-dev/cli/azd/pkg/ioc" - "github.com/azure/azure-dev/cli/azd/pkg/lazy" "github.com/azure/azure-dev/cli/azd/pkg/output/ux" "github.com/azure/azure-dev/cli/azd/pkg/project" ) type HooksMiddleware struct { - lazyEnvManager *lazy.Lazy[environment.Manager] - lazyEnv *lazy.Lazy[*environment.Environment] - lazyProjectConfig *lazy.Lazy[*project.ProjectConfig] - importManager *project.ImportManager - commandRunner exec.CommandRunner - console input.Console - options *Options - serviceLocator ioc.ServiceLocator + envManager environment.Manager + env *environment.Environment + projectConfig *project.ProjectConfig + importManager *project.ImportManager + commandRunner exec.CommandRunner + console input.Console + options *Options + serviceLocator ioc.ServiceLocator } // Creates a new instance of the Hooks middleware func NewHooksMiddleware( - lazyEnvManager *lazy.Lazy[environment.Manager], - lazyEnv *lazy.Lazy[*environment.Environment], - lazyProjectConfig *lazy.Lazy[*project.ProjectConfig], + envManager environment.Manager, + env *environment.Environment, + projectConfig *project.ProjectConfig, importManager *project.ImportManager, commandRunner exec.CommandRunner, console input.Console, @@ -42,74 +41,65 @@ func NewHooksMiddleware( serviceLocator ioc.ServiceLocator, ) Middleware { return &HooksMiddleware{ - lazyEnvManager: lazyEnvManager, - lazyEnv: lazyEnv, - lazyProjectConfig: lazyProjectConfig, - importManager: importManager, - commandRunner: commandRunner, - console: console, - options: options, - serviceLocator: serviceLocator, + envManager: envManager, + env: env, + projectConfig: projectConfig, + importManager: importManager, + commandRunner: commandRunner, + console: console, + options: options, + serviceLocator: serviceLocator, } } // Runs the Hooks middleware func (m *HooksMiddleware) Run(ctx context.Context, next NextFn) (*actions.ActionResult, error) { - env, err := m.lazyEnv.GetValue() - if err != nil { + if m.env == nil { log.Println("azd environment is not available, skipping all hook registrations.") return next(ctx) } - projectConfig, err := m.lazyProjectConfig.GetValue() - if err != nil || projectConfig == nil { + if m.projectConfig == nil { log.Println("azd project is not available, skipping all hook registrations.") return next(ctx) } // Validate hooks and display any warnings if !m.options.IsChildAction(ctx) { - if err := m.validateHooks(ctx, projectConfig); err != nil { + if err := m.validateHooks(ctx, m.projectConfig); err != nil { return nil, fmt.Errorf("failed validating hooks, %w", err) } } - if err := m.registerServiceHooks(ctx, env, projectConfig); err != nil { + if err := m.registerServiceHooks(ctx); err != nil { return nil, fmt.Errorf("failed registering service hooks, %w", err) } - return m.registerCommandHooks(ctx, env, projectConfig, next) + return m.registerCommandHooks(ctx, next) } // Register command level hooks for the executing cobra command & action // Invokes the middleware next function func (m *HooksMiddleware) registerCommandHooks( ctx context.Context, - env *environment.Environment, - projectConfig *project.ProjectConfig, next NextFn, ) (*actions.ActionResult, error) { - if len(projectConfig.Hooks) == 0 { + if len(m.projectConfig.Hooks) == 0 { log.Println( "azd project is not available or does not contain any command hooks, skipping command hook registrations.", ) return next(ctx) } - envManager, err := m.lazyEnvManager.GetValue() - if err != nil { - return nil, fmt.Errorf("failed getting environment manager, %w", err) - } - - hooksManager := ext.NewHooksManager(projectConfig.Path, m.commandRunner) + hooksManager := ext.NewHooksManager(m.projectConfig.Path, m.commandRunner) hooksRunner := ext.NewHooksRunner( hooksManager, m.commandRunner, - envManager, + m.envManager, m.console, - projectConfig.Path, - projectConfig.Hooks, - env, + m.projectConfig.Path, + m.projectConfig.Hooks, + m.env, m.serviceLocator, ) @@ -118,7 +108,7 @@ func (m *HooksMiddleware) registerCommandHooks( commandNames := []string{m.options.CommandPath} commandNames = append(commandNames, m.options.Aliases...) - err = hooksRunner.Invoke(ctx, commandNames, func() error { + err := hooksRunner.Invoke(ctx, commandNames, func() error { result, err := next(ctx) if err != nil { return err @@ -137,17 +127,8 @@ func (m *HooksMiddleware) registerCommandHooks( // Registers event handlers for all services within the project configuration // Runs hooks for each matching event handler -func (m *HooksMiddleware) registerServiceHooks( - ctx context.Context, - env *environment.Environment, - projectConfig *project.ProjectConfig, -) error { - envManager, err := m.lazyEnvManager.GetValue() - if err != nil { - return fmt.Errorf("failed getting environment manager, %w", err) - } - - stableServices, err := m.importManager.ServiceStable(ctx, projectConfig) +func (m *HooksMiddleware) registerServiceHooks(ctx context.Context) error { + stableServices, err := m.importManager.ServiceStable(ctx, m.projectConfig) if err != nil { return fmt.Errorf("failed getting services: %w", err) } @@ -164,11 +145,11 @@ func (m *HooksMiddleware) registerServiceHooks( serviceHooksRunner := ext.NewHooksRunner( serviceHooksManager, m.commandRunner, - envManager, + m.envManager, m.console, service.Path(), service.Hooks, - env, + m.env, m.serviceLocator, ) diff --git a/cli/azd/cmd/middleware/hooks_test.go b/cli/azd/cmd/middleware/hooks_test.go index b1c350f4b35..f33d531d9dc 100644 --- a/cli/azd/cmd/middleware/hooks_test.go +++ b/cli/azd/cmd/middleware/hooks_test.go @@ -15,7 +15,6 @@ import ( "github.com/azure/azure-dev/cli/azd/pkg/environment/azdcontext" "github.com/azure/azure-dev/cli/azd/pkg/exec" "github.com/azure/azure-dev/cli/azd/pkg/ext" - "github.com/azure/azure-dev/cli/azd/pkg/lazy" "github.com/azure/azure-dev/cli/azd/pkg/project" "github.com/azure/azure-dev/cli/azd/test/mocks" "github.com/azure/azure-dev/cli/azd/test/mocks/mockenv" @@ -344,22 +343,10 @@ func runMiddleware( envManager.On("Save", mock.Anything, mock.Anything).Return(nil) envManager.On("Reload", mock.Anything, mock.Anything).Return(nil) - lazyEnvManager := lazy.NewLazy(func() (environment.Manager, error) { - return envManager, nil - }) - - lazyEnv := lazy.NewLazy(func() (*environment.Environment, error) { - return env, nil - }) - - lazyProjectConfig := lazy.NewLazy(func() (*project.ProjectConfig, error) { - return projectConfig, nil - }) - middleware := NewHooksMiddleware( - lazyEnvManager, - lazyEnv, - lazyProjectConfig, + envManager, + env, + projectConfig, project.NewImportManager(nil), mockContext.CommandRunner, mockContext.Console, From b874b38c5f029ee8ca03fee8f30905291e1c08c4 Mon Sep 17 00:00:00 2001 From: JeffreyCA Date: Mon, 24 Nov 2025 12:45:43 -0800 Subject: [PATCH 2/3] Apply suggestion from @weikanglim Co-authored-by: Wei Lim --- cli/azd/cmd/middleware/hooks.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/azd/cmd/middleware/hooks.go b/cli/azd/cmd/middleware/hooks.go index fa26767e229..7a2e62725b7 100644 --- a/cli/azd/cmd/middleware/hooks.go +++ b/cli/azd/cmd/middleware/hooks.go @@ -86,7 +86,7 @@ func (m *HooksMiddleware) registerCommandHooks( ) (*actions.ActionResult, error) { if len(m.projectConfig.Hooks) == 0 { log.Println( - "azd project is not available or does not contain any command hooks, skipping command hook registrations.", + "azd project does not contain any command hooks, skipping command hook registrations.", ) return next(ctx) } From 7db683982359f99301e94fb326c6e79fa5072e35 Mon Sep 17 00:00:00 2001 From: Jeffrey Chen Date: Mon, 24 Nov 2025 20:45:56 +0000 Subject: [PATCH 3/3] Remove redundant nil checks --- cli/azd/cmd/middleware/hooks.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/cli/azd/cmd/middleware/hooks.go b/cli/azd/cmd/middleware/hooks.go index 7a2e62725b7..d43794fbeb4 100644 --- a/cli/azd/cmd/middleware/hooks.go +++ b/cli/azd/cmd/middleware/hooks.go @@ -54,16 +54,6 @@ func NewHooksMiddleware( // Runs the Hooks middleware func (m *HooksMiddleware) Run(ctx context.Context, next NextFn) (*actions.ActionResult, error) { - if m.env == nil { - log.Println("azd environment is not available, skipping all hook registrations.") - return next(ctx) - } - - if m.projectConfig == nil { - log.Println("azd project is not available, skipping all hook registrations.") - return next(ctx) - } - // Validate hooks and display any warnings if !m.options.IsChildAction(ctx) { if err := m.validateHooks(ctx, m.projectConfig); err != nil {