Skip to content

Commit d7a9b87

Browse files
wip preview deployment support
1 parent 137a528 commit d7a9b87

File tree

6 files changed

+925
-423
lines changed

6 files changed

+925
-423
lines changed

cloud/common/deploy/provider/pulumi.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,86 @@ func (s *PulumiProviderServer) Down(req *deploymentspb.DeploymentDownRequest, st
343343
return nil
344344
}
345345

346+
// Preview - automatically called by the Nitric CLI via the `preview` command
347+
func (s *PulumiProviderServer) Preview(req *deploymentspb.DeploymentUpRequest, stream deploymentspb.Deployment_PreviewServer) error {
348+
// Verify if dependencies are available
349+
if err := checkDependencies(checkPulumiAvailable, checkDockerAvailable); err != nil {
350+
return status.Error(codes.FailedPrecondition, err.Error())
351+
}
352+
353+
projectName, stackName, err := stackAndProjectFromAttributes(req.Attributes.AsMap())
354+
if err != nil {
355+
return err
356+
}
357+
358+
attributesMap := req.Attributes.AsMap()
359+
360+
err = s.provider.Init(attributesMap)
361+
if err != nil {
362+
return err
363+
}
364+
365+
pulumiProgram := createPulumiProgramForNitricProvider(req, s.provider, s.runtime)
366+
367+
autoStack, err := auto.UpsertStackInlineSource(context.TODO(), fmt.Sprintf("%s-%s", projectName, stackName), projectName, pulumiProgram)
368+
if err != nil {
369+
return err
370+
}
371+
372+
pulumiEventsChan := make(chan events.EngineEvent)
373+
374+
go func() {
375+
// output the stream
376+
_ = pulumix.StreamPulumiPreviewEngineEvents(stream, pulumiEventsChan)
377+
}()
378+
379+
config, err := s.provider.Config()
380+
if err != nil {
381+
return err
382+
}
383+
384+
err = autoStack.SetAllConfig(context.TODO(), config)
385+
if err != nil {
386+
return err
387+
}
388+
389+
refresh, ok := attributesMap["refresh"].(bool)
390+
391+
options := []optup.Option{optup.EventStreams(pulumiEventsChan)}
392+
393+
if ok && refresh {
394+
options = append(options, optup.Refresh())
395+
}
396+
397+
result, err := autoStack.Up(context.TODO(), options...)
398+
if err != nil {
399+
err = handleCommonErrors(err)
400+
401+
for _, handler := range s.errorHandlers {
402+
err = handler(err)
403+
}
404+
405+
return err
406+
}
407+
408+
resultStr, ok := result.Outputs[resultCtxKey].Value.(string)
409+
if !ok {
410+
resultStr = ""
411+
}
412+
413+
err = stream.Send(&deploymentspb.DeploymentPreviewEvent{
414+
Content: &deploymentspb.DeploymentPreviewEvent_Result{
415+
Result: &deploymentspb.UpResult{
416+
Content: &deploymentspb.UpResult_Text{
417+
Text: resultStr,
418+
},
419+
},
420+
},
421+
})
422+
423+
return err
424+
}
425+
346426
// Start - starts the Nitric Provider gRPC server, making it callable by the Nitric CLI during deployments.
347427
func (s *PulumiProviderServer) Start() {
348428
port := env.PORT.String()

cloud/common/deploy/provider/terraform.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,14 @@ func (s *TerraformProviderServer) Down(req *deploymentspb.DeploymentDownRequest,
108108
return status.Error(codes.Unimplemented, "Down not implemented for Terraform providers, please run terraform destroy against your stack state")
109109
}
110110

111+
func (s *TerraformProviderServer) Preview(req *deploymentspb.DeploymentUpRequest, stream deploymentspb.Deployment_PreviewServer) error {
112+
if beta, err := env.BETA_PROVIDERS.Bool(); err != nil || !beta {
113+
return status.Error(codes.FailedPrecondition, "Nitric terraform providers are currently in beta, please add beta-providers to the preview field of your nitric.yaml to enable")
114+
}
115+
116+
return status.Error(codes.Unimplemented, "Preview not implemented for Terraform providers, please run terraform plan against your stack state")
117+
}
118+
111119
func NewTerraformProviderServer(provider NitricTerraformProvider, runtime RuntimeProvider) *TerraformProviderServer {
112120
return &TerraformProviderServer{
113121
provider: provider,

cloud/common/deploy/pulumix/clistream.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,38 @@ func StreamPulumiUpEngineEvents(stream deploymentspb.Deployment_UpServer, pulumi
263263
return nil
264264
}
265265

266+
func StreamPulumiPreviewEngineEvents(stream deploymentspb.Deployment_PreviewServer, pulumiEventsChan <-chan events.EngineEvent) error {
267+
evtHandler := pulumiEventHandler{
268+
tree: DataTree{
269+
Root: &DataNode{
270+
Id: "stack",
271+
Data: nil,
272+
Children: make([]*DataNode, 0),
273+
},
274+
},
275+
}
276+
277+
for evt := range pulumiEventsChan {
278+
// translate the engine event to a server message and send back to the CLIent
279+
updateDetails, err := evtHandler.engineEventToResourceUpdate(evt)
280+
if err != nil {
281+
// unknown event, possibly still useful for debugging.
282+
logger.Debugf("%+v", evt)
283+
continue
284+
}
285+
286+
err = stream.Send(&deploymentspb.DeploymentPreviewEvent{
287+
Content: &deploymentspb.DeploymentPreviewEvent_Update{
288+
Update: updateDetails,
289+
},
290+
})
291+
if err != nil {
292+
return err
293+
}
294+
}
295+
return nil
296+
}
297+
266298
func StreamPulumiDownEngineEvents(stream deploymentspb.Deployment_DownServer, pulumiEventsChan <-chan events.EngineEvent) (err error) {
267299
evtHandler := pulumiEventHandler{
268300
tree: DataTree{

0 commit comments

Comments
 (0)