// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1

syntax = "proto3";
package tfstackdata1;

import "planfile.proto"; // tfplan, from internal/plans/planproto
import "google/protobuf/any.proto";

// These definitions describe the PRIVATE raw format that we use to persist
// stack and plan information for stacks between operations.
//
// Nothing outside of this codebase should attempt to produce or consume
// these formats. They are subject to change at any time.

///////////// PLAN SEQUENCE MESSAGES
//
// A "stack plan" consists of a sequence of messages emitted gradually from
// the streaming Stacks.PlanStackChanges RPC in the Terraform Core RPC API.
//
// From the perspective of that protocol the objects in the sequence are
// opaque and to be preserved byte-for-byte without any external interpretation,
// in the same order they were emitted from Terraform Core.
//
// Internally, we decode each one based on the type field of google.protobuf.Any,
// treating each one as some kind of mutation of our in-memory plan data
// structure.
//
// These message types only cover the data that Terraform needs to apply the
// plan, and so don't cover any information that Terraform Core might emit
// only for the caller's benefit.
//////////////

// Appears early in a raw plan sequence to capture some metadata that we need
// to process subsequent messages, or to abort if we're being asked to decode
// a plan created by a different version of Terraform.
message PlanHeader {
    // The canonical version string for the version of Terraform that created
    // the plan sequence that this message belongs to.
    //
    // The raw plan sequence loader will fail if it finds a message of this
    // type with a version string that disagrees with the version of Terraform
    // decoding the message, because we always expect plans to be applied by
    // the same version of Terraform that created them.
    string terraform_version = 1;
}

// Captures one element from the raw prior state that was provided when
// creating the plan. A valid plan includes a copy of its entire prior state
// represented as zero or more messages of this type, which we then interpret
// as a map from key to raw during load.
message PlanPriorStateElem {
    string key = 1;
    google.protobuf.Any raw = 2;
}

// Confirms whether the overall plan whose raw plan sequence includes this
// message is complete enough and valid enough to be applied.
//
// If a the sequence of raw plan messages includes multiple messages of this
// type then the one with the latest position in the list "wins" during
// decoding of the overall sequence, although in practice there isn't yet
// any clear reason to include more than one instance of this message type in a
// plan.
message PlanApplyable {
    bool applyable = 1;
}

// Records the plan timestamp to be used for all components and the stacks language.
message PlanTimestamp {
    string plan_timestamp = 1;
}

// Records the value of one of the main stack's input values during planning.
//
// These values get fixed during the plan phase so that we can ensure that we
// use identical values when subsequently applying the plan.
message PlanRootInputValue {
    string name = 1;
    DynamicValue value = 2;
    bool required_on_apply = 3;
}

// Records that a root input variable should be deleted by the apply operation.
message DeletedRootInputVariable {
    string name = 1;
}

// Records that a root output should be deleted by the apply operation.
message DeletedRootOutputValue {
    string name = 1;
}

// Records that a component should just be deleted from the state.
message DeletedComponent {
    string component_instance_addr = 1;
}

// FunctionResults stores a record of the results of provider functions
// that were called during the planning phase. This is used to ensure that the
// same results are returned during the apply phase.
message FunctionResults {
    repeated tfplan.FunctionCallHash function_results = 1;
}

// Represents the existence of a particular component instance, and so must
// always appear before any messages representing objects that belong to that
// component instance.
//
// This message type exists to avoid the ambiguity between a component instance
// existing with zero resource instances inside vs. a component instance
// not existing at all.
message PlanComponentInstance {
    string component_instance_addr = 1;

    // plan_timestamp records the time when the plan for this component
    // instance was created, exclusively for making sure that the
    // "plantimestamp" function can return the same value during the apply
    // phase. It must not be used for any other purpose.
    string plan_timestamp = 2;

    // Captures an approximation of the input values for this component with
    // as much detail as we knew during the planning phase. This might
    // contain unknown values as placeholders for values that won't be
    // determined until the apply phase, so this isn't usable directly as
    // the input to subsequently applying the component plan but the final
    // input values should be a valid concretization of what's described here.
    map<string, DynamicValue> planned_input_values = 3;

    // The action planned for the component as a whole.
    //
    // This does not directly incorporate actions planned for resource
    // instances within this component instance, but does capture a sense
    // of the overall action being taken for this particular component
    // instance.
    //
    // The currently-possible values are:
    //   - CREATE and UPDATE both describe applying a "normal" plan, where
    //     CREATE additionally represents that the component instance
    //     did not previously exist.
    //   - READ describes a refresh-only plan. This is currently possible only
    //     if the overall stack plan is refresh-only.
    //   - DELETE describes applying a destroy plan, with the intent of
    //     deleting all remote objects currently bound to resource instances
    //     in this component instance.
    //
    // The value recorded here is used to achieve a few variations needed in
    // the apply phase.
    tfplan.Action planned_action = 4;

    // The mode that was used to plan this component.
    //
    // This is used to determine the behavior of the apply phase for this
    // component instance.
    //
    // Ideally, we wouldn't need to include this at all as the plan should
    // contain everything we need without a general mode. However, this is
    // not currently the case. See context_apply.go:332 for more details.
    // TODO: Remove this once walkDestroy has been properly audited.
    tfplan.Mode mode = 10;

    // The appliability flag decided by the modules runtime for this component's
    // plan. See the docs for plans.Plan.Applyable for details on what this
    // represents. (It's here largely just so that we can repopulate it
    // faithfully when we rebuild a plans.Plan object at apply time.)
    bool plan_applyable = 7;

    // The completion flag decided by the modules runtime for this component's
    // plan. See the docs for plans.Plan.Complete for details on what this
    // represents. (It's here largely just so that we can repopulate it
    // faithfully when we rebuild a plans.Plan object at apply time.)
    bool plan_complete = 8;

    // A list of absolute component addresses that this component
    // instance depends on according to the configuration the plan was
    // created from. (These are components rather than component instances
    // because the stacks language evaluation model uses components as the
    // most specific granularity for dependency resolution.)
    //
    // Applying this component instance's plan must wait until any
    // CREATE or UPDATE plans for any of the listed component instances have
    // completed successfully. Additionally, if any of the component instances
    // listed here have DELETE plans then this component instance must also
    // have a DELETE plan and the upstream DELETE must wait until this one
    // has completed.
    //
    // A component instance plan that is not DELETE cannot depend on another
    // component instance that is not also DELETE, since that would imply that
    // this component instance's configuration refers to a component that isn't
    // declared, which should therefore have failed validation.
    repeated string depends_on_component_addrs = 5;

    // Captures an approximation of the output values for this component with
    // as much detail as we knew during the planning phase.
    //
    // For any planned action other than DELETE this might contain unknown
    // values as placeholders for values that won't be determined until the
    // apply phase
    //
    // For a DELETE plan the values should always be known because they are
    // based on the prior state for the component, before it has been destroyed.
    // The apply phase should use these values to build the representation of
    // the component instance as an expression, because for DELETE any
    // dependent objects must also be pending DELETE and their delete must
    // happen before this instance is destroyed.
    map<string, DynamicValue> planned_output_values = 6;

    // A list of check results for this component instance, as produced by
    // the modules runtime during the planning phase. The apply expects to
    // update check results which were unknown during planning to reflect
    // the actual results from the apply phase.
    repeated tfplan.CheckResults planned_check_results = 9;

    // The set of provider function results that were produced during the
    // planning phase for this component instance. These results are used
    // to ensure that the same results are returned during the apply phase.
    repeated tfplan.FunctionCallHash function_results = 11;
}

// Represents a planned change to a particular resource instance within a
// particular component instance.
message PlanResourceInstanceChangePlanned {
    // The same string must previously have been announced with a
    // PlanComponentInstance message, or the overall plan sequence is invalid.
    string component_instance_addr = 1;
    string resource_instance_addr = 4;
    string deposed_key = 5;

    // The address of the provider configuration that planned this change,
    // or that produced the prior state for messages where "change" is
    // unpopulated. This is a module-centric view relative to the root module
    // of the component identified in component_instance_addr.
    string provider_config_addr = 6;

    // Description of the planned change in the standard "tfplan" (planproto)
    // format.
    tfplan.ResourceInstanceChange change = 2;

    // A snapshot of the "prior state", which is the result of upgrading and
    // refreshing the previous run's state.
    //
    // The very first action on applying this plan should be to update the
    // raw state for the resource instance to match this value, since
    // the main apply phase for each component instance assumes that the
    // prior state has already been updated to match the "old" value from
    // the "change" message.
    StateResourceInstanceObjectV1 prior_state = 3;
}

// Represents a deferred change to a particular resource instance within a
// particular component instance.
message PlanDeferredResourceInstanceChange {
    tfplan.Deferred deferred = 1;
    PlanResourceInstanceChangePlanned change = 2;
}

// Represents that we need to emit "delete" requests for one or more raw
// state and/or state description objects during the apply phase.
//
// This situation arises if the previous state (given as input to the apply
// phase) contains keys that are of a type unrecognized by the current
// version of Terraform and that are marked as "discard if unrecognized",
// suggesting that their content is likely to become somehow invalid if
// other parts of the state were to get updated.
message PlanDiscardStateMapKeys {
    // A set of keys to delete from the "raw state".
    repeated string raw_state_keys = 1;

    // A set of keys to delete from the "state description".
    repeated string description_keys = 2;
}

///////////// STATE MAP MESSAGES
//
// A "stack state snapshot" is a mapping from arbitrary keys to messages
// emitted gradually from the streaming Stacks.ApplyStackChanges RPC in the
// Terraform Core RPC API.
//
// From the perspective of that protocol the keys and values in the map are
// opaque and to be preserved verbatim without any external interpretation,
// overwriting any previous value that had the same key.
//
// Internally, we decode each one based on the type field of google.protobuf.Any,
// treating each one as some kind of mutation of our in-memory plan data
// structure.
//
// These message types only cover the data that Terraform needs to produce
// a future plan based on this snapshot, and don't cover any information that
// Terraform Core might emit only for the caller's benefit.
//
// Because state messages survive from one run to the next, all top-level
// messages used for state snapshots have a format version suffix that is
// currently always 1. The functions that load a state map into the in-memory
// state structure will fail if any of the messages are of an unknown type, so
// we should increment the format version only as a last resort because this
// will prevent users from downgrading to an earlier version of Terraform once
// they've got at least one state map message that is of a newer version.
//////////////

// Represents the existence of a particular component instance.
//
// This is here mainly to remove the ambiguity between a component instance that
// exists but contains no resource instances vs. a component instance that
// doesn't exist at all.
//
// Because the state map is updated on a per-element basis rather than
// atomically, it's possible that the state map might contain resource instances
// which belong to a component instance that is not tracked by a message of
// this type. In that case, the state loader will just assume an implied
// message of this type with a matching component instance address and with
// all other fields unset.
message StateComponentInstanceV1 {
    // The component instance's output values as reported from the most recent
    // apply action. We retain this only so that we have some values to use
    // in cases where the values in the configuration are unavailable or
    // insufficient, such as when we're making a destroy-mode plan and therefore
    // the desired state would be for the component instance to cease existing
    // but yet we still need to have _some_ output values to use when planning
    // and applying other component instances that refer to this one.
    map<string, DynamicValue> output_values = 1;

    // The input variables for this component instance as reported from the
    // most recent apply action. We retain this only for usage within removed
    // blocks, where we need to know the input variables to be able to plan
    // and apply the destroy action without asking the user to resupply or
    // remember them.
    map<string, DynamicValue> input_variables = 2;

    // The absolute configuration addresses of components that this component
    // instance depended on when it was created. We preserve this information
    // to help with plan and apply ordering during destroy plans or for removed
    // blocks.
    repeated string dependency_addrs = 3;

    // The absolute configuration addresses of components that depended on this
    // component instance when it was created. We preserve this information
    // to help with plan and apply ordering during destroy plans or for removed
    // blocks.
    repeated string dependent_addrs = 4;
}

// Represents the existence of a particular resource instance object in a
// particular component instance.
//
// A resource instance message object should typically be accompanied by a
// StateComponentInstanceV1 (or later version) that represents the existence
// of the component itself, but for robustness we tolerate the absense of
// such a message and just assume that all of its fields (other than the
// component instance address) are unset.
message StateResourceInstanceObjectV1 {
    // value_json is a JSON representation of the object value representing
    // this resource instance object.
    //
    // This is JSON-serialized rather than MessagePack serialized (as we do
    // for everything else in this format and in the RPC API) because
    // the provider protocol only supports legacy flatmap and JSON as input
    // to the state upgrade process, and we won't be able to transcode from
    // MessagePack to JSON once we decode this because we won't know the
    // schema that the value was encoded with.
    //
    // This is a pragmatic exception for this particular quirk of Terraform's
    // provider API design. Other parts of this format and associated protocol
    // should use tfplan.DynamicValue and MessagePack encoding for consistency.
    bytes value_json = 1;
    repeated tfplan.Path sensitive_paths = 2;
    uint64 schema_version = 3;

    Status status = 4;
    repeated string dependencies = 5;
    bool create_before_destroy = 6;
    string provider_config_addr = 7;

    // provider_specific_data is arbitrary bytes produced by the provider
    // in its apply response which we preserve and pass back to it in any
    // subsequent plan operation.
    bytes provider_specific_data = 8;

    enum Status {
        UNKNOWN = 0;
        READY = 1;
        DAMAGED = 2; // (formerly known as "tainted")
    }
}

message DynamicValue {
    tfplan.DynamicValue value = 1;
    repeated tfplan.Path sensitive_paths = 2;
}
