Merge pull request #13878 from hashicorp/f-core-computed-fields-validation
helper/schema: Disallow validation+diff suppression on computed fields
This commit is contained in:
commit
5681a47260
|
@ -6,7 +6,6 @@ import (
|
|||
"strings"
|
||||
|
||||
"github.com/circonus-labs/circonus-gometrics/api"
|
||||
"github.com/circonus-labs/circonus-gometrics/api/config"
|
||||
"github.com/hashicorp/errwrap"
|
||||
"github.com/hashicorp/terraform/helper/hashcode"
|
||||
"github.com/hashicorp/terraform/helper/schema"
|
||||
|
@ -85,9 +84,8 @@ func resourceMetricCluster() *schema.Resource {
|
|||
|
||||
// Out parameters
|
||||
metricClusterIDAttr: &schema.Schema{
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: validateRegexp(metricClusterIDAttr, config.MetricClusterCIDRegex),
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
},
|
||||
}),
|
||||
}
|
||||
|
|
|
@ -181,9 +181,6 @@ func dataSourceConsulAgentSelf() *schema.Resource {
|
|||
agentSelfACLDisabledTTL: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfACLDisabledTTL, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfACLDownPolicy: {
|
||||
Computed: true,
|
||||
|
@ -196,9 +193,6 @@ func dataSourceConsulAgentSelf() *schema.Resource {
|
|||
agentSelfACLTTL: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfACLTTL, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfAddresses: {
|
||||
Computed: true,
|
||||
|
@ -275,23 +269,14 @@ func dataSourceConsulAgentSelf() *schema.Resource {
|
|||
agentSelfCheckDeregisterIntervalMin: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfCheckDeregisterIntervalMin, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfCheckReapInterval: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfCheckReapInterval, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfCheckUpdateInterval: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfCheckUpdateInterval, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfClientAddr: {
|
||||
Computed: true,
|
||||
|
@ -317,16 +302,10 @@ func dataSourceConsulAgentSelf() *schema.Resource {
|
|||
agentSelfDNSMaxStale: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfDNSMaxStale, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfDNSNodeTTL: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfDNSNodeTTL, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfDNSOnlyPassing: {
|
||||
Computed: true,
|
||||
|
@ -335,16 +314,10 @@ func dataSourceConsulAgentSelf() *schema.Resource {
|
|||
agentSelfDNSRecursorTimeout: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfDNSRecursorTimeout, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfDNSServiceTTL: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfDNSServiceTTL, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfDNSUDPAnswerLimit: {
|
||||
Computed: true,
|
||||
|
@ -406,9 +379,6 @@ func dataSourceConsulAgentSelf() *schema.Resource {
|
|||
agentSelfID: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfID, validatorInputs{
|
||||
validateRegexp(`(?i)^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$`),
|
||||
}),
|
||||
},
|
||||
agentSelfLeaveOnInt: {
|
||||
Computed: true,
|
||||
|
@ -434,9 +404,6 @@ func dataSourceConsulAgentSelf() *schema.Resource {
|
|||
agentSelfPerformanceRaftMultiplier: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString, // FIXME(sean@): should be schema.TypeInt
|
||||
ValidateFunc: makeValidationFunc(agentSelfPerformanceRaftMultiplier, validatorInputs{
|
||||
validateIntMin(0),
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -453,58 +420,30 @@ func dataSourceConsulAgentSelf() *schema.Resource {
|
|||
agentSelfSchemaPortsDNS: {
|
||||
Computed: true,
|
||||
Type: schema.TypeInt,
|
||||
ValidateFunc: makeValidationFunc(agentSelfSchemaPortsDNS, validatorInputs{
|
||||
validateIntMin(1),
|
||||
validateIntMax(65535),
|
||||
}),
|
||||
},
|
||||
agentSelfSchemaPortsHTTP: {
|
||||
Computed: true,
|
||||
Type: schema.TypeInt,
|
||||
ValidateFunc: makeValidationFunc(agentSelfSchemaPortsHTTP, validatorInputs{
|
||||
validateIntMin(1),
|
||||
validateIntMax(65535),
|
||||
}),
|
||||
},
|
||||
agentSelfSchemaPortsHTTPS: {
|
||||
Computed: true,
|
||||
Type: schema.TypeInt,
|
||||
ValidateFunc: makeValidationFunc(agentSelfSchemaPortsHTTPS, validatorInputs{
|
||||
validateIntMin(1),
|
||||
validateIntMax(65535),
|
||||
}),
|
||||
},
|
||||
agentSelfSchemaPortsRPC: {
|
||||
Computed: true,
|
||||
Type: schema.TypeInt,
|
||||
ValidateFunc: makeValidationFunc(agentSelfSchemaPortsRPC, validatorInputs{
|
||||
validateIntMin(1),
|
||||
validateIntMax(65535),
|
||||
}),
|
||||
},
|
||||
agentSelfSchemaPortsSerfLAN: {
|
||||
Computed: true,
|
||||
Type: schema.TypeInt,
|
||||
ValidateFunc: makeValidationFunc(agentSelfSchemaPortsSerfLAN, validatorInputs{
|
||||
validateIntMin(1),
|
||||
validateIntMax(65535),
|
||||
}),
|
||||
},
|
||||
agentSelfSchemaPortsSerfWAN: {
|
||||
Computed: true,
|
||||
Type: schema.TypeInt,
|
||||
ValidateFunc: makeValidationFunc(agentSelfSchemaPortsSerfWAN, validatorInputs{
|
||||
validateIntMin(1),
|
||||
validateIntMax(65535),
|
||||
}),
|
||||
},
|
||||
agentSelfSchemaPortsServer: {
|
||||
Computed: true,
|
||||
Type: schema.TypeInt,
|
||||
ValidateFunc: makeValidationFunc(agentSelfSchemaPortsServer, validatorInputs{
|
||||
validateIntMin(1),
|
||||
validateIntMax(65535),
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -516,16 +455,10 @@ func dataSourceConsulAgentSelf() *schema.Resource {
|
|||
agentSelfReconnectTimeoutLAN: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfReconnectTimeoutLAN, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfReconnectTimeoutWAN: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfReconnectTimeoutWAN, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfRejoinAfterLeave: {
|
||||
Computed: true,
|
||||
|
@ -612,9 +545,6 @@ func dataSourceConsulAgentSelf() *schema.Resource {
|
|||
agentSelfSessionTTLMin: {
|
||||
Computed: true,
|
||||
Type: schema.TypeString,
|
||||
ValidateFunc: makeValidationFunc(agentSelfSessionTTLMin, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfStartJoin: {
|
||||
Computed: true,
|
||||
|
@ -702,9 +632,6 @@ func dataSourceConsulAgentSelf() *schema.Resource {
|
|||
agentSelfTelemetryCirconusSubmissionInterval: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
ValidateFunc: makeValidationFunc(agentSelfTelemetryCirconusSubmissionInterval, validatorInputs{
|
||||
validateDurationMin("0ns"),
|
||||
}),
|
||||
},
|
||||
agentSelfTelemetryEnableHostname: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
|
|
|
@ -56,14 +56,12 @@ func dataSourceConsulCatalogNodes() *schema.Resource {
|
|||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
catalogNodesNodeID: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
ValidateFunc: makeValidationFunc(catalogNodesNodeID, []interface{}{validateRegexp(`^[\S]+$`)}),
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
catalogNodesNodeName: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
ValidateFunc: makeValidationFunc(catalogNodesNodeName, []interface{}{validateRegexp(`^[\S]+$`)}),
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
catalogNodesNodeAddress: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
|
|
|
@ -76,14 +76,12 @@ func resourceRancherStack() *schema.Resource {
|
|||
Optional: true,
|
||||
},
|
||||
"rendered_docker_compose": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
DiffSuppressFunc: suppressComposeDiff,
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
"rendered_rancher_compose": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
DiffSuppressFunc: suppressComposeDiff,
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
|
@ -645,6 +645,19 @@ func (m schemaMap) InternalValidate(topSchemaMap schemaMap) error {
|
|||
}
|
||||
}
|
||||
|
||||
// Computed-only field
|
||||
if v.Computed && !v.Optional {
|
||||
if v.ValidateFunc != nil {
|
||||
return fmt.Errorf("%s: ValidateFunc is for validating user input, "+
|
||||
"there's nothing to validate on computed-only field", k)
|
||||
}
|
||||
if v.DiffSuppressFunc != nil {
|
||||
return fmt.Errorf("%s: DiffSuppressFunc is for suppressing differences"+
|
||||
" between config and state representation. "+
|
||||
"There is no config for computed-only field, nothing to compare.", k)
|
||||
}
|
||||
}
|
||||
|
||||
if v.ValidateFunc != nil {
|
||||
switch v.Type {
|
||||
case TypeList, TypeSet:
|
||||
|
|
|
@ -3325,16 +3325,46 @@ func TestSchemaMap_InternalValidate(t *testing.T) {
|
|||
},
|
||||
true,
|
||||
},
|
||||
|
||||
"computed-only field with validateFunc": {
|
||||
map[string]*Schema{
|
||||
"string": &Schema{
|
||||
Type: TypeString,
|
||||
Computed: true,
|
||||
ValidateFunc: func(v interface{}, k string) (ws []string, es []error) {
|
||||
es = append(es, fmt.Errorf("this is not fine"))
|
||||
return
|
||||
},
|
||||
},
|
||||
},
|
||||
true,
|
||||
},
|
||||
|
||||
"computed-only field with diffSuppressFunc": {
|
||||
map[string]*Schema{
|
||||
"string": &Schema{
|
||||
Type: TypeString,
|
||||
Computed: true,
|
||||
DiffSuppressFunc: func(k, old, new string, d *ResourceData) bool {
|
||||
// Always suppress any diff
|
||||
return false
|
||||
},
|
||||
},
|
||||
},
|
||||
true,
|
||||
},
|
||||
}
|
||||
|
||||
for tn, tc := range cases {
|
||||
err := schemaMap(tc.In).InternalValidate(nil)
|
||||
if err != nil != tc.Err {
|
||||
if tc.Err {
|
||||
t.Fatalf("%q: Expected error did not occur:\n\n%#v", tn, tc.In)
|
||||
t.Run(tn, func(t *testing.T) {
|
||||
err := schemaMap(tc.In).InternalValidate(nil)
|
||||
if err != nil != tc.Err {
|
||||
if tc.Err {
|
||||
t.Fatalf("%q: Expected error did not occur:\n\n%#v", tn, tc.In)
|
||||
}
|
||||
t.Fatalf("%q: Unexpected error occurred: %s\n\n%#v", tn, err, tc.In)
|
||||
}
|
||||
t.Fatalf("%q: Unexpected error occurred:\n\n%#v", tn, tc.In)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue