This change just flows the project's "main" directory all the way through to the plugins, fixing #667. In that work item, we discussed alternative approaches, such as rewriting the asset paths, but this is tricky because it's very tough to do without those absolute paths somehow ending up in the checkpoint files. Just launching the processes with the right pwd is far easier and safer, and it turns out that, conveniently, we set up the plugin context in exactly the same place that we read the project information.
59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
// Copyright 2016-2017, Pulumi Corporation. All rights reserved.
|
|
|
|
package plugin
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/opentracing/opentracing-go"
|
|
|
|
"github.com/pulumi/pulumi/pkg/diag"
|
|
"github.com/pulumi/pulumi/pkg/util/rpcutil"
|
|
)
|
|
|
|
// Context is used to group related operations together so that associated OS resources can be cached, shared, and
|
|
// reclaimed as appropriate.
|
|
type Context struct {
|
|
Diag diag.Sink // the diagnostics sink to use for messages.
|
|
Host Host // the host that can be used to fetch providers.
|
|
Pwd string // the working directory to spawn all plugins in.
|
|
|
|
tracingSpan opentracing.Span // the OpenTracing span to parent requests within.
|
|
}
|
|
|
|
// NewContext allocates a new context with a given sink and host. Note that the host is "owned" by this context from
|
|
// here forwards, such that when the context's resources are reclaimed, so too are the host's.
|
|
func NewContext(d diag.Sink, host Host, pwd string, parentSpan opentracing.Span) (*Context, error) {
|
|
ctx := &Context{
|
|
Diag: d,
|
|
Host: host,
|
|
Pwd: pwd,
|
|
tracingSpan: parentSpan,
|
|
}
|
|
if host == nil {
|
|
h, err := NewDefaultHost(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
ctx.Host = h
|
|
}
|
|
return ctx, nil
|
|
}
|
|
|
|
// Request allocates a request sub-context.
|
|
func (ctx *Context) Request() context.Context {
|
|
// TODO[pulumi/pulumi#143]: support cancellation.
|
|
return opentracing.ContextWithSpan(context.Background(), ctx.tracingSpan)
|
|
}
|
|
|
|
// Close reclaims all resources associated with this context.
|
|
func (ctx *Context) Close() error {
|
|
if ctx.tracingSpan != nil {
|
|
ctx.tracingSpan.Finish()
|
|
}
|
|
err := ctx.Host.Close()
|
|
if err != nil && !rpcutil.IsBenignCloseErr(err) {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|