diff --git a/provider/internal/deprecated/configencoding.go b/provider/internal/deprecated/configencoding.go index a10d48e..ba882e2 100644 --- a/provider/internal/deprecated/configencoding.go +++ b/provider/internal/deprecated/configencoding.go @@ -17,9 +17,6 @@ package deprecated import ( "encoding/json" "fmt" - "sort" - - "google.golang.org/protobuf/types/known/structpb" "github.com/pulumi/pulumi/pkg/v3/codegen/schema" "github.com/pulumi/pulumi/sdk/v3/go/common/resource" @@ -120,15 +117,10 @@ func (enc *ConfigEncoding) unmarshalOpts() plugin.MarshalOptions { // Like plugin.UnmarshalPropertyValue but overrides string parsing with convertStringToPropertyValue. func (enc *ConfigEncoding) unmarshalPropertyValue(key resource.PropertyKey, - v *structpb.Value, -) (*resource.PropertyValue, error) { + pv resource.PropertyValue, +) (resource.PropertyValue, error) { opts := enc.unmarshalOpts() - pv, err := plugin.UnmarshalPropertyValue(key, v, enc.unmarshalOpts()) - if err != nil { - return nil, fmt.Errorf("error unmarshalling property %q: %w", key, err) - } - prop, ok := enc.schema.Variables[string(key)] // Only apply JSON-encoded recognition for known fields. @@ -136,8 +128,10 @@ func (enc *ConfigEncoding) unmarshalPropertyValue(key resource.PropertyKey, return pv, nil } - var jsonString string - var jsonStringDetected, jsonStringSecret bool + var ( + jsonString string + jsonStringDetected, jsonStringSecret bool + ) if pv.IsString() { jsonString = pv.StringValue() @@ -153,22 +147,21 @@ func (enc *ConfigEncoding) unmarshalPropertyValue(key resource.PropertyKey, if jsonStringDetected { v, err := enc.convertStringToPropertyValue(jsonString, prop) if err != nil { - return nil, fmt.Errorf("error unmarshalling property %q: %w", key, err) + return resource.PropertyValue{}, fmt.Errorf("error unmarshalling property %q: %w", key, err) } if jsonStringSecret { - s := resource.MakeSecret(v) - return &s, nil + return resource.MakeSecret(v), nil } - return &v, nil + return v, nil } - // Computed sentinels are coming in as always having an empty string, but the encoding coerses them to a zero + // Computed sentinels are coming in as always having an empty string, but the encoding coerces them to a zero // value of the appropriate type. if pv.IsComputed() { el := pv.V.(resource.Computed).Element if el.IsString() && el.StringValue() == "" { res := resource.MakeComputed(enc.zeroValue(prop.Type)) - return &res, nil + return res, nil } } @@ -177,36 +170,21 @@ func (enc *ConfigEncoding) unmarshalPropertyValue(key resource.PropertyKey, // UnmarshalProperties is copied from plugin.UnmarshalProperties substituting plugin.UnmarshalPropertyValue. func (enc *ConfigEncoding) UnmarshalProperties( - props *structpb.Struct, + props resource.PropertyMap, ) (resource.PropertyMap, error) { - opts := enc.unmarshalOpts() - result := make(resource.PropertyMap) // First sort the keys so we enumerate them in order (in case errors happen, we want determinism). - var keys []string - if props != nil { - for k := range props.Fields { - keys = append(keys, k) - } - sort.Strings(keys) - } + keys := props.StableKeys() // And now unmarshal every field it into the map. for _, key := range keys { pk := resource.PropertyKey(key) - v, err := enc.unmarshalPropertyValue(pk, props.Fields[key]) + v, err := enc.unmarshalPropertyValue(pk, props[key]) if err != nil { return nil, err - } else if v != nil { - if opts.SkipNulls && v.IsNull() { - continue - } - if opts.SkipInternalKeys && resource.IsInternalPropertyKey(pk) { - continue - } - result[pk] = *v } + result[pk] = v } return result, nil diff --git a/provider/provider.go b/provider/provider.go index e9ca54f..a8a56c0 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -17,15 +17,14 @@ package provider import ( "context" "encoding/json" - "fmt" - "github.com/pulumi/pulumi-docker-build/provider/internal" - "github.com/pulumi/pulumi-docker-build/provider/internal/deprecated" gp "github.com/pulumi/pulumi-go-provider" "github.com/pulumi/pulumi/pkg/v3/codegen/schema" "github.com/pulumi/pulumi/pkg/v3/resource/provider" - "github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin" rpc "github.com/pulumi/pulumi/sdk/v3/proto/go" + + "github.com/pulumi/pulumi-docker-build/provider/internal" + "github.com/pulumi/pulumi-docker-build/provider/internal/deprecated" ) // Version is initialized by the Go linker to contain the semver of this build. @@ -41,11 +40,7 @@ func Serve() error { // New creates a new provider. func New(host *provider.HostClient) (rpc.ResourceProviderServer, error) { - server, err := gp.RawServer(Name, Version, internal.NewBuildxProvider())(host) - if err != nil { - return nil, fmt.Errorf("building raw server: %w", err) - } - return &configurableProvider{ResourceProviderServer: server}, nil + return gp.RawServer(Name, Version, configurableProvider(internal.NewBuildxProvider()))(host) } // configurableProvider is a workaround for @@ -56,35 +51,26 @@ func New(host *provider.HostClient) (rpc.ResourceProviderServer, error) { // // If you find yourself in a position where you need to copy this -- STOP! // https://github.com/pulumi/pulumi/pull/15032 should be merged with this fix. -type configurableProvider struct { - rpc.ResourceProviderServer -} +func configurableProvider(p gp.Provider) gp.Provider { + configure := p.Configure -func (p configurableProvider) Configure( - ctx context.Context, - request *rpc.ConfigureRequest, -) (*rpc.ConfigureResponse, error) { - r, err := p.GetSchema(ctx, &rpc.GetSchemaRequest{Version: 0}) - if err != nil { - return nil, err - } - spec := schema.PackageSpec{} - err = json.Unmarshal([]byte(r.Schema), &spec) - if err != nil { - return nil, err + p.Configure = func(ctx context.Context, req gp.ConfigureRequest) error { + r, err := p.GetSchema(ctx, gp.GetSchemaRequest{Version: 0}) + if err != nil { + return err + } + spec := schema.PackageSpec{} + err = json.Unmarshal([]byte(r.Schema), &spec) + if err != nil { + return err + } + + ce := deprecated.New(spec.Config) + if props, err := ce.UnmarshalProperties(req.Args); err == nil { + req.Args = props + } + return configure(ctx, req) } - ce := deprecated.New(spec.Config) - buildxReq := request - if props, err := ce.UnmarshalProperties(request.Args); err == nil { - args, _ := plugin.MarshalProperties(props, plugin.MarshalOptions{ - Label: "config", - KeepUnknowns: true, - SkipNulls: true, - KeepSecrets: true, - RejectAssets: true, - }) - buildxReq.Args = args - } - return p.ResourceProviderServer.Configure(ctx, buildxReq) + return p }