github.com/myhau/pulumi/pkg/v3@v3.70.2-0.20221116134521-f2775972e587/resource/deploy/deploytest/provider.go (about)

     1  // Copyright 2016-2018, Pulumi Corporation.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package deploytest
    16  
    17  import (
    18  	"context"
    19  	"fmt"
    20  
    21  	"github.com/blang/semver"
    22  	uuid "github.com/gofrs/uuid"
    23  
    24  	"github.com/pulumi/pulumi/sdk/v3/go/common/resource"
    25  	"github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin"
    26  	"github.com/pulumi/pulumi/sdk/v3/go/common/tokens"
    27  	"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
    28  	"github.com/pulumi/pulumi/sdk/v3/go/common/workspace"
    29  )
    30  
    31  type Provider struct {
    32  	Name    string
    33  	Package tokens.Package
    34  	Version semver.Version
    35  
    36  	Config     resource.PropertyMap
    37  	configured bool
    38  
    39  	GetSchemaF func(version int) ([]byte, error)
    40  
    41  	CheckConfigF func(urn resource.URN, olds,
    42  		news resource.PropertyMap, allowUnknowns bool) (resource.PropertyMap, []plugin.CheckFailure, error)
    43  	DiffConfigF func(urn resource.URN, olds, news resource.PropertyMap,
    44  		ignoreChanges []string) (plugin.DiffResult, error)
    45  	ConfigureF func(news resource.PropertyMap) error
    46  
    47  	CheckF func(urn resource.URN,
    48  		olds, news resource.PropertyMap, randomSeed []byte) (resource.PropertyMap, []plugin.CheckFailure, error)
    49  	DiffF func(urn resource.URN, id resource.ID, olds, news resource.PropertyMap,
    50  		ignoreChanges []string) (plugin.DiffResult, error)
    51  	CreateF func(urn resource.URN, inputs resource.PropertyMap, timeout float64,
    52  		preview bool) (resource.ID, resource.PropertyMap, resource.Status, error)
    53  	UpdateF func(urn resource.URN, id resource.ID, olds, news resource.PropertyMap, timeout float64,
    54  		ignoreChanges []string, preview bool) (resource.PropertyMap, resource.Status, error)
    55  	DeleteF func(urn resource.URN, id resource.ID, olds resource.PropertyMap, timeout float64) (resource.Status, error)
    56  	ReadF   func(urn resource.URN, id resource.ID,
    57  		inputs, state resource.PropertyMap) (plugin.ReadResult, resource.Status, error)
    58  
    59  	ConstructF func(monitor *ResourceMonitor, typ, name string, parent resource.URN, inputs resource.PropertyMap,
    60  		options plugin.ConstructOptions) (plugin.ConstructResult, error)
    61  
    62  	InvokeF func(tok tokens.ModuleMember,
    63  		inputs resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error)
    64  
    65  	CallF func(monitor *ResourceMonitor, tok tokens.ModuleMember, args resource.PropertyMap, info plugin.CallInfo,
    66  		options plugin.CallOptions) (plugin.CallResult, error)
    67  
    68  	CancelF func() error
    69  }
    70  
    71  func (prov *Provider) SignalCancellation() error {
    72  	if prov.CancelF == nil {
    73  		return nil
    74  	}
    75  	return prov.CancelF()
    76  }
    77  
    78  func (prov *Provider) Close() error {
    79  	return nil
    80  }
    81  
    82  func (prov *Provider) Pkg() tokens.Package {
    83  	return prov.Package
    84  }
    85  
    86  func (prov *Provider) GetPluginInfo() (workspace.PluginInfo, error) {
    87  	return workspace.PluginInfo{
    88  		Name:    prov.Name,
    89  		Version: &prov.Version,
    90  	}, nil
    91  }
    92  
    93  func (prov *Provider) GetSchema(version int) ([]byte, error) {
    94  	if prov.GetSchemaF == nil {
    95  		return []byte("{}"), nil
    96  	}
    97  	return prov.GetSchemaF(version)
    98  }
    99  
   100  func (prov *Provider) CheckConfig(urn resource.URN, olds,
   101  	news resource.PropertyMap, allowUnknowns bool) (resource.PropertyMap, []plugin.CheckFailure, error) {
   102  	if prov.CheckConfigF == nil {
   103  		return news, nil, nil
   104  	}
   105  	return prov.CheckConfigF(urn, olds, news, allowUnknowns)
   106  }
   107  func (prov *Provider) DiffConfig(urn resource.URN, olds, news resource.PropertyMap, _ bool,
   108  	ignoreChanges []string) (plugin.DiffResult, error) {
   109  	if prov.DiffConfigF == nil {
   110  		return plugin.DiffResult{}, nil
   111  	}
   112  	return prov.DiffConfigF(urn, olds, news, ignoreChanges)
   113  }
   114  func (prov *Provider) Configure(inputs resource.PropertyMap) error {
   115  	contract.Assert(!prov.configured)
   116  	prov.configured = true
   117  
   118  	if prov.ConfigureF == nil {
   119  		prov.Config = inputs
   120  		return nil
   121  	}
   122  	return prov.ConfigureF(inputs)
   123  }
   124  
   125  func (prov *Provider) Check(urn resource.URN,
   126  	olds, news resource.PropertyMap, _ bool, randomSeed []byte) (resource.PropertyMap, []plugin.CheckFailure, error) {
   127  	contract.Assert(randomSeed != nil)
   128  	if prov.CheckF == nil {
   129  		return news, nil, nil
   130  	}
   131  	return prov.CheckF(urn, olds, news, randomSeed)
   132  }
   133  func (prov *Provider) Create(urn resource.URN, props resource.PropertyMap, timeout float64,
   134  	preview bool) (resource.ID, resource.PropertyMap, resource.Status, error) {
   135  
   136  	if prov.CreateF == nil {
   137  		// generate a new uuid
   138  		uuid, err := uuid.NewV4()
   139  		if err != nil {
   140  			return "", nil, resource.StatusOK, err
   141  		}
   142  		return resource.ID(uuid.String()), resource.PropertyMap{}, resource.StatusOK, nil
   143  	}
   144  	return prov.CreateF(urn, props, timeout, preview)
   145  }
   146  func (prov *Provider) Diff(urn resource.URN, id resource.ID,
   147  	olds resource.PropertyMap, news resource.PropertyMap, _ bool, ignoreChanges []string) (plugin.DiffResult, error) {
   148  	if prov.DiffF == nil {
   149  		return plugin.DiffResult{}, nil
   150  	}
   151  	return prov.DiffF(urn, id, olds, news, ignoreChanges)
   152  }
   153  func (prov *Provider) Update(urn resource.URN, id resource.ID, olds resource.PropertyMap, news resource.PropertyMap,
   154  	timeout float64, ignoreChanges []string, preview bool) (resource.PropertyMap, resource.Status, error) {
   155  	if prov.UpdateF == nil {
   156  		return news, resource.StatusOK, nil
   157  	}
   158  	return prov.UpdateF(urn, id, olds, news, timeout, ignoreChanges, preview)
   159  }
   160  func (prov *Provider) Delete(urn resource.URN,
   161  	id resource.ID, props resource.PropertyMap, timeout float64) (resource.Status, error) {
   162  	if prov.DeleteF == nil {
   163  		return resource.StatusOK, nil
   164  	}
   165  	return prov.DeleteF(urn, id, props, timeout)
   166  }
   167  
   168  func (prov *Provider) Read(urn resource.URN, id resource.ID,
   169  	inputs, state resource.PropertyMap) (plugin.ReadResult, resource.Status, error) {
   170  	contract.Assertf(urn != "", "Read URN was empty")
   171  	contract.Assertf(id != "", "Read ID was empty")
   172  	if prov.ReadF == nil {
   173  		return plugin.ReadResult{
   174  			Outputs: resource.PropertyMap{},
   175  			Inputs:  resource.PropertyMap{},
   176  		}, resource.StatusUnknown, nil
   177  	}
   178  	return prov.ReadF(urn, id, inputs, state)
   179  }
   180  
   181  func (prov *Provider) Construct(info plugin.ConstructInfo, typ tokens.Type, name tokens.QName, parent resource.URN,
   182  	inputs resource.PropertyMap, options plugin.ConstructOptions) (plugin.ConstructResult, error) {
   183  	if prov.ConstructF == nil {
   184  		return plugin.ConstructResult{}, nil
   185  	}
   186  	monitor, err := dialMonitor(context.Background(), info.MonitorAddress)
   187  	if err != nil {
   188  		return plugin.ConstructResult{}, err
   189  	}
   190  	return prov.ConstructF(monitor, string(typ), string(name), parent, inputs, options)
   191  }
   192  
   193  func (prov *Provider) Invoke(tok tokens.ModuleMember,
   194  	args resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error) {
   195  	if prov.InvokeF == nil {
   196  		return resource.PropertyMap{}, nil, nil
   197  	}
   198  	return prov.InvokeF(tok, args)
   199  }
   200  
   201  func (prov *Provider) StreamInvoke(
   202  	tok tokens.ModuleMember, args resource.PropertyMap,
   203  	onNext func(resource.PropertyMap) error) ([]plugin.CheckFailure, error) {
   204  
   205  	return nil, fmt.Errorf("not implemented")
   206  }
   207  
   208  func (prov *Provider) Call(tok tokens.ModuleMember, args resource.PropertyMap, info plugin.CallInfo,
   209  	options plugin.CallOptions) (plugin.CallResult, error) {
   210  	if prov.CallF == nil {
   211  		return plugin.CallResult{}, nil
   212  	}
   213  	monitor, err := dialMonitor(context.Background(), info.MonitorAddress)
   214  	if err != nil {
   215  		return plugin.CallResult{}, err
   216  	}
   217  	return prov.CallF(monitor, tok, args, info, options)
   218  }