Skip to content

Commit 846080a

Browse files
Merge pull request GoogleCloudPlatform#2808 from jasonvigil/fix-sqlinstance-labels
Fix sqlinstance user labels to filter out KRM-style labels
2 parents c215416 + ec0e1af commit 846080a

16 files changed

+95
-120
lines changed

pkg/cli/krmtohcl/krmtohcl.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func UnstructuredToHCL(ctx context.Context, u *unstructured.Unstructured, smLoad
4040
if err != nil {
4141
return "", fmt.Errorf("could not parse resource %s: %w", u.GetName(), err)
4242
}
43-
config, _, err := krmtotf.KRMResourceToTFResourceConfigFull(krmResource, k8s.NewErroringClient(), smLoader, nil, nil, true, map[string]string{})
43+
config, _, err := krmtotf.KRMResourceToTFResourceConfigFull(krmResource, k8s.NewErroringClient(), smLoader, nil, nil, true)
4444
if err != nil {
4545
return "", fmt.Errorf("error expanding resource configuration: %w", err)
4646
}

pkg/cli/krmtohcl/testdata/computeinstance.golden.tf

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ resource "google_compute_instance" "computetargetpool_dep4" {
3232
labels = {
3333
cnrm-lease-expiration = "1603985453"
3434
cnrm-lease-holder-id = "btpp498colih6qs1pe5g"
35+
managed-by-cnrm = "true"
3536
}
3637

3738
machine_type = "n1-standard-1"

pkg/cli/krmtohcl/testdata/containercluster.golden.tf

+4
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ resource "google_container_cluster" "twenty_namespaces" {
8787
channel = "UNSPECIFIED"
8888
}
8989

90+
resource_labels = {
91+
managed-by-cnrm = "true"
92+
}
93+
9094
subnetwork = "projects/my-project/regions/us-central1/subnetworks/default"
9195

9296
workload_identity_config {

pkg/cli/krmtohcl/testdata/pubsubsubscription.golden.tf

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ resource "google_pubsub_subscription" "pubsubsubscription_sample" {
2525
cnrm-lease-expiration = "1603984859"
2626
cnrm-lease-holder-id = "btpp498colih6qs1pe5g"
2727
label-one = "value-one"
28+
managed-by-cnrm = "true"
2829
}
2930

3031
message_retention_duration = "86400s"

pkg/cli/krmtohcl/testdata/storagebucket.golden.tf

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@
1515
*/
1616

1717
resource "google_storage_bucket" "cc_cli" {
18-
force_destroy = false
18+
force_destroy = false
19+
20+
labels = {
21+
managed-by-cnrm = "true"
22+
}
23+
1924
location = "US"
2025
name = "cc-cli"
2126
project = "my-project"

pkg/cli/stream/testdata/expected-hcl-stream.golden.yaml

+59-10
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,23 @@
1515
resource "google_bigquery_dataset" "bigquerydatasetsamplec99k2khjhfu8dfrt53mr" {
1616
dataset_id = "bigquerydatasetsamplec99k2khjhfu8dfrt53mr"
1717
delete_contents_on_destroy = false
18-
project = "cli-test-project"
18+
19+
labels = {
20+
managed-by-cnrm = "true"
21+
}
22+
23+
project = "cli-test-project"
1924
}
2025
# terraform import google_bigquery_dataset.bigquerydatasetsamplec99k2khjhfu8dfrt53mr projects/cli-test-project/datasets/bigquerydatasetsamplec99k2khjhfu8dfrt53mr
2126
resource "google_bigquery_dataset" "bigquerydatasetivs17e1s13s9ro2k9n1j" {
2227
dataset_id = "bigquerydatasetivs17e1s13s9ro2k9n1j"
2328
delete_contents_on_destroy = false
24-
project = "cli-test-project"
29+
30+
labels = {
31+
managed-by-cnrm = "true"
32+
}
33+
34+
project = "cli-test-project"
2535
}
2636
# terraform import google_bigquery_dataset.bigquerydatasetivs17e1s13s9ro2k9n1j projects/cli-test-project/datasets/bigquerydatasetivs17e1s13s9ro2k9n1j
2737
resource "google_kms_key_ring" "key_ring_4dln90vis0b1c6f1jja9" {
@@ -31,18 +41,31 @@ resource "google_kms_key_ring" "key_ring_4dln90vis0b1c6f1jja9" {
3141
}
3242
# terraform import google_kms_key_ring.key_ring_4dln90vis0b1c6f1jja9 projects/cli-test-project/locations/us-central1/keyRings/key-ring-4dln90vis0b1c6f1jja9
3343
resource "google_compute_address" "computeaddress_1j26msq4eebfv63n6sil" {
44+
labels = {
45+
managed-by-cnrm = "true"
46+
}
47+
3448
name = "computeaddress-1j26msq4eebfv63n6sil"
3549
project = "cli-test-project"
3650
region = "us-central1"
3751
}
3852
# terraform import google_compute_address.computeaddress_1j26msq4eebfv63n6sil projects/cli-test-project/regions/us-central1/addresses/computeaddress-1j26msq4eebfv63n6sil
3953
resource "google_sql_database_instance" "sqluser_dep_7olc12tp9tdancsggr6s" {
40-
name = "sqluser-dep-7olc12tp9tdancsggr6s"
41-
project = "cli-test-project"
42-
settings = {}
54+
name = "sqluser-dep-7olc12tp9tdancsggr6s"
55+
project = "cli-test-project"
56+
57+
settings {
58+
user_labels = {
59+
managed-by-cnrm = "true"
60+
}
61+
}
4362
}
4463
# terraform import google_sql_database_instance.sqluser_dep_7olc12tp9tdancsggr6s projects/cli-test-project/instances/sqluser-dep-7olc12tp9tdancsggr6s
4564
resource "google_compute_address" "computeaddress_asdbgmb8o9mo6s075qp3" {
65+
labels = {
66+
managed-by-cnrm = "true"
67+
}
68+
4669
name = "computeaddress-asdbgmb8o9mo6s075qp3"
4770
project = "cli-test-project"
4871
region = "us-central1"
@@ -54,30 +77,51 @@ resource "google_compute_backend_service" "computebackendservice_8034p172pirpg3b
5477
}
5578
# terraform import google_compute_backend_service.computebackendservice_8034p172pirpg3bg31te projects/cli-test-project/global/backendServices/computebackendservice-8034p172pirpg3bg31te
5679
resource "google_sql_database_instance" "sqlinstance_sample_iocjd2jpebp9brf46rob" {
57-
name = "sqlinstance-sample-iocjd2jpebp9brf46rob"
58-
project = "cli-test-project"
59-
settings = {}
80+
name = "sqlinstance-sample-iocjd2jpebp9brf46rob"
81+
project = "cli-test-project"
82+
83+
settings {
84+
user_labels = {
85+
managed-by-cnrm = "true"
86+
}
87+
}
6088
}
6189
# terraform import google_sql_database_instance.sqlinstance_sample_iocjd2jpebp9brf46rob projects/cli-test-project/instances/sqlinstance-sample-iocjd2jpebp9brf46rob
6290
resource "google_compute_disk" "computedisk_39kl1g908j6npdp7pa9f" {
91+
labels = {
92+
managed-by-cnrm = "true"
93+
}
94+
6395
name = "computedisk-39kl1g908j6npdp7pa9f"
6496
project = "cli-test-project"
6597
zone = "us-central1-a"
6698
}
6799
# terraform import google_compute_disk.computedisk_39kl1g908j6npdp7pa9f projects/cli-test-project/zones/us-central1-a/disks/computedisk-39kl1g908j6npdp7pa9f
68100
resource "google_compute_disk" "computedisk_hiiupq1q4ujch81bj4g9" {
101+
labels = {
102+
managed-by-cnrm = "true"
103+
}
104+
69105
name = "computedisk-hiiupq1q4ujch81bj4g9"
70106
project = "cli-test-project"
71107
zone = "us-central1-a"
72108
}
73109
# terraform import google_compute_disk.computedisk_hiiupq1q4ujch81bj4g9 projects/cli-test-project/zones/us-central1-a/disks/computedisk-hiiupq1q4ujch81bj4g9
74110
resource "google_compute_forwarding_rule" "computeforwardingrule1_1j26msq4eebfv63n6sil" {
111+
labels = {
112+
managed-by-cnrm = "true"
113+
}
114+
75115
name = "computeforwardingrule1-1j26msq4eebfv63n6sil"
76116
project = "cli-test-project"
77117
region = "us-central1"
78118
}
79119
# terraform import google_compute_forwarding_rule.computeforwardingrule1_1j26msq4eebfv63n6sil projects/cli-test-project/regions/us-central1/forwardingRules/computeforwardingrule1-1j26msq4eebfv63n6sil
80120
resource "google_compute_global_forwarding_rule" "computeglobalforwardingrule_8034p172pirpg3bg31te" {
121+
labels = {
122+
managed-by-cnrm = "true"
123+
}
124+
81125
name = "computeglobalforwardingrule-8034p172pirpg3bg31te"
82126
project = "cli-test-project"
83127
}
@@ -118,7 +162,12 @@ resource "google_compute_subnetwork" "default" {
118162
# terraform import google_compute_subnetwork.default projects/cli-test-project/regions/northamerica-northeast1/subnetworks/default
119163
resource "google_storage_bucket" "storagebucket_sample_696uso65hngc4js48ic9" {
120164
force_destroy = false
121-
name = "storagebucket-sample-696uso65hngc4js48ic9"
122-
project = "project-id-1"
165+
166+
labels = {
167+
managed-by-cnrm = "true"
168+
}
169+
170+
name = "storagebucket-sample-696uso65hngc4js48ic9"
171+
project = "project-id-1"
123172
}
124173
# terraform import google_storage_bucket.storagebucket_sample_696uso65hngc4js48ic9 storagebucket-sample-696uso65hngc4js48ic9

pkg/controller/direct/sql/mapping.go pkg/controller/direct/sql/sqlinstance_mappings.go

+1-7
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,7 @@ func SQLInstanceKRMToGCP(in *krm.SQLInstance, refs *SQLInstanceInternalRefs) (*a
105105
out.Settings.SqlServerAuditConfig = InstanceSqlServerAuditConfigKRMToGCP(in.Spec.Settings.SqlServerAuditConfig, refs)
106106
out.Settings.Tier = in.Spec.Settings.Tier
107107
out.Settings.TimeZone = direct.ValueOf(in.Spec.Settings.TimeZone)
108-
109-
if in.Labels != nil {
110-
out.Settings.UserLabels = make(map[string]string)
111-
for k, v := range in.Labels {
112-
out.Settings.UserLabels[k] = v
113-
}
114-
}
108+
out.Settings.UserLabels = in.Labels
115109

116110
// TODO: Move to InstanceSettingsKRMToGCP
117111
if in.Spec.Settings.DeletionProtectionEnabled != nil {

pkg/controller/direct/sql/normalize.go pkg/controller/direct/sql/sqlinstance_normalize.go

+4-11
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
storagev1beta1 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/clients/generated/apis/storage/v1beta1"
2525
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/controller/direct"
2626
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/k8s"
27+
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/label"
2728
corev1 "k8s.io/api/core/v1"
2829
apierrors "k8s.io/apimachinery/pkg/api/errors"
2930
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@@ -70,9 +71,9 @@ func NormalizeSQLInstance(ctx context.Context, kube client.Reader, obj *krm.SQLI
7071
if err != nil {
7172
return nil, err
7273
}
73-
if err := normalizeLabels(obj); err != nil {
74-
return nil, err
75-
}
74+
// Normalize labels.
75+
obj.Labels = label.NewGCPLabelsFromK8sLabels(obj.Labels)
76+
// Apply defaults.
7677
if err := normalizeTFDefaults(obj); err != nil {
7778
return nil, err
7879
}
@@ -338,14 +339,6 @@ func normalizeSourceSQLInstanceRef(ctx context.Context, kube client.Reader, obj
338339
}
339340
}
340341

341-
func normalizeLabels(obj *krm.SQLInstance) error {
342-
if obj.Labels == nil {
343-
obj.Labels = make(map[string]string)
344-
}
345-
obj.Labels["managed-by-cnrm"] = "true"
346-
return nil
347-
}
348-
349342
func normalizeTFDefaults(obj *krm.SQLInstance) error {
350343
if obj.Spec.Settings.ActivationPolicy == nil {
351344
obj.Spec.Settings.ActivationPolicy = direct.PtrTo("ALWAYS")

pkg/controller/tf/controller.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/execution"
3535
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/k8s"
3636
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/krmtotf"
37-
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/label"
3837
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/lease/leaser"
3938
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/resourceoverrides"
4039
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/resourceoverrides/operations"
@@ -336,7 +335,7 @@ func (r *Reconciler) sync(ctx context.Context, krmResource *krmtotf.Resource) (r
336335
fmt.Errorf("underlying resource no longer exists and can't be recreated without creating a brand new resource"))
337336
}
338337
config, secretVersions, err := krmtotf.KRMResourceToTFResourceConfigFull(
339-
krmResource, r, r.smLoader, liveState, r.schemaRef.JSONSchema, true, label.GetDefaultLabels(),
338+
krmResource, r, r.smLoader, liveState, r.schemaRef.JSONSchema, true,
340339
)
341340
if err != nil {
342341
if unwrappedErr, ok := lifecyclehandler.CausedByUnresolvableDeps(err); ok {

pkg/dcl/conversion/converter.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,7 @@ func convertToDCLLabelsField(obj *unstructured.Unstructured, r *dclunstruct.Reso
793793
if _, ok := schema.Properties[labelsField]; !ok {
794794
return nil
795795
}
796-
labels := label.NewGCPLabelsFromK8SLabels(obj.GetLabels(), label.GetDefaultLabels())
796+
labels := label.ToJSONCompatibleFormat(label.NewGCPLabelsFromK8sLabels(obj.GetLabels()))
797797
if len(labels) != 0 {
798798
r.Object[labelsField] = labels
799799
}

pkg/krmtotf/fetchlivestate.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
corekccv1alpha1 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/apis/core/v1alpha1"
2424
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/deepcopy"
2525
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/k8s"
26-
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/label"
2726
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/servicemapping/servicemappingloader"
2827
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/text"
2928
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/util"
@@ -204,7 +203,7 @@ func WithFieldsPresetForRead(imported map[string]interface{}, r *Resource, kubeC
204203
importedAsInstanceState := MapToInstanceState(r.TFResource, imported)
205204
var jsonSchema *apiextensions.JSONSchemaProps
206205
config, secretVersions, err = KRMResourceToTFResourceConfigFull(
207-
r, kubeClient, smLoader, importedAsInstanceState, jsonSchema, mustResolveSensitiveFields, label.GetDefaultLabels(),
206+
r, kubeClient, smLoader, importedAsInstanceState, jsonSchema, mustResolveSensitiveFields,
208207
)
209208
if err != nil {
210209
return nil, fmt.Errorf("error converting resource config: %w", err)

pkg/krmtotf/krmtotf.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import (
4444
// validation of either the input KRM or output TF is left as the
4545
// responsibility of other layers (e.g. webhooks, CRD schemas, GCP API, etc.)
4646
func KRMResourceToTFResourceConfig(r *Resource, c client.Client, smLoader *servicemappingloader.ServiceMappingLoader) (tfConfig *terraform.ResourceConfig, secretVersions map[string]string, err error) {
47-
return KRMResourceToTFResourceConfigFull(r, c, smLoader, nil, nil, true, label.GetDefaultLabels())
47+
return KRMResourceToTFResourceConfigFull(r, c, smLoader, nil, nil, true)
4848
}
4949

5050
// KRMResourceToTFResourceConfigFull is a more flexible version of KRMResourceToTFResourceConfig,
@@ -55,7 +55,7 @@ func KRMResourceToTFResourceConfig(r *Resource, c client.Client, smLoader *servi
5555
// - mustResolveSensitiveFields: if set, sensitive fields will be resolved.
5656
// - defaultLabels: if set, these labels will be added to tfConfig.
5757
func KRMResourceToTFResourceConfigFull(r *Resource, c client.Client, smLoader *servicemappingloader.ServiceMappingLoader,
58-
liveState *terraform.InstanceState, jsonSchema *apiextensions.JSONSchemaProps, mustResolveSensitiveFields bool, defaultLabels map[string]string) (tfConfig *terraform.ResourceConfig, secretVersions map[string]string, err error) {
58+
liveState *terraform.InstanceState, jsonSchema *apiextensions.JSONSchemaProps, mustResolveSensitiveFields bool) (tfConfig *terraform.ResourceConfig, secretVersions map[string]string, err error) {
5959
config := deepcopy.MapStringInterface(r.Spec)
6060
if config == nil {
6161
config = make(map[string]interface{})
@@ -74,7 +74,7 @@ func KRMResourceToTFResourceConfigFull(r *Resource, c client.Client, smLoader *s
7474
}
7575
if r.ResourceConfig.MetadataMapping.Labels != "" {
7676
path := text.SnakeCaseToLowerCamelCase(r.ResourceConfig.MetadataMapping.Labels)
77-
labels := label.NewGCPLabelsFromK8SLabels(r.GetLabels(), defaultLabels)
77+
labels := label.ToJSONCompatibleFormat(label.NewGCPLabelsFromK8sLabels(r.GetLabels()))
7878
if err := setValue(config, path, labels); err != nil {
7979
return nil, nil, fmt.Errorf("error mapping 'metadata.labels': %w", err)
8080
}

pkg/label/label.go

+8-22
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@ import (
1818
"strings"
1919
)
2020

21-
func NewGcpFromK8sLabels(labels map[string]string) map[string]string {
22-
res := RemoveLabelsWithKRMPrefix(labels)
21+
func NewGCPLabelsFromK8sLabels(labels map[string]string) map[string]string {
22+
res := removeLabelsWithKRMPrefix(labels)
23+
// Apply default label.
2324
res[CnrmManagedKey] = "true"
2425
return res
2526
}
2627

27-
func RemoveLabelsWithKRMPrefix(labels map[string]string) map[string]string {
28+
func removeLabelsWithKRMPrefix(labels map[string]string) map[string]string {
2829
res := make(map[string]string)
2930
for k, v := range labels {
3031
if len(strings.Split(k, "/")) == 2 {
@@ -38,26 +39,11 @@ func RemoveLabelsWithKRMPrefix(labels map[string]string) map[string]string {
3839
return res
3940
}
4041

41-
func NewGCPLabelsFromK8SLabels(labelMaps ...map[string]string) map[string]interface{} {
42+
// Reformat labels map into a JSON-compatible map[string]interface{} type.
43+
func ToJSONCompatibleFormat(labels map[string]string) map[string]interface{} {
4244
res := make(map[string]interface{})
43-
for _, labels := range labelMaps {
44-
if labels != nil {
45-
for k, v := range labels {
46-
if len(strings.Split(k, "/")) == 2 {
47-
// Do not include any KRM-style labels (labels that include a prefix
48-
// denoted with a '/').
49-
// TODO(b/137755194): Determine long-term solution.
50-
continue
51-
}
52-
res[k] = v
53-
}
54-
}
45+
for k, v := range labels {
46+
res[k] = v
5547
}
5648
return res
5749
}
58-
59-
func GetDefaultLabels() map[string]string {
60-
return map[string]string{
61-
CnrmManagedKey: "true",
62-
}
63-
}

0 commit comments

Comments
 (0)