-
Notifications
You must be signed in to change notification settings - Fork 21
/
resource_block.go
122 lines (117 loc) · 4.51 KB
/
resource_block.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package schema
import (
"github.com/hashicorp/go-version"
"github.com/hashicorp/hcl-lang/lang"
"github.com/hashicorp/hcl-lang/schema"
"github.com/hashicorp/terraform-schema/internal/schema/refscope"
"github.com/hashicorp/terraform-schema/internal/schema/tokmod"
"github.com/zclconf/go-cty/cty"
)
func resourceBlockSchema(v *version.Version) *schema.BlockSchema {
bs := &schema.BlockSchema{
Address: &schema.BlockAddrSchema{
Steps: []schema.AddrStep{
schema.LabelStep{Index: 0},
schema.LabelStep{Index: 1},
},
FriendlyName: "resource",
ScopeId: refscope.ResourceScope,
AsReference: true,
DependentBodyAsData: true,
InferDependentBody: true,
DependentBodySelfRef: true,
},
SemanticTokenModifiers: lang.SemanticTokenModifiers{tokmod.Resource},
Labels: []*schema.LabelSchema{
{
Name: "type",
SemanticTokenModifiers: lang.SemanticTokenModifiers{tokmod.Type, lang.TokenModifierDependent},
Description: lang.PlainText("Resource Type"),
IsDepKey: true,
Completable: true,
},
{
Name: "name",
SemanticTokenModifiers: lang.SemanticTokenModifiers{tokmod.Name},
Description: lang.PlainText("Reference Name"),
},
},
Description: lang.PlainText("A resource block declares a resource of a given type with a given local name. The name is " +
"used to refer to this resource from elsewhere in the same Terraform module, but has no significance " +
"outside of the scope of a module."),
Body: &schema.BodySchema{
Extensions: &schema.BodyExtensions{
Count: true,
ForEach: true, // for_each was introduced in 0.12.6, but for simplicity we report it for all 0.12+
DynamicBlocks: true,
},
Attributes: map[string]*schema.AttributeSchema{
"provider": {
Constraint: schema.Reference{OfScopeId: refscope.ProviderScope},
IsOptional: true,
Description: lang.Markdown("Reference to a `provider` configuration block, e.g. `mycloud.west` or `mycloud`"),
IsDepKey: true,
SemanticTokenModifiers: lang.SemanticTokenModifiers{lang.TokenModifierDependent},
},
"depends_on": {
Constraint: schema.Set{
Elem: schema.OneOf{
schema.Reference{OfScopeId: refscope.DataScope},
schema.Reference{OfScopeId: refscope.ModuleScope},
schema.Reference{OfScopeId: refscope.ResourceScope},
schema.Reference{OfScopeId: refscope.VariableScope},
schema.Reference{OfScopeId: refscope.LocalScope},
},
},
IsOptional: true,
Description: lang.Markdown("Set of references to hidden dependencies, e.g. other resources or data sources"),
},
},
Blocks: map[string]*schema.BlockSchema{
"lifecycle": lifecycleBlock(),
"connection": connectionBlock(v),
"provisioner": provisionerBlock(v),
},
},
}
return bs
}
func lifecycleBlock() *schema.BlockSchema {
return &schema.BlockSchema{
Description: lang.Markdown("Lifecycle customizations to change default resource behaviours during apply"),
Body: &schema.BodySchema{
Attributes: map[string]*schema.AttributeSchema{
"create_before_destroy": {
Constraint: schema.LiteralType{Type: cty.Bool},
DefaultValue: schema.DefaultValue{Value: cty.BoolVal(false)},
IsOptional: true,
Description: lang.Markdown("Whether to reverse the default order of operations (destroy -> create) during apply " +
"when the resource requires replacement (cannot be updated in-place)"),
},
"prevent_destroy": {
Constraint: schema.LiteralType{Type: cty.Bool},
DefaultValue: schema.DefaultValue{Value: cty.BoolVal(false)},
IsOptional: true,
Description: lang.Markdown("Whether to prevent accidental destruction of the resource and cause Terraform " +
"to reject with an error any plan that would destroy the resource"),
},
"ignore_changes": {
Constraint: schema.OneOf{
schema.Set{
// TODO: expose reference targets via attribute-only address
},
schema.Keyword{
Keyword: "all",
Description: lang.Markdown("Ignore all attributes, which means that Terraform can create" +
" and destroy the remote object but will never propose updates to it"),
},
},
IsOptional: true,
Description: lang.Markdown("A set of fields (references) of which to ignore changes to, e.g. `tags`"),
},
},
},
}
}