Skip to content

Commit ce55a40

Browse files
authored
remove terraformer (#1617)
* remove terraformer * test fixes * cleanup
1 parent 200f833 commit ce55a40

File tree

31 files changed

+440
-2392
lines changed

31 files changed

+440
-2392
lines changed

.ci/testruns/default/templates/testrun.yaml

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -54,46 +54,13 @@ spec:
5454
key: secretAccessKey
5555

5656
testflow:
57-
- name: infrastructure-test-tf
57+
- name: infrastructure-test
5858
definition:
5959
name: infrastructure-test
6060
config:
6161
- name: REGION
6262
type: env
6363
value: eu-west-1
64-
- name: RECONCILER
65-
type: env
66-
value: tf
67-
- name: infrastructure-test-flow
68-
definition:
69-
name: infrastructure-test
70-
config:
71-
- name: REGION
72-
type: env
73-
value: eu-west-1
74-
- name: RECONCILER
75-
type: env
76-
value: flow
77-
- name: infrastructure-test-migrate
78-
definition:
79-
name: infrastructure-test
80-
config:
81-
- name: REGION
82-
type: env
83-
value: eu-west-1
84-
- name: RECONCILER
85-
type: env
86-
value: migrate
87-
- name: infrastructure-test-recover
88-
definition:
89-
name: infrastructure-test
90-
config:
91-
- name: REGION
92-
type: env
93-
value: eu-west-1
94-
- name: RECONCILER
95-
type: env
96-
value: recover
9764
- name: backupbucket-test
9865
definition:
9966
name: backupbucket-test

.test-defs/apply-flow-aws.yaml

Lines changed: 0 additions & 23 deletions
This file was deleted.

.test-defs/infrastructure-test.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ spec:
1515
--access-key-id=$ACCESS_KEY_ID
1616
--secret-access-key=$SECRET_ACCESS_KEY
1717
--region=$REGION
18-
--reconciler="${RECONCILER}"
1918
2019
image: golang:1.25
2120
resources:

Makefile

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ EXTENSION_NAMESPACE := garden
2424
GARDEN_KUBECONFIG ?=
2525

2626
PLATFORM := linux/amd64
27-
RECONCILER := flow
2827

2928
WEBHOOK_PARAM := --webhook-config-url=$(WEBHOOK_CONFIG_URL)
3029
ifeq ($(WEBHOOK_CONFIG_MODE), service)
@@ -181,7 +180,6 @@ integration-test-infra:
181180
--access-key-id='$(shell cat $(ACCESS_KEY_ID_FILE))' \
182181
--secret-access-key='$(shell cat $(SECRET_ACCESS_KEY_FILE))' \
183182
--region=$(REGION) \
184-
--reconciler=$(RECONCILER)
185183

186184
.PHONY: integration-test-bastion
187185
integration-test-bastion:

cmd/gardener-extension-provider-aws/app/app.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"context"
99
"fmt"
1010
"os"
11+
"strings"
1112
"time"
1213

1314
druidcorev1alpha1 "github.com/gardener/etcd-druid/api/core/v1alpha1"
@@ -20,10 +21,13 @@ import (
2021
webhookcmd "github.com/gardener/gardener/extensions/pkg/webhook/cmd"
2122
"github.com/gardener/gardener/pkg/client/kubernetes"
2223
gardenerhealthz "github.com/gardener/gardener/pkg/healthz"
24+
kutil "github.com/gardener/gardener/pkg/utils/kubernetes"
2325
machinev1alpha1 "github.com/gardener/machine-controller-manager/pkg/apis/machine/v1alpha1"
26+
"github.com/go-logr/logr"
2427
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
2528
"github.com/spf13/cobra"
2629
corev1 "k8s.io/api/core/v1"
30+
rbacv1 "k8s.io/api/rbac/v1"
2731
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2832
vpaautoscalingv1 "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1"
2933
"k8s.io/component-base/version/verflag"
@@ -273,6 +277,13 @@ func NewControllerManagerCommand(ctx context.Context) *cobra.Command {
273277
return fmt.Errorf("error running manager: %w", err)
274278
}
275279

280+
// TODO (kon-angelo): Remove after the release of version 1.68.0
281+
if err := mgr.Add(manager.RunnableFunc(func(ctx context.Context) error {
282+
return purgeTerraformerRBACResources(ctx, mgr.GetClient(), log)
283+
})); err != nil {
284+
return fmt.Errorf("error adding terraformer migrations: %w", err)
285+
}
286+
276287
return nil
277288
},
278289
}
@@ -282,3 +293,75 @@ func NewControllerManagerCommand(ctx context.Context) *cobra.Command {
282293

283294
return cmd
284295
}
296+
297+
// TODO (kon-angelo): Remove after the release of version 1.68.0
298+
func purgeTerraformerRBACResources(ctx context.Context, c client.Client, log logr.Logger) error {
299+
log.Info("Starting the deletion of obsolete terraformer resources")
300+
301+
const (
302+
terraformerRoleName = "gardener.cloud:system:terraformer"
303+
)
304+
305+
var (
306+
roleBindingList = &rbacv1.RoleBindingList{}
307+
roleList = &rbacv1.RoleList{}
308+
serviceAccountList = &corev1.ServiceAccountList{}
309+
)
310+
311+
// list serviceAccount bindings in all namespaces
312+
if err := c.List(ctx, roleBindingList); err != nil {
313+
return fmt.Errorf("failed to list RoleBindings: %w", err)
314+
}
315+
316+
for _, roleBinding := range roleBindingList.Items {
317+
if strings.EqualFold(roleBinding.Name, terraformerRoleName) {
318+
log.Info("Deleting RoleBinding", "roleBinding", client.ObjectKeyFromObject(&roleBinding))
319+
if err := kutil.DeleteObject(
320+
ctx,
321+
c,
322+
&rbacv1.RoleBinding{ObjectMeta: metav1.ObjectMeta{Namespace: roleBinding.Namespace, Name: roleBinding.Name}},
323+
); err != nil {
324+
return fmt.Errorf("failed to delete roleBinding %s: %w", client.ObjectKeyFromObject(&roleBinding), err)
325+
}
326+
}
327+
}
328+
log.Info("Successfully deleted the obsolete RoleBindings for terraformer")
329+
330+
if err := c.List(ctx, roleList); err != nil {
331+
return fmt.Errorf("failed to list roles: %w", err)
332+
}
333+
334+
for _, role := range roleList.Items {
335+
if strings.EqualFold(role.Name, terraformerRoleName) {
336+
log.Info("Deleting Role", "role", client.ObjectKeyFromObject(&role))
337+
if err := kutil.DeleteObject(
338+
ctx,
339+
c,
340+
&rbacv1.Role{ObjectMeta: metav1.ObjectMeta{Namespace: role.Namespace, Name: role.Name}},
341+
); err != nil {
342+
return fmt.Errorf("failed to delete Role %s: %w", client.ObjectKeyFromObject(&role), err)
343+
}
344+
}
345+
}
346+
log.Info("Successfully deleted the obsolete Roles for terraformer")
347+
348+
if err := c.List(ctx, serviceAccountList); err != nil {
349+
return fmt.Errorf("failed to list roles: %w", err)
350+
}
351+
352+
for _, serviceAccount := range serviceAccountList.Items {
353+
if strings.EqualFold(serviceAccount.Name, "terraformer") {
354+
log.Info("Deleting ServiceAccount", "serviceAccount", client.ObjectKeyFromObject(&serviceAccount))
355+
if err := kutil.DeleteObject(
356+
ctx,
357+
c,
358+
&corev1.ServiceAccount{ObjectMeta: metav1.ObjectMeta{Namespace: serviceAccount.Namespace, Name: serviceAccount.Name}},
359+
); err != nil {
360+
return fmt.Errorf("failed to delete ServiceAccount %s: %w", client.ObjectKeyFromObject(&serviceAccount), err)
361+
}
362+
}
363+
}
364+
log.Info("Successfully deleted the obsolete ServiceAccounts for terraformer")
365+
366+
return nil
367+
}

go.mod

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ go 1.25.0
55

66
require (
77
github.com/Masterminds/semver/v3 v3.4.0
8-
github.com/Masterminds/sprig v2.22.0+incompatible
98
github.com/ahmetb/gen-crd-api-reference-docs v0.3.0
109
github.com/aws/aws-sdk-go-v2 v1.41.1
1110
github.com/aws/aws-sdk-go-v2/config v1.32.7
@@ -54,7 +53,6 @@ require (
5453
dario.cat/mergo v1.0.2 // indirect
5554
github.com/BurntSushi/toml v1.5.0 // indirect
5655
github.com/Masterminds/goutils v1.1.1 // indirect
57-
github.com/Masterminds/semver v1.5.0 // indirect
5856
github.com/Masterminds/sprig/v3 v3.3.0 // indirect
5957
github.com/PaesslerAG/gval v1.2.4 // indirect
6058
github.com/PaesslerAG/jsonpath v0.1.2-0.20240726212847-3a740cf7976f // indirect
@@ -115,7 +113,6 @@ require (
115113
github.com/hashicorp/go-multierror v1.1.1 // indirect
116114
github.com/hashicorp/go-version v1.7.0 // indirect
117115
github.com/huandu/xstrings v1.5.0 // indirect
118-
github.com/imdario/mergo v0.3.16 // indirect
119116
github.com/inconshreveable/mousetrap v1.1.0 // indirect
120117
github.com/ironcore-dev/vgopath v0.1.5 // indirect
121118
github.com/josharian/intern v1.0.0 // indirect

go.sum

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -744,12 +744,8 @@ github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1v
744744
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
745745
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
746746
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
747-
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
748-
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
749747
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
750748
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
751-
github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60=
752-
github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
753749
github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs=
754750
github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0=
755751
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
@@ -1185,8 +1181,6 @@ github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI
11851181
github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
11861182
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
11871183
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
1188-
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
1189-
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
11901184
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
11911185
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
11921186
github.com/ionos-cloud/sdk-go/v6 v6.3.0 h1:/lTieTH9Mo/CWm3cTlFLnK10jgxjUGkAqRffGqvPteY=

imagevector/images.yaml

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -375,17 +375,3 @@ images:
375375
integrity_requirement: high
376376
availability_requirement: low
377377
signing: false
378-
- name: terraformer
379-
sourceRepository: github.com/gardener/terraformer
380-
repository: europe-docker.pkg.dev/gardener-project/releases/gardener/terraformer-aws
381-
tag: v2.28.0
382-
labels:
383-
- name: gardener.cloud/cve-categorisation
384-
value:
385-
network_exposure: protected
386-
authentication_enforced: false
387-
user_interaction: gardener-operator
388-
confidentiality_requirement: high
389-
integrity_requirement: high
390-
availability_requirement: low
391-
signing: false

imagevector/imagevector.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import (
99

1010
"github.com/gardener/gardener/pkg/utils/imagevector"
1111
"k8s.io/apimachinery/pkg/util/runtime"
12-
13-
"github.com/gardener/gardener-extension-provider-aws/pkg/aws"
1412
)
1513

1614
// ImagesYAML contains the content of the images.yaml file
@@ -33,10 +31,3 @@ func init() {
3331
func ImageVector() imagevector.ImageVector {
3432
return imageVector
3533
}
36-
37-
// TerraformerImage returns the Terraformer image.
38-
func TerraformerImage() string {
39-
image, err := imageVector.FindImage(aws.TerraformerImageName)
40-
runtime.Must(err)
41-
return image.String()
42-
}

pkg/apis/aws/helper/scheme.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,40 @@
55
package helper
66

77
import (
8+
"encoding/json"
89
"errors"
910
"fmt"
1011

1112
"github.com/gardener/gardener/extensions/pkg/controller"
1213
"github.com/gardener/gardener/extensions/pkg/util"
1314
extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1"
15+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1416
"k8s.io/apimachinery/pkg/runtime"
17+
"k8s.io/apimachinery/pkg/runtime/schema"
1518
"k8s.io/apimachinery/pkg/runtime/serializer"
1619
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1720
k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
1821

1922
api "github.com/gardener/gardener-extension-provider-aws/pkg/apis/aws"
2023
"github.com/gardener/gardener-extension-provider-aws/pkg/apis/aws/install"
24+
apiv1alpha1 "github.com/gardener/gardener-extension-provider-aws/pkg/apis/aws/v1alpha1"
2125
)
2226

2327
var (
2428
// Scheme is a Scheme with the types relevant for AWS actuators.
2529
Scheme *runtime.Scheme
2630

2731
decoder runtime.Decoder
32+
33+
lenientDecoder runtime.Decoder
2834
)
2935

3036
func init() {
3137
Scheme = runtime.NewScheme()
3238
utilruntime.Must(install.AddToScheme(Scheme))
3339

3440
decoder = serializer.NewCodecFactory(Scheme, serializer.EnableStrict).UniversalDecoder()
41+
lenientDecoder = serializer.NewCodecFactory(Scheme).UniversalDecoder()
3542
}
3643

3744
// CloudProfileConfigFromCluster decodes the provider specific cloud profile configuration for a cluster
@@ -132,3 +139,43 @@ func WorkloadIdentityConfigFromBytes(config []byte) (*api.WorkloadIdentityConfig
132139
}
133140
return workloadIdentityConfig, nil
134141
}
142+
143+
// HasFlowState returns true if the group version of the State field in the provided
144+
// `extensionsv1alpha1.InfrastructureStatus` is aws.provider.extensions.gardener.cloud/v1alpha1.
145+
func HasFlowState(status extensionsv1alpha1.InfrastructureStatus) (bool, error) {
146+
if status.State == nil {
147+
return true, nil
148+
}
149+
150+
flowState := unstructured.Unstructured{}
151+
stateJson, err := status.State.MarshalJSON()
152+
if err != nil {
153+
return false, err
154+
}
155+
156+
if err := json.Unmarshal(stateJson, &flowState); err != nil {
157+
return false, err
158+
}
159+
160+
return flowState.GroupVersionKind() == schema.GroupVersionKind{
161+
Group: apiv1alpha1.SchemeGroupVersion.Group,
162+
Version: apiv1alpha1.SchemeGroupVersion.Version,
163+
Kind: "InfrastructureState",
164+
}, nil
165+
}
166+
167+
// InfrastructureStateFromRaw extracts the state from the Infrastructure. If no state was available, it returns a "zero" value InfrastructureState object.
168+
func InfrastructureStateFromRaw(raw *runtime.RawExtension) (*api.InfrastructureState, error) {
169+
state := &api.InfrastructureState{}
170+
if raw != nil && raw.Raw != nil {
171+
if _, _, err := lenientDecoder.Decode(raw.Raw, nil, state); err != nil {
172+
return nil, err
173+
}
174+
}
175+
176+
if state.Data == nil {
177+
state.Data = make(map[string]string)
178+
}
179+
180+
return state, nil
181+
}

0 commit comments

Comments
 (0)