tfplan2cai/converters/google/resources/services/privateca/privateca_utils.go (444 lines of code) (raw):

package privateca import ( "fmt" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource" transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport" ) // This file contains shared flatteners between PrivateCA Certificate, CaPool and CertificateAuthority. // These resources share the x509Config (Certificate, CertificateAuthorty)/baselineValues (CaPool) object. // The API does not return this object if it only contains booleans with the default (false) value. This // causes problems if a user specifies only default values, as Terraform detects that the object has been // deleted on the API-side. This flattener creates default objects for sub-objects that match this pattern // to fix perma-diffs on default-only objects. For this to work all objects that are flattened from nil to // their default object *MUST* be set in the user's config, so they are all marked as Required in the schema. // // This file also contains shared expanders between the above resources. The expanders are required in order // to handle the optional primitive field in CaOptions. By adding a virtual field, the expander can distinguish // between an unset primitive field and a set primitive field with a default value. // Expander utilities func expandPrivatecaCertificateConfigX509ConfigCaOptions(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { // Fields non_ca, zero_max_issuer_path_length are used to distinguish between // unset booleans and booleans set with a default value. // Unset is_ca or unset max_issuer_path_length either allow any values for these fields when // used in an issuance policy, or allow the API to use default values when used in a // certificate config. A default value of is_ca=false means that issued certificates cannot // be CA certificates. A default value of max_issuer_path_length=0 means that the CA cannot // issue CA certificates. if v == nil { return nil, nil } l := v.([]interface{}) if len(l) == 0 || l[0] == nil { return nil, nil } raw := l[0] original := raw.(map[string]interface{}) nonCa := original["non_ca"].(bool) isCa := original["is_ca"].(bool) zeroPathLength := original["zero_max_issuer_path_length"].(bool) maxIssuerPathLength := original["max_issuer_path_length"].(int) transformed := make(map[string]interface{}) if nonCa && isCa { return nil, fmt.Errorf("non_ca, is_ca can not be set to true at the same time.") } if zeroPathLength && maxIssuerPathLength > 0 { 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.") } if isCa || nonCa { transformed["isCa"] = original["is_ca"] } if maxIssuerPathLength > 0 || zeroPathLength { transformed["maxIssuerPathLength"] = original["max_issuer_path_length"] } return transformed, nil } func expandPrivatecaCertificateConfigX509ConfigKeyUsage(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { if v == nil { return v, nil } l := v.([]interface{}) if len(l) == 0 || l[0] == nil { return nil, nil } raw := l[0] original := raw.(map[string]interface{}) if len(original) == 0 { // Ignore empty KeyUsage return nil, nil } transformed := make(map[string]interface{}) transformed["baseKeyUsage"] = expandPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsage(original["base_key_usage"], d, config) transformed["extendedKeyUsage"] = expandPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsage(original["extended_key_usage"], d, config) transformed["unknownExtendedKeyUsages"] = expandPrivatecaCertificateConfigX509ConfigKeyUsageUnknownExtendedKeyUsages(original["unknown_extended_key_usages"], d, config) return transformed, nil } func expandPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsage(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) interface{} { if v == nil { return v } l := v.([]interface{}) if len(l) == 0 || l[0] == nil { return nil } raw := l[0] original := raw.(map[string]interface{}) if len(original) == 0 { // Ignore empty BaseKeyUsage return nil } transformed := make(map[string]interface{}) transformed["digitalSignature"] = original["digital_signature"] transformed["contentCommitment"] = original["content_commitment"] transformed["keyEncipherment"] = original["key_encipherment"] transformed["dataEncipherment"] = original["data_encipherment"] transformed["keyAgreement"] = original["key_agreement"] transformed["certSign"] = original["cert_sign"] transformed["crlSign"] = original["crl_sign"] transformed["encipherOnly"] = original["encipher_only"] transformed["decipherOnly"] = original["decipher_only"] return transformed } func expandPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsage(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) interface{} { if v == nil { return v } l := v.([]interface{}) if len(l) == 0 || l[0] == nil { return nil } raw := l[0] original := raw.(map[string]interface{}) if len(original) == 0 { // Ignore empty ExtendedKeyUsage return nil } transformed := make(map[string]interface{}) transformed["serverAuth"] = original["server_auth"] transformed["clientAuth"] = original["client_auth"] transformed["codeSigning"] = original["code_signing"] transformed["emailProtection"] = original["email_protection"] transformed["timeStamping"] = original["time_stamping"] transformed["ocspSigning"] = original["ocsp_signing"] return transformed } func expandPrivatecaCertificateConfigX509ConfigKeyUsageUnknownExtendedKeyUsages(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) interface{} { if v == nil { return v } l := v.([]interface{}) transformed := make([]interface{}, 0, len(l)) // Parses the list of object IDs for _, raw := range l { original := raw.(map[string]interface{}) if len(original) < 1 { // Ignore empty UnknownExtendedKeyUsages continue } transformed = append(transformed, map[string]interface{}{ "objectIdPath": original["object_id_path"], }) } return transformed } func expandPrivatecaCertificateConfigX509ConfigPolicyIds(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { if v == nil { return v, nil } l := v.([]interface{}) transformed := make([]interface{}, 0, len(l)) // Parses the list of object IDs for _, raw := range l { original := raw.(map[string]interface{}) if len(original) < 1 { // Ignore empty ObjectId continue } transformed = append(transformed, map[string]interface{}{ "objectIdPath": original["object_id_path"], }) } return transformed, nil } func expandPrivatecaCertificateConfigX509ConfigAdditionalExtensions(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { if v == nil { return v, nil } l := v.([]interface{}) transformed := make([]interface{}, 0, len(l)) for _, raw := range l { original := raw.(map[string]interface{}) if len(original) < 1 { // Ignore empty AdditionalExtensions continue } transformed = append(transformed, map[string]interface{}{ "critical": original["critical"], "value": original["value"], "objectId": expandPrivatecaCertificateConfigX509ConfigAdditionalExtensionsObjectId(original["object_id"], d, config), }) } return transformed, nil } func expandPrivatecaCertificateConfigX509ConfigAdditionalExtensionsObjectId(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) interface{} { if v == nil { return v } l := v.([]interface{}) if len(l) == 0 || l[0] == nil { return nil } // Expects a single object ID. raw := l[0] original := raw.(map[string]interface{}) if len(original) == 0 { // Ignore empty ObjectId return nil } transformed := make(map[string]interface{}) transformed["objectIdPath"] = original["object_id_path"] return transformed } func expandPrivatecaCertificateConfigX509ConfigAiaOcspServers(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { // List of strings, no processing necessary. return v, nil } func expandPrivatecaCertificateConfigX509ConfigNameConstraints(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { if v == nil { return nil, nil } l := v.([]interface{}) if len(l) == 0 || l[0] == nil { return nil, nil } raw := l[0] original := raw.(map[string]interface{}) if len(original) == 0 { // Ignore empty name constraints return nil, nil } transformed := make(map[string]interface{}) transformed["critical"] = original["critical"] transformed["permittedDnsNames"] = original["permitted_dns_names"] transformed["excludedDnsNames"] = original["excluded_dns_names"] transformed["permittedIpRanges"] = original["permitted_ip_ranges"] transformed["excludedIpRanges"] = original["excluded_ip_ranges"] transformed["permittedEmailAddresses"] = original["permitted_email_addresses"] transformed["excludedEmailAddresses"] = original["excluded_email_addresses"] transformed["permittedUris"] = original["permitted_uris"] transformed["excludedUris"] = original["excluded_uris"] return transformed, nil } // Flattener utilities func flattenPrivatecaCertificateConfigX509ConfigAdditionalExtensions(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { return v } l := v.([]interface{}) transformed := make([]interface{}, 0, len(l)) for _, raw := range l { original := raw.(map[string]interface{}) if len(original) < 1 { // Do not include empty json objects coming back from the api continue } transformed = append(transformed, map[string]interface{}{ "critical": flattenPrivatecaCertificateConfigX509ConfigAdditionalExtensionsCritical(original["critical"], d, config), "value": flattenPrivatecaCertificateConfigX509ConfigAdditionalExtensionsValue(original["value"], d, config), "object_id": flattenPrivatecaCertificateConfigX509ConfigAdditionalExtensionsObjectId(original["objectId"], d, config), }) } return transformed } func flattenPrivatecaCertificateConfigX509ConfigAdditionalExtensionsCritical(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigAdditionalExtensionsValue(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigAdditionalExtensionsObjectId(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { return nil } original := v.(map[string]interface{}) if len(original) == 0 { return nil } transformed := make(map[string]interface{}) transformed["object_id_path"] = flattenPrivatecaCertificateConfigX509ConfigAdditionalExtensionsObjectIdObjectIdPath(original["objectIdPath"], d, config) return []interface{}{transformed} } func flattenPrivatecaCertificateConfigX509ConfigAdditionalExtensionsObjectIdObjectIdPath(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigPolicyIds(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { return v } l := v.([]interface{}) transformed := make([]interface{}, 0, len(l)) for _, raw := range l { original := raw.(map[string]interface{}) if len(original) < 1 { // Do not include empty json objects coming back from the api continue } transformed = append(transformed, map[string]interface{}{ "object_id_path": flattenPrivatecaCertificateConfigX509ConfigPolicyIdsObjectIdPath(original["objectIdPath"], d, config), }) } return transformed } func flattenPrivatecaCertificateConfigX509ConfigPolicyIdsObjectIdPath(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigAiaOcspServers(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigCaOptions(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { // Special case here as the CaPool API returns an empty object rather than nil unlike the Certificate // and CertificateAuthority APIs. if v == nil || len(v.(map[string]interface{})) == 0 { v = make(map[string]interface{}) } original := v.(map[string]interface{}) transformed := make(map[string]interface{}) val, exists := original["isCa"] transformed["is_ca"] = flattenPrivatecaCertificateConfigX509ConfigCaOptionsIsCa(val, d, config) if exists && !val.(bool) { transformed["non_ca"] = true } val, exists = original["maxIssuerPathLength"] transformed["max_issuer_path_length"] = flattenPrivatecaCertificateConfigX509ConfigCaOptionsMaxIssuerPathLength(val, d, config) if exists && int(val.(float64)) == 0 { transformed["zero_max_issuer_path_length"] = true } return []interface{}{transformed} } func flattenPrivatecaCertificateConfigX509ConfigCaOptionsIsCa(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigCaOptionsMaxIssuerPathLength(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { // Handles the string fixed64 format if strVal, ok := v.(string); ok { if intVal, err := tpgresource.StringToFixed64(strVal); err == nil { return intVal } } // number values are represented as float64 if floatVal, ok := v.(float64); ok { intVal := int(floatVal) return intVal } return v // let terraform core handle it otherwise } func flattenPrivatecaCertificateConfigX509ConfigKeyUsage(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { v = make(map[string]interface{}) } original := v.(map[string]interface{}) transformed := make(map[string]interface{}) transformed["base_key_usage"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsage(original["baseKeyUsage"], d, config) transformed["extended_key_usage"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsage(original["extendedKeyUsage"], d, config) transformed["unknown_extended_key_usages"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageUnknownExtendedKeyUsages(original["unknownExtendedKeyUsages"], d, config) return []interface{}{transformed} } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsage(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { v = make(map[string]interface{}) } original := v.(map[string]interface{}) transformed := make(map[string]interface{}) transformed["digital_signature"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageDigitalSignature(original["digitalSignature"], d, config) transformed["content_commitment"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageContentCommitment(original["contentCommitment"], d, config) transformed["key_encipherment"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageKeyEncipherment(original["keyEncipherment"], d, config) transformed["data_encipherment"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageDataEncipherment(original["dataEncipherment"], d, config) transformed["key_agreement"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageKeyAgreement(original["keyAgreement"], d, config) transformed["cert_sign"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageCertSign(original["certSign"], d, config) transformed["crl_sign"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageCrlSign(original["crlSign"], d, config) transformed["encipher_only"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageEncipherOnly(original["encipherOnly"], d, config) transformed["decipher_only"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageDecipherOnly(original["decipherOnly"], d, config) return []interface{}{transformed} } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageDigitalSignature(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageContentCommitment(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageKeyEncipherment(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageDataEncipherment(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageKeyAgreement(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageCertSign(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageCrlSign(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageEncipherOnly(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageBaseKeyUsageDecipherOnly(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsage(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { v = make(map[string]interface{}) } original := v.(map[string]interface{}) transformed := make(map[string]interface{}) transformed["server_auth"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageServerAuth(original["serverAuth"], d, config) transformed["client_auth"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageClientAuth(original["clientAuth"], d, config) transformed["code_signing"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageCodeSigning(original["codeSigning"], d, config) transformed["email_protection"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageEmailProtection(original["emailProtection"], d, config) transformed["time_stamping"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageTimeStamping(original["timeStamping"], d, config) transformed["ocsp_signing"] = flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageOcspSigning(original["ocspSigning"], d, config) return []interface{}{transformed} } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageServerAuth(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageClientAuth(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageCodeSigning(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageEmailProtection(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageTimeStamping(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageExtendedKeyUsageOcspSigning(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageUnknownExtendedKeyUsages(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { return v } l := v.([]interface{}) transformed := make([]interface{}, 0, len(l)) for _, raw := range l { original := raw.(map[string]interface{}) if len(original) < 1 { // Do not include empty json objects coming back from the api continue } transformed = append(transformed, map[string]interface{}{ "object_id_path": flattenPrivatecaCertificateConfigX509ConfigKeyUsageUnknownExtendedKeyUsagesObjectIdPath(original["objectIdPath"], d, config), }) } return transformed } func flattenPrivatecaCertificateConfigX509ConfigKeyUsageUnknownExtendedKeyUsagesObjectIdPath(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } func flattenPrivatecaCertificateConfigX509ConfigNameConstraints(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { return nil } original := v.(map[string]interface{}) transformed := make(map[string]interface{}) transformed["critical"] = original["critical"] transformed["permitted_dns_names"] = original["permittedDnsNames"] transformed["excluded_dns_names"] = original["excludedDnsNames"] transformed["permitted_ip_ranges"] = original["permittedIpRanges"] transformed["excluded_ip_ranges"] = original["excludedIpRanges"] transformed["permitted_email_addresses"] = original["permittedEmailAddresses"] transformed["excluded_email_addresses"] = original["excludedEmailAddresses"] transformed["permitted_uris"] = original["permittedUris"] transformed["excluded_uris"] = original["excludedUris"] return []interface{}{transformed} }