Skip to content

Commit cb7b149

Browse files
authored
Merge pull request #67 from spectrocloud/maasstaticip
Added maasmachine controller
2 parents 734a2cf + 37c3c69 commit cb7b149

File tree

6 files changed

+359
-22
lines changed

6 files changed

+359
-22
lines changed

Makefile

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ ALL_ARCH = amd64 arm64
1919

2020
REGISTRY ?= gcr.io/spectro-dev-public/$(USER)/${RELEASE_LOC}
2121
IMAGE_NAME ?= capv-static-ip
22+
MAAS_IMAGE_NAME ?= capmaas-static-ip
2223
CONTROLLER_IMG ?= $(REGISTRY)/$(IMAGE_NAME)
24+
MAAS_CONTROLLER_IMG ?= $(REGISTRY)/$(MAAS_IMAGE_NAME)
2325
CONTROLLER_IMG_TAG ?= $(CONTROLLER_IMG):$(TAG)
2426
STATIC_IP_IMG ?= ${REGISTRY}/${IMAGE_NAME}:${TAG}
2527

@@ -100,8 +102,9 @@ docker-build: ## Build the docker image for controller-manager
100102
docker-push: ## Push the docker image
101103
docker push $(CONTROLLER_IMG)-$(ARCH):$(TAG)
102104

103-
docker-rmi: ## Remove the local docker image
104-
docker rmi $(CONTROLLER_IMG)-$(ARCH):$(TAG)
105+
docker-rmi: ## Remove the local docker images
106+
docker rmi $(CONTROLLER_IMG)-$(ARCH):$(TAG) || true
107+
docker rmi $(MAAS_CONTROLLER_IMG)-$(ARCH):$(TAG) || true
105108

106109
## --------------------------------------
107110
## Docker — All ARCH
@@ -112,20 +115,27 @@ docker-build-all: $(addprefix docker-build-,$(ALL_ARCH))
112115

113116
docker-build-%:
114117
$(MAKE) ARCH=$* docker-build
118+
docker tag $(CONTROLLER_IMG)-$*:$(TAG) $(MAAS_CONTROLLER_IMG)-$*:$(TAG)
115119

116120
.PHONY: docker-push-all ## Push all the architecture docker images
117121
docker-push-all: $(addprefix docker-push-,$(ALL_ARCH))
118122
$(MAKE) docker-push-manifest
119123

120124
docker-push-%:
121125
$(MAKE) ARCH=$* docker-push
126+
docker push $(MAAS_CONTROLLER_IMG)-$*:$(TAG)
122127

123128
.PHONY: docker-push-manifest
124-
docker-push-manifest: ## Push the fat manifest docker image.
129+
docker-push-manifest: ## Push the fat manifest docker images.
125130
## Minimum docker version 18.06.0 is required for creating and pushing manifest images.
131+
# Push capv-static-ip image manifest
126132
docker manifest create --amend $(CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CONTROLLER_IMG)\-&:$(TAG)~g")
127133
@for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CONTROLLER_IMG}:${TAG} ${CONTROLLER_IMG}-$${arch}:${TAG}; done
128134
docker manifest push --purge ${CONTROLLER_IMG}:${TAG}
135+
# Push capmaas-static-ip image manifest
136+
docker manifest create --amend $(MAAS_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(MAAS_CONTROLLER_IMG)\-&:$(TAG)~g")
137+
@for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${MAAS_CONTROLLER_IMG}:${TAG} ${MAAS_CONTROLLER_IMG}-$${arch}:${TAG}; done
138+
docker manifest push --purge ${MAAS_CONTROLLER_IMG}:${TAG}
129139

130140

131141
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)

config/rbac/role.yaml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,32 @@ rules:
8989
- get
9090
- list
9191
- watch
92+
- apiGroups:
93+
- infrastructure.cluster.x-k8s.io
94+
resources:
95+
- maasmachines
96+
verbs:
97+
- get
98+
- list
99+
- patch
100+
- update
101+
- watch
102+
- apiGroups:
103+
- infrastructure.cluster.x-k8s.io
104+
resources:
105+
- maasmachines/status
106+
verbs:
107+
- get
108+
- patch
109+
- update
110+
- apiGroups:
111+
- infrastructure.cluster.x-k8s.io
112+
resources:
113+
- maasmachinetemplates
114+
verbs:
115+
- get
116+
- list
117+
- watch
92118
- apiGroups:
93119
- ipam.metal3.io
94120
resources:
Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
/*
2+
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package controllers
18+
19+
import (
20+
"context"
21+
"fmt"
22+
"time"
23+
24+
"github.com/go-logr/logr"
25+
"github.com/pkg/errors"
26+
infrav1 "github.com/spectrocloud/cluster-api-provider-maas/api/v1beta1"
27+
"github.com/spectrocloud/cluster-api-provider-vsphere-static-ip/pkg/ipam"
28+
"github.com/spectrocloud/cluster-api-provider-vsphere-static-ip/pkg/ipam/factory"
29+
_ "github.com/spectrocloud/cluster-api-provider-vsphere-static-ip/pkg/ipam/metal3io"
30+
"github.com/spectrocloud/cluster-api-provider-vsphere-static-ip/pkg/util"
31+
"k8s.io/apimachinery/pkg/runtime"
32+
"k8s.io/apimachinery/pkg/types"
33+
capi "sigs.k8s.io/cluster-api/api/v1beta1"
34+
clusterutilv1 "sigs.k8s.io/cluster-api/util"
35+
ctrl "sigs.k8s.io/controller-runtime"
36+
"sigs.k8s.io/controller-runtime/pkg/client"
37+
)
38+
39+
// MaasMachineReconciler reconciles a MaasMachine object
40+
type MaasMachineReconciler struct {
41+
client.Client
42+
Log logr.Logger
43+
Scheme *runtime.Scheme
44+
}
45+
46+
// +kubebuilder:rbac:groups=controlplane.cluster.x-k8s.io,resources=kubeadmcontrolplanes,verbs=get;list;watch
47+
// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=maasmachinetemplates,verbs=get;list;watch;update;patch
48+
// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=maasmachines,verbs=get;list;watch;update;patch
49+
// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=maasmachines/status,verbs=get;update;patch
50+
// +kubebuilder:rbac:groups=cluster.x-k8s.io,resources=machines;machines/status,verbs=get;list;watch
51+
// +kubebuilder:rbac:groups="",resources=events,verbs=get;list;watch;create;update;patch
52+
// +kubebuilder:rbac:groups=cluster.x-k8s.io,resources=clusters;clusters/status,verbs=get;list;watch
53+
// +kubebuilder:rbac:groups=ipam.metal3.io,resources=ippools,verbs=get;list;watch;update;patch
54+
// +kubebuilder:rbac:groups=ipam.metal3.io,resources=ippools/status,verbs=get;update;patch
55+
// +kubebuilder:rbac:groups=ipam.metal3.io,resources=ipclaims,verbs=get;list;watch;create;update;patch;delete
56+
// +kubebuilder:rbac:groups=ipam.metal3.io,resources=ipclaims/status,verbs=get;update;patch
57+
// +kubebuilder:rbac:groups=ipam.metal3.io,resources=ipaddresses,verbs=get;list;watch;create;update;patch;delete
58+
// +kubebuilder:rbac:groups=ipam.metal3.io,resources=ipaddresses/status,verbs=get;update;patch
59+
60+
func (r *MaasMachineReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
61+
log := r.Log.WithValues("maasmachine", req.NamespacedName)
62+
var res *ctrl.Result
63+
var err error
64+
65+
maasMachine := &infrav1.MaasMachine{}
66+
if err := r.Get(ctx, req.NamespacedName, maasMachine); err != nil {
67+
return ctrl.Result{}, util.IgnoreNotFound(err)
68+
}
69+
70+
//handle the case where gvk is empty
71+
if maasMachine.GroupVersionKind().Empty() {
72+
log.V(0).Info("setting the missing gvk for maasMachine")
73+
maasMachine.Kind = "MaasMachine"
74+
maasMachine.APIVersion = infrav1.GroupVersion.String()
75+
}
76+
77+
// fetch the capi machine.
78+
machine, err := clusterutilv1.GetOwnerMachine(ctx, r.Client, maasMachine.ObjectMeta)
79+
if err != nil {
80+
return ctrl.Result{}, err
81+
}
82+
if machine == nil {
83+
log.V(0).Info("waiting for machine controller to set ownerRef on MaasMachine")
84+
return ctrl.Result{}, nil
85+
}
86+
87+
// fetch the capi cluster
88+
cluster, err := clusterutilv1.GetClusterFromMetadata(ctx, r.Client, machine.ObjectMeta)
89+
if err != nil {
90+
log.V(0).Info("machine is missing cluster label or cluster does not exist")
91+
return ctrl.Result{}, nil
92+
}
93+
94+
res, err = r.reconcileMaasMachineIPAddress(cluster, maasMachine)
95+
if err != nil {
96+
log.Error(err, "failed to reconcile MaasMachine IP")
97+
}
98+
99+
if res == nil {
100+
res = &ctrl.Result{}
101+
}
102+
103+
return *res, err
104+
}
105+
106+
func (r *MaasMachineReconciler) reconcileMaasMachineIPAddress(cluster *capi.Cluster, maasMachine *infrav1.MaasMachine) (*ctrl.Result, error) {
107+
if maasMachine == nil {
108+
r.Log.V(0).Info("invalid MaasMachine, skipping reconcile IPAddress")
109+
return &ctrl.Result{}, nil
110+
}
111+
112+
log := r.Log.WithValues("maasMachine", maasMachine.Name, "namespace", maasMachine.Namespace)
113+
log.V(0).Info("reconcile IP address for MaasMachine")
114+
115+
// Check if static IP is enabled
116+
if maasMachine.Spec.StaticIP == nil {
117+
log.V(0).Info("MaasMachine static IP is not enabled, skipping IP allocation")
118+
return &ctrl.Result{}, nil
119+
}
120+
121+
// Check if IP address is already allocated
122+
if maasMachine.Spec.StaticIP.IP != "" {
123+
log.V(0).Info("IP address is already allocated for MaasMachine", "ipAddress", maasMachine.Spec.StaticIP.IP)
124+
return &ctrl.Result{}, nil
125+
}
126+
127+
dataPatch := client.MergeFrom(maasMachine.DeepCopy())
128+
newIpamFunc, ok := factory.IpamFactory[ipam.IpamTypeMetal3io]
129+
if !ok {
130+
log.V(0).Info("ipam type not supported")
131+
return &ctrl.Result{}, nil
132+
}
133+
134+
ipamFunc := newIpamFunc(r.Client, log)
135+
136+
poolMatchLabels, err := r.getIPPoolMatchLabels(r.Client, maasMachine)
137+
if err != nil {
138+
log.Error(err, "failed to get IPPool match labels")
139+
return &ctrl.Result{}, nil
140+
}
141+
ipPool, err := ipamFunc.GetAvailableIPPool(poolMatchLabels, cluster.ObjectMeta)
142+
if err != nil {
143+
log.Error(err, "failed to get an available IPPool")
144+
return &ctrl.Result{}, nil
145+
}
146+
if ipPool == nil {
147+
log.V(0).Info("waiting for IPPool to be available")
148+
return &ctrl.Result{}, nil
149+
}
150+
151+
ipName := maasMachine.Name
152+
ip, err := ipamFunc.GetIP(ipName, ipPool)
153+
if err != nil {
154+
return &ctrl.Result{}, errors.Wrapf(err, "failed to get allocated IP address for MaasMachine %s", maasMachine.Name)
155+
}
156+
157+
if ip == nil {
158+
if _, err := ipamFunc.AllocateIP(ipName, ipPool, maasMachine); err != nil {
159+
return &ctrl.Result{}, errors.Wrapf(err, "failed to allocate IP address for MaasMachine: %s", maasMachine.Name)
160+
}
161+
162+
log.V(0).Info("waiting for IP address to be available for the MaasMachine")
163+
return &ctrl.Result{RequeueAfter: 30 * time.Second}, nil
164+
}
165+
166+
if err := util.ValidateIP(ip); err != nil {
167+
return &ctrl.Result{}, errors.Wrapf(err, "invalid IP address retrieved for MaasMachine: %s", maasMachine.Name)
168+
}
169+
170+
log.V(0).Info("static IP selected for MaasMachine", "IPAddressName", ip.GetName())
171+
172+
ipAddr := util.GetAddress(ip)
173+
log.V(0).Info("assigning IP address to MaasMachine", "IPAddress", ipAddr)
174+
175+
// Set the IP address and network configuration in the MaasMachine spec
176+
if maasMachine.Spec.StaticIP == nil {
177+
maasMachine.Spec.StaticIP = &infrav1.StaticIPConfig{}
178+
}
179+
180+
// Update the MaasMachineTemplate with the IP address
181+
vmTemplateName, ok := maasMachine.GetAnnotations()[capi.TemplateClonedFromNameAnnotation]
182+
if ok {
183+
maasMachineTemplate := &infrav1.MaasMachineTemplate{}
184+
key := types.NamespacedName{Namespace: maasMachine.Namespace, Name: vmTemplateName}
185+
186+
if err := r.Get(context.TODO(), key, maasMachineTemplate); err == nil {
187+
// Check if template already has the correct IP
188+
if maasMachineTemplate.Spec.Template.Spec.StaticIP == nil ||
189+
maasMachineTemplate.Spec.Template.Spec.StaticIP.IP != ipAddr {
190+
templatePatch := client.MergeFrom(maasMachineTemplate.DeepCopy())
191+
192+
// Initialize StaticIP if nil
193+
if maasMachineTemplate.Spec.Template.Spec.StaticIP == nil {
194+
maasMachineTemplate.Spec.Template.Spec.StaticIP = &infrav1.StaticIPConfig{}
195+
}
196+
197+
maasMachineTemplate.Spec.Template.Spec.StaticIP.IP = ipAddr
198+
199+
if err := r.Patch(context.TODO(), maasMachineTemplate, templatePatch); err != nil {
200+
log.Error(err, "failed to patch MaasMachineTemplate with static IP")
201+
}
202+
}
203+
}
204+
}
205+
// Set the allocated IP address
206+
maasMachine.Spec.StaticIP.IP = ipAddr
207+
208+
if err := r.Patch(context.TODO(), maasMachine, dataPatch); err != nil {
209+
return &ctrl.Result{}, errors.Wrapf(err, "failed to patch MaasMachine %s", maasMachine.Name)
210+
}
211+
212+
log.V(0).Info("successfully reconciled IP address for MaasMachine")
213+
214+
return &ctrl.Result{}, nil
215+
}
216+
217+
func (r *MaasMachineReconciler) getIPPoolMatchLabels(cli client.Client, maasMachine *infrav1.MaasMachine) (map[string]string, error) {
218+
219+
//match labels for the IPPool are retrieved from the MaasMachineTemplate
220+
vmTemplateName, ok := maasMachine.GetAnnotations()[capi.TemplateClonedFromNameAnnotation]
221+
if !ok {
222+
return nil, fmt.Errorf("MaasMachine %s has no value set in the 'cloned-from-name' annotation", maasMachine.Name)
223+
}
224+
225+
maasMachineTemplate := &infrav1.MaasMachineTemplate{}
226+
key := types.NamespacedName{Namespace: maasMachine.Namespace, Name: vmTemplateName}
227+
if err := cli.Get(context.Background(), key, maasMachineTemplate); err != nil {
228+
return nil, fmt.Errorf("failed to get MaasMachineTemplate %s", vmTemplateName)
229+
}
230+
231+
return maasMachineTemplate.GetLabels(), nil
232+
}
233+
234+
func (r *MaasMachineReconciler) SetupWithManager(mgr ctrl.Manager) error {
235+
return ctrl.NewControllerManagedBy(mgr).
236+
For(&infrav1.MaasMachine{}).
237+
Complete(r)
238+
}

go.mod

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
module github.com/spectrocloud/cluster-api-provider-vsphere-static-ip
22

3-
go 1.23.0
3+
go 1.24.2
44

5-
toolchain go1.23.7
5+
toolchain go1.24.5
66

77
require (
88
github.com/ghodss/yaml v1.0.0
@@ -12,6 +12,7 @@ require (
1212
github.com/onsi/ginkgo/v2 v2.22.2
1313
github.com/onsi/gomega v1.36.2
1414
github.com/pkg/errors v0.9.1
15+
github.com/spectrocloud/cluster-api-provider-maas v0.5.1-0.20250731170852-067010dcfbdc
1516
github.com/spf13/pflag v1.0.6
1617
github.com/stretchr/testify v1.10.0
1718
k8s.io/api v0.32.2
@@ -103,10 +104,12 @@ require (
103104
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
104105
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 // indirect
105106
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
106-
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect
107+
sigs.k8s.io/structured-merge-diff/v4 v4.4.3 // indirect
107108
sigs.k8s.io/yaml v1.4.0 // indirect
108109
)
109110

111+
replace github.com/spectrocloud/cluster-api-provider-maas => github.com/spectrocloud/cluster-api-provider-maas v0.5.1-0.20250815013702-51c775d09dac
112+
110113
// github.com/metal3-io/ip-address-manager/api => github.com/metal3-io/ip-address-manager/api v0.0.0-20210929111944-d66dc8cb0347
111114
// replace sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.9.0-rc.0.0.20250303134942-c9261b079e0b
112115

go.sum

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,10 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
146146
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
147147
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
148148
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
149+
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
150+
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
151+
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
152+
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
149153
github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
150154
github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
151155
github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
@@ -174,6 +178,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
174178
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
175179
github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js=
176180
github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
181+
github.com/spectrocloud/cluster-api-provider-maas v0.5.1-0.20250815013702-51c775d09dac h1:lKBzWgveK30+CBBIo6ARKsAxfdYoEXXONWx3obBeijM=
182+
github.com/spectrocloud/cluster-api-provider-maas v0.5.1-0.20250815013702-51c775d09dac/go.mod h1:bQNkmi/Ymyub/b94gzwDW5dba1t0oyX5n6ThcgqN65s=
177183
github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
178184
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
179185
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
@@ -306,6 +312,8 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
306312
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
307313
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
308314
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
315+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
316+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
309317
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
310318
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
311319
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -341,7 +349,7 @@ sigs.k8s.io/controller-runtime v0.19.6 h1:fuq53qTLQ7aJTA7aNsklNnu7eQtSFqJUomOyM+
341349
sigs.k8s.io/controller-runtime v0.19.6/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4=
342350
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
343351
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
344-
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA=
345-
sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
352+
sigs.k8s.io/structured-merge-diff/v4 v4.4.3 h1:sCP7Vv3xx/CWIuTPVN38lUPx0uw0lcLfzaiDa8Ja01A=
353+
sigs.k8s.io/structured-merge-diff/v4 v4.4.3/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
346354
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
347355
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=

0 commit comments

Comments
 (0)