// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package providers import ( "time" "github.com/hashicorp/terraform/internal/tfdiags" "github.com/zclconf/go-cty/cty" ) // OpenEphemeralResourceRequest represents the arguments for the OpenEphemeralResource // operation on a provider. type OpenEphemeralResourceRequest struct { // TypeName is the type of ephemeral resource to open. This should // only be one of the type names previously reported in the provider's // schema. TypeName string // Config is an object-typed value representing the configuration for // the ephemeral resource instance that the caller is trying to open. // // The object type of this value always conforms to the resource type // schema's implied type, and uses null values to represent attributes // that were not explicitly assigned in the configuration block. // Computed-only attributes are always null in the configuration, because // they can be set only in the response. Config cty.Value // ClientCapabilities contains information about the client's capabilities. ClientCapabilities ClientCapabilities } // OpenEphemeralResourceRequest represents the response from an OpenEphemeralResource // operation on a provider. type OpenEphemeralResourceResponse struct { // Deferred, if present, signals that the provider doesn't have enough // information to open this ephemeral resource instance. // // This implies that any other side-effect-performing object must have its // planning deferred if its planning operation indirectly depends on this // ephemeral resource result. For example, if a provider configuration // refers to an ephemeral resource whose opening is deferred then the // affected provider configuration must not be instantiated and any resource // instances that belong to it must have their planning immediately // deferred. Deferred *Deferred // Result is an object-typed value representing the newly-opened session // with the opened ephemeral object. // // The object type of this value always conforms to the resource type // schema's implied type. Unknown values are forbidden unless the Deferred // field is set, in which case the Result represents the provider's best // approximation of the final object using unknown values in any location // where a final value cannot be predicted. Result cty.Value // Private is any internal data needed by the provider to perform a // subsequent [Interface.CloseEphemeralResource] request for the same object. The // provider may choose any encoding format to represent the needed data, // because Terraform Core treats this field as opaque. // // Providers should aim to keep this data relatively compact to minimize // overhead. Although Terraform Core does not enforce a specific limit just // for this field, it would be very unusual for the internal context to be // more than 256 bytes in size, and in most cases it should be on the order // of only tens of bytes. For example, a lease ID for the remote system is a // reasonable thing to encode here. // // Because ephemeral resource instances never outlive a single Terraform // Core phase, it's guaranteed that a CloseEphemeralResource request will be // received by exactly the same plugin instance that returned this value, // and so it's valid for this to refer to in-memory state belonging to the // provider instance. Private []byte // RenewAt, if non-zero, signals that the opened object has an inherent // expiration time and so must be "renewed" if Terraform needs to use it // beyond that expiration time. // // If a provider sets this field then it may receive a subsequent // Interface.RenewEphemeralResource call, if Terraform expects to need the // object beyond the expiration time. RenewAt time.Time // Diagnostics describes any problems encountered while opening the // ephemeral resource. If this contains errors then the other response // fields must be assumed invalid. Diagnostics tfdiags.Diagnostics } // EphemeralRenew describes when and how Terraform Core must request renewal // of an ephemeral resource instance in order to continue using it. type EphemeralRenew struct { // RenewAt is the deadline before which Terraform must renew the // ephemeral resource instance. RenewAt time.Time // Private is any internal data needed by the provider to // perform a subsequent [Interface.RenewEphemeralResource] request. The provider // may choose any encoding format to represent the needed data, because // Terraform Core treats this field as opaque. // // Providers should aim to keep this data relatively compact to minimize // overhead. Although Terraform Core does not enforce a specific limit // just for this field, it would be very unusual for the internal context // to be more than 256 bytes in size, and in most cases it should be // on the order of only tens of bytes. For example, a lease ID for the // remote system is a reasonable thing to encode here. // // Because ephemeral resource instances never outlive a single Terraform // Core phase, it's guaranteed that a RenewEphemeralResource request will be // received by exactly the same plugin instance that previously handled // the OpenEphemeralResource or RenewEphemeralResource request that produced this internal // context, and so it's valid for this to refer to in-memory state in the // provider object. Private []byte } // RenewEphemeralResourceRequest represents the arguments for the RenewEphemeralResource // operation on a provider. type RenewEphemeralResourceRequest struct { // TypeName is the type of ephemeral resource being renewed. This should // only be one of the type names previously sent in a successful // [OpenEphemeralResourceRequest]. TypeName string // Private echoes verbatim the value from the field of the same // name from the most recent [EphemeralRenew] object, received from either // an [OpenEphemeralResourceResponse] or a [RenewEphemeralResourceResponse] object. Private []byte } // RenewEphemeralResourceRequest represents the response from a RenewEphemeralResource // operation on a provider. type RenewEphemeralResourceResponse struct { // RenewAt, if non-zero, describes a new expiration deadline for the // object, possibly causing a further call to [Interface.RenewEphemeralResource] // if Terraform needs to exceed the updated deadline. // // If this is not set then Terraform Core will not make any further // renewal requests for the remaining life of the object. RenewAt time.Time // Private is any internal data needed by the provider to // perform a subsequent [Interface.RenewEphemeralResource] request. The provider // may choose any encoding format to represent the needed data, because // Terraform Core treats this field as opaque. Private []byte // Diagnostics describes any problems encountered while renewing the // ephemeral resource instance. If this contains errors then the other // response fields must be assumed invalid. // // Because renewals happen asynchronously from other uses of the // ephemeral object, it's unspecified whether a renewal error will block // any specific usage of the object. For example, a request using the // object might already be in progress when a renewal error occurs, // in which case that other request might also fail trying to use a // now-invalid object, or it might by chance succeed in completing its // operation before the ephemeral object truly expires. Diagnostics tfdiags.Diagnostics } // CloseEphemeralResourceRequest represents the arguments for the CloseEphemeralResource // operation on a provider. type CloseEphemeralResourceRequest struct { // TypeName is the type of ephemeral resource being closed. This should // only be one of the type names previously sent in a successful // [OpenEphemeralResourceRequest]. TypeName string // Private echoes verbatim the value from the field of the same // name from the corresponding [OpenEphemeralResourceResponse] object. Private []byte } // CloseEphemeralResourceRequest represents the response from a CloseEphemeralResource // operation on a provider. type CloseEphemeralResourceResponse struct { // Diagnostics describes any problems encountered while closing the // ephemeral resource instance. If this contains errors then the other // response fields must be assumed invalid. // // If closing an ephemeral resource instance fails then it's unspecified // whether a corresponding remote object remains valid or not. // // Providers should make a best effort to treat the closure of an // already-expired ephemeral object as a success in order to exhibit // idemponent behavior for closing, but some remote systems do not allow // distinguishing that case from other error conditions. Diagnostics tfdiags.Diagnostics }