Skip to content

Commit 6c4a8af

Browse files
laurenz-kzli82016
andauthored
Add support for certificatemanager.googleapis.com/Certificate to TGC cai2hcl (#15203)
Co-authored-by: Zhenhua Li <[email protected]>
1 parent 7cf5fd5 commit 6c4a8af

File tree

6 files changed

+867
-0
lines changed

6 files changed

+867
-0
lines changed

mmv1/third_party/cai2hcl/convert_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,12 @@ func TestConvertNetworksecurity(t *testing.T) {
3232
"backend_authentication_config",
3333
})
3434
}
35+
36+
func TestConvertCertificateManager(t *testing.T) {
37+
cai2hclTesting.AssertTestFiles(
38+
t,
39+
"./services/certificatemanager/testdata",
40+
[]string{
41+
"certificate",
42+
})
43+
}

mmv1/third_party/cai2hcl/converter_map.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cai2hcl
22

33
import (
44
"github.com/GoogleCloudPlatform/terraform-google-conversion/v7/cai2hcl/common"
5+
"github.com/GoogleCloudPlatform/terraform-google-conversion/v7/cai2hcl/services/certificatemanager"
56
"github.com/GoogleCloudPlatform/terraform-google-conversion/v7/cai2hcl/services/compute"
67
"github.com/GoogleCloudPlatform/terraform-google-conversion/v7/cai2hcl/services/networksecurity"
78
"github.com/GoogleCloudPlatform/terraform-google-conversion/v7/cai2hcl/services/resourcemanager"
@@ -26,6 +27,8 @@ var AssetTypeToConverter = map[string]string{
2627

2728
networksecurity.ServerTLSPolicyAssetType: "google_network_security_server_tls_policy",
2829
networksecurity.BackendAuthenticationConfigAssetType: "google_network_security_backend_authentication_config",
30+
31+
certificatemanager.CertificateAssetType: "google_certificate_manager_certificate",
2932
}
3033

3134
// ConverterMap is a collection of converters instances, indexed by name.
@@ -42,4 +45,6 @@ var ConverterMap = map[string]common.Converter{
4245

4346
"google_network_security_server_tls_policy": networksecurity.NewServerTLSPolicyConverter(provider),
4447
"google_network_security_backend_authentication_config": networksecurity.NewBackendAuthenticationConfigConverter(provider),
48+
49+
"google_certificate_manager_certificate": certificatemanager.NewCertificateConverter(provider),
4550
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package certificatemanager
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"github.com/GoogleCloudPlatform/terraform-google-conversion/v7/cai2hcl/common"
7+
"github.com/GoogleCloudPlatform/terraform-google-conversion/v7/caiasset"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
certificatemanagerapi "google.golang.org/api/certificatemanager/v1"
10+
"strings"
11+
)
12+
13+
// CertificateAssetType is the CAI asset type name.
14+
const CertificateAssetType string = "certificatemanager.googleapis.com/Certificate"
15+
16+
// CertificateSchemaName is the TF resource schema name.
17+
const CertificateSchemaName string = "google_certificate_manager_certificate"
18+
19+
// CertificateConverter for certificatemanager Certificate resource
20+
type CertificateConverter struct {
21+
name string
22+
schema map[string]*schema.Schema
23+
}
24+
25+
// NewCertificateConverter returns an HCL converter
26+
func NewCertificateConverter(provider *schema.Provider) common.Converter {
27+
schema := provider.ResourcesMap[CertificateSchemaName].Schema
28+
29+
return &CertificateConverter{
30+
name: CertificateSchemaName,
31+
schema: schema,
32+
}
33+
}
34+
35+
// Convert converts CAI assets to HCL resource blocks (Provider version: 6.47.0)
36+
func (c *CertificateConverter) Convert(assets []*caiasset.Asset) ([]*common.HCLResourceBlock, error) {
37+
var blocks []*common.HCLResourceBlock
38+
var err error
39+
40+
for _, asset := range assets {
41+
if asset == nil {
42+
continue
43+
} else if asset.Resource == nil || asset.Resource.Data == nil {
44+
return nil, fmt.Errorf("INVALID_ARGUMENT: Asset resource data is nil")
45+
} else if asset.Type != CertificateAssetType {
46+
return nil, fmt.Errorf("INVALID_ARGUMENT: Expected asset of type %s, but received %s", CertificateAssetType, asset.Type)
47+
}
48+
block, errConvert := c.convertResourceData(asset)
49+
blocks = append(blocks, block)
50+
if errConvert != nil {
51+
err = errors.Join(err, errConvert)
52+
}
53+
}
54+
return blocks, err
55+
}
56+
57+
func (c *CertificateConverter) convertResourceData(asset *caiasset.Asset) (*common.HCLResourceBlock, error) {
58+
if asset == nil || asset.Resource == nil || asset.Resource.Data == nil {
59+
return nil, fmt.Errorf("INVALID_ARGUMENT: Asset resource data is nil")
60+
}
61+
62+
hcl, _ := flattenCertificate(asset.Resource)
63+
64+
ctyVal, err := common.MapToCtyValWithSchema(hcl, c.schema)
65+
if err != nil {
66+
return nil, err
67+
}
68+
69+
resourceName := hcl["name"].(string)
70+
71+
return &common.HCLResourceBlock{
72+
Labels: []string{c.name, resourceName},
73+
Value: ctyVal,
74+
}, nil
75+
}
76+
77+
func flattenCertificate(resource *caiasset.AssetResource) (map[string]any, error) {
78+
result := make(map[string]any)
79+
80+
var certificate *certificatemanagerapi.Certificate
81+
if err := common.DecodeJSON(resource.Data, &certificate); err != nil {
82+
return nil, err
83+
}
84+
85+
result["name"] = flattenName(certificate.Name)
86+
result["description"] = certificate.Description
87+
result["labels"] = certificate.Labels
88+
result["scope"] = certificate.Scope
89+
result["self_managed"] = flattenSelfManaged(certificate.SelfManaged, certificate.PemCertificate)
90+
result["managed"] = flattenManaged(certificate.Managed)
91+
result["project"] = flattenProjectName(certificate.Name)
92+
93+
result["location"] = resource.Location
94+
95+
return result, nil
96+
}
97+
98+
func flattenName(name string) string {
99+
tokens := strings.Split(name, "/")
100+
return tokens[len(tokens)-1]
101+
}
102+
103+
func flattenSelfManaged(selfManaged *certificatemanagerapi.SelfManagedCertificate, pemCertificate string) []map[string]any {
104+
if selfManaged == nil {
105+
return nil
106+
}
107+
108+
result := make(map[string]any)
109+
result["pem_certificate"] = pemCertificate
110+
result["pem_private_key"] = "<private_key>"
111+
112+
return []map[string]any{result}
113+
}
114+
115+
func flattenManaged(managed *certificatemanagerapi.ManagedCertificate) []map[string]any {
116+
if managed == nil {
117+
return nil
118+
}
119+
120+
result := make(map[string]any)
121+
result["domains"] = managed.Domains
122+
result["dns_authorizations"] = managed.DnsAuthorizations
123+
result["issuance_config"] = managed.IssuanceConfig
124+
125+
return []map[string]any{result}
126+
}
127+
128+
func flattenProjectName(name string) string {
129+
tokens := strings.Split(name, "/")
130+
if len(tokens) < 2 || tokens[0] != "projects" {
131+
return ""
132+
}
133+
return tokens[1]
134+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package certificatemanager_test
2+
3+
import (
4+
cai2hcl_testing "github.com/GoogleCloudPlatform/terraform-google-conversion/v7/cai2hcl/testing"
5+
"testing"
6+
)
7+
8+
func TestCertificate(t *testing.T) {
9+
cai2hcl_testing.AssertTestFiles(
10+
t,
11+
"./testdata",
12+
[]string{"certificate"})
13+
}

0 commit comments

Comments
 (0)