Skip to content

Commit 65a62d6

Browse files
authored
Exposes ServiceContext in events (#6002)
This change exposes the new ServiceContext in all service lifecycle events. This will provide extension developers more information during lifecycle events that includes all the artifacts generated for the given command/workflow.
1 parent 185245c commit 65a62d6

30 files changed

+1179
-112
lines changed

cli/azd/cmd/env.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,8 +1127,9 @@ func (ef *envRefreshAction) Run(ctx context.Context) (*actions.ActionResult, err
11271127

11281128
for _, svc := range servicesStable {
11291129
eventArgs := project.ServiceLifecycleEventArgs{
1130-
Project: ef.projectConfig,
1131-
Service: svc,
1130+
Project: ef.projectConfig,
1131+
Service: svc,
1132+
ServiceContext: project.NewServiceContext(),
11321133
Args: map[string]any{
11331134
"bicepOutput": state.Outputs,
11341135
},

cli/azd/cmd/middleware/hooks_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,9 @@ func Test_ServiceHooks_Registered(t *testing.T) {
272272

273273
nextFn := func(ctx context.Context) (*actions.ActionResult, error) {
274274
err := serviceConfig.Invoke(ctx, project.ServiceEventDeploy, project.ServiceLifecycleEventArgs{
275-
Project: &projectConfig,
276-
Service: serviceConfig,
275+
Project: &projectConfig,
276+
Service: serviceConfig,
277+
ServiceContext: project.NewServiceContext(),
277278
}, func() error {
278279
return nil
279280
})

cli/azd/extensions/microsoft.azd.demo/internal/cmd/listen.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,26 +61,20 @@ func newListenCommand() *cobra.Command {
6161
}).
6262
WithServiceEventHandler("prepackage", func(ctx context.Context, args *azdext.ServiceEventArgs) error {
6363
for i := 1; i <= 20; i++ {
64-
fmt.Printf("%d. Doing important prepackage service work in extension...\n", i)
64+
fmt.Printf("Service: %s, Artifacts: %d\n", args.Service.Name, len(args.ServiceContext.Package))
6565
time.Sleep(250 * time.Millisecond)
6666
}
6767

6868
return nil
69-
}, &azdext.ServerEventOptions{
70-
// Optionally filter your subscription by service host and/or language
71-
Host: "containerapp",
72-
}).
69+
}, nil).
7370
WithServiceEventHandler("postpackage", func(ctx context.Context, args *azdext.ServiceEventArgs) error {
7471
for i := 1; i <= 20; i++ {
75-
fmt.Printf("%d. Doing important postpackage service work in extension...\n", i)
72+
fmt.Printf("Service: %s, Artifacts: %d\n", args.Service.Name, len(args.ServiceContext.Package))
7673
time.Sleep(250 * time.Millisecond)
7774
}
7875

7976
return nil
80-
}, &azdext.ServerEventOptions{
81-
// Optionally filter your subscription by service host and/or language
82-
Host: "containerapp",
83-
})
77+
}, nil)
8478

8579
// Start listening for events
8680
// This is a blocking call and will not return until the server connection is closed.

cli/azd/grpc/proto/event.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ message InvokeServiceHandler {
6565
ProjectConfig project = 2;
6666
// Specific service configuration.
6767
ServiceConfig service = 3;
68+
// Service context with artifacts from all lifecycle phases.
69+
ServiceContext service_context = 4;
6870
}
6971

7072
// Client sends status updates for project events

cli/azd/internal/cmd/provision.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,9 @@ func (p *ProvisionAction) Run(ctx context.Context) (*actions.ActionResult, error
398398

399399
for _, svc := range servicesStable {
400400
eventArgs := project.ServiceLifecycleEventArgs{
401-
Project: p.projectConfig,
402-
Service: svc,
401+
Project: p.projectConfig,
402+
Service: svc,
403+
ServiceContext: project.NewServiceContext(),
403404
Args: map[string]any{
404405
"bicepOutput": deployResult.Deployment.Outputs,
405406
},

cli/azd/internal/grpcserver/event_service.go

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ func (s *eventService) createProjectEventHandler(
160160
defer s.syncExtensionOutput(ctx, extension, previewTitle)()
161161

162162
// Send the invoke message.
163-
if err := s.sendProjectInvokeMessage(stream, eventName, args.Project); err != nil {
163+
if err := s.sendProjectInvokeMessage(stream, eventName, args); err != nil {
164164
return err
165165
}
166166

@@ -172,7 +172,7 @@ func (s *eventService) createProjectEventHandler(
172172
func (s *eventService) sendProjectInvokeMessage(
173173
stream grpc.BidiStreamingServer[azdext.EventMessage, azdext.EventMessage],
174174
eventName string,
175-
proj *project.ProjectConfig,
175+
args project.ProjectLifecycleEventArgs,
176176
) error {
177177
resolver := noEnvResolver
178178
env, err := s.lazyEnv.GetValue()
@@ -181,7 +181,7 @@ func (s *eventService) sendProjectInvokeMessage(
181181
}
182182

183183
var protoProjectConfig *azdext.ProjectConfig
184-
if err := mapper.WithResolver(resolver).Convert(proj, &protoProjectConfig); err != nil {
184+
if err := mapper.WithResolver(resolver).Convert(args.Project, &protoProjectConfig); err != nil {
185185
return err
186186
}
187187

@@ -270,7 +270,7 @@ func (s *eventService) createServiceEventHandler(
270270
defer s.syncExtensionOutput(ctx, extension, previewTitle)()
271271

272272
// Send the invoke message.
273-
if err := s.sendServiceInvokeMessage(stream, eventName, args.Project, args.Service); err != nil {
273+
if err := s.sendServiceInvokeMessage(stream, eventName, args); err != nil {
274274
return err
275275
}
276276

@@ -282,31 +282,38 @@ func (s *eventService) createServiceEventHandler(
282282
func (s *eventService) sendServiceInvokeMessage(
283283
stream grpc.BidiStreamingServer[azdext.EventMessage, azdext.EventMessage],
284284
eventName string,
285-
proj *project.ProjectConfig,
286-
svc *project.ServiceConfig,
285+
args project.ServiceLifecycleEventArgs,
287286
) error {
288287
resolver := noEnvResolver
289288
env, err := s.lazyEnv.GetValue()
290289
if err == nil && env != nil {
291290
resolver = env.Getenv
292291
}
293292

293+
objectMapper := mapper.WithResolver(resolver)
294+
294295
var protoProjectConfig *azdext.ProjectConfig
295-
if err := mapper.WithResolver(resolver).Convert(proj, &protoProjectConfig); err != nil {
296+
if err := objectMapper.Convert(args.Project, &protoProjectConfig); err != nil {
296297
return err
297298
}
298299

299300
var protoServiceConfig *azdext.ServiceConfig
300-
if err := mapper.WithResolver(resolver).Convert(svc, &protoServiceConfig); err != nil {
301+
if err := objectMapper.Convert(args.Service, &protoServiceConfig); err != nil {
302+
return err
303+
}
304+
305+
var protoServiceContext *azdext.ServiceContext
306+
if err := objectMapper.Convert(args.ServiceContext, &protoServiceContext); err != nil {
301307
return err
302308
}
303309

304310
return stream.Send(&azdext.EventMessage{
305311
MessageType: &azdext.EventMessage_InvokeServiceHandler{
306312
InvokeServiceHandler: &azdext.InvokeServiceHandler{
307-
EventName: eventName,
308-
Project: protoProjectConfig,
309-
Service: protoServiceConfig,
313+
EventName: eventName,
314+
Project: protoProjectConfig,
315+
Service: protoServiceConfig,
316+
ServiceContext: protoServiceContext,
310317
},
311318
},
312319
})

0 commit comments

Comments
 (0)