github.com/opentofu/opentofu@v1.7.1/internal/provider-simple/provider.go (about)

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