blob: 0a4df9f31f4444d7ca525bd4f4c4b05a78ff5702 [file] [log] [blame]
// 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
}