github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/legacy/terraform/provider_mock.go (about)

     1  package terraform
     2  
     3  import (
     4  	"encoding/json"
     5  	"sync"
     6  
     7  	"github.com/zclconf/go-cty/cty"
     8  	ctyjson "github.com/zclconf/go-cty/cty/json"
     9  
    10  	"github.com/hashicorp/terraform/internal/configs/hcl2shim"
    11  	"github.com/hashicorp/terraform/internal/providers"
    12  )
    13  
    14  var _ providers.Interface = (*MockProvider)(nil)
    15  
    16  // MockProvider implements providers.Interface but mocks out all the
    17  // calls for testing purposes.
    18  type MockProvider struct {
    19  	sync.Mutex
    20  
    21  	// Anything you want, in case you need to store extra data with the mock.
    22  	Meta interface{}
    23  
    24  	GetSchemaCalled bool
    25  	GetSchemaReturn *ProviderSchema // This is using ProviderSchema directly rather than providers.GetProviderSchemaResponse for compatibility with old tests
    26  
    27  	ValidateProviderConfigCalled   bool
    28  	ValidateProviderConfigResponse providers.ValidateProviderConfigResponse
    29  	ValidateProviderConfigRequest  providers.ValidateProviderConfigRequest
    30  	ValidateProviderConfigFn       func(providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse
    31  
    32  	ValidateResourceConfigCalled   bool
    33  	ValidateResourceConfigTypeName string
    34  	ValidateResourceConfigResponse providers.ValidateResourceConfigResponse
    35  	ValidateResourceConfigRequest  providers.ValidateResourceConfigRequest
    36  	ValidateResourceConfigFn       func(providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse
    37  
    38  	ValidateDataResourceConfigCalled   bool
    39  	ValidateDataResourceConfigTypeName string
    40  	ValidateDataResourceConfigResponse providers.ValidateDataResourceConfigResponse
    41  	ValidateDataResourceConfigRequest  providers.ValidateDataResourceConfigRequest
    42  	ValidateDataResourceConfigFn       func(providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse
    43  
    44  	UpgradeResourceStateCalled   bool
    45  	UpgradeResourceStateTypeName string
    46  	UpgradeResourceStateResponse providers.UpgradeResourceStateResponse
    47  	UpgradeResourceStateRequest  providers.UpgradeResourceStateRequest
    48  	UpgradeResourceStateFn       func(providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse
    49  
    50  	ConfigureProviderCalled   bool
    51  	ConfigureProviderResponse providers.ConfigureProviderResponse
    52  	ConfigureProviderRequest  providers.ConfigureProviderRequest
    53  	ConfigureProviderFn       func(providers.ConfigureProviderRequest) providers.ConfigureProviderResponse
    54  
    55  	StopCalled   bool
    56  	StopFn       func() error
    57  	StopResponse error
    58  
    59  	ReadResourceCalled   bool
    60  	ReadResourceResponse providers.ReadResourceResponse
    61  	ReadResourceRequest  providers.ReadResourceRequest
    62  	ReadResourceFn       func(providers.ReadResourceRequest) providers.ReadResourceResponse
    63  
    64  	PlanResourceChangeCalled   bool
    65  	PlanResourceChangeResponse providers.PlanResourceChangeResponse
    66  	PlanResourceChangeRequest  providers.PlanResourceChangeRequest
    67  	PlanResourceChangeFn       func(providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse
    68  
    69  	ApplyResourceChangeCalled   bool
    70  	ApplyResourceChangeResponse providers.ApplyResourceChangeResponse
    71  	ApplyResourceChangeRequest  providers.ApplyResourceChangeRequest
    72  	ApplyResourceChangeFn       func(providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse
    73  
    74  	ImportResourceStateCalled   bool
    75  	ImportResourceStateResponse providers.ImportResourceStateResponse
    76  	ImportResourceStateRequest  providers.ImportResourceStateRequest
    77  	ImportResourceStateFn       func(providers.ImportResourceStateRequest) providers.ImportResourceStateResponse
    78  	// Legacy return type for existing tests, which will be shimmed into an
    79  	// ImportResourceStateResponse if set
    80  	ImportStateReturn []*InstanceState
    81  
    82  	ReadDataSourceCalled   bool
    83  	ReadDataSourceResponse providers.ReadDataSourceResponse
    84  	ReadDataSourceRequest  providers.ReadDataSourceRequest
    85  	ReadDataSourceFn       func(providers.ReadDataSourceRequest) providers.ReadDataSourceResponse
    86  
    87  	CloseCalled bool
    88  	CloseError  error
    89  }
    90  
    91  func (p *MockProvider) GetProviderSchema() providers.GetProviderSchemaResponse {
    92  	p.Lock()
    93  	defer p.Unlock()
    94  	p.GetSchemaCalled = true
    95  	return p.getSchema()
    96  }
    97  
    98  func (p *MockProvider) getSchema() providers.GetProviderSchemaResponse {
    99  	// This version of getSchema doesn't do any locking, so it's suitable to
   100  	// call from other methods of this mock as long as they are already
   101  	// holding the lock.
   102  
   103  	ret := providers.GetProviderSchemaResponse{
   104  		Provider:      providers.Schema{},
   105  		DataSources:   map[string]providers.Schema{},
   106  		ResourceTypes: map[string]providers.Schema{},
   107  	}
   108  	if p.GetSchemaReturn != nil {
   109  		ret.Provider.Block = p.GetSchemaReturn.Provider
   110  		ret.ProviderMeta.Block = p.GetSchemaReturn.ProviderMeta
   111  		for n, s := range p.GetSchemaReturn.DataSources {
   112  			ret.DataSources[n] = providers.Schema{
   113  				Block: s,
   114  			}
   115  		}
   116  		for n, s := range p.GetSchemaReturn.ResourceTypes {
   117  			ret.ResourceTypes[n] = providers.Schema{
   118  				Version: int64(p.GetSchemaReturn.ResourceTypeSchemaVersions[n]),
   119  				Block:   s,
   120  			}
   121  		}
   122  	}
   123  
   124  	return ret
   125  }
   126  
   127  func (p *MockProvider) ValidateProviderConfig(r providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse {
   128  	p.Lock()
   129  	defer p.Unlock()
   130  
   131  	p.ValidateProviderConfigCalled = true
   132  	p.ValidateProviderConfigRequest = r
   133  	if p.ValidateProviderConfigFn != nil {
   134  		return p.ValidateProviderConfigFn(r)
   135  	}
   136  	return p.ValidateProviderConfigResponse
   137  }
   138  
   139  func (p *MockProvider) ValidateResourceConfig(r providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse {
   140  	p.Lock()
   141  	defer p.Unlock()
   142  
   143  	p.ValidateResourceConfigCalled = true
   144  	p.ValidateResourceConfigRequest = r
   145  
   146  	if p.ValidateResourceConfigFn != nil {
   147  		return p.ValidateResourceConfigFn(r)
   148  	}
   149  
   150  	return p.ValidateResourceConfigResponse
   151  }
   152  
   153  func (p *MockProvider) ValidateDataResourceConfig(r providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse {
   154  	p.Lock()
   155  	defer p.Unlock()
   156  
   157  	p.ValidateDataResourceConfigCalled = true
   158  	p.ValidateDataResourceConfigRequest = r
   159  
   160  	if p.ValidateDataResourceConfigFn != nil {
   161  		return p.ValidateDataResourceConfigFn(r)
   162  	}
   163  
   164  	return p.ValidateDataResourceConfigResponse
   165  }
   166  
   167  func (p *MockProvider) UpgradeResourceState(r providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse {
   168  	p.Lock()
   169  	defer p.Unlock()
   170  
   171  	schemas := p.getSchema()
   172  	schema := schemas.ResourceTypes[r.TypeName]
   173  	schemaType := schema.Block.ImpliedType()
   174  
   175  	p.UpgradeResourceStateCalled = true
   176  	p.UpgradeResourceStateRequest = r
   177  
   178  	if p.UpgradeResourceStateFn != nil {
   179  		return p.UpgradeResourceStateFn(r)
   180  	}
   181  
   182  	resp := p.UpgradeResourceStateResponse
   183  
   184  	if resp.UpgradedState == cty.NilVal {
   185  		switch {
   186  		case r.RawStateFlatmap != nil:
   187  			v, err := hcl2shim.HCL2ValueFromFlatmap(r.RawStateFlatmap, schemaType)
   188  			if err != nil {
   189  				resp.Diagnostics = resp.Diagnostics.Append(err)
   190  				return resp
   191  			}
   192  			resp.UpgradedState = v
   193  		case len(r.RawStateJSON) > 0:
   194  			v, err := ctyjson.Unmarshal(r.RawStateJSON, schemaType)
   195  
   196  			if err != nil {
   197  				resp.Diagnostics = resp.Diagnostics.Append(err)
   198  				return resp
   199  			}
   200  			resp.UpgradedState = v
   201  		}
   202  	}
   203  	return resp
   204  }
   205  
   206  func (p *MockProvider) ConfigureProvider(r providers.ConfigureProviderRequest) providers.ConfigureProviderResponse {
   207  	p.Lock()
   208  	defer p.Unlock()
   209  
   210  	p.ConfigureProviderCalled = true
   211  	p.ConfigureProviderRequest = r
   212  
   213  	if p.ConfigureProviderFn != nil {
   214  		return p.ConfigureProviderFn(r)
   215  	}
   216  
   217  	return p.ConfigureProviderResponse
   218  }
   219  
   220  func (p *MockProvider) Stop() error {
   221  	// We intentionally don't lock in this one because the whole point of this
   222  	// method is to be called concurrently with another operation that can
   223  	// be cancelled.  The provider itself is responsible for handling
   224  	// any concurrency concerns in this case.
   225  
   226  	p.StopCalled = true
   227  	if p.StopFn != nil {
   228  		return p.StopFn()
   229  	}
   230  
   231  	return p.StopResponse
   232  }
   233  
   234  func (p *MockProvider) ReadResource(r providers.ReadResourceRequest) providers.ReadResourceResponse {
   235  	p.Lock()
   236  	defer p.Unlock()
   237  
   238  	p.ReadResourceCalled = true
   239  	p.ReadResourceRequest = r
   240  
   241  	if p.ReadResourceFn != nil {
   242  		return p.ReadResourceFn(r)
   243  	}
   244  
   245  	resp := p.ReadResourceResponse
   246  	if resp.NewState != cty.NilVal {
   247  		// make sure the NewState fits the schema
   248  		// This isn't always the case for the existing tests
   249  		newState, err := p.GetSchemaReturn.ResourceTypes[r.TypeName].CoerceValue(resp.NewState)
   250  		if err != nil {
   251  			panic(err)
   252  		}
   253  		resp.NewState = newState
   254  		return resp
   255  	}
   256  
   257  	// just return the same state we received
   258  	resp.NewState = r.PriorState
   259  	return resp
   260  }
   261  
   262  func (p *MockProvider) PlanResourceChange(r providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse {
   263  	p.Lock()
   264  	defer p.Unlock()
   265  
   266  	p.PlanResourceChangeCalled = true
   267  	p.PlanResourceChangeRequest = r
   268  
   269  	if p.PlanResourceChangeFn != nil {
   270  		return p.PlanResourceChangeFn(r)
   271  	}
   272  
   273  	return p.PlanResourceChangeResponse
   274  }
   275  
   276  func (p *MockProvider) ApplyResourceChange(r providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse {
   277  	p.Lock()
   278  	p.ApplyResourceChangeCalled = true
   279  	p.ApplyResourceChangeRequest = r
   280  	p.Unlock()
   281  
   282  	if p.ApplyResourceChangeFn != nil {
   283  		return p.ApplyResourceChangeFn(r)
   284  	}
   285  
   286  	return p.ApplyResourceChangeResponse
   287  }
   288  
   289  func (p *MockProvider) ImportResourceState(r providers.ImportResourceStateRequest) providers.ImportResourceStateResponse {
   290  	p.Lock()
   291  	defer p.Unlock()
   292  
   293  	if p.ImportStateReturn != nil {
   294  		for _, is := range p.ImportStateReturn {
   295  			if is.Attributes == nil {
   296  				is.Attributes = make(map[string]string)
   297  			}
   298  			is.Attributes["id"] = is.ID
   299  
   300  			typeName := is.Ephemeral.Type
   301  			// Use the requested type if the resource has no type of it's own.
   302  			// We still return the empty type, which will error, but this prevents a panic.
   303  			if typeName == "" {
   304  				typeName = r.TypeName
   305  			}
   306  
   307  			schema := p.GetSchemaReturn.ResourceTypes[typeName]
   308  			if schema == nil {
   309  				panic("no schema found for " + typeName)
   310  			}
   311  
   312  			private, err := json.Marshal(is.Meta)
   313  			if err != nil {
   314  				panic(err)
   315  			}
   316  
   317  			state, err := hcl2shim.HCL2ValueFromFlatmap(is.Attributes, schema.ImpliedType())
   318  			if err != nil {
   319  				panic(err)
   320  			}
   321  
   322  			state, err = schema.CoerceValue(state)
   323  			if err != nil {
   324  				panic(err)
   325  			}
   326  
   327  			p.ImportResourceStateResponse.ImportedResources = append(
   328  				p.ImportResourceStateResponse.ImportedResources,
   329  				providers.ImportedResource{
   330  					TypeName: is.Ephemeral.Type,
   331  					State:    state,
   332  					Private:  private,
   333  				})
   334  		}
   335  	}
   336  
   337  	p.ImportResourceStateCalled = true
   338  	p.ImportResourceStateRequest = r
   339  	if p.ImportResourceStateFn != nil {
   340  		return p.ImportResourceStateFn(r)
   341  	}
   342  
   343  	return p.ImportResourceStateResponse
   344  }
   345  
   346  func (p *MockProvider) ReadDataSource(r providers.ReadDataSourceRequest) providers.ReadDataSourceResponse {
   347  	p.Lock()
   348  	defer p.Unlock()
   349  
   350  	p.ReadDataSourceCalled = true
   351  	p.ReadDataSourceRequest = r
   352  
   353  	if p.ReadDataSourceFn != nil {
   354  		return p.ReadDataSourceFn(r)
   355  	}
   356  
   357  	return p.ReadDataSourceResponse
   358  }
   359  
   360  func (p *MockProvider) Close() error {
   361  	p.CloseCalled = true
   362  	return p.CloseError
   363  }