github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/provider-simple/provider.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  // simple provider a minimal provider implementation for testing
     5  package simple
     6  
     7  import (
     8  	"errors"
     9  	"time"
    10  
    11  	"github.com/terramate-io/tf/configs/configschema"
    12  	"github.com/terramate-io/tf/providers"
    13  	"github.com/zclconf/go-cty/cty"
    14  	ctyjson "github.com/zclconf/go-cty/cty/json"
    15  )
    16  
    17  type simple struct {
    18  	schema providers.GetProviderSchemaResponse
    19  }
    20  
    21  func Provider() providers.Interface {
    22  	simpleResource := providers.Schema{
    23  		Block: &configschema.Block{
    24  			Attributes: map[string]*configschema.Attribute{
    25  				"id": {
    26  					Computed: true,
    27  					Type:     cty.String,
    28  				},
    29  				"value": {
    30  					Optional: true,
    31  					Type:     cty.String,
    32  				},
    33  			},
    34  		},
    35  	}
    36  
    37  	return simple{
    38  		schema: providers.GetProviderSchemaResponse{
    39  			Provider: providers.Schema{
    40  				Block: nil,
    41  			},
    42  			ResourceTypes: map[string]providers.Schema{
    43  				"simple_resource": simpleResource,
    44  			},
    45  			DataSources: map[string]providers.Schema{
    46  				"simple_resource": simpleResource,
    47  			},
    48  			ServerCapabilities: providers.ServerCapabilities{
    49  				PlanDestroy: true,
    50  			},
    51  		},
    52  	}
    53  }
    54  
    55  func (s simple) GetProviderSchema() providers.GetProviderSchemaResponse {
    56  	return s.schema
    57  }
    58  
    59  func (s simple) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
    60  	return resp
    61  }
    62  
    63  func (s simple) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
    64  	return resp
    65  }
    66  
    67  func (s simple) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
    68  	return resp
    69  }
    70  
    71  func (p simple) UpgradeResourceState(req providers.UpgradeResourceStateRequest) (resp providers.UpgradeResourceStateResponse) {
    72  	ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
    73  	val, err := ctyjson.Unmarshal(req.RawStateJSON, ty)
    74  	resp.Diagnostics = resp.Diagnostics.Append(err)
    75  	resp.UpgradedState = val
    76  	return resp
    77  }
    78  
    79  func (s simple) ConfigureProvider(providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
    80  	return resp
    81  }
    82  
    83  func (s simple) Stop() error {
    84  	return nil
    85  }
    86  
    87  func (s simple) ReadResource(req providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
    88  	// just return the same state we received
    89  	resp.NewState = req.PriorState
    90  	return resp
    91  }
    92  
    93  func (s simple) PlanResourceChange(req providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
    94  	if req.ProposedNewState.IsNull() {
    95  		// destroy op
    96  		resp.PlannedState = req.ProposedNewState
    97  		resp.PlannedPrivate = req.PriorPrivate
    98  		return resp
    99  	}
   100  
   101  	m := req.ProposedNewState.AsValueMap()
   102  	_, ok := m["id"]
   103  	if !ok {
   104  		m["id"] = cty.UnknownVal(cty.String)
   105  	}
   106  
   107  	resp.PlannedState = cty.ObjectVal(m)
   108  	return resp
   109  }
   110  
   111  func (s simple) ApplyResourceChange(req providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
   112  	if req.PlannedState.IsNull() {
   113  		resp.NewState = req.PlannedState
   114  		return resp
   115  	}
   116  
   117  	m := req.PlannedState.AsValueMap()
   118  	_, ok := m["id"]
   119  	if !ok {
   120  		m["id"] = cty.StringVal(time.Now().String())
   121  	}
   122  	resp.NewState = cty.ObjectVal(m)
   123  
   124  	return resp
   125  }
   126  
   127  func (s simple) ImportResourceState(providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
   128  	resp.Diagnostics = resp.Diagnostics.Append(errors.New("unsupported"))
   129  	return resp
   130  }
   131  
   132  func (s simple) ReadDataSource(req providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
   133  	m := req.Config.AsValueMap()
   134  	m["id"] = cty.StringVal("static_id")
   135  	resp.State = cty.ObjectVal(m)
   136  	return resp
   137  }
   138  
   139  func (s simple) Close() error {
   140  	return nil
   141  }