@@ -24,8 +24,12 @@ import (
24
24
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
25
25
)
26
26
27
- // This file contains shared flatteners between PrivateCA Certificate, CaPool and CertificateAuthority.
28
- // These resources share the x509Config (Certificate, CertificateAuthorty)/baselineValues (CaPool) object.
27
+ // This file contains shared flatteners between PrivateCA Certificate, CaPool, CertificateTemplate and
28
+ // CertificateAuthority. These resources share the x509Config (Certificate, CertificateAuthority)/
29
+ // baselineValues (CaPool) object. CertificateTemplate contains the predefinedValues object, which is slightly
30
+ // different from the other two, and so requires its own functions to process. These functions are also contained
31
+ // in this file.
32
+ //
29
33
// The API does not return this object if it only contains booleans with the default (false) value. This
30
34
// causes problems if a user specifies only default values, as Terraform detects that the object has been
31
35
// deleted on the API-side. This flattener creates default objects for sub-objects that match this pattern
@@ -80,6 +84,50 @@ func expandPrivatecaCertificateConfigX509ConfigCaOptions(v interface{}, d tpgres
80
84
return transformed , nil
81
85
}
82
86
87
+ func expandPrivatecaCertificateTemplateConfigX509ConfigCaOptions (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
88
+ // Similar to expandPrivatecaCertificateConfigX509ConfigCaOptions, but only for use in
89
+ // Certificate Templates, which use a null_ca field instead of the non_ca field.
90
+ // Fields null_ca, zero_max_issuer_path_length are used to distinguish between
91
+ // unset booleans and booleans set with a default value.
92
+ // Unset is_ca or unset max_issuer_path_length either allow any values for these fields when
93
+ // used in an issuance policy, or allow the API to use default values when used in a
94
+ // certificate config. A default value of is_ca=false means that issued certificates cannot
95
+ // be CA certificates. A default value of max_issuer_path_length=0 means that the CA cannot
96
+ // issue CA certificates.
97
+ if v == nil {
98
+ return nil , nil
99
+ }
100
+ l := v .([]interface {})
101
+ if len (l ) == 0 || l [0 ] == nil {
102
+ return nil , nil
103
+ }
104
+ raw := l [0 ]
105
+ original := raw .(map [string ]interface {})
106
+
107
+ nullCa := original ["null_ca" ].(bool )
108
+ isCa := original ["is_ca" ].(bool )
109
+
110
+ zeroPathLength := original ["zero_max_issuer_path_length" ].(bool )
111
+ maxIssuerPathLength := original ["max_issuer_path_length" ].(int )
112
+
113
+ transformed := make (map [string ]interface {})
114
+
115
+ if nullCa && isCa {
116
+ return nil , fmt .Errorf ("null_ca, is_ca can not be set to true at the same time." )
117
+ }
118
+ if zeroPathLength && maxIssuerPathLength > 0 {
119
+ return nil , fmt .Errorf ("zero_max_issuer_path_length can not be set to true while max_issuer_path_length being set to a positive integer." )
120
+ }
121
+
122
+ if ! nullCa {
123
+ transformed ["isCa" ] = original ["is_ca" ]
124
+ }
125
+ if maxIssuerPathLength > 0 || zeroPathLength {
126
+ transformed ["maxIssuerPathLength" ] = original ["max_issuer_path_length" ]
127
+ }
128
+ return transformed , nil
129
+ }
130
+
83
131
func expandPrivatecaCertificateConfigX509ConfigKeyUsage (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
84
132
if v == nil {
85
133
return v , nil
@@ -377,6 +425,33 @@ func flattenPrivatecaCertificateConfigX509ConfigCaOptions(v interface{}, d *sche
377
425
378
426
return []interface {}{transformed }
379
427
}
428
+
429
+ func flattenPrivatecaCertificateTemplateConfigX509ConfigCaOptions (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
430
+ // Special case here as the CaPool API returns an empty object rather than nil unlike the Certificate
431
+ // and CertificateAuthority APIs.
432
+ if v == nil || len (v .(map [string ]interface {})) == 0 {
433
+ v = make (map [string ]interface {})
434
+ }
435
+ original := v .(map [string ]interface {})
436
+ transformed := make (map [string ]interface {})
437
+
438
+ val , exists := original ["isCa" ]
439
+ transformed ["is_ca" ] =
440
+ flattenPrivatecaCertificateConfigX509ConfigCaOptionsIsCa (val , d , config )
441
+ if ! exists {
442
+ transformed ["null_ca" ] = true
443
+ }
444
+
445
+ val , exists = original ["maxIssuerPathLength" ]
446
+ transformed ["max_issuer_path_length" ] =
447
+ flattenPrivatecaCertificateConfigX509ConfigCaOptionsMaxIssuerPathLength (val , d , config )
448
+ if exists && int (val .(float64 )) == 0 {
449
+ transformed ["zero_max_issuer_path_length" ] = true
450
+ }
451
+
452
+ return []interface {}{transformed }
453
+ }
454
+
380
455
func flattenPrivatecaCertificateConfigX509ConfigCaOptionsIsCa (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
381
456
return v
382
457
}
0 commit comments