diff --git a/apis/acm/v1alpha1/zz_generated.tagged.go b/apis/acm/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..b74563bc88 --- /dev/null +++ b/apis/acm/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import "sort" + +// AddTag adds a tag to this Certificate. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Certificate) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/acm/v1beta1/zz_generated.tagged.go b/apis/acm/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..69e4484a30 --- /dev/null +++ b/apis/acm/v1beta1/zz_generated.tagged.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +import "sort" + +// AddTag adds a tag to this Certificate. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Certificate) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/acmpca/v1alpha1/zz_generated.tagged.go b/apis/acmpca/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..4cb2a61364 --- /dev/null +++ b/apis/acmpca/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import "sort" + +// AddTag adds a tag to this CertificateAuthority. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *CertificateAuthority) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/acmpca/v1beta1/zz_generated.tagged.go b/apis/acmpca/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..7ed010d8a1 --- /dev/null +++ b/apis/acmpca/v1beta1/zz_generated.tagged.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +import "sort" + +// AddTag adds a tag to this CertificateAuthority. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *CertificateAuthority) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/apigateway/v1alpha1/zz_generated.tagged.go b/apis/apigateway/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..d3bf80031b --- /dev/null +++ b/apis/apigateway/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,111 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this APIKey. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *APIKey) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} + +// AddTag adds a tag to this DomainName. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DomainName) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} + +// AddTag adds a tag to this RestAPI. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *RestAPI) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} + +// AddTag adds a tag to this Stage. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Stage) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} + +// AddTag adds a tag to this UsagePlan. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *UsagePlan) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} + +// AddTag adds a tag to this VPCLink. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *VPCLink) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/apigatewayv2/v1alpha1/zz_generated.tagged.go b/apis/apigatewayv2/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..ff7717899b --- /dev/null +++ b/apis/apigatewayv2/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,81 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this API. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *API) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} + +// AddTag adds a tag to this DomainName. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DomainName) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} + +// AddTag adds a tag to this Stage. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Stage) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} + +// AddTag adds a tag to this VPCLink. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *VPCLink) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/apigatewayv2/v1beta1/zz_generated.tagged.go b/apis/apigatewayv2/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..cc5668448b --- /dev/null +++ b/apis/apigatewayv2/v1beta1/zz_generated.tagged.go @@ -0,0 +1,36 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this VPCLink. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *VPCLink) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/athena/v1alpha1/zz_generated.tagged.go b/apis/athena/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..144731dbd7 --- /dev/null +++ b/apis/athena/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,58 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this WorkGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *WorkGroup) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/cache/v1alpha1/zz_generated.tagged.go b/apis/cache/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..8907eb243e --- /dev/null +++ b/apis/cache/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,54 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this CacheCluster. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *CacheCluster) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/cache/v1beta1/zz_generated.tagged.go b/apis/cache/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..9dce9e937a --- /dev/null +++ b/apis/cache/v1beta1/zz_generated.tagged.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +import "sort" + +// AddTag adds a tag to this ReplicationGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *ReplicationGroup) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/cloudwatchlogs/v1alpha1/zz_generated.tagged.go b/apis/cloudwatchlogs/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..589f82f617 --- /dev/null +++ b/apis/cloudwatchlogs/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,36 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this LogGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *LogGroup) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/database/v1beta1/zz_generated.tagged.go b/apis/database/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..5ba5db21b6 --- /dev/null +++ b/apis/database/v1beta1/zz_generated.tagged.go @@ -0,0 +1,81 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +import "sort" + +// AddTag adds a tag to this DBSubnetGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DBSubnetGroup) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} + +// AddTag adds a tag to this RDSInstance. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *RDSInstance) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/dax/v1alpha1/zz_generated.tagged.go b/apis/dax/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..d0b9d70a28 --- /dev/null +++ b/apis/dax/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,58 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this Cluster. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Cluster) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/docdb/v1alpha1/zz_generated.tagged.go b/apis/docdb/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..c48f01583a --- /dev/null +++ b/apis/docdb/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,160 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this DBCluster. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DBCluster) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this DBClusterParameterGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DBClusterParameterGroup) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this DBInstance. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DBInstance) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this DBSubnetGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DBSubnetGroup) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/dynamodb/v1alpha1/zz_generated.tagged.go b/apis/dynamodb/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..e72a7d0ed5 --- /dev/null +++ b/apis/dynamodb/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,58 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this Table. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Table) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/ec2/manualv1alpha1/zz_generated.tagged.go b/apis/ec2/manualv1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..41d49ec172 --- /dev/null +++ b/apis/ec2/manualv1alpha1/zz_generated.tagged.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package manualv1alpha1 + +import "sort" + +// AddTag adds a tag to this Instance. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Instance) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/ec2/v1beta1/zz_generated.tagged.go b/apis/ec2/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..8f2fa5f9fe --- /dev/null +++ b/apis/ec2/v1beta1/zz_generated.tagged.go @@ -0,0 +1,231 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +import "sort" + +// AddTag adds a tag to this Address. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Address) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} + +// AddTag adds a tag to this InternetGateway. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *InternetGateway) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} + +// AddTag adds a tag to this NATGateway. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *NATGateway) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} + +// AddTag adds a tag to this RouteTable. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *RouteTable) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} + +// AddTag adds a tag to this SecurityGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *SecurityGroup) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} + +// AddTag adds a tag to this Subnet. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Subnet) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} + +// AddTag adds a tag to this VPC. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *VPC) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/ecr/v1alpha1/zz_generated.tagged.go b/apis/ecr/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..757e3253d4 --- /dev/null +++ b/apis/ecr/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import "sort" + +// AddTag adds a tag to this Repository. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Repository) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/ecr/v1beta1/zz_generated.tagged.go b/apis/ecr/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..64b97d95a7 --- /dev/null +++ b/apis/ecr/v1beta1/zz_generated.tagged.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +import "sort" + +// AddTag adds a tag to this Repository. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Repository) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/efs/v1alpha1/zz_generated.tagged.go b/apis/efs/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..5b080b197b --- /dev/null +++ b/apis/efs/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,92 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this AccessPoint. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *AccessPoint) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this FileSystem. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *FileSystem) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/eks/manualv1alpha1/zz_generated.tagged.go b/apis/eks/manualv1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..b7d1e82bfb --- /dev/null +++ b/apis/eks/manualv1alpha1/zz_generated.tagged.go @@ -0,0 +1,64 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package manualv1alpha1 + +// AddTag adds a tag to this FargateProfile. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *FargateProfile) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]string{key: value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || oldValue != value { + mg.Spec.ForProvider.Tags[key] = value + return true + } + return false +} + +// AddTag adds a tag to this IdentityProviderConfig. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *IdentityProviderConfig) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]string{key: value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || oldValue != value { + mg.Spec.ForProvider.Tags[key] = value + return true + } + return false +} + +// AddTag adds a tag to this NodeGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *NodeGroup) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]string{key: value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || oldValue != value { + mg.Spec.ForProvider.Tags[key] = value + return true + } + return false +} diff --git a/apis/eks/v1alpha1/zz_generated.tagged.go b/apis/eks/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..23ee7c197c --- /dev/null +++ b/apis/eks/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,36 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this Addon. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Addon) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/eks/v1beta1/zz_generated.tagged.go b/apis/eks/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..0fde8e6774 --- /dev/null +++ b/apis/eks/v1beta1/zz_generated.tagged.go @@ -0,0 +1,49 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +// AddTag adds a tag to this Cluster. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Cluster) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]string{key: value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || oldValue != value { + mg.Spec.ForProvider.Tags[key] = value + return true + } + return false +} + +// AddTag adds a tag to this FargateProfile. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *FargateProfile) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]string{key: value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || oldValue != value { + mg.Spec.ForProvider.Tags[key] = value + return true + } + return false +} diff --git a/apis/elasticache/v1alpha1/zz_generated.tagged.go b/apis/elasticache/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..e18a053d59 --- /dev/null +++ b/apis/elasticache/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,58 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this CacheParameterGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *CacheParameterGroup) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/elasticloadbalancing/v1alpha1/zz_generated.tagged.go b/apis/elasticloadbalancing/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..ce4dc75602 --- /dev/null +++ b/apis/elasticloadbalancing/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,54 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this ELB. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *ELB) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/elbv2/v1alpha1/zz_generated.tagged.go b/apis/elbv2/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..5faab219c6 --- /dev/null +++ b/apis/elbv2/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,126 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this Listener. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Listener) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this LoadBalancer. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *LoadBalancer) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this TargetGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *TargetGroup) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/generate.go b/apis/generate.go index 630b0340cd..3965b3aa73 100644 --- a/apis/generate.go +++ b/apis/generate.go @@ -17,21 +17,24 @@ See the License for the specific language governing permissions and limitations under the License. */ -// NOTE(negz): See the below link for details on what is happening here. -// https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module +// // NOTE(negz): See the below link for details on what is happening here. +// // https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module -// Remove existing CRDs -//go:generate rm -rf ../package/crds +// // Remove existing CRDs +// //go:generate rm -rf ../package/crds -// Generate deepcopy methodsets and CRD manifests -//go:generate go run -tags generate sigs.k8s.io/controller-tools/cmd/controller-gen object:headerFile=../hack/boilerplate.go.txt paths=./... crd:allowDangerousTypes=true,crdVersions=v1 output:artifacts:config=../package/crds +// // Generate deepcopy methodsets and CRD manifests +// //go:generate go run -tags generate sigs.k8s.io/controller-tools/cmd/controller-gen object:headerFile=../hack/boilerplate.go.txt paths=./... crd:allowDangerousTypes=true,crdVersions=v1 output:artifacts:config=../package/crds -// Generate crossplane-runtime methodsets (resource.Claim, etc) -//go:generate go run -tags generate github.com/crossplane/crossplane-tools/cmd/angryjet generate-methodsets --header-file=../hack/boilerplate.go.txt ./... +// // Generate crossplane-runtime methodsets (resource.Claim, etc) +// //go:generate go run -tags generate github.com/crossplane/crossplane-tools/cmd/angryjet generate-methodsets --header-file=../hack/boilerplate.go.txt ./... -// TODO(muvaf): Remove the last mockgen usage in Addon resource and move to -// current convention with tests. -//go:generate go run github.com/golang/mock/mockgen --build_flags=--mod=mod -package eksiface -copyright_file ../hack/boilerplate.go.txt -destination ../pkg/clients/eks/fake/eksiface/fake.go github.com/aws/aws-sdk-go/service/eks/eksiface EKSAPI +// // Generate tag methods for each managed resource +//go:generate go run -tags generate github.com/crossplane-contrib/provider-aws/cmd/codegen generate-methodsets --header-file=../hack/boilerplate.go.txt ./... + +// // TODO(muvaf): Remove the last mockgen usage in Addon resource and move to +// // current convention with tests. +// //go:generate go run github.com/golang/mock/mockgen --build_flags=--mod=mod -package eksiface -copyright_file ../hack/boilerplate.go.txt -destination ../pkg/clients/eks/fake/eksiface/fake.go github.com/aws/aws-sdk-go/service/eks/eksiface EKSAPI package apis diff --git a/apis/glue/v1alpha1/zz_generated.tagged.go b/apis/glue/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..14354d9b63 --- /dev/null +++ b/apis/glue/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,66 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this Connection. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Connection) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} + +// AddTag adds a tag to this Crawler. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Crawler) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} + +// AddTag adds a tag to this Job. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Job) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/iam/v1alpha1/zz_generated.tagged.go b/apis/iam/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..2f5e29c226 --- /dev/null +++ b/apis/iam/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,58 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this InstanceProfile. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *InstanceProfile) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/iam/v1beta1/zz_generated.tagged.go b/apis/iam/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..a711463723 --- /dev/null +++ b/apis/iam/v1beta1/zz_generated.tagged.go @@ -0,0 +1,141 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +import "sort" + +// AddTag adds a tag to this OpenIDConnectProvider. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *OpenIDConnectProvider) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} + +// AddTag adds a tag to this Policy. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Policy) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} + +// AddTag adds a tag to this Role. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Role) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} + +// AddTag adds a tag to this User. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *User) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/iot/v1alpha1/zz_generated.tagged.go b/apis/iot/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..5189eadde4 --- /dev/null +++ b/apis/iot/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,58 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this Policy. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Policy) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/kafka/v1alpha1/zz_generated.tagged.go b/apis/kafka/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..63d54af3c4 --- /dev/null +++ b/apis/kafka/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,36 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this Cluster. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Cluster) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/kms/v1alpha1/tagged.go b/apis/kms/v1alpha1/tagged.go new file mode 100644 index 0000000000..a212cdee9f --- /dev/null +++ b/apis/kms/v1alpha1/tagged.go @@ -0,0 +1,37 @@ +/* +Copyright 2022 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +// AddTag adds a tag to this Key. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Key) AddTag(key string, value string) bool { + newTag := &Tag{ + TagKey: &key, + TagValue: &value, + } + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && ta.TagKey != nil && *ta.TagKey == key { + if ta.TagValue != nil && *ta.TagValue == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + return true + } + } + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + return true +} diff --git a/apis/lambda/v1alpha1/zz_generated.tagged.go b/apis/lambda/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..7fd7ca40a9 --- /dev/null +++ b/apis/lambda/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,36 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this Function. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Function) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/lambda/v1beta1/zz_generated.tagged.go b/apis/lambda/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..97f6952969 --- /dev/null +++ b/apis/lambda/v1beta1/zz_generated.tagged.go @@ -0,0 +1,36 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this Function. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Function) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/mq/v1alpha1/zz_generated.tagged.go b/apis/mq/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..21d4c9cd70 --- /dev/null +++ b/apis/mq/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,36 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this Broker. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Broker) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/mwaa/v1alpha1/zz_generated.tagged.go b/apis/mwaa/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..dc17ae7830 --- /dev/null +++ b/apis/mwaa/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,36 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this Environment. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Environment) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/neptune/v1alpha1/zz_generated.tagged.go b/apis/neptune/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..cf9a8754f9 --- /dev/null +++ b/apis/neptune/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,58 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this DBCluster. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DBCluster) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/notification/v1alpha1/zz_generated.tagged.go b/apis/notification/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..9071b02c23 --- /dev/null +++ b/apis/notification/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,54 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this SNSTopic. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *SNSTopic) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/prometheusservice/v1alpha1/zz_generated.tagged.go b/apis/prometheusservice/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..42307b86c7 --- /dev/null +++ b/apis/prometheusservice/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,36 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import pointer "k8s.io/utils/pointer" + +// AddTag adds a tag to this Workspace. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Workspace) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]*string{key: &value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || pointer.StringDeref(oldValue, "") != value { + mg.Spec.ForProvider.Tags[key] = &value + return true + } + return false +} diff --git a/apis/ram/v1alpha1/zz_generated.tagged.go b/apis/ram/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..5e1cad2ea7 --- /dev/null +++ b/apis/ram/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,58 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this ResourceShare. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *ResourceShare) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/rds/v1alpha1/zz_generated.tagged.go b/apis/rds/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..8f7269372e --- /dev/null +++ b/apis/rds/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,160 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this DBCluster. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DBCluster) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this DBClusterParameterGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DBClusterParameterGroup) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this DBInstance. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DBInstance) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this DBParameterGroup. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *DBParameterGroup) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/redshift/v1alpha1/zz_generated.tagged.go b/apis/redshift/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..ffb299bbc7 --- /dev/null +++ b/apis/redshift/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import "sort" + +// AddTag adds a tag to this Cluster. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Cluster) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if ta.Value == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/route53resolver/v1alpha1/zz_generated.tagged.go b/apis/route53resolver/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..16cd88a5b8 --- /dev/null +++ b/apis/route53resolver/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,92 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this ResolverEndpoint. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *ResolverEndpoint) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this ResolverRule. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *ResolverRule) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/secretsmanager/v1alpha1/zz_generated.tagged.go b/apis/secretsmanager/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..33ac6c4b95 --- /dev/null +++ b/apis/secretsmanager/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,58 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this Secret. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Secret) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/secretsmanager/v1beta1/zz_generated.tagged.go b/apis/secretsmanager/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..d519283301 --- /dev/null +++ b/apis/secretsmanager/v1beta1/zz_generated.tagged.go @@ -0,0 +1,58 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this Secret. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Secret) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/servicediscovery/v1alpha1/zz_generated.tagged.go b/apis/servicediscovery/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..4b1f1123cc --- /dev/null +++ b/apis/servicediscovery/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,126 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this HTTPNamespace. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *HTTPNamespace) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this PrivateDNSNamespace. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *PrivateDNSNamespace) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this PublicDNSNamespace. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *PublicDNSNamespace) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/sfn/v1alpha1/zz_generated.tagged.go b/apis/sfn/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..adae7437dc --- /dev/null +++ b/apis/sfn/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,92 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this Activity. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Activity) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this StateMachine. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *StateMachine) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/apis/sns/v1beta1/zz_generated.tagged.go b/apis/sns/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..0412e3cd48 --- /dev/null +++ b/apis/sns/v1beta1/zz_generated.tagged.go @@ -0,0 +1,54 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this Topic. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Topic) AddTag(key string, value string) bool { + newTag := Tag{ + Key: key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta.Key == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) + return true +} diff --git a/apis/sqs/v1beta1/zz_generated.tagged.go b/apis/sqs/v1beta1/zz_generated.tagged.go new file mode 100644 index 0000000000..b941694e92 --- /dev/null +++ b/apis/sqs/v1beta1/zz_generated.tagged.go @@ -0,0 +1,34 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1beta1 + +// AddTag adds a tag to this Queue. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Queue) AddTag(key string, value string) bool { + if mg.Spec.ForProvider.Tags == nil { + mg.Spec.ForProvider.Tags = map[string]string{key: value} + return true + } + oldValue, exists := mg.Spec.ForProvider.Tags[key] + if !exists || oldValue != value { + mg.Spec.ForProvider.Tags[key] = value + return true + } + return false +} diff --git a/apis/transfer/v1alpha1/zz_generated.tagged.go b/apis/transfer/v1alpha1/zz_generated.tagged.go new file mode 100644 index 0000000000..69543a4616 --- /dev/null +++ b/apis/transfer/v1alpha1/zz_generated.tagged.go @@ -0,0 +1,92 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by provider-aws codegen. DO NOT EDIT. + +package v1alpha1 + +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + +// AddTag adds a tag to this Server. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *Server) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} + +// AddTag adds a tag to this User. If it already exists, it will be overwritten. +// It returns true if the tag has been added/changed. Otherwise false. +func (mg *User) AddTag(key string, value string) bool { + newTag := &Tag{ + Key: &key, + Value: &value, + } + updated := false + for i, ta := range mg.Spec.ForProvider.Tags { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { + return false + } + mg.Spec.ForProvider.Tags[i] = newTag + updated = true + break + } + } + if !updated { + mg.Spec.ForProvider.Tags = append(mg.Spec.ForProvider.Tags, newTag) + } + sort.Slice(mg.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := mg.Spec.ForProvider.Tags[i] + tb := mg.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) + return true +} diff --git a/go.mod b/go.mod index d8ca56ca3a..1e1be90913 100644 --- a/go.mod +++ b/go.mod @@ -42,6 +42,7 @@ require ( k8s.io/api v0.23.0 k8s.io/apimachinery v0.23.0 k8s.io/client-go v0.23.0 + k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b sigs.k8s.io/controller-runtime v0.11.0 sigs.k8s.io/controller-tools v0.8.0 sigs.k8s.io/yaml v1.3.0 @@ -143,7 +144,6 @@ require ( k8s.io/component-base v0.23.0 // indirect k8s.io/klog/v2 v2.30.0 // indirect k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect - k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b // indirect sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.0 // indirect ) diff --git a/pkg/codegen/method/method.go b/pkg/codegen/method/method.go index a55c7ff1cc..34628868ac 100644 --- a/pkg/codegen/method/method.go +++ b/pkg/codegen/method/method.go @@ -85,6 +85,13 @@ const ( localFieldOldValue = "oldValue" localFieldEntryExists = "exists" localFieldTagIterator = "ta" + localFieldUpdated = "updated" + + localFieldIndexA = "i" + localFieldIndexB = "j" + + localFieldTagA = "ta" + localFieldTagB = "tb" ) // NewAddTag creates a new AddTag function generator. @@ -131,17 +138,19 @@ func NewAddTag(receiver string, log logging.Logger) New { // tagging implementation. In this case it is necessary to define the // AddTag method manually. - tagFieldAccessor := jen.Id(receiver).Dot(fields.NameSpec).Dot(fields.NameSpecForProvider).Dot(fields.NameTags) + tagFieldAccessor := func() *jen.Statement { + return jen.Id(receiver).Dot(fields.NameSpec).Dot(fields.NameSpecForProvider).Dot(fields.NameTags) + } if ref := isTagMap(tagObj); ref != nil { funcHeader().Block( - jen.If(jen.Id(receiver).Dot(fields.NameSpec).Dot(fields.NameSpecForProvider).Dot(fields.NameTags).Op("==").Nil()).Block( - jen.Id(receiver).Dot(fields.NameSpec).Dot(fields.NameSpecForProvider).Dot(fields.NameTags).Op("=").Add(ref.newMap), + jen.If(tagFieldAccessor().Op("==").Nil()).Block( + tagFieldAccessor().Op("=").Add(ref.newMap), jen.Return(jen.True()), ), - jen.List(jen.Id(localFieldOldValue), jen.Id(localFieldEntryExists)).Op(":=").Add(tagFieldAccessor).Index(jen.Id(localFieldKey)), - jen.If(jen.Op("!").Id(localFieldEntryExists).Op("||").Add(ref.checkUnequalValue)).Block( - jen.Id(receiver).Dot(fields.NameSpec).Dot(fields.NameSpecForProvider).Dot(fields.NameTags).Index(jen.Id(localFieldKey)).Op("=").Add(ref.assignValue), + jen.List(jen.Id(localFieldOldValue), jen.Id(localFieldEntryExists)).Op(":=").Add(tagFieldAccessor()).Index(jen.Id(localFieldKey)), + jen.If(jen.Op("!").Id(localFieldEntryExists).Op("||").Add(ref.oldValueRef).Op("!=").Id(localFieldNewValue)).Block( + tagFieldAccessor().Index(jen.Id(localFieldKey)).Op("=").Add(ref.assignValue), jen.Return(jen.True()), ), jen.Return(jen.False()), @@ -149,29 +158,43 @@ func NewAddTag(receiver string, log logging.Logger) New { } else if ref := isTagSlice(tagObj); ref != nil { funcHeader().Block( jen.Id(localFieldNewTag).Op(":=").Add(ref.newTag), - jen.For(jen.List(jen.Id("i"), jen.Id(localFieldTagIterator)).Op(":=").Range().Id(receiver).Dot(fields.NameSpec).Dot(fields.NameSpecForProvider).Dot(fields.NameTags)).Block( + jen.Id(localFieldUpdated).Op(":=").False(), + jen.For(jen.List(jen.Id("i"), jen.Id(localFieldTagIterator)).Op(":=").Range().Add(tagFieldAccessor())).Block( jen.If(ref.checkEqualKey).Block( jen.If(ref.checkEqualValue).Block( jen.Return().False(), ), - jen.Id(receiver).Dot(fields.NameSpec).Dot(fields.NameSpecForProvider).Dot(fields.NameTags).Index(jen.Id("i")).Op("=").Id(localFieldNewTag), - jen.Return().True(), + tagFieldAccessor().Index(jen.Id("i")).Op("=").Id(localFieldNewTag), + jen.Id(localFieldUpdated).Op("=").True(), + jen.Break(), ), ), - jen.Id(receiver).Dot(fields.NameSpec).Dot(fields.NameSpecForProvider).Dot(fields.NameTags).Op("=").Id("append").Call( - jen.Id(receiver).Dot(fields.NameSpec).Dot(fields.NameSpecForProvider).Dot(fields.NameTags), - jen.Id(localFieldNewTag), + jen.If(jen.Op("!").Id(localFieldUpdated)).Block( + tagFieldAccessor().Op("=").Id("append").Call( + tagFieldAccessor(), + jen.Id(localFieldNewTag), + ), ), + jen.Qual("sort", "Slice").Call(tagFieldAccessor(), jen.Func().Params(jen.Id(localFieldIndexA).Int(), jen.Id(localFieldIndexB).Int()).Bool().Block( + jen.Id(localFieldTagA).Op(":=").Add(tagFieldAccessor()).Index(jen.Id(localFieldIndexA)), + jen.Id(localFieldTagB).Op(":=").Add(tagFieldAccessor()).Index(jen.Id(localFieldIndexB)), + ref.compareTagStruct(jen.Id(localFieldTagA), jen.Id(localFieldTagB)), + ref.compareTagKeys(jen.Id(localFieldTagA), jen.Id(localFieldTagB)), + )), jen.Return().True(), ) } } } +const ( + packageK8sUtilPointer = "k8s.io/utils/pointer" +) + type tagMapReference struct { - newMap *jen.Statement - checkUnequalValue *jen.Statement - assignValue *jen.Statement + newMap *jen.Statement + oldValueRef *jen.Statement + assignValue *jen.Statement } func isTagMap(t types.Type) *tagMapReference { @@ -185,16 +208,13 @@ func isTagMap(t types.Type) *tagMapReference { } switch { case isString(m.Elem()): - ref.checkUnequalValue = jen.Id(localFieldOldValue).Op("!=").Id(localFieldNewValue) + ref.oldValueRef = jen.Id(localFieldOldValue) ref.assignValue = jen.Id(localFieldNewValue) ref.newMap = jen.Map(jen.String()).String().Values(jen.Dict{ jen.Id(localFieldKey): jen.Id(localFieldNewValue), }) case isStringPtr(m.Elem()): - ref.checkUnequalValue = jen. - Id(localFieldOldValue).Op("==").Nil(). - Op("||"). - Op("*").Id(localFieldOldValue).Op("!=").Id(localFieldNewValue) + ref.oldValueRef = jen.Qual(packageK8sUtilPointer, "StringDeref").Call(jen.Id(localFieldOldValue), jen.Lit("")) ref.assignValue = jen.Op("&").Id(localFieldNewValue) ref.newMap = jen.Map(jen.String()).Op("*").String().Values(jen.Dict{ jen.Id(localFieldKey): jen.Op("&").Id(localFieldNewValue), @@ -206,9 +226,11 @@ func isTagMap(t types.Type) *tagMapReference { } type tagSliceReference struct { - newTag *jen.Statement - checkEqualKey *jen.Statement - checkEqualValue *jen.Statement + newTag *jen.Statement + checkEqualKey *jen.Statement + checkEqualValue *jen.Statement + compareTagStruct func(tagA, tagB *jen.Statement) *jen.Statement + compareTagKeys func(tagA, tagB *jen.Statement) *jen.Statement } func isTagSlice(t types.Type) *tagSliceReference { @@ -217,6 +239,8 @@ func isTagSlice(t types.Type) *tagSliceReference { return nil } + ref := &tagSliceReference{} + var named *types.Named var elem *types.Struct var newTag *jen.Statement @@ -225,9 +249,20 @@ func isTagSlice(t types.Type) *tagSliceReference { if named, elem = isNamedStruct(s.Elem()); elem != nil { newTag = jen.Empty() baseCheck = jen.Empty() + ref.compareTagStruct = func(tagA, tagB *jen.Statement) *jen.Statement { + return jen.Empty() + } } else if named, elem = isNamedStructPtr(s.Elem()); elem != nil { newTag = jen.Op("&") baseCheck = jen.Id(localFieldTagIterator).Op("!=").Nil().Op("&&") + + ref.compareTagStruct = func(tagA, tagB *jen.Statement) *jen.Statement { + return jen.If(tagA.Op("==").Nil()).Block( + jen.Return(jen.True()), + ).Else().If(tagB.Op("==").Nil()).Block( + jen.Return(jen.False()), + ) + } } else { return nil } @@ -235,20 +270,31 @@ func isTagSlice(t types.Type) *tagSliceReference { key := lookupFieldByName(elem, fields.NameTagKey) value := lookupFieldByName(elem, fields.NameTagValue) - ref := &tagSliceReference{} - var keyValue *jen.Statement switch { case isString(key): keyValue = jen.Id(localFieldKey) ref.checkEqualKey = baseCheck. - Id(localFieldTagIterator).Dot(fields.NameTagKey).Op("==").Id(localFieldKey) + Id(localFieldTagIterator).Dot(fields.NameTagKey). + Op("=="). + Id(localFieldKey) + + ref.compareTagKeys = func(tagA, tagB *jen.Statement) *jen.Statement { + return jen.Return(tagA.Dot(fields.NameTagKey).Op("<").Add(tagB).Dot(fields.NameTagKey)) + } case isStringPtr(key): keyValue = jen.Op("&").Id(localFieldKey) ref.checkEqualKey = baseCheck. - Id(localFieldTagIterator).Dot(fields.NameTagKey).Op("!=").Nil(). - Op("&&"). - Op("*").Id(localFieldTagIterator).Dot(fields.NameTagKey).Op("==").Id(localFieldKey) + Qual(packageK8sUtilPointer, "StringDeref").Call(jen.Id(localFieldTagIterator).Dot(fields.NameTagKey), jen.Lit("")). + Op("=="). + Id(localFieldKey) + ref.compareTagKeys = func(tagA, tagB *jen.Statement) *jen.Statement { + return jen.Return(jen. + Qual(packageK8sUtilPointer, "StringDeref").Call(tagA.Clone().Dot(fields.NameTagKey), jen.Lit("")). + Op("<"). + Qual(packageK8sUtilPointer, "StringDeref").Call(tagB.Clone().Dot(fields.NameTagKey), jen.Lit("")), + ) + } default: return nil } @@ -261,9 +307,9 @@ func isTagSlice(t types.Type) *tagSliceReference { case isStringPtr(value): valueValue = jen.Op("&").Id(localFieldNewValue) ref.checkEqualValue = jen. - Id(localFieldTagIterator).Dot(fields.NameTagValue).Op("!=").Nil(). - Op("&&"). - Op("*").Id(localFieldTagIterator).Dot(fields.NameTagValue).Op("==").Id(localFieldNewValue) + Qual(packageK8sUtilPointer, "StringDeref").Call(jen.Id(localFieldTagIterator).Dot(fields.NameTagValue), jen.Lit("")). + Op("=="). + Id(localFieldNewValue) default: return nil } diff --git a/pkg/codegen/method/method_test.go b/pkg/codegen/method/method_test.go index 29e3dc1d85..eb52503e15 100644 --- a/pkg/codegen/method/method_test.go +++ b/pkg/codegen/method/method_test.go @@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -127,6 +127,11 @@ type Model8 struct { generated := `package v1alpha1 +import ( + pointer "k8s.io/utils/pointer" + "sort" +) + // AddTag adds a tag to this Model1. If it already exists, it will be overwritten. // It returns true if the tag has been added/changed. Otherwise false. func (t *Model1) AddTag(key string, value string) bool { @@ -150,7 +155,7 @@ func (t *Model2) AddTag(key string, value string) bool { return true } oldValue, exists := t.Spec.ForProvider.Tags[key] - if !exists || oldValue == nil || *oldValue != value { + if !exists || pointer.StringDeref(oldValue, "") != value { t.Spec.ForProvider.Tags[key] = &value return true } @@ -164,16 +169,26 @@ func (t *Model3) AddTag(key string, value string) bool { Key: key, Value: value, } + updated := false for i, ta := range t.Spec.ForProvider.Tags { if ta.Key == key { if ta.Value == value { return false } t.Spec.ForProvider.Tags[i] = newTag - return true + updated = true + break } } - t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + if !updated { + t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + } + sort.Slice(t.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := t.Spec.ForProvider.Tags[i] + tb := t.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) return true } @@ -184,16 +199,30 @@ func (t *Model4) AddTag(key string, value string) bool { Key: key, Value: value, } + updated := false for i, ta := range t.Spec.ForProvider.Tags { if ta != nil && ta.Key == key { if ta.Value == value { return false } t.Spec.ForProvider.Tags[i] = newTag - return true + updated = true + break } } - t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + if !updated { + t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + } + sort.Slice(t.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := t.Spec.ForProvider.Tags[i] + tb := t.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return ta.Key < tb.Key + }) return true } @@ -204,16 +233,26 @@ func (t *Model5) AddTag(key string, value string) bool { Key: &key, Value: &value, } + updated := false for i, ta := range t.Spec.ForProvider.Tags { - if ta.Key != nil && *ta.Key == key { - if ta.Value != nil && *ta.Value == value { + if pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { return false } t.Spec.ForProvider.Tags[i] = newTag - return true + updated = true + break } } - t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + if !updated { + t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + } + sort.Slice(t.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := t.Spec.ForProvider.Tags[i] + tb := t.Spec.ForProvider.Tags[j] + + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) return true } @@ -224,16 +263,30 @@ func (t *Model6) AddTag(key string, value string) bool { Key: &key, Value: &value, } + updated := false for i, ta := range t.Spec.ForProvider.Tags { - if ta != nil && ta.Key != nil && *ta.Key == key { - if ta.Value != nil && *ta.Value == value { + if ta != nil && pointer.StringDeref(ta.Key, "") == key { + if pointer.StringDeref(ta.Value, "") == value { return false } t.Spec.ForProvider.Tags[i] = newTag - return true + updated = true + break } } - t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + if !updated { + t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + } + sort.Slice(t.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := t.Spec.ForProvider.Tags[i] + tb := t.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return pointer.StringDeref(ta.Key, "") < pointer.StringDeref(tb.Key, "") + }) return true } @@ -244,16 +297,26 @@ func (t *Model7) AddTag(key string, value string) bool { Key: key, Value: &value, } + updated := false for i, ta := range t.Spec.ForProvider.Tags { if ta.Key == key { - if ta.Value != nil && *ta.Value == value { + if pointer.StringDeref(ta.Value, "") == value { return false } t.Spec.ForProvider.Tags[i] = newTag - return true + updated = true + break } } - t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + if !updated { + t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + } + sort.Slice(t.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := t.Spec.ForProvider.Tags[i] + tb := t.Spec.ForProvider.Tags[j] + + return ta.Key < tb.Key + }) return true } @@ -264,16 +327,30 @@ func (t *Model8) AddTag(key string, value string) bool { Key: key, Value: &value, } + updated := false for i, ta := range t.Spec.ForProvider.Tags { if ta != nil && ta.Key == key { - if ta.Value != nil && *ta.Value == value { + if pointer.StringDeref(ta.Value, "") == value { return false } t.Spec.ForProvider.Tags[i] = newTag - return true + updated = true + break } } - t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + if !updated { + t.Spec.ForProvider.Tags = append(t.Spec.ForProvider.Tags, newTag) + } + sort.Slice(t.Spec.ForProvider.Tags, func(i int, j int) bool { + ta := t.Spec.ForProvider.Tags[i] + tb := t.Spec.ForProvider.Tags[j] + if ta == nil { + return true + } else if tb == nil { + return false + } + return ta.Key < tb.Key + }) return true } ` @@ -293,6 +370,7 @@ func (t *Model8) AddTag(key string, value string) bool { for _, n := range pkgs[0].Types.Scope().Names() { NewAddTag("t", logging.NewNopLogger())(f, pkgs[0].Types.Scope().Lookup(n)) } + fmt.Printf("%#v\n", f) if diff := cmp.Diff(generated, fmt.Sprintf("%#v", f)); diff != "" { t.Errorf("NewAddTag(): -want, +got\n%s", diff) } diff --git a/pkg/controller/acm/controller.go b/pkg/controller/acm/controller.go index 41bfcea876..1ac8453df6 100644 --- a/pkg/controller/acm/controller.go +++ b/pkg/controller/acm/controller.go @@ -39,6 +39,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/acm" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -50,8 +51,6 @@ const ( errUpdate = "failed to update the Certificate resource" errSDK = "empty Certificate received from ACM API" - errKubeUpdateFailed = "cannot late initialize Certificate" - errAddTagsFailed = "cannot add tags to Certificate" errListTagsFailed = "failed to list tags for Certificate" errRemoveTagsFailed = "failed to remove tags for Certificate" @@ -76,7 +75,7 @@ func SetupCertificate(mgr ctrl.Manager, o controller.Options) error { managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(&tagger{kube: mgr.GetClient()}), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &v1beta1.Certificate{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) @@ -225,29 +224,3 @@ func (e *external) Delete(ctx context.Context, mgd resource.Managed) error { return awsclient.Wrap(resource.Ignore(acm.IsErrorNotFound, err), errDelete) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error { - cr, ok := mgd.(*v1beta1.Certificate) - if !ok { - return errors.New(errUnexpectedObject) - } - added := false - tagMap := map[string]string{} - for _, t := range cr.Spec.ForProvider.Tags { - tagMap[t.Key] = t.Value - } - for k, v := range resource.GetExternalTags(mgd) { - if tagMap[k] != v { - cr.Spec.ForProvider.Tags = append(cr.Spec.ForProvider.Tags, v1beta1.Tag{Key: k, Value: v}) - added = true - } - } - if !added { - return nil - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/acmpca/certificateauthority/controller.go b/pkg/controller/acmpca/certificateauthority/controller.go index b918cfe464..91b4ba02a7 100644 --- a/pkg/controller/acmpca/certificateauthority/controller.go +++ b/pkg/controller/acmpca/certificateauthority/controller.go @@ -39,6 +39,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/acmpca" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -75,7 +76,7 @@ func SetupCertificateAuthority(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{client: mgr.GetClient(), newClientFn: acmpca.NewClient}), managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), - managed.WithInitializers(&tagger{kube: mgr.GetClient()}), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &v1beta1.CertificateAuthority{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) @@ -256,33 +257,3 @@ func (e *external) Delete(ctx context.Context, mgd resource.Managed) error { return awsclient.Wrap(resource.Ignore(acmpca.IsErrorNotFound, err), errDelete) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error { - cr, ok := mgd.(*v1beta1.CertificateAuthority) - if !ok { - return errors.New(errUnexpectedObject) - } - added := false - tagMap := map[string]string{} - for _, t := range cr.Spec.ForProvider.Tags { - tagMap[t.Key] = t.Value - } - for k, v := range resource.GetExternalTags(mgd) { - if p, ok := tagMap[k]; !ok || v != p { - cr.Spec.ForProvider.Tags = append(cr.Spec.ForProvider.Tags, v1beta1.Tag{Key: k, Value: v}) - added = true - } - } - if !added { - return nil - } - err := t.kube.Update(ctx, cr) - if err != nil { - return errors.Wrap(err, errKubeUpdateFailed) - } - return nil -} diff --git a/pkg/controller/acmpca/certificateauthority/controller_test.go b/pkg/controller/acmpca/certificateauthority/controller_test.go index d8b782954c..1e0c93eeaf 100644 --- a/pkg/controller/acmpca/certificateauthority/controller_test.go +++ b/pkg/controller/acmpca/certificateauthority/controller_test.go @@ -41,6 +41,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" acmpca "github.com/crossplane-contrib/provider-aws/pkg/clients/acmpca" "github.com/crossplane-contrib/provider-aws/pkg/clients/acmpca/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -578,7 +579,7 @@ func TestInitialize(t *testing.T) { cr: unexpectedItem, }, want: want{ - err: errors.New(errUnexpectedObject), + err: errors.New(common.ErrNotTagged), }, }, "Successful": { @@ -605,14 +606,15 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.args.kube, &v1beta1.CertificateAuthority{}) + err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/apigatewayv2/api/setup.go b/pkg/controller/apigatewayv2/api/setup.go index 8606267301..19570439a9 100644 --- a/pkg/controller/apigatewayv2/api/setup.go +++ b/pkg/controller/apigatewayv2/api/setup.go @@ -34,6 +34,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/apigatewayv2/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -61,7 +62,7 @@ func SetupAPI(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.APIGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.API{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/apigatewayv2/domainname/setup.go b/pkg/controller/apigatewayv2/domainname/setup.go index 95d1e753af..3e66c19bf5 100644 --- a/pkg/controller/apigatewayv2/domainname/setup.go +++ b/pkg/controller/apigatewayv2/domainname/setup.go @@ -33,6 +33,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/apigatewayv2/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -60,6 +61,7 @@ func SetupDomainName(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.DomainNameGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.DomainName{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/apigatewayv2/stage/setup.go b/pkg/controller/apigatewayv2/stage/setup.go index 88ba72f85f..055b83ea9e 100644 --- a/pkg/controller/apigatewayv2/stage/setup.go +++ b/pkg/controller/apigatewayv2/stage/setup.go @@ -33,6 +33,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/apigatewayv2/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -60,6 +61,7 @@ func SetupStage(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.StageGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.Stage{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/apigatewayv2/vpclink/setup.go b/pkg/controller/apigatewayv2/vpclink/setup.go index 67ef74b47b..1b9f0243b6 100644 --- a/pkg/controller/apigatewayv2/vpclink/setup.go +++ b/pkg/controller/apigatewayv2/vpclink/setup.go @@ -33,6 +33,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/apigatewayv2/v1beta1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -61,7 +62,7 @@ func SetupVPCLink(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.VPCLinkGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.VPCLink{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/athena/workgroup/setup.go b/pkg/controller/athena/workgroup/setup.go index 2e46e5bf51..85131beec0 100644 --- a/pkg/controller/athena/workgroup/setup.go +++ b/pkg/controller/athena/workgroup/setup.go @@ -30,6 +30,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/athena/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -58,6 +59,7 @@ func SetupWorkGroup(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.WorkGroupGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.WorkGroup{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/cache/cluster/controller.go b/pkg/controller/cache/cluster/controller.go index a1b9568280..b656b9f06a 100644 --- a/pkg/controller/cache/cluster/controller.go +++ b/pkg/controller/cache/cluster/controller.go @@ -38,6 +38,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/elasticache" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -69,6 +70,7 @@ func SetupCacheCluster(mgr ctrl.Manager, o controller.Options) error { managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: elasticache.NewClient}), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &cachev1alpha1.CacheCluster{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/cache/managed.go b/pkg/controller/cache/managed.go index a7ce7bceb3..1e1f069094 100644 --- a/pkg/controller/cache/managed.go +++ b/pkg/controller/cache/managed.go @@ -19,7 +19,6 @@ package cache import ( "context" "reflect" - "sort" "github.com/aws/aws-sdk-go-v2/aws" awselasticache "github.com/aws/aws-sdk-go-v2/service/elasticache" @@ -41,6 +40,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/elasticache" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -77,7 +77,11 @@ func SetupReplicationGroup(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(v1beta1.ReplicationGroupGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: elasticache.NewClient}), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &v1beta1.ReplicationGroup{}), + ), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), @@ -289,34 +293,6 @@ func (e *external) updateTags(ctx context.Context, tags []v1beta1.Tag, arn *stri return nil } -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*v1beta1.ReplicationGroup) - if !ok { - return errors.New(errNotReplicationGroup) - } - tagMap := map[string]string{} - for _, t := range cr.Spec.ForProvider.Tags { - tagMap[t.Key] = t.Value - } - for k, v := range resource.GetExternalTags(mg) { - tagMap[k] = v - } - cr.Spec.ForProvider.Tags = make([]v1beta1.Tag, len(tagMap)) - i := 0 - for k, v := range tagMap { - cr.Spec.ForProvider.Tags[i] = v1beta1.Tag{Key: k, Value: v} - i++ - } - sort.Slice(cr.Spec.ForProvider.Tags, func(i, j int) bool { - return cr.Spec.ForProvider.Tags[i].Key < cr.Spec.ForProvider.Tags[j].Key - }) - return errors.Wrap(t.kube.Update(ctx, cr), errUpdateReplicationGroupCR) -} - func getCacheClusterList(ctx context.Context, client awselasticache.DescribeCacheClustersAPIClient, idList []string) ([]awselasticachetypes.CacheCluster, error) { if len(idList) < 1 { return nil, nil diff --git a/pkg/controller/cache/managed_test.go b/pkg/controller/cache/managed_test.go index 489c7d3bc0..fddce17c8c 100644 --- a/pkg/controller/cache/managed_test.go +++ b/pkg/controller/cache/managed_test.go @@ -38,6 +38,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/cache/v1beta1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/elasticache/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) const ( @@ -771,14 +772,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errorBoom)}, }, want: want{ - err: awsclient.Wrap(errorBoom, errUpdateReplicationGroupCR), + err: awsclient.Wrap(errorBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &v1beta1.ReplicationGroup{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/cloudwatchlogs/loggroup/setup.go b/pkg/controller/cloudwatchlogs/loggroup/setup.go index ac41b1e3ee..3b18c62613 100644 --- a/pkg/controller/cloudwatchlogs/loggroup/setup.go +++ b/pkg/controller/cloudwatchlogs/loggroup/setup.go @@ -32,6 +32,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/cloudwatchlogs/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -68,7 +69,7 @@ func SetupLogGroup(mgr ctrl.Manager, o controller.Options) error { For(&svcapitypes.LogGroup{}). Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.LogGroupGroupVersionKind), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.LogGroup{})), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), diff --git a/pkg/controller/common/doc.go b/pkg/controller/common/doc.go new file mode 100644 index 0000000000..f03fe560ac --- /dev/null +++ b/pkg/controller/common/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2021 The Crossplane Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package common contains shared controller logic. +package common diff --git a/pkg/controller/common/tagger.go b/pkg/controller/common/tagger.go new file mode 100644 index 0000000000..fbb0cd4678 --- /dev/null +++ b/pkg/controller/common/tagger.go @@ -0,0 +1,50 @@ +package common + +import ( + "context" + + "github.com/crossplane/crossplane-runtime/pkg/resource" + "github.com/pkg/errors" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/crossplane-contrib/provider-aws/apis" +) + +const ( + // ErrNotTagged error message + ErrNotTagged = "Resource does not implement the Tagged interface" + // ErrUpdateTags error message + ErrUpdateTags = "Failed to update tags for Tagged resource" +) + +// Tagger is a controller initializer that adds all default tags to a managed +// resource if it implements the Tagged interface. +type Tagger struct { + kube client.Client +} + +// NewTagger creates a new Tagger instance. +func NewTagger(kube client.Client, _ apis.Tagged) *Tagger { + return &Tagger{ + kube: kube, + } +} + +// Initialize adds the default tags to the given managed resource if it +// implements the Tagged interface. +func (t *Tagger) Initialize(ctx context.Context, mg resource.Managed) error { + tagged, ok := mg.(apis.Tagged) + if !ok { + return errors.New(ErrNotTagged) + } + shouldUpdate := false + for k, v := range resource.GetExternalTags(mg) { + if added := tagged.AddTag(k, v); added { + shouldUpdate = true + } + } + if shouldUpdate { + return errors.Wrap(t.kube.Update(ctx, mg), ErrUpdateTags) + } + return nil +} diff --git a/pkg/controller/database/dbsubnetgroup/controller.go b/pkg/controller/database/dbsubnetgroup/controller.go index e5fd892462..ac8b63ccdf 100644 --- a/pkg/controller/database/dbsubnetgroup/controller.go +++ b/pkg/controller/database/dbsubnetgroup/controller.go @@ -41,6 +41,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" dbsg "github.com/crossplane-contrib/provider-aws/pkg/clients/dbsubnetgroup" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -74,6 +75,7 @@ func SetupDBSubnetGroup(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: dbsg.NewClient}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithConnectionPublishers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &v1beta1.DBSubnetGroup{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/database/rdsinstance.go b/pkg/controller/database/rdsinstance.go index 1db48c1b89..2c8ec6a2ae 100644 --- a/pkg/controller/database/rdsinstance.go +++ b/pkg/controller/database/rdsinstance.go @@ -19,7 +19,6 @@ package database import ( "context" "reflect" - "sort" "github.com/aws/aws-sdk-go-v2/aws" awsrds "github.com/aws/aws-sdk-go-v2/service/rds" @@ -41,12 +40,12 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/rds" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( errNotRDSInstance = "managed resource is not an RDS instance custom resource" - errKubeUpdateFailed = "cannot update RDS instance custom resource" errCreateFailed = "cannot create RDS instance" errS3RestoreFailed = "cannot restore RDS instance from S3 backup" errSnapshotRestoreFailed = "cannot restore RDS instance from snapshot" @@ -78,7 +77,11 @@ func SetupRDSInstance(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(v1beta1.RDSInstanceGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: rds.NewClient}), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &v1beta1.RDSInstance{}), + ), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), @@ -305,31 +308,3 @@ func (e *external) Delete(ctx context.Context, mg resource.Managed) error { _, err = e.client.DeleteDBInstance(ctx, &input) return awsclient.Wrap(resource.Ignore(rds.IsErrorNotFound, err), errDeleteFailed) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*v1beta1.RDSInstance) - if !ok { - return errors.New(errNotRDSInstance) - } - tagMap := map[string]string{} - for _, t := range cr.Spec.ForProvider.Tags { - tagMap[t.Key] = t.Value - } - for k, v := range resource.GetExternalTags(mg) { - tagMap[k] = v - } - cr.Spec.ForProvider.Tags = make([]v1beta1.Tag, len(tagMap)) - i := 0 - for k, v := range tagMap { - cr.Spec.ForProvider.Tags[i] = v1beta1.Tag{Key: k, Value: v} - i++ - } - sort.Slice(cr.Spec.ForProvider.Tags, func(i, j int) bool { - return cr.Spec.ForProvider.Tags[i].Key < cr.Spec.ForProvider.Tags[j].Key - }) - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/database/rdsinstance_test.go b/pkg/controller/database/rdsinstance_test.go index ff817062d9..92ff4db636 100644 --- a/pkg/controller/database/rdsinstance_test.go +++ b/pkg/controller/database/rdsinstance_test.go @@ -43,6 +43,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/rds" "github.com/crossplane-contrib/provider-aws/pkg/clients/rds/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) const ( @@ -1006,14 +1007,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: awsclient.Wrap(errBoom, errKubeUpdateFailed), + err: awsclient.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &v1beta1.RDSInstance{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/dax/cluster/setup.go b/pkg/controller/dax/cluster/setup.go index 3a3775d163..e25a093c65 100644 --- a/pkg/controller/dax/cluster/setup.go +++ b/pkg/controller/dax/cluster/setup.go @@ -16,6 +16,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/dax/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) // SetupCluster adds a controller that reconciles Cluster. @@ -39,7 +40,7 @@ func SetupCluster(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.ClusterGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.Cluster{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))))) diff --git a/pkg/controller/docdb/dbcluster/setup.go b/pkg/controller/docdb/dbcluster/setup.go index 6eeb73c0a7..625486f2d3 100644 --- a/pkg/controller/docdb/dbcluster/setup.go +++ b/pkg/controller/docdb/dbcluster/setup.go @@ -40,13 +40,12 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/docdb/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" svcutils "github.com/crossplane-contrib/provider-aws/pkg/controller/docdb" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( - errNotDBCluster = "managed resource is not a DB Cluster custom resource" - errKubeUpdateFailed = "cannot update DBCluster instance custom resource" errGetPasswordSecretFailed = "cannot get password secret" ) @@ -68,7 +67,10 @@ func SetupDBCluster(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.DBClusterGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &svcapitypes.DBCluster{}), + ), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -320,17 +322,3 @@ func getConnectionDetails(cr *svcapitypes.DBCluster) managed.ConnectionDetails { "readerEndpoint": []byte(awsclient.StringValue(cr.Status.AtProvider.ReaderEndpoint)), } } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*svcapitypes.DBCluster) - if !ok { - return errors.New(errNotDBCluster) - } - - cr.Spec.ForProvider.Tags = svcutils.AddExternalTags(mg, cr.Spec.ForProvider.Tags) - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/docdb/dbcluster/setup_test.go b/pkg/controller/docdb/dbcluster/setup_test.go index 21ae664e86..20bc07327c 100644 --- a/pkg/controller/docdb/dbcluster/setup_test.go +++ b/pkg/controller/docdb/dbcluster/setup_test.go @@ -18,6 +18,7 @@ package dbcluster import ( "context" + "sort" "strconv" "testing" @@ -37,6 +38,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/docdb/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/docdb/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" svcutils "github.com/crossplane-contrib/provider-aws/pkg/controller/docdb" ) @@ -309,6 +311,9 @@ func mergeTags(lists ...[]*svcapitypes.Tag) []*svcapitypes.Tag { for _, list := range lists { res = append(res, list...) } + sort.Slice(res, func(i, j int) bool { + return awsclient.StringValue(res[i].Key) < awsclient.StringValue(res[j].Key) + }) return res } @@ -2774,14 +2779,14 @@ func TestInitialize(t *testing.T) { svcutils.GetExternalTags(instance()), )..., )), - err: awsclient.Wrap(errors.New(testErrBoom), errKubeUpdateFailed), + err: awsclient.Wrap(errors.New(testErrBoom), common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &svcapitypes.DBCluster{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/docdb/dbclusterparametergroup/setup.go b/pkg/controller/docdb/dbclusterparametergroup/setup.go index 4ee283ecff..481cefd0bc 100644 --- a/pkg/controller/docdb/dbclusterparametergroup/setup.go +++ b/pkg/controller/docdb/dbclusterparametergroup/setup.go @@ -38,16 +38,15 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/docdb/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" svcutils "github.com/crossplane-contrib/provider-aws/pkg/controller/docdb" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( - errNotDBClusterParameterGroup = "managed resource is not a DocDBClusterParameterGroup custom resource" - errKubeUpdateFailed = "cannot update DocDB DBClusterParameterGroup custom resource" - errModifyFamily = "cannot modify DBParameterGroupFamily of an existing DBClusterParameterGroup" - errModifyDescription = "cannot modify Description of an existing DBClusterParameterGroup" - errDescribeParameters = "cannot describe parameters for DBClusterParameterGroup" + errModifyFamily = "cannot modify DBParameterGroupFamily of an existing DBClusterParameterGroup" + errModifyDescription = "cannot modify Description of an existing DBClusterParameterGroup" + errDescribeParameters = "cannot describe parameters for DBClusterParameterGroup" ) // SetupDBClusterParameterGroup adds a controller that reconciles a DBClusterParameterGroup. @@ -68,7 +67,10 @@ func SetupDBClusterParameterGroup(mgr ctrl.Manager, o controller.Options) error resource.ManagedKind(svcapitypes.DBClusterParameterGroupGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &svcapitypes.DBClusterParameterGroup{}), + ), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -262,17 +264,3 @@ func generateAPIParameter(p *svcsdk.Parameter, o *svcapitypes.Parameter) *svcapi return o } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*svcapitypes.DBClusterParameterGroup) - if !ok { - return errors.New(errNotDBClusterParameterGroup) - } - - cr.Spec.ForProvider.Tags = svcutils.AddExternalTags(mg, cr.Spec.ForProvider.Tags) - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/docdb/dbclusterparametergroup/setup_test.go b/pkg/controller/docdb/dbclusterparametergroup/setup_test.go index e722bc0ac3..7d3fb87ea7 100644 --- a/pkg/controller/docdb/dbclusterparametergroup/setup_test.go +++ b/pkg/controller/docdb/dbclusterparametergroup/setup_test.go @@ -18,6 +18,7 @@ package dbclusterparametergroup import ( "context" + "sort" "testing" "github.com/google/go-cmp/cmp" @@ -35,6 +36,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/docdb/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/docdb/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" svcutils "github.com/crossplane-contrib/provider-aws/pkg/controller/docdb" ) @@ -140,6 +142,9 @@ func mergeTags(lists ...[]*svcapitypes.Tag) []*svcapitypes.Tag { for _, list := range lists { res = append(res, list...) } + sort.Slice(res, func(i, j int) bool { + return awsclient.StringValue(res[i].Key) < awsclient.StringValue(res[j].Key) + }) return res } @@ -1183,14 +1188,14 @@ func TestInitialize(t *testing.T) { svcutils.GetExternalTags(instance()), )..., )), - err: awsclient.Wrap(errors.New(testErrBoom), errKubeUpdateFailed), + err: awsclient.Wrap(errors.New(testErrBoom), common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &svcapitypes.DBClusterParameterGroup{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/docdb/dbinstance/setup.go b/pkg/controller/docdb/dbinstance/setup.go index 0ecc6528ca..be60f6bd48 100644 --- a/pkg/controller/docdb/dbinstance/setup.go +++ b/pkg/controller/docdb/dbinstance/setup.go @@ -22,7 +22,6 @@ import ( svcsdk "github.com/aws/aws-sdk-go/service/docdb" "github.com/aws/aws-sdk-go/service/docdb/docdbiface" - "github.com/pkg/errors" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -37,15 +36,11 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/docdb/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" svcutils "github.com/crossplane-contrib/provider-aws/pkg/controller/docdb" "github.com/crossplane-contrib/provider-aws/pkg/features" ) -const ( - errNotDBInstance = "managed resource is not a DocDB instance custom resource" - errKubeUpdateFailed = "cannot update DocDB instance custom resource" -) - // SetupDBInstance adds a controller that reconciles a DBInstance. func SetupDBInstance(mgr ctrl.Manager, o controller.Options) error { name := managed.ControllerName(svcapitypes.DBInstanceGroupKind) @@ -64,7 +59,10 @@ func SetupDBInstance(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.DBInstanceGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &svcapitypes.DBInstance{}), + ), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -206,17 +204,3 @@ func getConnectionDetails(cr *svcapitypes.DBInstance) managed.ConnectionDetails xpv1.ResourceCredentialsSecretPortKey: []byte(strconv.Itoa(int(awsclient.Int64Value(cr.Status.AtProvider.Endpoint.Port)))), } } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*svcapitypes.DBInstance) - if !ok { - return errors.New(errNotDBInstance) - } - - cr.Spec.ForProvider.Tags = svcutils.AddExternalTags(mg, cr.Spec.ForProvider.Tags) - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/docdb/dbsubnetgroup/setup.go b/pkg/controller/docdb/dbsubnetgroup/setup.go index ae5be98bb3..355ea13cc0 100644 --- a/pkg/controller/docdb/dbsubnetgroup/setup.go +++ b/pkg/controller/docdb/dbsubnetgroup/setup.go @@ -21,7 +21,6 @@ import ( svcsdk "github.com/aws/aws-sdk-go/service/docdb" "github.com/aws/aws-sdk-go/service/docdb/docdbiface" - "github.com/pkg/errors" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -36,15 +35,11 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/docdb/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" svcutils "github.com/crossplane-contrib/provider-aws/pkg/controller/docdb" "github.com/crossplane-contrib/provider-aws/pkg/features" ) -const ( - errNotDBSubnetGroup = "managed resource is not a DBSubnetGroup custom resource" - errKubeUpdateFailed = "cannot update DocDBSubnetGroup custom resource" -) - // SetupDBSubnetGroup adds a controller that reconciles a DBSubnetGroup. func SetupDBSubnetGroup(mgr ctrl.Manager, o controller.Options) error { name := managed.ControllerName(svcapitypes.DBSubnetGroupKind) @@ -63,7 +58,11 @@ func SetupDBSubnetGroup(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.DBSubnetGroupGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &svcapitypes.DBSubnetGroup{}), + ), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -174,17 +173,3 @@ func filterList(cr *svcapitypes.DBSubnetGroup, list *svcsdk.DescribeDBSubnetGrou DBSubnetGroups: []*svcsdk.DBSubnetGroup{}, } } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*svcapitypes.DBSubnetGroup) - if !ok { - return errors.New(errNotDBSubnetGroup) - } - - cr.Spec.ForProvider.Tags = svcutils.AddExternalTags(mg, cr.Spec.ForProvider.Tags) - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/docdb/tags.go b/pkg/controller/docdb/tags.go index d6eaaa22ef..ac63328e26 100644 --- a/pkg/controller/docdb/tags.go +++ b/pkg/controller/docdb/tags.go @@ -148,7 +148,7 @@ func AddExternalTags(mg resource.Managed, spec []*svcapitypes.Tag) []*svcapitype func GetExternalTags(mg resource.Managed) []*svcapitypes.Tag { externalTags := []*svcapitypes.Tag{} for k, v := range resource.GetExternalTags(mg) { - externalTags = append(externalTags, &svcapitypes.Tag{Key: awsclient.String(k), Value: awsclient.String(v)}) + externalTags = append(externalTags, &svcapitypes.Tag{Key: awsclient.String(k, awsclient.FieldRequired), Value: awsclient.String(v, awsclient.FieldRequired)}) } sort.Slice(externalTags, func(i, j int) bool { diff --git a/pkg/controller/dynamodb/table/hooks.go b/pkg/controller/dynamodb/table/hooks.go index 0a93e8af82..e2a53d4528 100644 --- a/pkg/controller/dynamodb/table/hooks.go +++ b/pkg/controller/dynamodb/table/hooks.go @@ -24,10 +24,7 @@ import ( svcsdk "github.com/aws/aws-sdk-go/service/dynamodb" svcsdkapi "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbiface" - "github.com/google/go-cmp/cmp" - "github.com/pkg/errors" ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1" "github.com/crossplane/crossplane-runtime/pkg/connection" @@ -40,6 +37,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/dynamodb/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -75,7 +73,8 @@ func SetupTable(mgr ctrl.Manager, o controller.Options) error { managed.WithInitializers( managed.NewNameAsExternalName(mgr.GetClient()), managed.NewDefaultProviderConfig(mgr.GetClient()), - &tagger{kube: mgr.GetClient()}), + common.NewTagger(mgr.GetClient(), &svcapitypes.Table{}), + ), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -134,36 +133,6 @@ func postObserve(_ context.Context, cr *svcapitypes.Table, resp *svcsdk.Describe return obs, nil } -type tagger struct { - kube client.Client -} - -func (e *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*svcapitypes.Table) - if !ok { - return errors.New(errUnexpectedObject) - } - tagMap := map[string]string{} - for _, t := range cr.Spec.ForProvider.Tags { - tagMap[aws.StringValue(t.Key)] = aws.StringValue(t.Value) - } - for k, v := range resource.GetExternalTags(cr) { - tagMap[k] = v - } - tags := make([]*svcapitypes.Tag, 0) - for k, v := range tagMap { - tags = append(tags, &svcapitypes.Tag{Key: aws.String(k), Value: aws.String(v)}) - } - sort.Slice(tags, func(i, j int) bool { - return aws.StringValue(tags[i].Key) < aws.StringValue(tags[j].Key) - }) - if cmp.Equal(cr.Spec.ForProvider.Tags, tags) { - return nil - } - cr.Spec.ForProvider.Tags = tags - return errors.Wrap(e.kube.Update(ctx, cr), "cannot update Table Spec") -} - func lateInitialize(in *svcapitypes.TableParameters, t *svcsdk.DescribeTableOutput) error { // nolint:gocyclo,unparam if t == nil { return nil diff --git a/pkg/controller/ec2/address/controller.go b/pkg/controller/ec2/address/controller.go index 3908f80f07..35a37ee1ee 100644 --- a/pkg/controller/ec2/address/controller.go +++ b/pkg/controller/ec2/address/controller.go @@ -18,7 +18,6 @@ package address import ( "context" - "sort" "time" "github.com/aws/aws-sdk-go-v2/aws" @@ -41,12 +40,12 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( errUnexpectedObject = "The managed resource is not an Address resource" - errKubeUpdateFailed = "cannot update Address custom resource" errDescribe = "failed to describe Address with id" errMultipleItems = "retrieved multiple Addresss for the given AddressId" @@ -75,7 +74,10 @@ func SetupAddress(mgr ctrl.Manager, o controller.Options) error { managed.WithCreationGracePeriod(3*time.Minute), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithConnectionPublishers(), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &v1beta1.Address{}), + ), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -224,31 +226,3 @@ func (e *external) Delete(ctx context.Context, mgd resource.Managed) error { return awsclient.Wrap(resource.Ignore(ec2.IsAddressNotFoundErr, err), errDelete) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error { - cr, ok := mgd.(*v1beta1.Address) - if !ok { - return errors.New(errUnexpectedObject) - } - tagMap := map[string]string{} - for _, t := range cr.Spec.ForProvider.Tags { - tagMap[t.Key] = t.Value - } - for k, v := range resource.GetExternalTags(mgd) { - tagMap[k] = v - } - cr.Spec.ForProvider.Tags = make([]v1beta1.Tag, len(tagMap)) - i := 0 - for k, v := range tagMap { - cr.Spec.ForProvider.Tags[i] = v1beta1.Tag{Key: k, Value: v} - i++ - } - sort.Slice(cr.Spec.ForProvider.Tags, func(i, j int) bool { - return cr.Spec.ForProvider.Tags[i].Key < cr.Spec.ForProvider.Tags[j].Key - }) - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/ec2/address/controller_test.go b/pkg/controller/ec2/address/controller_test.go index acb21e337b..c93649d7cd 100644 --- a/pkg/controller/ec2/address/controller_test.go +++ b/pkg/controller/ec2/address/controller_test.go @@ -38,6 +38,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -464,14 +465,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &v1beta1.Address{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/ec2/instance/controller.go b/pkg/controller/ec2/instance/controller.go index 7ba26fcca3..f24113fba0 100644 --- a/pkg/controller/ec2/instance/controller.go +++ b/pkg/controller/ec2/instance/controller.go @@ -18,7 +18,6 @@ package instance import ( "context" - "sort" "github.com/aws/aws-sdk-go-v2/aws" awsec2 "github.com/aws/aws-sdk-go-v2/service/ec2" @@ -40,6 +39,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -74,7 +74,10 @@ func SetupInstance(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: ec2.NewInstanceClient}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithConnectionPublishers(), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &svcapitypes.Instance{}), + ), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -352,31 +355,3 @@ func (e *external) Delete(ctx context.Context, mgd resource.Managed) error { return awsclient.Wrap(resource.Ignore(ec2.IsInstanceNotFoundErr, err), errDelete) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error { - cr, ok := mgd.(*svcapitypes.Instance) - if !ok { - return errors.New(errUnexpectedObject) - } - tagMap := map[string]string{} - for _, t := range cr.Spec.ForProvider.Tags { - tagMap[t.Key] = t.Value - } - for k, v := range resource.GetExternalTags(mgd) { - tagMap[k] = v - } - cr.Spec.ForProvider.Tags = make([]svcapitypes.Tag, len(tagMap)) - i := 0 - for k, v := range tagMap { - cr.Spec.ForProvider.Tags[i] = svcapitypes.Tag{Key: k, Value: v} - i++ - } - sort.Slice(cr.Spec.ForProvider.Tags, func(i, j int) bool { - return cr.Spec.ForProvider.Tags[i].Key < cr.Spec.ForProvider.Tags[j].Key - }) - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/ec2/instance/controller_test.go b/pkg/controller/ec2/instance/controller_test.go index 8b3123e93d..758bc04d65 100644 --- a/pkg/controller/ec2/instance/controller_test.go +++ b/pkg/controller/ec2/instance/controller_test.go @@ -39,6 +39,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -450,14 +451,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &manualv1alpha1.Instance{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/ec2/internetgateway/controller.go b/pkg/controller/ec2/internetgateway/controller.go index 45f512f5cf..6f6d5fbd05 100644 --- a/pkg/controller/ec2/internetgateway/controller.go +++ b/pkg/controller/ec2/internetgateway/controller.go @@ -39,6 +39,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -73,7 +74,7 @@ func SetupInternetGateway(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: ec2.NewInternetGatewayClient}), managed.WithCreationGracePeriod(3*time.Minute), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &v1beta1.InternetGateway{})), managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), diff --git a/pkg/controller/ec2/natgateway/controller.go b/pkg/controller/ec2/natgateway/controller.go index 81ed6288c0..380cfd856c 100644 --- a/pkg/controller/ec2/natgateway/controller.go +++ b/pkg/controller/ec2/natgateway/controller.go @@ -23,6 +23,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -54,7 +55,7 @@ func SetupNatGateway(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: ec2.NewNatGatewayClient}), managed.WithCreationGracePeriod(3*time.Minute), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &v1beta1.NATGateway{})), managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), diff --git a/pkg/controller/ec2/routetable/controller.go b/pkg/controller/ec2/routetable/controller.go index b5208e8439..786b699220 100644 --- a/pkg/controller/ec2/routetable/controller.go +++ b/pkg/controller/ec2/routetable/controller.go @@ -40,6 +40,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -79,7 +80,7 @@ func SetupRouteTable(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: ec2.NewRouteTableClient}), managed.WithCreationGracePeriod(3*time.Minute), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &v1beta1.RouteTable{})), managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), diff --git a/pkg/controller/ec2/securitygroup/controller.go b/pkg/controller/ec2/securitygroup/controller.go index 1762ace7ed..660dfd4d04 100644 --- a/pkg/controller/ec2/securitygroup/controller.go +++ b/pkg/controller/ec2/securitygroup/controller.go @@ -42,6 +42,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -81,7 +82,7 @@ func SetupSecurityGroup(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: ec2.NewSecurityGroupClient}), managed.WithCreationGracePeriod(3*time.Minute), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &v1beta1.SecurityGroup{})), managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), diff --git a/pkg/controller/ec2/subnet/controller.go b/pkg/controller/ec2/subnet/controller.go index d51b3ba462..e10f997e0c 100644 --- a/pkg/controller/ec2/subnet/controller.go +++ b/pkg/controller/ec2/subnet/controller.go @@ -18,7 +18,6 @@ package subnet import ( "context" - "sort" "time" "github.com/aws/aws-sdk-go-v2/aws" @@ -41,12 +40,12 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( errUnexpectedObject = "The managed resource is not an Subnet resource" - errKubeUpdateFailed = "cannot update Subnet custom resource" errDescribe = "failed to describe Subnet" errMultipleItems = "retrieved multiple Subnets" @@ -75,7 +74,10 @@ func SetupSubnet(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: ec2.NewSubnetClient}), managed.WithCreationGracePeriod(3*time.Minute), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &v1beta1.Subnet{}), + ), managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), @@ -252,31 +254,3 @@ func (e *external) Delete(ctx context.Context, mgd resource.Managed) error { return awsclient.Wrap(resource.Ignore(ec2.IsSubnetNotFoundErr, err), errDelete) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error { - cr, ok := mgd.(*v1beta1.Subnet) - if !ok { - return errors.New(errUnexpectedObject) - } - tagMap := map[string]string{} - for _, t := range cr.Spec.ForProvider.Tags { - tagMap[t.Key] = t.Value - } - for k, v := range resource.GetExternalTags(mgd) { - tagMap[k] = v - } - cr.Spec.ForProvider.Tags = make([]v1beta1.Tag, len(tagMap)) - i := 0 - for k, v := range tagMap { - cr.Spec.ForProvider.Tags[i] = v1beta1.Tag{Key: k, Value: v} - i++ - } - sort.Slice(cr.Spec.ForProvider.Tags, func(i, j int) bool { - return cr.Spec.ForProvider.Tags[i].Key < cr.Spec.ForProvider.Tags[j].Key - }) - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/ec2/vpc/controller.go b/pkg/controller/ec2/vpc/controller.go index 402b67d469..ab465c073a 100644 --- a/pkg/controller/ec2/vpc/controller.go +++ b/pkg/controller/ec2/vpc/controller.go @@ -18,7 +18,6 @@ package vpc import ( "context" - "sort" "time" "github.com/aws/aws-sdk-go-v2/aws" @@ -41,12 +40,12 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( errUnexpectedObject = "The managed resource is not an VPC resource" - errKubeUpdateFailed = "cannot update VPC custom resource" errDescribe = "failed to describe VPC with id" errMultipleItems = "retrieved multiple VPCs for the given vpcId" @@ -77,7 +76,10 @@ func SetupVPC(mgr ctrl.Manager, o controller.Options) error { managed.WithCreationGracePeriod(3*time.Minute), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithConnectionPublishers(), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &v1beta1.VPC{}), + ), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -290,31 +292,3 @@ func (e *external) Delete(ctx context.Context, mgd resource.Managed) error { return awsclient.Wrap(resource.Ignore(ec2.IsVPCNotFoundErr, err), errDelete) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error { - cr, ok := mgd.(*v1beta1.VPC) - if !ok { - return errors.New(errUnexpectedObject) - } - tagMap := map[string]string{} - for _, t := range cr.Spec.ForProvider.Tags { - tagMap[t.Key] = t.Value - } - for k, v := range resource.GetExternalTags(mgd) { - tagMap[k] = v - } - cr.Spec.ForProvider.Tags = make([]v1beta1.Tag, len(tagMap)) - i := 0 - for k, v := range tagMap { - cr.Spec.ForProvider.Tags[i] = v1beta1.Tag{Key: k, Value: v} - i++ - } - sort.Slice(cr.Spec.ForProvider.Tags, func(i, j int) bool { - return cr.Spec.ForProvider.Tags[i].Key < cr.Spec.ForProvider.Tags[j].Key - }) - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/ec2/vpc/controller_test.go b/pkg/controller/ec2/vpc/controller_test.go index da115fdb6d..4816bb4cea 100644 --- a/pkg/controller/ec2/vpc/controller_test.go +++ b/pkg/controller/ec2/vpc/controller_test.go @@ -39,6 +39,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2" "github.com/crossplane-contrib/provider-aws/pkg/clients/ec2/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -484,14 +485,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &v1beta1.VPC{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/ecr/repository/controller.go b/pkg/controller/ecr/repository/controller.go index a5db45b7eb..20d41b994e 100644 --- a/pkg/controller/ecr/repository/controller.go +++ b/pkg/controller/ecr/repository/controller.go @@ -39,12 +39,12 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/ecr" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( errUnexpectedObject = "managed resource is not an repository resource" - errKubeUpdateFailed = "cannot update repository custom resource" errDescribe = "failed to describe repository with id" errMultipleItems = "retrieved multiple repository for the given ECR name" @@ -78,7 +78,11 @@ func SetupRepository(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{kube: mgr.GetClient()}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithConnectionPublishers(), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &v1beta1.Repository{}), + ), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -243,32 +247,6 @@ func (e *external) Delete(ctx context.Context, mgd resource.Managed) error { return awsclient.Wrap(resource.Ignore(ecr.IsRepoNotFoundErr, err), errDelete) } -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error { - cr, ok := mgd.(*v1beta1.Repository) - if !ok { - return errors.New(errUnexpectedObject) - } - added := false - tagMap := map[string]string{} - for _, t := range cr.Spec.ForProvider.Tags { - tagMap[t.Key] = t.Value - } - for k, v := range resource.GetExternalTags(mgd) { - if tagMap[k] != v { - cr.Spec.ForProvider.Tags = append(cr.Spec.ForProvider.Tags, v1beta1.Tag{Key: k, Value: v}) - added = true - } - } - if !added { - return nil - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} - func (e *external) updateTags(ctx context.Context, repo *v1beta1.Repository) error { resp, err := e.client.ListTagsForResource(ctx, &awsecr.ListTagsForResourceInput{ResourceArn: &repo.Status.AtProvider.RepositoryArn}) if err != nil { diff --git a/pkg/controller/ecr/repository/controller_test.go b/pkg/controller/ecr/repository/controller_test.go index b9f24165ec..7a8a08136f 100644 --- a/pkg/controller/ecr/repository/controller_test.go +++ b/pkg/controller/ecr/repository/controller_test.go @@ -41,6 +41,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" ecr "github.com/crossplane-contrib/provider-aws/pkg/clients/ecr" "github.com/crossplane-contrib/provider-aws/pkg/clients/ecr/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -666,14 +667,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &v1beta1.Repository{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/efs/accesspoint/setup.go b/pkg/controller/efs/accesspoint/setup.go index b264c2ba6f..47987b8255 100644 --- a/pkg/controller/efs/accesspoint/setup.go +++ b/pkg/controller/efs/accesspoint/setup.go @@ -15,6 +15,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/efs/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) // SetupAccessPoint adds a controller that reconciles AccessPoint. @@ -34,7 +35,7 @@ func SetupAccessPoint(mgr ctrl.Manager, o controller.Options) error { For(&svcapitypes.AccessPoint{}). Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.AccessPointGroupVersionKind), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.AccessPoint{})), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), diff --git a/pkg/controller/efs/filesystem/setup.go b/pkg/controller/efs/filesystem/setup.go index 6b364c818e..a10c5cabb0 100644 --- a/pkg/controller/efs/filesystem/setup.go +++ b/pkg/controller/efs/filesystem/setup.go @@ -18,6 +18,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/efs/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -47,7 +48,7 @@ func SetupFileSystem(mgr ctrl.Manager, o controller.Options) error { For(&svcapitypes.FileSystem{}). Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.FileSystemGroupVersionKind), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.FileSystem{})), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), diff --git a/pkg/controller/eks/addon/setup.go b/pkg/controller/eks/addon/setup.go index a0a13ee725..7e24aadb8c 100644 --- a/pkg/controller/eks/addon/setup.go +++ b/pkg/controller/eks/addon/setup.go @@ -36,14 +36,13 @@ import ( eksv1alpha1 "github.com/crossplane-contrib/provider-aws/apis/eks/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( - errNotEKSCluster = "managed resource is not an EKS cluster custom resource" - errKubeUpdateFailed = "cannot update EKS cluster custom resource" - errTagResource = "cannot tag resource" - errUntagResource = "cannot untag resource" + errTagResource = "cannot tag resource" + errUntagResource = "cannot untag resource" ) // SetupAddon adds a controller that reconciles Clusters. @@ -65,7 +64,10 @@ func SetupAddon(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(eksv1alpha1.AddonGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &eksv1alpha1.Addon{}), + ), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), @@ -199,21 +201,3 @@ func preDelete(_ context.Context, cr *eksv1alpha1.Addon, obj *awseks.DeleteAddon obj.ClusterName = cr.Spec.ForProvider.ClusterName return false, nil } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*eksv1alpha1.Addon) - if !ok { - return errors.New(errNotEKSCluster) - } - if cr.Spec.ForProvider.Tags == nil { - cr.Spec.ForProvider.Tags = map[string]*string{} - } - for k, v := range resource.GetExternalTags(mg) { - cr.Spec.ForProvider.Tags[k] = awsclients.String(v) - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/eks/cluster.go b/pkg/controller/eks/cluster.go index 44c8c76c67..bfc850853d 100644 --- a/pkg/controller/eks/cluster.go +++ b/pkg/controller/eks/cluster.go @@ -38,6 +38,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -71,7 +72,11 @@ func SetupCluster(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(v1beta1.ClusterGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: eks.NewEKSClient, newSTSClientFn: eks.NewSTSClient}), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &v1beta1.Cluster{}), + ), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), @@ -213,21 +218,3 @@ func (e *external) Delete(ctx context.Context, mg resource.Managed) error { _, err := e.client.DeleteCluster(ctx, &awseks.DeleteClusterInput{Name: awsclient.String(meta.GetExternalName(cr))}) return awsclient.Wrap(resource.Ignore(eks.IsErrorNotFound, err), errDeleteFailed) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*v1beta1.Cluster) - if !ok { - return errors.New(errNotEKSCluster) - } - if cr.Spec.ForProvider.Tags == nil { - cr.Spec.ForProvider.Tags = map[string]string{} - } - for k, v := range resource.GetExternalTags(mg) { - cr.Spec.ForProvider.Tags[k] = v - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/eks/cluster_test.go b/pkg/controller/eks/cluster_test.go index 5ed8212b25..ff4f0c9a3f 100644 --- a/pkg/controller/eks/cluster_test.go +++ b/pkg/controller/eks/cluster_test.go @@ -35,6 +35,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -658,14 +659,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &v1beta1.Cluster{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/eks/fargateprofile/controller.go b/pkg/controller/eks/fargateprofile/controller.go index 486313d381..2f7ef03d51 100644 --- a/pkg/controller/eks/fargateprofile/controller.go +++ b/pkg/controller/eks/fargateprofile/controller.go @@ -38,12 +38,12 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( errNotEKSFargateProfile = "managed resource is not an EKS fargate profile custom resource" - errKubeUpdateFailed = "cannot update EKS fargate profile custom resource" errCreateFailed = "cannot create EKS fargate profile" errAddTagsFailed = "cannot add tags to EKS fargate profile" errDeleteFailed = "cannot delete EKS fargate profile" @@ -66,7 +66,11 @@ func SetupFargateProfile(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(v1beta1.FargateProfileGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newEKSClientFn: eks.NewEKSClient}), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &v1beta1.FargateProfile{}), + ), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), @@ -182,28 +186,3 @@ func (e *external) Delete(ctx context.Context, mg resource.Managed) error { _, err := e.client.DeleteFargateProfile(ctx, &awseks.DeleteFargateProfileInput{FargateProfileName: awsclient.String(meta.GetExternalName(cr)), ClusterName: &cr.Spec.ForProvider.ClusterName}) return awsclient.Wrap(resource.Ignore(eks.IsErrorNotFound, err), errDeleteFailed) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*v1beta1.FargateProfile) - if !ok { - return errors.New(errNotEKSFargateProfile) - } - changed := false - if cr.Spec.ForProvider.Tags == nil { - cr.Spec.ForProvider.Tags = map[string]string{} - } - for k, v := range resource.GetExternalTags(mg) { - if cr.Spec.ForProvider.Tags[k] != v { - cr.Spec.ForProvider.Tags[k] = v - changed = true - } - } - if !changed { - return nil - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/eks/fargateprofile/controller_test.go b/pkg/controller/eks/fargateprofile/controller_test.go index 5df048938e..9f2e5e501f 100644 --- a/pkg/controller/eks/fargateprofile/controller_test.go +++ b/pkg/controller/eks/fargateprofile/controller_test.go @@ -39,6 +39,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -509,14 +510,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &v1beta1.FargateProfile{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/eks/identityproviderconfig/controller.go b/pkg/controller/eks/identityproviderconfig/controller.go index abb9ce3459..109a83f373 100644 --- a/pkg/controller/eks/identityproviderconfig/controller.go +++ b/pkg/controller/eks/identityproviderconfig/controller.go @@ -39,12 +39,12 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( errNotEKSIdentityProviderConfig = "managed resource is not an EKS Identity Provider Config custom resource" - errKubeUpdateFailed = "cannot update EKS identity provider config custom resource" errCreateFailed = "cannot associate EKS identity provider config" errDeleteFailed = "cannot disassociate EKS identity provider config" @@ -68,7 +68,11 @@ func SetupIdentityProviderConfig(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(manualv1alpha1.IdentityProviderConfigGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newEKSClientFn: eks.NewEKSClient}), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &manualv1alpha1.IdentityProviderConfig{}), + ), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), @@ -198,21 +202,3 @@ func (e *external) Delete(ctx context.Context, mg resource.Managed) error { _, err := e.client.DisassociateIdentityProviderConfig(ctx, eks.GenerateDisassociateIdentityProviderConfigInput(meta.GetExternalName(cr), cr.Spec.ForProvider.ClusterName)) return awsclient.Wrap(resource.Ignore(eks.IsErrorNotFound, err), errDeleteFailed) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*manualv1alpha1.IdentityProviderConfig) - if !ok { - return errors.New(errNotEKSIdentityProviderConfig) - } - if cr.Spec.ForProvider.Tags == nil { - cr.Spec.ForProvider.Tags = map[string]string{} - } - for k, v := range resource.GetExternalTags(mg) { - cr.Spec.ForProvider.Tags[k] = v - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/eks/identityproviderconfig/controller_test.go b/pkg/controller/eks/identityproviderconfig/controller_test.go index 78fe35ceee..820a4e2c6a 100644 --- a/pkg/controller/eks/identityproviderconfig/controller_test.go +++ b/pkg/controller/eks/identityproviderconfig/controller_test.go @@ -35,6 +35,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -509,14 +510,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &manualv1alpha1.IdentityProviderConfig{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/eks/nodegroup/controller.go b/pkg/controller/eks/nodegroup/controller.go index ca45ef9d42..76659e45e0 100644 --- a/pkg/controller/eks/nodegroup/controller.go +++ b/pkg/controller/eks/nodegroup/controller.go @@ -38,6 +38,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -69,7 +70,11 @@ func SetupNodeGroup(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(manualv1alpha1.NodeGroupGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newEKSClientFn: eks.NewEKSClient}), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &manualv1alpha1.NodeGroup{}), + ), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), @@ -201,21 +206,3 @@ func (e *external) Delete(ctx context.Context, mg resource.Managed) error { _, err := e.client.DeleteNodegroup(ctx, &awseks.DeleteNodegroupInput{NodegroupName: awsclient.String(meta.GetExternalName(cr)), ClusterName: &cr.Spec.ForProvider.ClusterName}) return awsclient.Wrap(resource.Ignore(eks.IsErrorNotFound, err), errDeleteFailed) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*manualv1alpha1.NodeGroup) - if !ok { - return errors.New(errNotEKSNodeGroup) - } - if cr.Spec.ForProvider.Tags == nil { - cr.Spec.ForProvider.Tags = map[string]string{} - } - for k, v := range resource.GetExternalTags(mg) { - cr.Spec.ForProvider.Tags[k] = v - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/eks/nodegroup/controller_test.go b/pkg/controller/eks/nodegroup/controller_test.go index 7564d7844c..c375aff7bc 100644 --- a/pkg/controller/eks/nodegroup/controller_test.go +++ b/pkg/controller/eks/nodegroup/controller_test.go @@ -35,6 +35,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks" "github.com/crossplane-contrib/provider-aws/pkg/clients/eks/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -653,14 +654,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &manualv1alpha1.NodeGroup{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/elasticache/cacheparametergroup/setup.go b/pkg/controller/elasticache/cacheparametergroup/setup.go index 74767730e5..66de94453a 100644 --- a/pkg/controller/elasticache/cacheparametergroup/setup.go +++ b/pkg/controller/elasticache/cacheparametergroup/setup.go @@ -37,6 +37,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/elasticache/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -58,6 +59,7 @@ func SetupCacheParameterGroup(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.CacheParameterGroupGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.CacheParameterGroup{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/elasticloadbalancing/elb/controller.go b/pkg/controller/elasticloadbalancing/elb/controller.go index af6aa1535f..8bddd55965 100644 --- a/pkg/controller/elasticloadbalancing/elb/controller.go +++ b/pkg/controller/elasticloadbalancing/elb/controller.go @@ -39,6 +39,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/elasticloadbalancing/elb" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -73,6 +74,7 @@ func SetupELB(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: elb.NewClient}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithConnectionPublishers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &elasticloadbalancingv1alpha1.ELB{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/elbv2/listener/setup.go b/pkg/controller/elbv2/listener/setup.go index d4acfdf992..050b50ebe3 100644 --- a/pkg/controller/elbv2/listener/setup.go +++ b/pkg/controller/elbv2/listener/setup.go @@ -17,6 +17,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/elbv2/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -45,7 +46,7 @@ func SetupListener(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.ListenerGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.Listener{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/elbv2/loadbalancer/setup.go b/pkg/controller/elbv2/loadbalancer/setup.go index 681875e037..a7225933ef 100644 --- a/pkg/controller/elbv2/loadbalancer/setup.go +++ b/pkg/controller/elbv2/loadbalancer/setup.go @@ -17,6 +17,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/elbv2/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -44,7 +45,7 @@ func SetupLoadBalancer(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.LoadBalancerGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.LoadBalancer{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/elbv2/targetgroup/setup.go b/pkg/controller/elbv2/targetgroup/setup.go index ef6024bb52..71e6c84cc3 100644 --- a/pkg/controller/elbv2/targetgroup/setup.go +++ b/pkg/controller/elbv2/targetgroup/setup.go @@ -17,6 +17,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/elbv2/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -43,7 +44,7 @@ func SetupTargetGroup(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.TargetGroupGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.TargetGroup{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/iam/openidconnectprovider/controller.go b/pkg/controller/iam/openidconnectprovider/controller.go index e4f4fcb891..4771deb0e9 100644 --- a/pkg/controller/iam/openidconnectprovider/controller.go +++ b/pkg/controller/iam/openidconnectprovider/controller.go @@ -41,6 +41,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/iam" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -56,7 +57,6 @@ const ( errSDK = "empty OpenIDConnectProvider received from IAM API" errAddTags = "cannot add tags to OpenIDConnectProvider in AWS" errRemoveTags = "cannot remove tags to OpenIDConnectProvider in AWS" - errKubeUpdateFailed = "cannot update OpenIDConnectProvider instance custom resource" ) // SetupOpenIDConnectProvider adds a controller that reconciles OpenIDConnectProvider. @@ -75,7 +75,7 @@ func SetupOpenIDConnectProvider(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(v1beta1.OpenIDConnectProviderGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: iam.NewOpenIDConnectProviderClient}), - managed.WithInitializers(&tagger{kube: mgr.GetClient()}), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &v1beta1.OpenIDConnectProvider{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -247,29 +247,3 @@ func (e *external) Delete(ctx context.Context, mgd resource.Managed) error { return awsclient.Wrap(resource.Ignore(iam.IsErrorNotFound, err), errDelete) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error { - cr, ok := mgd.(*v1beta1.OpenIDConnectProvider) - if !ok { - return errors.New(errUnexpectedObject) - } - added := false - tagMap := map[string]string{} - for _, t := range cr.Spec.ForProvider.Tags { - tagMap[t.Key] = t.Value - } - for k, v := range resource.GetExternalTags(mgd) { - if p, ok := tagMap[k]; !ok || v != p { - cr.Spec.ForProvider.Tags = append(cr.Spec.ForProvider.Tags, v1beta1.Tag{Key: k, Value: v}) - added = true - } - } - if !added { - return nil - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/iam/openidconnectprovider/controller_test.go b/pkg/controller/iam/openidconnectprovider/controller_test.go index d34bdc0985..996055319e 100644 --- a/pkg/controller/iam/openidconnectprovider/controller_test.go +++ b/pkg/controller/iam/openidconnectprovider/controller_test.go @@ -42,6 +42,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/iam/v1beta1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/iam/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -753,7 +754,7 @@ func TestInitialize(t *testing.T) { cr: unexpectedItem, }, want: want{ - err: errors.New(errUnexpectedObject), + err: errors.New(common.ErrNotTagged), }, }, "Successful": { @@ -793,14 +794,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &v1beta1.OpenIDConnectProvider{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/iam/policy/controller.go b/pkg/controller/iam/policy/controller.go index 51059ae0af..a7c8e8f741 100644 --- a/pkg/controller/iam/policy/controller.go +++ b/pkg/controller/iam/policy/controller.go @@ -40,23 +40,23 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/iam" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( errUnexpectedObject = "The managed resource is not a Policy resource" - errGet = "failed to get IAM Policy" - errCreate = "failed to create the IAM Policy" - errDelete = "failed to delete the IAM Policy" - errUpdate = "failed to update the IAM Policy" - errExternalName = "failed to update the IAM Policy external-name" - errEmptyPolicy = "empty IAM Policy received from IAM API" - errPolicyVersion = "No version for policy received from IAM API" - errUpToDate = "cannot check if policy is up to date" - errKubeUpdateFailed = "cannot late initialize IAM Policy" - errTag = "cannot tag policy" - errUntag = "cannot untag policy" + errGet = "failed to get IAM Policy" + errCreate = "failed to create the IAM Policy" + errDelete = "failed to delete the IAM Policy" + errUpdate = "failed to update the IAM Policy" + errExternalName = "failed to update the IAM Policy external-name" + errEmptyPolicy = "empty IAM Policy received from IAM API" + errPolicyVersion = "No version for policy received from IAM API" + errUpToDate = "cannot check if policy is up to date" + errTag = "cannot tag policy" + errUntag = "cannot untag policy" ) // SetupPolicy adds a controller that reconciles IAM Policy. @@ -75,7 +75,7 @@ func SetupPolicy(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(v1beta1.PolicyGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: iam.NewPolicyClient, newSTSClientFn: iam.NewSTSClient}), - managed.WithInitializers(&tagger{kube: mgr.GetClient()}), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &v1beta1.Policy{})), managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), @@ -378,36 +378,3 @@ func (e *external) getPolicyArnByNameAndPath(ctx context.Context, policyName str return aws.String(policyArn.String()), nil } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error { - cr, ok := mgd.(*v1beta1.Policy) - if !ok { - return errors.New(errUnexpectedObject) - } - added := false - defaultTags := resource.GetExternalTags(mgd) - - for i, t := range cr.Spec.ForProvider.Tags { - v, ok := defaultTags[t.Key] - if ok { - if v != t.Value { - cr.Spec.ForProvider.Tags[i].Value = v - added = true - } - delete(defaultTags, t.Key) - } - } - - for k, v := range defaultTags { - cr.Spec.ForProvider.Tags = append(cr.Spec.ForProvider.Tags, v1beta1.Tag{Key: k, Value: v}) - added = true - } - if !added { - return nil - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/iam/policy/controller_test.go b/pkg/controller/iam/policy/controller_test.go index f3d59d54e0..9d08f0f825 100644 --- a/pkg/controller/iam/policy/controller_test.go +++ b/pkg/controller/iam/policy/controller_test.go @@ -44,6 +44,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/iam" "github.com/crossplane-contrib/provider-aws/pkg/clients/iam/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -969,7 +970,7 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(nil)}, }, want: want{ - err: errors.New(errUnexpectedObject), + err: errors.New(common.ErrNotTagged), }, }, "Successful": { @@ -1018,14 +1019,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &v1beta1.Policy{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/iam/role/controller.go b/pkg/controller/iam/role/controller.go index 5beaf442bd..3f4f4ebd45 100644 --- a/pkg/controller/iam/role/controller.go +++ b/pkg/controller/iam/role/controller.go @@ -38,6 +38,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/iam" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -74,7 +75,10 @@ func SetupRole(mgr ctrl.Manager, o controller.Options) error { managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), - managed.WithInitializers(managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &v1beta1.Role{}), + ), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) } @@ -235,36 +239,3 @@ func (e *external) Delete(ctx context.Context, mgd resource.Managed) error { return awsclient.Wrap(resource.Ignore(iam.IsErrorNotFound, err), errDelete) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error { - cr, ok := mgd.(*v1beta1.Role) - if !ok { - return errors.New(errUnexpectedObject) - } - - added := false - defaultTags := resource.GetExternalTags(mgd) - - for i, t := range cr.Spec.ForProvider.Tags { - if v, ok := defaultTags[t.Key]; ok { - if v != t.Value { - cr.Spec.ForProvider.Tags[i].Value = v - added = true - } - delete(defaultTags, t.Key) - } - } - - for k, v := range defaultTags { - cr.Spec.ForProvider.Tags = append(cr.Spec.ForProvider.Tags, v1beta1.Tag{Key: k, Value: v}) - added = true - } - if !added { - return nil - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/iam/role/controller_test.go b/pkg/controller/iam/role/controller_test.go index 0321358043..db501f5017 100644 --- a/pkg/controller/iam/role/controller_test.go +++ b/pkg/controller/iam/role/controller_test.go @@ -38,6 +38,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/iam" "github.com/crossplane-contrib/provider-aws/pkg/clients/iam/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -477,7 +478,7 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(nil)}, }, want: want{ - err: errors.New(errUnexpectedObject), + err: errors.New(common.ErrNotTagged), }, }, "Successful": { @@ -534,14 +535,14 @@ func TestInitialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &v1beta1.Role{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/iam/user/controller.go b/pkg/controller/iam/user/controller.go index 3fa64b5654..cbd52a8708 100644 --- a/pkg/controller/iam/user/controller.go +++ b/pkg/controller/iam/user/controller.go @@ -39,6 +39,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/iam" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -74,7 +75,8 @@ func SetupUser(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: iam.NewUserClient}), managed.WithInitializers( managed.NewNameAsExternalName(mgr.GetClient()), - &tagger{kube: mgr.GetClient()}), + common.NewTagger(mgr.GetClient(), &v1beta1.User{}), + ), managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), @@ -224,36 +226,3 @@ func (e *external) Delete(ctx context.Context, mgd resource.Managed) error { return awsclient.Wrap(resource.Ignore(iam.IsErrorNotFound, err), errDelete) } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error { - cr, ok := mgd.(*v1beta1.User) - if !ok { - return errors.New(errUnexpectedObject) - } - - added := false - defaultTags := resource.GetExternalTags(mgd) - - for i, t := range cr.Spec.ForProvider.Tags { - if v, ok := defaultTags[t.Key]; ok { - if v != t.Value { - cr.Spec.ForProvider.Tags[i].Value = v - added = true - } - delete(defaultTags, t.Key) - } - } - - for k, v := range defaultTags { - cr.Spec.ForProvider.Tags = append(cr.Spec.ForProvider.Tags, v1beta1.Tag{Key: k, Value: v}) - added = true - } - if !added { - return nil - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/iam/user/controller_test.go b/pkg/controller/iam/user/controller_test.go index a807360799..e2485f2da9 100644 --- a/pkg/controller/iam/user/controller_test.go +++ b/pkg/controller/iam/user/controller_test.go @@ -39,6 +39,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/iam/v1beta1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/iam/fake" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) var ( @@ -674,7 +675,7 @@ func TestTagger_Initialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(nil)}, }, want: want{ - err: errors.New(errUnexpectedObject), + err: errors.New(common.ErrNotTagged), }, }, "Successful": { @@ -731,14 +732,14 @@ func TestTagger_Initialize(t *testing.T) { kube: &test.MockClient{MockUpdate: test.NewMockUpdateFn(errBoom)}, }, want: want{ - err: errors.Wrap(errBoom, errKubeUpdateFailed), + err: errors.Wrap(errBoom, common.ErrUpdateTags), }, }, } for name, tc := range cases { t.Run(name, func(t *testing.T) { - e := &tagger{kube: tc.kube} + e := common.NewTagger(tc.kube, &v1beta1.User{}) err := e.Initialize(context.Background(), tc.args.cr) if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" { diff --git a/pkg/controller/iot/policy/setup.go b/pkg/controller/iot/policy/setup.go index f84c7af5c7..d564c7298a 100644 --- a/pkg/controller/iot/policy/setup.go +++ b/pkg/controller/iot/policy/setup.go @@ -33,6 +33,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/iot/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -62,6 +63,7 @@ func SetupPolicy(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.PolicyGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.Policy{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/kafka/cluster/setup.go b/pkg/controller/kafka/cluster/setup.go index fd37b1cf87..e894663cb8 100644 --- a/pkg/controller/kafka/cluster/setup.go +++ b/pkg/controller/kafka/cluster/setup.go @@ -31,6 +31,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/kafka/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -62,6 +63,7 @@ func SetupCluster(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.ClusterGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.Cluster{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/kms/key/setup.go b/pkg/controller/kms/key/setup.go index a0b84fadd8..adb99a82d7 100644 --- a/pkg/controller/kms/key/setup.go +++ b/pkg/controller/kms/key/setup.go @@ -19,6 +19,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/kms/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -53,7 +54,7 @@ func SetupKey(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.KeyGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.Key{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/lambda/function/setup.go b/pkg/controller/lambda/function/setup.go index 840f94b60b..95840da6ae 100644 --- a/pkg/controller/lambda/function/setup.go +++ b/pkg/controller/lambda/function/setup.go @@ -21,6 +21,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/lambda/v1beta1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -53,6 +54,7 @@ func SetupFunction(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.FunctionGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.Function{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/mq/broker/setup.go b/pkg/controller/mq/broker/setup.go index 005d864ac7..4e6e896174 100644 --- a/pkg/controller/mq/broker/setup.go +++ b/pkg/controller/mq/broker/setup.go @@ -21,6 +21,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/mq" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -50,7 +51,10 @@ func SetupBroker(mgr ctrl.Manager, o controller.Options) error { For(&svcapitypes.Broker{}). Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.BrokerGroupVersionKind), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient())), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &svcapitypes.Broker{}), + ), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), diff --git a/pkg/controller/mwaa/environment/setup.go b/pkg/controller/mwaa/environment/setup.go index 071194cfa3..6cafe43fd0 100644 --- a/pkg/controller/mwaa/environment/setup.go +++ b/pkg/controller/mwaa/environment/setup.go @@ -20,16 +20,15 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/mwaa/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" ) const ( - errNotEnvironment = "managed resource is not a environment custom resource" - errKubeUpdateFailed = "failed to update Secret custom resource" - errCreateCLIToken = "cannot create CLI token" - errCreateWebToken = "cannot create web token" - errGetEnvironemt = "cannot get environment" - errTagResource = "cannot tag resource" - errUntagResource = "cannot untag resource" + errCreateCLIToken = "cannot create CLI token" + errCreateWebToken = "cannot create web token" + errGetEnvironemt = "cannot get environment" + errTagResource = "cannot tag resource" + errUntagResource = "cannot untag resource" ) // SetupEnvironment adds a controller that reconciles Environment. @@ -55,7 +54,11 @@ func SetupEnvironment(mgr ctrl.Manager, o controller.Options) error { For(&svcapitypes.Environment{}). Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.EnvironmentGroupVersionKind), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &svcapitypes.Environment{}), + ), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), @@ -247,24 +250,3 @@ func diffTags(spec, current map[string]*string) (map[string]*string, []*string) return addTags, remove } - -type tagger struct { - kube client.Client -} - -// TODO(knappek): split this out as it is used in several controllers -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*svcapitypes.Environment) - if !ok { - return errors.New(errNotEnvironment) - } - - if cr.Spec.ForProvider.Tags == nil { - cr.Spec.ForProvider.Tags = map[string]*string{} - } - - for k, v := range resource.GetExternalTags(mg) { - cr.Spec.ForProvider.Tags[k] = awsclients.String(v) - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/neptune/dbcluster/setup.go b/pkg/controller/neptune/dbcluster/setup.go index 3d25db3209..0e76bfac95 100644 --- a/pkg/controller/neptune/dbcluster/setup.go +++ b/pkg/controller/neptune/dbcluster/setup.go @@ -33,6 +33,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/neptune/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -74,6 +75,7 @@ func SetupDBCluster(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.DBClusterGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.DBCluster{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/notification/snstopic/controller.go b/pkg/controller/notification/snstopic/controller.go index 1b39e0c156..2dffeb918d 100644 --- a/pkg/controller/notification/snstopic/controller.go +++ b/pkg/controller/notification/snstopic/controller.go @@ -39,6 +39,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" notclient "github.com/crossplane-contrib/provider-aws/pkg/clients/notification" "github.com/crossplane-contrib/provider-aws/pkg/clients/sns" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -67,7 +68,7 @@ func SetupSNSTopic(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(notificationv1alpha1.SNSTopicGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: sns.NewTopicClient}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), ¬ificationv1alpha1.SNSTopic{})), managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), diff --git a/pkg/controller/prometheusservice/workspace/setup.go b/pkg/controller/prometheusservice/workspace/setup.go index ee42994af3..d83388787a 100644 --- a/pkg/controller/prometheusservice/workspace/setup.go +++ b/pkg/controller/prometheusservice/workspace/setup.go @@ -6,9 +6,7 @@ import ( "github.com/aws/aws-sdk-go/aws" svcsdk "github.com/aws/aws-sdk-go/service/prometheusservice" - "github.com/pkg/errors" ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1" "github.com/crossplane/crossplane-runtime/pkg/connection" @@ -21,14 +19,10 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/prometheusservice/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) -const ( - errNotWorkspace = "managed resource is not an Workspace custom resource" - errKubeUpdateFailed = "cannot update Workspace custom resource" -) - // SetupWorkspace adds a controller that reconciles Workspace for PrometheusService. func SetupWorkspace(mgr ctrl.Manager, o controller.Options) error { name := managed.ControllerName(svcapitypes.WorkspaceGroupKind) @@ -54,7 +48,10 @@ func SetupWorkspace(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.WorkspaceGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &svcapitypes.Workspace{}), + ), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -115,21 +112,3 @@ func postDelete(_ context.Context, cr *svcapitypes.Workspace, obj *svcsdk.Delete } return err } - -type tagger struct { - kube client.Client -} - -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*svcapitypes.Workspace) - if !ok { - return errors.New(errNotWorkspace) - } - if cr.Spec.ForProvider.Tags == nil { - cr.Spec.ForProvider.Tags = map[string]*string{} - } - for k, v := range resource.GetExternalTags(mg) { - cr.Spec.ForProvider.Tags[k] = awsclients.String(v) - } - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} diff --git a/pkg/controller/rds/dbcluster/setup.go b/pkg/controller/rds/dbcluster/setup.go index 549510f28a..f34b865d88 100644 --- a/pkg/controller/rds/dbcluster/setup.go +++ b/pkg/controller/rds/dbcluster/setup.go @@ -22,6 +22,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/rds" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -54,6 +55,7 @@ func SetupDBCluster(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.DBClusterGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.DBCluster{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/rds/dbclusterparametergroup/setup.go b/pkg/controller/rds/dbclusterparametergroup/setup.go index 8d9d763002..c3e93678f4 100644 --- a/pkg/controller/rds/dbclusterparametergroup/setup.go +++ b/pkg/controller/rds/dbclusterparametergroup/setup.go @@ -21,6 +21,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/rds/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -60,6 +61,7 @@ func SetupDBClusterParameterGroup(mgr ctrl.Manager, o controller.Options) error resource.ManagedKind(svcapitypes.DBClusterParameterGroupGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.DBClusterParameterGroup{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/rds/dbinstance/setup.go b/pkg/controller/rds/dbinstance/setup.go index c6ed4f55fc..c11e0fbf1f 100644 --- a/pkg/controller/rds/dbinstance/setup.go +++ b/pkg/controller/rds/dbinstance/setup.go @@ -30,6 +30,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/rds" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -75,6 +76,7 @@ func SetupDBInstance(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.DBInstanceGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.DBInstance{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/rds/dbparametergroup/setup.go b/pkg/controller/rds/dbparametergroup/setup.go index c6d450c26a..6c90e9b12e 100644 --- a/pkg/controller/rds/dbparametergroup/setup.go +++ b/pkg/controller/rds/dbparametergroup/setup.go @@ -20,6 +20,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/rds/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -59,6 +60,7 @@ func SetupDBParameterGroup(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.DBParameterGroupGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.DBParameterGroup{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/redshift/controller.go b/pkg/controller/redshift/controller.go index 9b6d2eca85..a2b80455e5 100644 --- a/pkg/controller/redshift/controller.go +++ b/pkg/controller/redshift/controller.go @@ -39,6 +39,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/redshift" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -71,6 +72,7 @@ func SetupCluster(mgr ctrl.Manager, o controller.Options) error { managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: redshift.NewClient}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &redshiftv1alpha1.Cluster{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/route53resolver/resolverendpoint/hooks.go b/pkg/controller/route53resolver/resolverendpoint/hooks.go index d0197e06ab..5e2c0426b9 100644 --- a/pkg/controller/route53resolver/resolverendpoint/hooks.go +++ b/pkg/controller/route53resolver/resolverendpoint/hooks.go @@ -18,6 +18,7 @@ import ( route53resolverv1alpha1 "github.com/crossplane-contrib/provider-aws/apis/route53resolver/v1alpha1" svcapitypes "github.com/crossplane-contrib/provider-aws/apis/route53resolver/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -47,7 +48,7 @@ func SetupResolverEndpoint(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, cpresource.ManagedKind(route53resolverv1alpha1.ResolverEndpointGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &route53resolverv1alpha1.ResolverEndpoint{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/route53resolver/resolverrule/hooks.go b/pkg/controller/route53resolver/resolverrule/hooks.go index 103d711527..68577cbeef 100644 --- a/pkg/controller/route53resolver/resolverrule/hooks.go +++ b/pkg/controller/route53resolver/resolverrule/hooks.go @@ -18,6 +18,7 @@ import ( route53resolverv1alpha1 "github.com/crossplane-contrib/provider-aws/apis/route53resolver/v1alpha1" svcapitypes "github.com/crossplane-contrib/provider-aws/apis/route53resolver/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -47,7 +48,7 @@ func SetupResolverRule(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, cpresource.ManagedKind(route53resolverv1alpha1.ResolverRuleGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &route53resolverv1alpha1.ResolverRule{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/secretsmanager/secret/setup.go b/pkg/controller/secretsmanager/secret/setup.go index e2085b25b9..c759944333 100644 --- a/pkg/controller/secretsmanager/secret/setup.go +++ b/pkg/controller/secretsmanager/secret/setup.go @@ -18,7 +18,6 @@ import ( "context" "encoding/json" "fmt" - "sort" svcsdk "github.com/aws/aws-sdk-go/service/secretsmanager" "github.com/aws/aws-sdk-go/service/secretsmanager/secretsmanageriface" @@ -41,12 +40,11 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/secretsmanager/v1beta1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) const ( - errNotSecret = "managed resource is not a secret custom resource" - errKubeUpdateFailed = "failed to update Secret custom resource" errCreateTags = "failed to create tags for the secret" errRemoveTags = "failed to remove tags for the secret" errFmtKeyNotFound = "key %s is not found in referenced Kubernetes secret" @@ -93,7 +91,11 @@ func SetupSecret(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(svcapitypes.SecretGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(managed.NewDefaultProviderConfig(mgr.GetClient()), managed.NewNameAsExternalName(mgr.GetClient()), &tagger{kube: mgr.GetClient()}), + managed.WithInitializers( + managed.NewDefaultProviderConfig(mgr.GetClient()), + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &svcapitypes.Secret{}), + ), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), @@ -394,35 +396,6 @@ func preDelete(_ context.Context, cr *svcapitypes.Secret, obj *svcsdk.DeleteSecr return false, nil } -type tagger struct { - kube client.Client -} - -// TODO(knappek): split this out as it is used in several controllers -func (t *tagger) Initialize(ctx context.Context, mg resource.Managed) error { - cr, ok := mg.(*svcapitypes.Secret) - if !ok { - return errors.New(errNotSecret) - } - tagMap := map[string]string{} - for _, tags := range cr.Spec.ForProvider.Tags { - tagMap[awsclients.StringValue(tags.Key)] = awsclients.StringValue(tags.Value) - } - for k, v := range resource.GetExternalTags(mg) { - tagMap[k] = v - } - cr.Spec.ForProvider.Tags = make([]*svcapitypes.Tag, len(tagMap)) - i := 0 - for k, v := range tagMap { - cr.Spec.ForProvider.Tags[i] = &svcapitypes.Tag{Key: awsclients.String(k), Value: awsclients.String(v)} - i++ - } - sort.Slice(cr.Spec.ForProvider.Tags, func(i, j int) bool { - return awsclients.StringValue(cr.Spec.ForProvider.Tags[i].Key) < awsclients.StringValue(cr.Spec.ForProvider.Tags[j].Key) - }) - return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed) -} - // DiffTags returns tags that should be added or removed. func DiffTags(spec []*svcapitypes.Tag, current []*svcsdk.Tag) (addTags []*svcsdk.Tag, remove []*string) { addMap := make(map[string]string, len(spec)) diff --git a/pkg/controller/servicediscovery/httpnamespace/setup.go b/pkg/controller/servicediscovery/httpnamespace/setup.go index 12cbdce51a..0aa7a6083c 100644 --- a/pkg/controller/servicediscovery/httpnamespace/setup.go +++ b/pkg/controller/servicediscovery/httpnamespace/setup.go @@ -31,6 +31,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/servicediscovery/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/controller/servicediscovery/commonnamespace" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -60,7 +61,7 @@ func SetupHTTPNamespace(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.HTTPNamespaceGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.HTTPNamespace{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/servicediscovery/privatednsnamespace/setup.go b/pkg/controller/servicediscovery/privatednsnamespace/setup.go index 0864c0413e..4c12410939 100644 --- a/pkg/controller/servicediscovery/privatednsnamespace/setup.go +++ b/pkg/controller/servicediscovery/privatednsnamespace/setup.go @@ -31,6 +31,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/servicediscovery/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/controller/servicediscovery/commonnamespace" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -60,7 +61,7 @@ func SetupPrivateDNSNamespace(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.PrivateDNSNamespaceGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.PrivateDNSNamespace{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/servicediscovery/publicdnsnamespace/setup.go b/pkg/controller/servicediscovery/publicdnsnamespace/setup.go index da195e242e..dffdbc76df 100644 --- a/pkg/controller/servicediscovery/publicdnsnamespace/setup.go +++ b/pkg/controller/servicediscovery/publicdnsnamespace/setup.go @@ -31,6 +31,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/servicediscovery/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/controller/servicediscovery/commonnamespace" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -60,7 +61,7 @@ func SetupPublicDNSNamespace(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.PublicDNSNamespaceGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.PublicDNSNamespace{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/sfn/activity/hooks.go b/pkg/controller/sfn/activity/hooks.go index 4dae91d912..a9cf4fcb8c 100644 --- a/pkg/controller/sfn/activity/hooks.go +++ b/pkg/controller/sfn/activity/hooks.go @@ -33,6 +33,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/sfn/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -60,7 +61,7 @@ func SetupActivity(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.ActivityGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.Activity{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/sfn/statemachine/hooks.go b/pkg/controller/sfn/statemachine/hooks.go index adc1561e1d..e4d85676e2 100644 --- a/pkg/controller/sfn/statemachine/hooks.go +++ b/pkg/controller/sfn/statemachine/hooks.go @@ -33,6 +33,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/sfn/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" aws "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -61,7 +62,7 @@ func SetupStateMachine(mgr ctrl.Manager, o controller.Options) error { Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.StateMachineGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.StateMachine{})), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), diff --git a/pkg/controller/sns/topic/controller.go b/pkg/controller/sns/topic/controller.go index 594e609d2e..03a46e0fa3 100644 --- a/pkg/controller/sns/topic/controller.go +++ b/pkg/controller/sns/topic/controller.go @@ -39,6 +39,7 @@ import ( awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/sns" snsclient "github.com/crossplane-contrib/provider-aws/pkg/clients/sns" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -67,7 +68,7 @@ func SetupSNSTopic(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(v1beta1.TopicGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: sns.NewTopicClient}), managed.WithReferenceResolver(managed.NewAPISimpleReferenceResolver(mgr.GetClient())), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &v1beta1.Topic{})), managed.WithConnectionPublishers(), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), diff --git a/pkg/controller/sqs/queue/controller.go b/pkg/controller/sqs/queue/controller.go index cca74e9500..38fce4f347 100644 --- a/pkg/controller/sqs/queue/controller.go +++ b/pkg/controller/sqs/queue/controller.go @@ -39,6 +39,7 @@ import ( "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclient "github.com/crossplane-contrib/provider-aws/pkg/clients" "github.com/crossplane-contrib/provider-aws/pkg/clients/sqs" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -71,6 +72,7 @@ func SetupQueue(mgr ctrl.Manager, o controller.Options) error { resource.ManagedKind(v1beta1.QueueGroupVersionKind), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), newClientFn: sqs.NewClient}), managed.WithPollInterval(o.PollInterval), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &v1beta1.Queue{})), managed.WithLogger(o.Logger.WithValues("controller", name)), managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), managed.WithConnectionPublishers(cps...))) diff --git a/pkg/controller/transfer/server/setup.go b/pkg/controller/transfer/server/setup.go index f260dd2888..c7b6423d2c 100644 --- a/pkg/controller/transfer/server/setup.go +++ b/pkg/controller/transfer/server/setup.go @@ -30,6 +30,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/transfer/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -58,7 +59,7 @@ func SetupServer(mgr ctrl.Manager, o controller.Options) error { For(&svcapitypes.Server{}). Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.ServerGroupVersionKind), - managed.WithInitializers(), + managed.WithInitializers(common.NewTagger(mgr.GetClient(), &svcapitypes.Server{})), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)), diff --git a/pkg/controller/transfer/user/setup.go b/pkg/controller/transfer/user/setup.go index 3a62715df5..3336facb1b 100644 --- a/pkg/controller/transfer/user/setup.go +++ b/pkg/controller/transfer/user/setup.go @@ -30,6 +30,7 @@ import ( svcapitypes "github.com/crossplane-contrib/provider-aws/apis/transfer/v1alpha1" "github.com/crossplane-contrib/provider-aws/apis/v1alpha1" awsclients "github.com/crossplane-contrib/provider-aws/pkg/clients" + "github.com/crossplane-contrib/provider-aws/pkg/controller/common" "github.com/crossplane-contrib/provider-aws/pkg/features" ) @@ -57,7 +58,10 @@ func SetupUser(mgr ctrl.Manager, o controller.Options) error { For(&svcapitypes.User{}). Complete(managed.NewReconciler(mgr, resource.ManagedKind(svcapitypes.UserGroupVersionKind), - managed.WithInitializers(managed.NewNameAsExternalName(mgr.GetClient())), + managed.WithInitializers( + managed.NewNameAsExternalName(mgr.GetClient()), + common.NewTagger(mgr.GetClient(), &svcapitypes.User{}), + ), managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}), managed.WithPollInterval(o.PollInterval), managed.WithLogger(o.Logger.WithValues("controller", name)),