Skip to content

Commit 4b368a6

Browse files
committed
Update sync logic
Updated sync logic for OpenStackCluster and OpenStackMachine like CAPA.
1 parent e69cb7e commit 4b368a6

8 files changed

+218
-6
lines changed

api/v1alpha3/openstackmachine_types.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ type OpenStackMachineSpec struct {
3333
// ProviderID is the unique identifier as specified by the cloud provider.
3434
ProviderID *string `json:"providerID,omitempty"`
3535

36+
// InstanceID is the OpenStack instance ID for this machine.
37+
InstanceID *string `json:"instanceID,omitempty"`
38+
3639
// The name of the secret containing the openstack credentials
3740
// +optional
3841
CloudsSecret *corev1.SecretReference `json:"cloudsSecret"`

api/v1alpha3/openstackmachine_webhook.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ func (r *OpenStackMachine) ValidateUpdate(old runtime.Object) error {
7272
delete(oldOpenStackMachineSpec, "providerID")
7373
delete(newOpenStackMachineSpec, "providerID")
7474

75+
// allow changes to instanceID
76+
delete(oldOpenStackMachineSpec, "instanceID")
77+
delete(newOpenStackMachineSpec, "instanceID")
78+
7579
if !reflect.DeepEqual(oldOpenStackMachineSpec, newOpenStackMachineSpec) {
7680
allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "cannot be modified"))
7781
}

api/v1alpha3/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachines.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ spec:
9090
If the RootVolume is specified, this will be ignored and use rootVolume
9191
directly.
9292
type: string
93+
instanceID:
94+
description: InstanceID is the OpenStack instance ID for this machine.
95+
type: string
9396
networks:
9497
description: A networks object. Required parameter when there are
9598
multiple networks defined for the tenant. When you do not specify

config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachinetemplates.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ spec:
8282
instance. If the RootVolume is specified, this will be ignored
8383
and use rootVolume directly.
8484
type: string
85+
instanceID:
86+
description: InstanceID is the OpenStack instance ID for this
87+
machine.
88+
type: string
8589
networks:
8690
description: A networks object. Required parameter when there
8791
are multiple networks defined for the tenant. When you do

controllers/openstackcluster_controller.go

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package controllers
1919
import (
2020
"context"
2121
"fmt"
22+
"reflect"
2223

2324
"github.com/go-logr/logr"
2425
"github.com/gophercloud/gophercloud"
@@ -41,7 +42,11 @@ import (
4142
"sigs.k8s.io/controller-runtime/pkg/client"
4243
"sigs.k8s.io/controller-runtime/pkg/controller"
4344
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
45+
"sigs.k8s.io/controller-runtime/pkg/event"
46+
"sigs.k8s.io/controller-runtime/pkg/handler"
47+
"sigs.k8s.io/controller-runtime/pkg/predicate"
4448
"sigs.k8s.io/controller-runtime/pkg/reconcile"
49+
"sigs.k8s.io/controller-runtime/pkg/source"
4550
)
4651

4752
// OpenStackClusterReconciler reconciles a OpenStackCluster object
@@ -433,9 +438,109 @@ func (r *OpenStackClusterReconciler) reconcileNetworkComponents(log logr.Logger,
433438
}
434439

435440
func (r *OpenStackClusterReconciler) SetupWithManager(mgr ctrl.Manager, options controller.Options) error {
436-
return ctrl.NewControllerManagedBy(mgr).
441+
controller, err := ctrl.NewControllerManagedBy(mgr).
437442
WithOptions(options).
438443
For(&infrav1.OpenStackCluster{}).
439444
WithEventFilter(pausedPredicates(r.Log)).
440-
Complete(r)
445+
WithEventFilter(
446+
predicate.Funcs{
447+
// Avoid reconciling if the event triggering the reconciliation is related to incremental status updates
448+
// for OpenStackCluster resources only
449+
UpdateFunc: func(e event.UpdateEvent) bool {
450+
if e.ObjectOld.GetObjectKind().GroupVersionKind().Kind != "OpenStackCluster" {
451+
return true
452+
}
453+
454+
oldCluster := e.ObjectOld.(*infrav1.OpenStackCluster).DeepCopy()
455+
newCluster := e.ObjectNew.(*infrav1.OpenStackCluster).DeepCopy()
456+
457+
oldCluster.Status = infrav1.OpenStackClusterStatus{}
458+
newCluster.Status = infrav1.OpenStackClusterStatus{}
459+
460+
oldCluster.ObjectMeta.ResourceVersion = ""
461+
newCluster.ObjectMeta.ResourceVersion = ""
462+
463+
return !reflect.DeepEqual(oldCluster, newCluster)
464+
},
465+
},
466+
).
467+
Build(r)
468+
if err != nil {
469+
return errors.Wrap(err, "error creating controller")
470+
}
471+
472+
return controller.Watch(
473+
&source.Kind{Type: &clusterv1.Cluster{}},
474+
&handler.EnqueueRequestsFromMapFunc{
475+
ToRequests: handler.ToRequestsFunc(r.requeueOpenStackClusterForUnpausedCluster),
476+
},
477+
predicate.Funcs{
478+
UpdateFunc: func(e event.UpdateEvent) bool {
479+
oldCluster := e.ObjectOld.(*clusterv1.Cluster)
480+
newCluster := e.ObjectNew.(*clusterv1.Cluster)
481+
log := r.Log.WithValues("predicate", "updateEvent", "namespace", newCluster.Namespace, "cluster", newCluster.Name)
482+
switch {
483+
// return true if Cluster.Spec.Paused has changed from true to false
484+
case oldCluster.Spec.Paused && !newCluster.Spec.Paused:
485+
log.V(4).Info("Cluster was unpaused, will attempt to map associated OpenStackCluster.")
486+
return true
487+
// otherwise, return false
488+
default:
489+
log.V(4).Info("Cluster did not match expected conditions, will not attempt to map associated OpenStackCluster.")
490+
return false
491+
}
492+
},
493+
CreateFunc: func(e event.CreateEvent) bool {
494+
cluster := e.Object.(*clusterv1.Cluster)
495+
log := r.Log.WithValues("predicate", "createEvent", "namespace", cluster.Namespace, "cluster", cluster.Name)
496+
497+
// Only need to trigger a reconcile if the Cluster.Spec.Paused is false
498+
if !cluster.Spec.Paused {
499+
log.V(4).Info("Cluster is not paused, will attempt to map associated OpenStackCluster.")
500+
return true
501+
}
502+
log.V(4).Info("Cluster did not match expected conditions, will not attempt to map associated OpenStackCluster.")
503+
return false
504+
},
505+
DeleteFunc: func(e event.DeleteEvent) bool {
506+
log := r.Log.WithValues("predicate", "deleteEvent", "namespace", e.Meta.GetNamespace(), "cluster", e.Meta.GetName())
507+
log.V(4).Info("Cluster did not match expected conditions, will not attempt to map associated OpenStackCluster.")
508+
return false
509+
},
510+
GenericFunc: func(e event.GenericEvent) bool {
511+
log := r.Log.WithValues("predicate", "genericEvent", "namespace", e.Meta.GetNamespace(), "cluster", e.Meta.GetName())
512+
log.V(4).Info("Cluster did not match expected conditions, will not attempt to map associated OpenStackCluster.")
513+
return false
514+
},
515+
},
516+
)
517+
}
518+
519+
func (r *OpenStackClusterReconciler) requeueOpenStackClusterForUnpausedCluster(o handler.MapObject) []ctrl.Request {
520+
c := o.Object.(*clusterv1.Cluster)
521+
log := r.Log.WithValues("objectMapper", "clusterToOpenStackCluster", "namespace", c.Namespace, "cluster", c.Name)
522+
523+
// Don't handle deleted clusters
524+
if !c.ObjectMeta.DeletionTimestamp.IsZero() {
525+
log.V(4).Info("Cluster has a deletion timestamp, skipping mapping.")
526+
return nil
527+
}
528+
529+
// Make sure the ref is set
530+
if c.Spec.InfrastructureRef == nil {
531+
log.V(4).Info("Cluster does not have an InfrastructureRef, skipping mapping.")
532+
return nil
533+
}
534+
535+
if c.Spec.InfrastructureRef.GroupVersionKind().Kind != "OpenStackCluster" {
536+
log.V(4).Info("Cluster has an InfrastructureRef for a different type, skipping mapping.")
537+
return nil
538+
}
539+
540+
log.V(4).Info("Adding request.", "openstackCluster", c.Spec.InfrastructureRef.Name)
541+
return []ctrl.Request{
542+
{
543+
NamespacedName: client.ObjectKey{Namespace: c.Namespace, Name: c.Spec.InfrastructureRef.Name},
544+
},
545+
}
441546
}

controllers/openstackmachine_controller.go

Lines changed: 87 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"encoding/base64"
2222
"fmt"
23+
"reflect"
2324
"time"
2425

2526
"github.com/go-logr/logr"
@@ -28,6 +29,7 @@ import (
2829
"github.com/pkg/errors"
2930
corev1 "k8s.io/api/core/v1"
3031
apierrors "k8s.io/apimachinery/pkg/api/errors"
32+
"k8s.io/apimachinery/pkg/runtime"
3133
"k8s.io/apimachinery/pkg/types"
3234
"k8s.io/client-go/tools/record"
3335
"k8s.io/utils/pointer"
@@ -51,6 +53,8 @@ import (
5153
)
5254

5355
const (
56+
InstanceIDIndex = ".spec.instanceID"
57+
5458
waitForClusterInfrastructureReadyDuration = 15 * time.Second
5559
)
5660

@@ -121,7 +125,7 @@ func (r *OpenStackMachineReconciler) Reconcile(req ctrl.Request) (_ ctrl.Result,
121125
return ctrl.Result{}, err
122126
}
123127

124-
// Always patch the openStackMachine when exiting this function so we can persist any AWSMachine changes.
128+
// Always patch the openStackMachine when exiting this function so we can persist any OpenStackMachine changes.
125129
defer func() {
126130
if err := patchHelper.Patch(ctx, openStackMachine); err != nil {
127131
if reterr == nil {
@@ -154,12 +158,41 @@ func (r *OpenStackMachineReconciler) SetupWithManager(mgr ctrl.Manager, options
154158
&handler.EnqueueRequestsFromMapFunc{ToRequests: handler.ToRequestsFunc(r.OpenStackClusterToOpenStackMachines)},
155159
).
156160
WithEventFilter(pausedPredicates(r.Log)).
161+
WithEventFilter(
162+
predicate.Funcs{
163+
// Avoid reconciling if the event triggering the reconciliation is related to incremental status updates
164+
// for OpenStackMachine resources only
165+
UpdateFunc: func(e event.UpdateEvent) bool {
166+
if e.ObjectOld.GetObjectKind().GroupVersionKind().Kind != "OpenStackMachine" {
167+
return true
168+
}
169+
170+
oldMachine := e.ObjectOld.(*infrav1.OpenStackMachine).DeepCopy()
171+
newMachine := e.ObjectNew.(*infrav1.OpenStackMachine).DeepCopy()
172+
173+
oldMachine.Status = infrav1.OpenStackMachineStatus{}
174+
newMachine.Status = infrav1.OpenStackMachineStatus{}
175+
176+
oldMachine.ObjectMeta.ResourceVersion = ""
177+
newMachine.ObjectMeta.ResourceVersion = ""
178+
179+
return !reflect.DeepEqual(oldMachine, newMachine)
180+
},
181+
},
182+
).
157183
Build(r)
158-
159184
if err != nil {
160185
return err
161186
}
162187

188+
// Add index to OpenStackMachine to find by providerID
189+
if err := mgr.GetFieldIndexer().IndexField(&infrav1.OpenStackMachine{},
190+
InstanceIDIndex,
191+
r.indexOpenStackMachineByInstanceID,
192+
); err != nil {
193+
return errors.Wrap(err, "error setting index fields")
194+
}
195+
163196
return controller.Watch(
164197
&source.Kind{Type: &clusterv1.Cluster{}},
165198
&handler.EnqueueRequestsFromMapFunc{
@@ -169,13 +202,48 @@ func (r *OpenStackMachineReconciler) SetupWithManager(mgr ctrl.Manager, options
169202
UpdateFunc: func(e event.UpdateEvent) bool {
170203
oldCluster := e.ObjectOld.(*clusterv1.Cluster)
171204
newCluster := e.ObjectNew.(*clusterv1.Cluster)
172-
return oldCluster.Spec.Paused && !newCluster.Spec.Paused
205+
log := r.Log.WithValues("predicate", "updateEvent", "namespace", newCluster.Namespace, "cluster", newCluster.Name)
206+
207+
switch {
208+
// never return true for a paused Cluster
209+
case newCluster.Spec.Paused:
210+
log.V(4).Info("Cluster is paused, will not attempt to map associated OpenStackMachine.")
211+
return false
212+
// return true if Cluster.Status.InfrastructureReady has changed from false to true
213+
case !oldCluster.Status.InfrastructureReady && newCluster.Status.InfrastructureReady:
214+
log.V(4).Info("Cluster InfrastructureReady became ready, will attempt to map associated OpenStackMachine.")
215+
return true
216+
// return true if Cluster.Spec.Paused has changed from true to false
217+
case oldCluster.Spec.Paused && !newCluster.Spec.Paused:
218+
log.V(4).Info("Cluster was unpaused, will attempt to map associated OpenStackMachine.")
219+
return true
220+
// otherwise, return false
221+
default:
222+
log.V(4).Info("Cluster did not match expected conditions, will not attempt to map associated OpenStackMachine.")
223+
return false
224+
}
173225
},
174226
CreateFunc: func(e event.CreateEvent) bool {
175227
cluster := e.Object.(*clusterv1.Cluster)
176-
return !cluster.Spec.Paused
228+
log := r.Log.WithValues("predicateEvent", "create", "namespace", cluster.Namespace, "cluster", cluster.Name)
229+
230+
// Only need to trigger a reconcile if the Cluster.Spec.Paused is false and
231+
// Cluster.Status.InfrastructureReady is true
232+
if !cluster.Spec.Paused && cluster.Status.InfrastructureReady {
233+
log.V(4).Info("Cluster is not paused and has infrastructure ready, will attempt to map associated OpenStackMachine.")
234+
return true
235+
}
236+
log.V(4).Info("Cluster did not match expected conditions, will not attempt to map associated OpenStackMachine.")
237+
return false
177238
},
178239
DeleteFunc: func(e event.DeleteEvent) bool {
240+
log := r.Log.WithValues("predicateEvent", "delete", "namespace", e.Meta.GetNamespace(), "cluster", e.Meta.GetName())
241+
log.V(4).Info("Cluster did not match expected conditions, will not attempt to map associated OpenStackMachine.")
242+
return false
243+
},
244+
GenericFunc: func(e event.GenericEvent) bool {
245+
log := r.Log.WithValues("predicateEvent", "generic", "namespace", e.Meta.GetNamespace(), "cluster", e.Meta.GetName())
246+
log.V(4).Info("Cluster did not match expected conditions, will not attempt to map associated OpenStackMachine.")
179247
return false
180248
},
181249
},
@@ -316,6 +384,7 @@ func (r *OpenStackMachineReconciler) reconcileNormal(ctx context.Context, logger
316384
// TODO(sbueringer) From CAPA: TODO(ncdc): move this validation logic into a validating webhook (for us: create validation logic in webhook)
317385

318386
openStackMachine.Spec.ProviderID = pointer.StringPtr(fmt.Sprintf("openstack:///%s", instance.ID))
387+
openStackMachine.Spec.InstanceID = pointer.StringPtr(instance.ID)
319388

320389
openStackMachine.Status.InstanceState = &instance.State
321390

@@ -493,3 +562,17 @@ func (r *OpenStackMachineReconciler) requestsForCluster(namespace, name string)
493562
}
494563
return result
495564
}
565+
566+
func (r *OpenStackMachineReconciler) indexOpenStackMachineByInstanceID(o runtime.Object) []string {
567+
openstackMachine, ok := o.(*infrav1.OpenStackMachine)
568+
if !ok {
569+
r.Log.Error(errors.New("incorrect type"), "expected an OpenStackMachine", "type", fmt.Sprintf("%T", o))
570+
return nil
571+
}
572+
573+
if openstackMachine.Spec.InstanceID != nil {
574+
return []string{*openstackMachine.Spec.InstanceID}
575+
}
576+
577+
return nil
578+
}

go.sum

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1Gn
1515
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
1616
github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k=
1717
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
18+
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
1819
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
1920
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
2021
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
@@ -31,6 +32,7 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
3132
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
3233
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
3334
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
35+
github.com/alessio/shellescape v0.0.0-20190409004728-b115ca0f9053 h1:H/GMMKYPkEIC3DF/JWQz8Pdd+Feifov2EIgGfNpeogI=
3436
github.com/alessio/shellescape v0.0.0-20190409004728-b115ca0f9053/go.mod h1:xW8sBma2LE3QxFSzCnH9qe6gAE2yO9GvQaWwX89HxbE=
3537
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
3638
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
@@ -294,6 +296,7 @@ github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7
294296
github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk=
295297
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
296298
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
299+
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
297300
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
298301
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
299302
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
@@ -626,6 +629,7 @@ gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
626629
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
627630
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
628631
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
632+
gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71 h1:Xe2gvTZUJpsvOWUnvmL/tmhVBZUmHSvLbMjRj6NUUKo=
629633
gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
630634
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
631635
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -671,6 +675,7 @@ sigs.k8s.io/cluster-api v0.3.12 h1:iogA3mXvwRfNU3ZCZXbqM1ZVWUxtWobgu3zRd5IkMTM=
671675
sigs.k8s.io/cluster-api v0.3.12/go.mod h1:KuUGKyD9+8TwYIcwoqDaScWKsee74/bpPo2sqQMwy8o=
672676
sigs.k8s.io/controller-runtime v0.5.14 h1:lmoRaPvLg9877ZOnjFivjtyIdqyLbWfcCEilxHXTEj4=
673677
sigs.k8s.io/controller-runtime v0.5.14/go.mod h1:OTqxLuz7gVcrq+BHGUgedRu6b2VIKCEc7Pu4Jbwui0A=
678+
sigs.k8s.io/kind v0.7.1-0.20200303021537-981bd80d3802 h1:L6/8hETA7jvdx3xBcbDifrIN2xaYHE7tA58n+Kdp2Zw=
674679
sigs.k8s.io/kind v0.7.1-0.20200303021537-981bd80d3802/go.mod h1:HIZ3PWUezpklcjkqpFbnYOqaqsAE1JeCTEwkgvPLXjk=
675680
sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
676681
sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE=

0 commit comments

Comments
 (0)