Skip to content

Consider Surfacing Framework Type System Data for Config/Plan/State #590

@bflad

Description

@bflad
Contributor

Module version

v1.0.0

Use-cases

Provider developers should not need to drop down to the github.com/hashicorp/terraform-plugin-go/tftypes type system for advanced use cases that require working with schema-based data directly. In particular, tfsdk.Config, tfsdk.Plan, and tfsdk.State type Raw fields are currently tftypes.Value. Instead, providers should be able to work with the framework's type system for consistency, such as types.Object. If the tftypes data handling was still necessary by providers for whatever reason, they could still use the type implementations of ToTerraformValue() and FromTerraformValue() to roundtrip back and forth.

This effort would also help clean up a lot of framework internal logic that goes back and forth between the two type systems.

Proposal

This will require a large amount of design effort to complete successfully and this proposal is not currently exhaustive. It is being written in the context of closing out the generic #172.

Likely, some tftypes functionality such as walking and transforming values may be desirable in the framework type system or at least available internally within the framework.

Then, one of the following approaches could be taken to expose the data using the framework's type system:

Existing Type Approach

Add a new exported types.Object retrieval method to the existing tfsdk types. Deprecate the Raw field.

This introduces the least changes for providers and the framework, but does not fix the framework's technical debt imposed by the data storage being an exported tftypes.Value. Without a setter method, this also means that providers must use (types.Object).ToTerraformValue() to save the data back, which could be awkward.

New Type Approach

New schema-based data types could be introduced in the datasource, provider, and resource packages based off the framework type system which deprecate the existing tfsdk types. This enables fully executing the vision of each concept being self-contained within its own package in the framework. Various requests/responses would need the tfsdk based fields to be deprecated in preference of new fields using the new types.

This approach would also allow a more tailored design that no longer exposes any implementation details as errantly mutable fields, but more design would be needed on that front.

References

Activity

added
enhancementNew feature or request
tech-debtIssues tracking technical debt that we're carrying.
on Dec 16, 2022
bflad

bflad commented on Dec 16, 2022

@bflad
ContributorAuthor

One additional note that I would like to cross-reference from #186 is that any potential new implementation of GetAttribute() and SetAttribute() should consider only accepting a single attribute name path step or a string that is wrapped as such. There are some difficulties and current inconsistencies with attempting to fetch data at deeper levels. Personally, I think it would be good to encourage the provider developer practice of working with the framework type system directly for nested data and creating new values, rather than trying to directly work with data based on deeper schema paths.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesttech-debtIssues tracking technical debt that we're carrying.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @bflad

        Issue actions

          Consider Surfacing Framework Type System Data for Config/Plan/State · Issue #590 · hashicorp/terraform-plugin-framework