Skip to content

Commit 1fba244

Browse files
authored
Merge pull request #31179 from hashicorp/jbardin/plan-destroy
Call PlanResourceChange for destroy operations
2 parents 3036965 + 26c569e commit 1fba244

File tree

22 files changed

+2346
-1127
lines changed

22 files changed

+2346
-1127
lines changed
Lines changed: 381 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,381 @@
1+
// Terraform Plugin RPC protocol version 5.3
2+
//
3+
// This file defines version 5.3 of the RPC protocol. To implement a plugin
4+
// against this protocol, copy this definition into your own codebase and
5+
// use protoc to generate stubs for your target language.
6+
//
7+
// This file will not be updated. Any minor versions of protocol 5 to follow
8+
// should copy this file and modify the copy while maintaing backwards
9+
// compatibility. Breaking changes, if any are required, will come
10+
// in a subsequent major version with its own separate proto definition.
11+
//
12+
// Note that only the proto files included in a release tag of Terraform are
13+
// official protocol releases. Proto files taken from other commits may include
14+
// incomplete changes or features that did not make it into a final release.
15+
// In all reasonable cases, plugin developers should take the proto file from
16+
// the tag of the most recent release of Terraform, and not from the main
17+
// branch or any other development branch.
18+
//
19+
syntax = "proto3";
20+
option go_package = "github.com/hashicorp/terraform/internal/tfplugin5";
21+
22+
package tfplugin5;
23+
24+
// DynamicValue is an opaque encoding of terraform data, with the field name
25+
// indicating the encoding scheme used.
26+
message DynamicValue {
27+
bytes msgpack = 1;
28+
bytes json = 2;
29+
}
30+
31+
message Diagnostic {
32+
enum Severity {
33+
INVALID = 0;
34+
ERROR = 1;
35+
WARNING = 2;
36+
}
37+
Severity severity = 1;
38+
string summary = 2;
39+
string detail = 3;
40+
AttributePath attribute = 4;
41+
}
42+
43+
message AttributePath {
44+
message Step {
45+
oneof selector {
46+
// Set "attribute_name" to represent looking up an attribute
47+
// in the current object value.
48+
string attribute_name = 1;
49+
// Set "element_key_*" to represent looking up an element in
50+
// an indexable collection type.
51+
string element_key_string = 2;
52+
int64 element_key_int = 3;
53+
}
54+
}
55+
repeated Step steps = 1;
56+
}
57+
58+
message Stop {
59+
message Request {
60+
}
61+
message Response {
62+
string Error = 1;
63+
}
64+
}
65+
66+
// RawState holds the stored state for a resource to be upgraded by the
67+
// provider. It can be in one of two formats, the current json encoded format
68+
// in bytes, or the legacy flatmap format as a map of strings.
69+
message RawState {
70+
bytes json = 1;
71+
map<string, string> flatmap = 2;
72+
}
73+
74+
enum StringKind {
75+
PLAIN = 0;
76+
MARKDOWN = 1;
77+
}
78+
79+
// Schema is the configuration schema for a Resource, Provider, or Provisioner.
80+
message Schema {
81+
message Block {
82+
int64 version = 1;
83+
repeated Attribute attributes = 2;
84+
repeated NestedBlock block_types = 3;
85+
string description = 4;
86+
StringKind description_kind = 5;
87+
bool deprecated = 6;
88+
}
89+
90+
message Attribute {
91+
string name = 1;
92+
bytes type = 2;
93+
string description = 3;
94+
bool required = 4;
95+
bool optional = 5;
96+
bool computed = 6;
97+
bool sensitive = 7;
98+
StringKind description_kind = 8;
99+
bool deprecated = 9;
100+
}
101+
102+
message NestedBlock {
103+
enum NestingMode {
104+
INVALID = 0;
105+
SINGLE = 1;
106+
LIST = 2;
107+
SET = 3;
108+
MAP = 4;
109+
GROUP = 5;
110+
}
111+
112+
string type_name = 1;
113+
Block block = 2;
114+
NestingMode nesting = 3;
115+
int64 min_items = 4;
116+
int64 max_items = 5;
117+
}
118+
119+
// The version of the schema.
120+
// Schemas are versioned, so that providers can upgrade a saved resource
121+
// state when the schema is changed.
122+
int64 version = 1;
123+
124+
// Block is the top level configuration block for this schema.
125+
Block block = 2;
126+
}
127+
128+
service Provider {
129+
//////// Information about what a provider supports/expects
130+
rpc GetSchema(GetProviderSchema.Request) returns (GetProviderSchema.Response);
131+
rpc PrepareProviderConfig(PrepareProviderConfig.Request) returns (PrepareProviderConfig.Response);
132+
rpc ValidateResourceTypeConfig(ValidateResourceTypeConfig.Request) returns (ValidateResourceTypeConfig.Response);
133+
rpc ValidateDataSourceConfig(ValidateDataSourceConfig.Request) returns (ValidateDataSourceConfig.Response);
134+
rpc UpgradeResourceState(UpgradeResourceState.Request) returns (UpgradeResourceState.Response);
135+
136+
//////// One-time initialization, called before other functions below
137+
rpc Configure(Configure.Request) returns (Configure.Response);
138+
139+
//////// Managed Resource Lifecycle
140+
rpc ReadResource(ReadResource.Request) returns (ReadResource.Response);
141+
rpc PlanResourceChange(PlanResourceChange.Request) returns (PlanResourceChange.Response);
142+
rpc ApplyResourceChange(ApplyResourceChange.Request) returns (ApplyResourceChange.Response);
143+
rpc ImportResourceState(ImportResourceState.Request) returns (ImportResourceState.Response);
144+
145+
rpc ReadDataSource(ReadDataSource.Request) returns (ReadDataSource.Response);
146+
147+
//////// Graceful Shutdown
148+
rpc Stop(Stop.Request) returns (Stop.Response);
149+
}
150+
151+
message GetProviderSchema {
152+
message Request {
153+
}
154+
message Response {
155+
Schema provider = 1;
156+
map<string, Schema> resource_schemas = 2;
157+
map<string, Schema> data_source_schemas = 3;
158+
repeated Diagnostic diagnostics = 4;
159+
Schema provider_meta = 5;
160+
ServerCapabilities server_capabilities = 6;
161+
}
162+
163+
164+
// ServerCapabilities allows providers to communicate extra information
165+
// regarding supported protocol features. This is used to indicate
166+
// availability of certain forward-compatible changes which may be optional
167+
// in a major protocol version, but cannot be tested for directly.
168+
message ServerCapabilities {
169+
// The plan_destroy capability signals that a provider expects a call
170+
// to PlanResourceChange when a resource is going to be destroyed.
171+
bool plan_destroy = 1;
172+
}
173+
}
174+
175+
message PrepareProviderConfig {
176+
message Request {
177+
DynamicValue config = 1;
178+
}
179+
message Response {
180+
DynamicValue prepared_config = 1;
181+
repeated Diagnostic diagnostics = 2;
182+
}
183+
}
184+
185+
message UpgradeResourceState {
186+
message Request {
187+
string type_name = 1;
188+
189+
// version is the schema_version number recorded in the state file
190+
int64 version = 2;
191+
192+
// raw_state is the raw states as stored for the resource. Core does
193+
// not have access to the schema of prior_version, so it's the
194+
// provider's responsibility to interpret this value using the
195+
// appropriate older schema. The raw_state will be the json encoded
196+
// state, or a legacy flat-mapped format.
197+
RawState raw_state = 3;
198+
}
199+
message Response {
200+
// new_state is a msgpack-encoded data structure that, when interpreted with
201+
// the _current_ schema for this resource type, is functionally equivalent to
202+
// that which was given in prior_state_raw.
203+
DynamicValue upgraded_state = 1;
204+
205+
// diagnostics describes any errors encountered during migration that could not
206+
// be safely resolved, and warnings about any possibly-risky assumptions made
207+
// in the upgrade process.
208+
repeated Diagnostic diagnostics = 2;
209+
}
210+
}
211+
212+
message ValidateResourceTypeConfig {
213+
message Request {
214+
string type_name = 1;
215+
DynamicValue config = 2;
216+
}
217+
message Response {
218+
repeated Diagnostic diagnostics = 1;
219+
}
220+
}
221+
222+
message ValidateDataSourceConfig {
223+
message Request {
224+
string type_name = 1;
225+
DynamicValue config = 2;
226+
}
227+
message Response {
228+
repeated Diagnostic diagnostics = 1;
229+
}
230+
}
231+
232+
message Configure {
233+
message Request {
234+
string terraform_version = 1;
235+
DynamicValue config = 2;
236+
}
237+
message Response {
238+
repeated Diagnostic diagnostics = 1;
239+
}
240+
}
241+
242+
message ReadResource {
243+
message Request {
244+
string type_name = 1;
245+
DynamicValue current_state = 2;
246+
bytes private = 3;
247+
DynamicValue provider_meta = 4;
248+
}
249+
message Response {
250+
DynamicValue new_state = 1;
251+
repeated Diagnostic diagnostics = 2;
252+
bytes private = 3;
253+
}
254+
}
255+
256+
message PlanResourceChange {
257+
message Request {
258+
string type_name = 1;
259+
DynamicValue prior_state = 2;
260+
DynamicValue proposed_new_state = 3;
261+
DynamicValue config = 4;
262+
bytes prior_private = 5;
263+
DynamicValue provider_meta = 6;
264+
}
265+
266+
message Response {
267+
DynamicValue planned_state = 1;
268+
repeated AttributePath requires_replace = 2;
269+
bytes planned_private = 3;
270+
repeated Diagnostic diagnostics = 4;
271+
272+
273+
// This may be set only by the helper/schema "SDK" in the main Terraform
274+
// repository, to request that Terraform Core >=0.12 permit additional
275+
// inconsistencies that can result from the legacy SDK type system
276+
// and its imprecise mapping to the >=0.12 type system.
277+
// The change in behavior implied by this flag makes sense only for the
278+
// specific details of the legacy SDK type system, and are not a general
279+
// mechanism to avoid proper type handling in providers.
280+
//
281+
// ==== DO NOT USE THIS ====
282+
// ==== THIS MUST BE LEFT UNSET IN ALL OTHER SDKS ====
283+
// ==== DO NOT USE THIS ====
284+
bool legacy_type_system = 5;
285+
}
286+
}
287+
288+
message ApplyResourceChange {
289+
message Request {
290+
string type_name = 1;
291+
DynamicValue prior_state = 2;
292+
DynamicValue planned_state = 3;
293+
DynamicValue config = 4;
294+
bytes planned_private = 5;
295+
DynamicValue provider_meta = 6;
296+
}
297+
message Response {
298+
DynamicValue new_state = 1;
299+
bytes private = 2;
300+
repeated Diagnostic diagnostics = 3;
301+
302+
// This may be set only by the helper/schema "SDK" in the main Terraform
303+
// repository, to request that Terraform Core >=0.12 permit additional
304+
// inconsistencies that can result from the legacy SDK type system
305+
// and its imprecise mapping to the >=0.12 type system.
306+
// The change in behavior implied by this flag makes sense only for the
307+
// specific details of the legacy SDK type system, and are not a general
308+
// mechanism to avoid proper type handling in providers.
309+
//
310+
// ==== DO NOT USE THIS ====
311+
// ==== THIS MUST BE LEFT UNSET IN ALL OTHER SDKS ====
312+
// ==== DO NOT USE THIS ====
313+
bool legacy_type_system = 4;
314+
}
315+
}
316+
317+
message ImportResourceState {
318+
message Request {
319+
string type_name = 1;
320+
string id = 2;
321+
}
322+
323+
message ImportedResource {
324+
string type_name = 1;
325+
DynamicValue state = 2;
326+
bytes private = 3;
327+
}
328+
329+
message Response {
330+
repeated ImportedResource imported_resources = 1;
331+
repeated Diagnostic diagnostics = 2;
332+
}
333+
}
334+
335+
message ReadDataSource {
336+
message Request {
337+
string type_name = 1;
338+
DynamicValue config = 2;
339+
DynamicValue provider_meta = 3;
340+
}
341+
message Response {
342+
DynamicValue state = 1;
343+
repeated Diagnostic diagnostics = 2;
344+
}
345+
}
346+
347+
service Provisioner {
348+
rpc GetSchema(GetProvisionerSchema.Request) returns (GetProvisionerSchema.Response);
349+
rpc ValidateProvisionerConfig(ValidateProvisionerConfig.Request) returns (ValidateProvisionerConfig.Response);
350+
rpc ProvisionResource(ProvisionResource.Request) returns (stream ProvisionResource.Response);
351+
rpc Stop(Stop.Request) returns (Stop.Response);
352+
}
353+
354+
message GetProvisionerSchema {
355+
message Request {
356+
}
357+
message Response {
358+
Schema provisioner = 1;
359+
repeated Diagnostic diagnostics = 2;
360+
}
361+
}
362+
363+
message ValidateProvisionerConfig {
364+
message Request {
365+
DynamicValue config = 1;
366+
}
367+
message Response {
368+
repeated Diagnostic diagnostics = 1;
369+
}
370+
}
371+
372+
message ProvisionResource {
373+
message Request {
374+
DynamicValue config = 1;
375+
DynamicValue connection = 2;
376+
}
377+
message Response {
378+
string output = 1;
379+
repeated Diagnostic diagnostics = 2;
380+
}
381+
}

0 commit comments

Comments
 (0)