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 }