Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changes/unreleased/Improvements-301.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
component: runtime
kind: Improvements
body: Use the engine for plugin loading, instead of loading another copy of a plugin for type checking.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
body: Use the engine for plugin loading, instead of loading another copy of a plugin for type checking.
body: Use the engine for plugin loading, instead of loading another copy of a plugin for type checking

time: 2025-12-03T12:49:52.832569+01:00
custom:
PR: "301"
2 changes: 1 addition & 1 deletion cmd/pulumi-language-yaml/language_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ func TestLanguage(t *testing.T) {
// Run the language plugin
handle, err := rpcutil.ServeWithOptions(rpcutil.ServeOptions{
Init: func(srv *grpc.Server) error {
host := server.NewLanguageHost(engineAddress, "", true /* useRPCLoader */)
host := server.NewLanguageHost(engineAddress, "")
pulumirpc.RegisterLanguageRuntimeServer(srv, host)
return nil
},
Expand Down
2 changes: 1 addition & 1 deletion cmd/pulumi-language-yaml/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func main() {
handle, err := rpcutil.ServeWithOptions(rpcutil.ServeOptions{
Cancel: cancelChannel,
Init: func(srv *grpc.Server) error {
host := server.NewLanguageHost(engineAddress, tracing, false /* useRPCLoader */)
host := server.NewLanguageHost(engineAddress, tracing)
pulumirpc.RegisterLanguageRuntimeServer(srv, host)
return nil
},
Expand Down
29 changes: 0 additions & 29 deletions pkg/pulumiyaml/packages.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"context"
"errors"
"fmt"
"os"
"sort"
"strings"

Expand All @@ -16,12 +15,9 @@ import (
"github.com/pulumi/pulumi-yaml/pkg/pulumiyaml/packages"
"github.com/pulumi/pulumi-yaml/pkg/pulumiyaml/syntax"
"github.com/pulumi/pulumi/pkg/v3/codegen/schema"
"github.com/pulumi/pulumi/sdk/v3/go/common/diag"
"github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin"
"github.com/pulumi/pulumi/sdk/v3/go/common/tokens"
"github.com/pulumi/pulumi/sdk/v3/go/common/util/cmdutil"
"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
"github.com/pulumi/pulumi/sdk/v3/go/common/workspace"
)

type ResourceTypeToken string
Expand Down Expand Up @@ -92,14 +88,6 @@ func (l packageLoader) Close() {
}
}

func NewPackageLoader(plugins *workspace.Plugins, packages map[string]workspace.PackageSpec) (PackageLoader, error) {
host, err := newResourcePackageHost(plugins, packages)
if err != nil {
return nil, err
}
return packageLoader{schema.NewPluginLoader(host), host}, nil
}

// Unsafely create a PackageLoader from a schema.Loader, forfeiting the ability to close the host
// and clean up plugins when finished. Useful for test cases.
func NewPackageLoaderFromSchemaLoader(loader schema.ReferenceLoader) PackageLoader {
Expand Down Expand Up @@ -534,20 +522,3 @@ func getResourceConstants(props []*schema.Property) map[string]interface{} {

return constantProps
}

func newResourcePackageHost(plugins *workspace.Plugins, packages map[string]workspace.PackageSpec) (plugin.Host, error) {
cwd, err := os.Getwd()
if err != nil {
return nil, err
}
sink := diag.DefaultSink(os.Stderr, os.Stderr, diag.FormatOptions{
Color: cmdutil.GetGlobalColorization(),
})
ctx := context.Background()
pluginCtx, err := plugin.NewContextWithRoot(ctx, sink, sink, nil, cwd, cwd, nil, true, nil, plugins, packages, nil, nil)
if err != nil {
return nil, err
}

return pluginCtx.Host, nil
}
40 changes: 11 additions & 29 deletions pkg/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,16 +68,13 @@ type yamlLanguageHost struct {
engineAddress string
tracing string

useRPCLoader bool
templateCache map[string]templateCacheEntry
}

func NewLanguageHost(engineAddress, tracing string, useRPCLoader bool) pulumirpc.LanguageRuntimeServer {
func NewLanguageHost(engineAddress, tracing string) pulumirpc.LanguageRuntimeServer {
return &yamlLanguageHost{
engineAddress: engineAddress,
tracing: tracing,

useRPCLoader: useRPCLoader,
templateCache: make(map[string]templateCacheEntry),
}
}
Expand Down Expand Up @@ -206,15 +203,6 @@ func (host *yamlLanguageHost) Run(ctx context.Context, req *pulumirpc.RunRequest
fmt.Sprintf(`PULUMI_ROOT_DIRECTORY=%s`, req.Info.RootDirectory),
}

projPath, err := workspace.DetectProjectPathFrom(req.Info.RootDirectory)
if err != nil {
return nil, err
}
proj, err := workspace.LoadProject(projPath)
if err != nil {
return nil, err
}

compiler, err := parseCompiler(req.Info.Options.AsMap())
if err != nil {
return nil, err
Expand Down Expand Up @@ -297,20 +285,12 @@ func (host *yamlLanguageHost) Run(ctx context.Context, req *pulumirpc.RunRequest

// Because of async applies we may need the package loader to outlast the RunTemplate function. But by the
// time RunWithContext returns we should be done with all async work.
var loader pulumiyaml.PackageLoader
if host.useRPCLoader {
rpcLoader, err := schema.NewLoaderClient(req.LoaderTarget)
if err != nil {
return &pulumirpc.RunResponse{Error: err.Error()}, nil
}
loader = pulumiyaml.NewPackageLoaderFromSchemaLoader(
schema.NewCachedLoader(rpcLoader))
} else {
loader, err = pulumiyaml.NewPackageLoader(proj.Plugins, proj.GetPackageSpecs())
if err != nil {
return &pulumirpc.RunResponse{Error: err.Error()}, nil
}
rpcLoader, err := schema.NewLoaderClient(req.LoaderTarget)
if err != nil {
return &pulumirpc.RunResponse{Error: err.Error()}, nil
}
loader := pulumiyaml.NewPackageLoaderFromSchemaLoader(
schema.NewCachedLoader(rpcLoader))
defer loader.Close()

// Now instruct the Pulumi Go SDK to run the pulumi YAML interpreter.
Expand Down Expand Up @@ -372,12 +352,14 @@ func (host *yamlLanguageHost) RunPlugin(
}
defer pctx.Close()

// Because of async applies we may need the package loader to outlast the RunTemplate function. But by the
// time RunWithContext returns we should be done with all async work.
loader, err := pulumiyaml.NewPackageLoader(nil, nil)
rpcLoader, err := schema.NewLoaderClient(host.engineAddress)
if err != nil {
return err
}

// Because of async applies we may need the package loader to outlast the RunTemplate function. But by the
// time RunWithContext returns we should be done with all async work.
loader := pulumiyaml.NewPackageLoaderFromSchemaLoader(schema.NewCachedLoader(rpcLoader))
defer loader.Close()

schema, err := template.GenerateSchema()
Expand Down
Loading