Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .golangci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ linters:
- gosec
- importas
- misspell
- modernize
- nilerr
- nolintlint
- prealloc
Expand Down
4 changes: 1 addition & 3 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
module github.com/stackitcloud/gardener-extension-provider-stackit/v2

go 1.25.6

toolchain go1.26.1
go 1.26.1

require (
github.com/Masterminds/semver/v3 v3.4.0
Expand Down
3 changes: 1 addition & 2 deletions pkg/admission/mutator/mutator.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
extensionswebhook "github.com/gardener/gardener/extensions/pkg/webhook"
gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/utils/ptr"
"sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/manager"

Expand All @@ -32,7 +31,7 @@ func New(mgr manager.Manager) (*extensionswebhook.Webhook, error) {
Path: "/webhooks/mutate",
Mutators: map[extensionswebhook.Mutator][]extensionswebhook.Type{
NewShootMutator(mgr): {{Obj: &gardencorev1beta1.Shoot{}}},
NewNamespacedCloudProfileMutator(mgr): {{Obj: &gardencorev1beta1.NamespacedCloudProfile{}, Subresource: ptr.To("status")}},
NewNamespacedCloudProfileMutator(mgr): {{Obj: &gardencorev1beta1.NamespacedCloudProfile{}, Subresource: new("status")}},
},
Target: extensionswebhook.TargetSeed,
ObjectSelector: &metav1.LabelSelector{
Expand Down
5 changes: 2 additions & 3 deletions pkg/admission/mutator/namespacedcloudprofile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/utils/ptr"
"sigs.k8s.io/controller-runtime/pkg/client"
fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/manager"
Expand Down Expand Up @@ -66,7 +65,7 @@ var _ = Describe("NamespacedCloudProfile Mutator", func() {
})

It("should skip if NamespacedCloudProfile is in deletion phase", func() {
namespacedCloudProfile.DeletionTimestamp = ptr.To(metav1.Now())
namespacedCloudProfile.DeletionTimestamp = new(metav1.Now())
expectedProfile := namespacedCloudProfile.DeepCopy()

Expect(namespacedCloudProfileMutator.Mutate(ctx, namespacedCloudProfile, nil)).To(Succeed())
Expand Down Expand Up @@ -140,7 +139,7 @@ var _ = Describe("NamespacedCloudProfile Mutator", func() {
"Name": Equal("image-1"),
"Versions": ContainElements(
stackitv1alpha1.MachineImageVersion{Version: "1.0", Image: "image-name-1", Regions: []stackitv1alpha1.RegionIDMapping{{Name: "image-region-1", ID: "id-img-reg-1"}}},
stackitv1alpha1.MachineImageVersion{Version: "1.1", Image: "image-name-2", Regions: []stackitv1alpha1.RegionIDMapping{{Name: "image-region-2", ID: "id-img-reg-2", Architecture: ptr.To("armhf")}}},
stackitv1alpha1.MachineImageVersion{Version: "1.1", Image: "image-name-2", Regions: []stackitv1alpha1.RegionIDMapping{{Name: "image-region-2", ID: "id-img-reg-2", Architecture: new("armhf")}}},
),
}),
MatchFields(IgnoreExtras, Fields{
Expand Down
3 changes: 1 addition & 2 deletions pkg/admission/mutator/shoot.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import (
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/apimachinery/pkg/runtime/serializer/json"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/utils/ptr"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/manager"

Expand Down Expand Up @@ -120,7 +119,7 @@ func isShootInMigrationOrRestorePhase(shoot *gardencorev1beta1.Shoot) bool {
// and disables the ntp service.
func (s *shoot) mutateMachineImageVersion(shoot *gardencorev1beta1.Shoot) error {
ptpOverride := configv1alpha1.ExtensionConfig{NTP: &configv1alpha1.NTPConfig{
Enabled: ptr.To(false),
Enabled: new(false),
}}
providerConfigBuf := new(bytes.Buffer)
err := encoder.Encode(&ptpOverride, providerConfigBuf)
Expand Down
41 changes: 20 additions & 21 deletions pkg/admission/mutator/shoot_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import (
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/apimachinery/pkg/runtime/serializer/json"
"k8s.io/utils/ptr"

"github.com/stackitcloud/gardener-extension-provider-stackit/v2/pkg/stackit"
)
Expand Down Expand Up @@ -53,7 +52,7 @@ var _ = Describe("Shoot mutator", func() {

// Prepare the expected RawExtension for ProviderConfig
ptpOverride := configv1alpha1.ExtensionConfig{NTP: &configv1alpha1.NTPConfig{
Enabled: ptr.To(false),
Enabled: new(false),
}}
buffer := new(bytes.Buffer)

Expand All @@ -71,7 +70,7 @@ var _ = Describe("Shoot mutator", func() {
Kubernetes: gardencorev1beta1.Kubernetes{
Version: "1.28.2",
},
SeedName: ptr.To("stackit"),
SeedName: new("stackit"),
Provider: gardencorev1beta1.Provider{
Type: stackit.Type,
Workers: []gardencorev1beta1.Worker{
Expand All @@ -81,7 +80,7 @@ var _ = Describe("Shoot mutator", func() {
Type: "c1.2",
Image: &gardencorev1beta1.ShootMachineImage{
Name: "coreos",
Version: ptr.To("4152.2.3"),
Version: new("4152.2.3"),
},
},
},
Expand All @@ -91,16 +90,16 @@ var _ = Describe("Shoot mutator", func() {
Type: "c1.2",
Image: &gardencorev1beta1.ShootMachineImage{
Name: "ubuntu", // Non-coreos
Version: ptr.To("22.04"),
Version: new("22.04"),
},
},
},
},
},
Region: "eu01",
Networking: &gardencorev1beta1.Networking{
Nodes: ptr.To("10.250.0.0/16"),
Type: ptr.To("calico"),
Nodes: new("10.250.0.0/16"),
Type: new("calico"),
IPFamilies: []gardencorev1beta1.IPFamily{gardencorev1beta1.IPFamilyIPv4},
},
},
Expand All @@ -123,7 +122,7 @@ var _ = Describe("Shoot mutator", func() {
Type: gardencorev1beta1.LastOperationTypeReconcile,
State: gardencorev1beta1.LastOperationStateProcessing,
}
shoot.Status.SeedName = ptr.To("gcp-new") // Different from Spec.SeedName
shoot.Status.SeedName = new("gcp-new") // Different from Spec.SeedName
shootExpected := shoot.DeepCopy()

err := shootMutator.Mutate(ctx, shoot, oldShoot)
Expand Down Expand Up @@ -202,21 +201,21 @@ var _ = Describe("Shoot mutator", func() {
Expect(err).NotTo(HaveOccurred())

// worker1 (coreos 4152.2.3) - should not get ProviderConfig because version < 4230.2.1
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.Version).To(Equal(ptr.To("4152.2.3")))
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.Version).To(Equal(new("4152.2.3")))
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.ProviderConfig).To(BeNil())

// worker2 (ubuntu 22.04) - should be untouched
Expect(shoot.Spec.Provider.Workers[1]).To(DeepEqual(shootExpected.Spec.Provider.Workers[1]))
})

It("should not mutate image version but should set ProviderConfig for coreos worker with exact target version", func() {
shoot.Spec.Provider.Workers[0].Machine.Image.Version = ptr.To(FlatcarImageVersion) // Set to exact target
shoot.Spec.Provider.Workers[0].Machine.Image.Version = new(FlatcarImageVersion) // Set to exact target

err := shootMutator.Mutate(ctx, shoot, nil)
Expect(err).NotTo(HaveOccurred())

// Version should remain FlatcarImageVersion
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.Version).To(Equal(ptr.To(FlatcarImageVersion)))
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.Version).To(Equal(new(FlatcarImageVersion)))
// ProviderConfig should be set (because version >= FlatcarImageVersion)
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.ProviderConfig).To(DeepEqual(expectedPTPDisabledProviderConfig))

Expand All @@ -225,13 +224,13 @@ var _ = Describe("Shoot mutator", func() {
})

It("should not mutate image version but should set ProviderConfig for coreos worker with newer version", func() {
shoot.Spec.Provider.Workers[0].Machine.Image.Version = ptr.To("4300.0.0") // Newer version
shoot.Spec.Provider.Workers[0].Machine.Image.Version = new("4300.0.0") // Newer version

err := shootMutator.Mutate(ctx, shoot, nil)
Expect(err).NotTo(HaveOccurred())

// Version should remain 4300.0.0
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.Version).To(Equal(ptr.To("4300.0.0")))
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.Version).To(Equal(new("4300.0.0")))
// ProviderConfig should be set (because version >= FlatcarImageVersion)
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.ProviderConfig).To(DeepEqual(expectedPTPDisabledProviderConfig))
})
Expand All @@ -241,7 +240,7 @@ var _ = Describe("Shoot mutator", func() {
Expect(err).NotTo(HaveOccurred())

// Version should remain 4152.2.3 (not mutated)
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.Version).To(Equal(ptr.To("4152.2.3")))
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.Version).To(Equal(new("4152.2.3")))
// ProviderConfig should be nil (because version < FlatcarImageVersion)
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.ProviderConfig).To(BeNil())
})
Expand All @@ -253,7 +252,7 @@ var _ = Describe("Shoot mutator", func() {
Machine: gardencorev1beta1.Machine{
Image: &gardencorev1beta1.ShootMachineImage{
Name: "coreos",
Version: ptr.To("4100.0.0"), // Older
Version: new("4100.0.0"), // Older
},
},
},
Expand All @@ -262,7 +261,7 @@ var _ = Describe("Shoot mutator", func() {
Machine: gardencorev1beta1.Machine{
Image: &gardencorev1beta1.ShootMachineImage{
Name: "coreos",
Version: ptr.To("4230.2.1"), // Exact target
Version: new("4230.2.1"), // Exact target
},
},
},
Expand All @@ -271,7 +270,7 @@ var _ = Describe("Shoot mutator", func() {
Machine: gardencorev1beta1.Machine{
Image: &gardencorev1beta1.ShootMachineImage{
Name: "coreos",
Version: ptr.To("4500.0.0"), // Newer
Version: new("4500.0.0"), // Newer
},
},
},
Expand All @@ -280,7 +279,7 @@ var _ = Describe("Shoot mutator", func() {
Machine: gardencorev1beta1.Machine{
Image: &gardencorev1beta1.ShootMachineImage{
Name: "suse-jeos",
Version: ptr.To("15.5"),
Version: new("15.5"),
},
},
},
Expand All @@ -292,15 +291,15 @@ var _ = Describe("Shoot mutator", func() {
Expect(err).NotTo(HaveOccurred())

// old-coreos: version unchanged, ProviderConfig nil
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.Version).To(Equal(ptr.To("4100.0.0")))
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.Version).To(Equal(new("4100.0.0")))
Expect(shoot.Spec.Provider.Workers[0].Machine.Image.ProviderConfig).To(BeNil())

// new-coreos: version unchanged, ProviderConfig set
Expect(shoot.Spec.Provider.Workers[1].Machine.Image.Version).To(Equal(ptr.To("4230.2.1")))
Expect(shoot.Spec.Provider.Workers[1].Machine.Image.Version).To(Equal(new("4230.2.1")))
Expect(shoot.Spec.Provider.Workers[1].Machine.Image.ProviderConfig).To(DeepEqual(expectedPTPDisabledProviderConfig))

// newer-coreos: version unchanged, ProviderConfig set
Expect(shoot.Spec.Provider.Workers[2].Machine.Image.Version).To(Equal(ptr.To("4500.0.0")))
Expect(shoot.Spec.Provider.Workers[2].Machine.Image.Version).To(Equal(new("4500.0.0")))
Expect(shoot.Spec.Provider.Workers[2].Machine.Image.ProviderConfig).To(DeepEqual(expectedPTPDisabledProviderConfig))

// other-os: untouched
Expand Down
3 changes: 1 addition & 2 deletions pkg/admission/validator/namespacedcloudprofile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import (
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/apimachinery/pkg/util/validation/field"
"k8s.io/utils/ptr"
"sigs.k8s.io/controller-runtime/pkg/client"
fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/manager"
Expand Down Expand Up @@ -77,7 +76,7 @@ var _ = Describe("NamespacedCloudProfile Validator", func() {
})

It("should succeed if NamespacedCloudProfile is in deletion phase", func() {
namespacedCloudProfile.DeletionTimestamp = ptr.To(metav1.Now())
namespacedCloudProfile.DeletionTimestamp = new(metav1.Now())

Expect(namespacedCloudProfileValidator.Validate(ctx, namespacedCloudProfile, nil)).To(Succeed())
})
Expand Down
4 changes: 2 additions & 2 deletions pkg/apis/config/loader/loader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ func TestLoader(t *testing.T) {
var _ = Describe("Loader", func() {
Describe("#Load", func() {
buildConfigYAML := func(customLabelDomain string) []byte {
return []byte(fmt.Sprintf(`apiVersion: stackit.provider.extensions.config.stackit.cloud/v1alpha1
return fmt.Appendf(nil, `apiVersion: stackit.provider.extensions.config.stackit.cloud/v1alpha1
kind: ControllerConfiguration
customLabelDomain: %s
`, customLabelDomain))
`, customLabelDomain)
}

It("should apply defaults when data is empty", func() {
Expand Down
2 changes: 1 addition & 1 deletion pkg/apis/stackit/helper/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func FindImageFromCloudProfile(cloudProfileConfig *stackitv1alpha1.CloudProfileC
return &stackitv1alpha1.MachineImage{
Name: imageName,
Version: imageVersion,
Architecture: ptr.To(v1beta1constants.ArchitectureAMD64),
Architecture: new(v1beta1constants.ArchitectureAMD64),
Image: version.Image,
}, nil
}
Expand Down
Loading