github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/provider-simple-v6/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  	"fmt"
    10  	"time"
    11  
    12  	"github.com/terramate-io/tf/configs/configschema"
    13  	"github.com/terramate-io/tf/providers"
    14  	"github.com/zclconf/go-cty/cty"
    15  	ctyjson "github.com/zclconf/go-cty/cty/json"
    16  )
    17  
    18  type simple struct {
    19  	schema providers.GetProviderSchemaResponse
    20  }
    21  
    22  func Provider() providers.Interface {
    23  	simpleResource := providers.Schema{
    24  		Block: &configschema.Block{
    25  			Attributes: map[string]*configschema.Attribute{
    26  				"id": {
    27  					Computed: true,
    28  					Type:     cty.String,
    29  				},
    30  				"value": {
    31  					Optional: true,
    32  					Type:     cty.String,
    33  				},
    34  			},
    35  		},
    36  	}
    37  
    38  	return simple{
    39  		schema: providers.GetProviderSchemaResponse{
    40  			Provider: providers.Schema{
    41  				Block: nil,
    42  			},
    43  			ResourceTypes: map[string]providers.Schema{
    44  				"simple_resource": simpleResource,
    45  			},
    46  			DataSources: map[string]providers.Schema{
    47  				"simple_resource": simpleResource,
    48  			},
    49  			ServerCapabilities: providers.ServerCapabilities{
    50  				PlanDestroy: true,
    51  			},
    52  		},
    53  	}
    54  }
    55  
    56  func (s simple) GetProviderSchema() providers.GetProviderSchemaResponse {
    57  	return s.schema
    58  }
    59  
    60  func (s simple) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
    61  	return resp
    62  }
    63  
    64  func (s simple) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
    65  	return resp
    66  }
    67  
    68  func (s simple) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
    69  	return resp
    70  }
    71  
    72  func (p simple) UpgradeResourceState(req providers.UpgradeResourceStateRequest) (resp providers.UpgradeResourceStateResponse) {
    73  	ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
    74  	val, err := ctyjson.Unmarshal(req.RawStateJSON, ty)
    75  	resp.Diagnostics = resp.Diagnostics.Append(err)
    76  	resp.UpgradedState = val
    77  	return resp
    78  }
    79  
    80  func (s simple) ConfigureProvider(providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
    81  	return resp
    82  }
    83  
    84  func (s simple) Stop() error {
    85  	return nil
    86  }
    87  
    88  func (s simple) ReadResource(req providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
    89  	// just return the same state we received
    90  	resp.NewState = req.PriorState
    91  	return resp
    92  }
    93  
    94  func (s simple) PlanResourceChange(req providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
    95  	if req.ProposedNewState.IsNull() {
    96  		// destroy op
    97  		resp.PlannedState = req.ProposedNewState
    98  
    99  		// signal that this resource was properly planned for destruction,
   100  		// verifying that the schema capabilities with PlanDestroy took effect.
   101  		resp.PlannedPrivate = []byte("destroy planned")
   102  		return resp
   103  	}
   104  
   105  	m := req.ProposedNewState.AsValueMap()
   106  	_, ok := m["id"]
   107  	if !ok {
   108  		m["id"] = cty.UnknownVal(cty.String)
   109  	}
   110  
   111  	resp.PlannedState = cty.ObjectVal(m)
   112  	return resp
   113  }
   114  
   115  func (s simple) ApplyResourceChange(req providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
   116  	if req.PlannedState.IsNull() {
   117  		// make sure this was transferred from the plan action
   118  		if string(req.PlannedPrivate) != "destroy planned" {
   119  			resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("resource not planned for destroy, private data %q", req.PlannedPrivate))
   120  		}
   121  
   122  		resp.NewState = req.PlannedState
   123  		return resp
   124  	}
   125  
   126  	m := req.PlannedState.AsValueMap()
   127  	_, ok := m["id"]
   128  	if !ok {
   129  		m["id"] = cty.StringVal(time.Now().String())
   130  	}
   131  	resp.NewState = cty.ObjectVal(m)
   132  
   133  	return resp
   134  }
   135  
   136  func (s simple) ImportResourceState(providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
   137  	resp.Diagnostics = resp.Diagnostics.Append(errors.New("unsupported"))
   138  	return resp
   139  }
   140  
   141  func (s simple) ReadDataSource(req providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
   142  	m := req.Config.AsValueMap()
   143  	m["id"] = cty.StringVal("static_id")
   144  	resp.State = cty.ObjectVal(m)
   145  	return resp
   146  }
   147  
   148  func (s simple) Close() error {
   149  	return nil
   150  }