diff --git a/DEPS.bzl b/DEPS.bzl index 7f0938d3019dc..025d3aafc5e77 100644 --- a/DEPS.bzl +++ b/DEPS.bzl @@ -1048,8 +1048,8 @@ def go_deps(): name = "com_github_evanphx_json_patch", build_file_proto_mode = "disable", importpath = "github.com/evanphx/json-patch", - sum = "h1:K1MDoo4AZ4wU0GIU/fPmtZg7VpzLjCxu+UwBD1FvwOc=", - version = "v4.1.0+incompatible", + sum = "h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=", + version = "v4.12.0+incompatible", ) go_repository( name = "com_github_facebookgo_clock", @@ -1347,15 +1347,15 @@ def go_deps(): name = "com_github_go_openapi_jsonpointer", build_file_proto_mode = "disable", importpath = "github.com/go-openapi/jsonpointer", - sum = "h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=", - version = "v0.19.5", + sum = "h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=", + version = "v0.19.6", ) go_repository( name = "com_github_go_openapi_jsonreference", build_file_proto_mode = "disable", importpath = "github.com/go-openapi/jsonreference", - sum = "h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=", - version = "v0.19.6", + sum = "h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=", + version = "v0.20.1", ) go_repository( name = "com_github_go_openapi_spec", @@ -1368,8 +1368,8 @@ def go_deps(): name = "com_github_go_openapi_swag", build_file_proto_mode = "disable", importpath = "github.com/go-openapi/swag", - sum = "h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=", - version = "v0.19.15", + sum = "h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=", + version = "v0.22.3", ) go_repository( name = "com_github_go_playground_locales", @@ -1756,8 +1756,8 @@ def go_deps(): name = "com_github_google_gofuzz", build_file_proto_mode = "disable_global", importpath = "github.com/google/gofuzz", - sum = "h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=", - version = "v1.0.0", + sum = "h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=", + version = "v1.1.0", ) go_repository( name = "com_github_google_licensecheck", @@ -2759,8 +2759,8 @@ def go_deps(): name = "com_github_mailru_easyjson", build_file_proto_mode = "disable", importpath = "github.com/mailru/easyjson", - sum = "h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=", - version = "v0.7.6", + sum = "h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=", + version = "v0.7.7", ) go_repository( @@ -3217,15 +3217,15 @@ def go_deps(): name = "com_github_onsi_ginkgo_v2", build_file_proto_mode = "disable_global", importpath = "github.com/onsi/ginkgo/v2", - sum = "h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs=", - version = "v2.4.0", + sum = "h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk=", + version = "v2.9.1", ) go_repository( name = "com_github_onsi_gomega", build_file_proto_mode = "disable_global", importpath = "github.com/onsi/gomega", - sum = "h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys=", - version = "v1.23.0", + sum = "h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E=", + version = "v1.27.4", ) go_repository( name = "com_github_openpeedeep_depguard", @@ -3653,8 +3653,8 @@ def go_deps(): name = "com_github_rogpeppe_go_internal", build_file_proto_mode = "disable_global", importpath = "github.com/rogpeppe/go-internal", - sum = "h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=", - version = "v1.9.0", + sum = "h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=", + version = "v1.10.0", ) go_repository( name = "com_github_rs_cors", @@ -5716,15 +5716,15 @@ def go_deps(): name = "io_k8s_api", build_file_proto_mode = "disable", importpath = "k8s.io/api", - sum = "h1:aBGgKJUM9Hk/3AE8WaZIApnTxG35kbuQba2w+SXqezo=", - version = "v0.0.0-20190409021203-6e4e0e4f393b", + sum = "h1:+H17AJpUMvl+clT+BPnKf0E3ksMAzoBBg7CntpSuADo=", + version = "v0.27.2", ) go_repository( name = "io_k8s_apimachinery", build_file_proto_mode = "disable", importpath = "k8s.io/apimachinery", - sum = "h1:Jmdtdt1ZnoGfWWIIik61Z7nKYgO3J+swQJtPYsP9wHA=", - version = "v0.0.0-20190404173353-6a84e37a896d", + sum = "h1:vBjGaKKieaIreI+oQwELalVG4d8f3YAMNpWLzDXkxeg=", + version = "v0.27.2", ) go_repository( name = "io_k8s_client_go", @@ -5744,23 +5744,23 @@ def go_deps(): name = "io_k8s_klog_v2", build_file_proto_mode = "disable", importpath = "k8s.io/klog/v2", - sum = "h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=", - version = "v2.80.1", + sum = "h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw=", + version = "v2.90.1", ) go_repository( name = "io_k8s_kube_openapi", build_file_proto_mode = "disable", importpath = "k8s.io/kube-openapi", - sum = "h1:tHgpQvrWaYfrnC8G4N0Oszw5HHCsZxKilDi2R7HuCSM=", - version = "v0.0.0-20180629012420-d83b052f768a", + sum = "h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg=", + version = "v0.0.0-20230501164219-8b0f38b5fd1f", ) go_repository( name = "io_k8s_sigs_json", build_file_proto_mode = "disable", importpath = "sigs.k8s.io/json", - sum = "h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=", - version = "v0.0.0-20220713155537-f223a00ba0e2", + sum = "h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=", + version = "v0.0.0-20221116044647-bc3834ca7abd", ) go_repository( name = "io_k8s_sigs_structured_merge_diff_v4", @@ -5781,8 +5781,8 @@ def go_deps(): name = "io_k8s_utils", build_file_proto_mode = "disable", importpath = "k8s.io/utils", - sum = "h1:8r+l4bNWjRlsFYlQJnKJ2p7s1YQPj4XyXiJVqDHRx7c=", - version = "v0.0.0-20190308190857-21c4ce38f2a7", + sum = "h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY=", + version = "v0.0.0-20230209194617-a36077c30491", ) go_repository( name = "io_moul_zapgorm2", diff --git a/br/pkg/aws/ebs.go b/br/pkg/aws/ebs.go index 4e36034f114d4..4e4436cf11423 100644 --- a/br/pkg/aws/ebs.go +++ b/br/pkg/aws/ebs.go @@ -23,6 +23,18 @@ import ( "golang.org/x/sync/errgroup" ) +const ( + AnnPodNameKey string = "tidb.pingcap.com/pod-name" + AnnTemporaryVolumeID string = "temporary/volume-id" + EC2K8SClusterNameKey string = "aws:eks:cluster-name" + + SourcePvcNameKey string = "source/pvcName" + SourceVolumeIdKey string = "source/VolumeId" + SourceTikvNameKey string = "source/TikvName" + SourceNamespaceKey string = "source/Namespace" + SourceContextKey string = "source/context" +) + type EC2Session struct { ec2 ec2iface.EC2API // aws operation concurrency @@ -31,6 +43,14 @@ type EC2Session struct { type VolumeAZs map[string]string +type SnapshotTags struct { + sourcePVCName string + sourceTiKVName string + sourceNameSpace string +} + +type VolumeSnapshotTags map[string]SnapshotTags + func NewEC2Session(concurrency uint, region string) (*EC2Session, error) { // aws-sdk has builtin exponential backoff retry mechanism, see: // https://github.com/aws/aws-sdk-go/blob/db4388e8b9b19d34dcde76c492b17607cd5651e2/aws/client/default_retryer.go#L12-L16 @@ -47,6 +67,23 @@ func NewEC2Session(concurrency uint, region string) (*EC2Session, error) { return &EC2Session{ec2: ec2Session, concurrency: concurrency}, nil } +func GenerateVolumeSnapshotTags(backupInfo *config.EBSBasedBRMeta, pvVolumeMap map[string]string) (VolumeSnapshotTags, error) { + vst := make(VolumeSnapshotTags) + for j := range backupInfo.KubernetesMeta.PVCs { + pvc := backupInfo.KubernetesMeta.PVCs[j] + volID := pvVolumeMap[pvc.Spec.VolumeName] + if volID == "" { + return vst, errors.Errorf("No matching pv is found with name of [%s]", pvc.Spec.VolumeName) + } + vst[volID] = SnapshotTags{ + pvc.GetName(), + pvc.GetLabels()[AnnPodNameKey], + pvc.GetNamespace(), + } + } + return vst, nil +} + // CreateSnapshots is the mainly steps to control the data volume snapshots. func (e *EC2Session) CreateSnapshots(backupInfo *config.EBSBasedBRMeta) (map[string]string, VolumeAZs, error) { snapIDMap := make(map[string]string) @@ -54,13 +91,42 @@ func (e *EC2Session) CreateSnapshots(backupInfo *config.EBSBasedBRMeta) (map[str var mutex sync.Mutex eg, _ := errgroup.WithContext(context.Background()) - fillResult := func(createOutput *ec2.CreateSnapshotsOutput) { + + pvVolumeMap := make(map[string]string) + for j := range backupInfo.KubernetesMeta.PVs { + pv := backupInfo.KubernetesMeta.PVs[j] + pvVolumeMap[pv.GetName()] = pv.GetAnnotations()[AnnTemporaryVolumeID] + } + + vst, err := GenerateVolumeSnapshotTags(backupInfo, pvVolumeMap) + if err != nil { + return snapIDMap, nil, errors.Trace(err) + } + taggingAndFillResult := func(createOutput *ec2.CreateSnapshotsOutput, vst VolumeSnapshotTags, k8sClusterName *string) error { mutex.Lock() defer mutex.Unlock() for j := range createOutput.Snapshots { snapshot := createOutput.Snapshots[j] snapIDMap[aws.StringValue(snapshot.VolumeId)] = aws.StringValue(snapshot.SnapshotId) + + createTagInput := &ec2.CreateTagsInput{ + Resources: []*string{ + snapshot.SnapshotId, + }, + Tags: []*ec2.Tag{ + ec2Tag(SourcePvcNameKey, vst[aws.StringValue(snapshot.VolumeId)].sourcePVCName), + ec2Tag(SourceVolumeIdKey, aws.StringValue(snapshot.VolumeId)), + ec2Tag(SourceTikvNameKey, vst[aws.StringValue(snapshot.VolumeId)].sourceTiKVName), + ec2Tag(SourceNamespaceKey, vst[aws.StringValue(snapshot.VolumeId)].sourceNameSpace), + ec2Tag(SourceContextKey, aws.StringValue(k8sClusterName)), + }, + } + _, err := e.ec2.CreateTags(createTagInput) + if err != nil { + return errors.Trace(err) + } } + return nil } workerPool := utils.NewWorkerPool(e.concurrency, "create snapshots") @@ -93,6 +159,18 @@ func (e *EC2Session) CreateSnapshots(backupInfo *config.EBSBasedBRMeta) (map[str if err != nil { return snapIDMap, nil, errors.Trace(err) } + + // retrieve the k8s cluster name from EC2 instance tags + var k8sClusterName *string + + for j := range resp1.Reservations[0].Instances[0].Tags { + tag := resp1.Reservations[0].Instances[0].Tags[j] + if aws.StringValue(tag.Key) == EC2K8SClusterNameKey { + k8sClusterName = tag.Value + break + } + } + for j := range resp1.Reservations[0].Instances[0].BlockDeviceMappings { device := resp1.Reservations[0].Instances[0].BlockDeviceMappings[j] // skip root volume @@ -120,18 +198,19 @@ func (e *EC2Session) CreateSnapshots(backupInfo *config.EBSBasedBRMeta) (map[str instanceSpecification := ec2.InstanceSpecification{} createSnapshotInput := ec2.CreateSnapshotsInput{} - instanceSpecification.SetInstanceId(*ec2InstanceId) - instanceSpecification.SetExcludeBootVolume(true) - instanceSpecification.SetExcludeDataVolumeIds(excludedVolumeIDs) + instanceSpecification.SetInstanceId(aws.StringValue(ec2InstanceId)).SetExcludeBootVolume(true).SetExcludeDataVolumeIds(excludedVolumeIDs) - createSnapshotInput.SetCopyTagsFromSource("volume") createSnapshotInput.SetInstanceSpecification(&instanceSpecification) resp, err := e.ec2.CreateSnapshots(&createSnapshotInput) if err != nil { return errors.Trace(err) } - fillResult(resp) + err = taggingAndFillResult(resp, vst, k8sClusterName) + if err != nil { + return errors.Trace(err) + } + return nil }) } @@ -263,14 +342,6 @@ func (e *EC2Session) DeleteSnapshots(snapIDMap map[string]string) { func (e *EC2Session) CreateVolumes(meta *config.EBSBasedBRMeta, volumeType string, iops, throughput int64, targetAZ string) (map[string]string, error) { template := ec2.CreateVolumeInput{ VolumeType: &volumeType, - TagSpecifications: []*ec2.TagSpecification{ - { - ResourceType: aws.String(ec2.ResourceTypeVolume), - Tags: []*ec2.Tag{ - ec2Tag("TiDBCluster-BR", "new"), - }, - }, - }, } if iops > 0 { template.SetIops(iops) @@ -287,6 +358,17 @@ func (e *EC2Session) CreateVolumes(meta *config.EBSBasedBRMeta, volumeType strin defer mutex.Unlock() newVolumeIDMap[oldVol.ID] = *newVol.VolumeId } + + fetchTagValue := func(tags []*ec2.Tag, key string) string { + for i := range tags { + tag := tags[i] + if aws.StringValue(tag.Key) == key { + return aws.StringValue(tag.Value) + } + } + return "" + } + workerPool := utils.NewWorkerPool(e.concurrency, "create volume") for i := range meta.TiKVComponent.Stores { store := meta.TiKVComponent.Stores[i] @@ -295,12 +377,47 @@ func (e *EC2Session) CreateVolumes(meta *config.EBSBasedBRMeta, volumeType strin workerPool.ApplyOnErrorGroup(eg, func() error { log.Debug("create volume from snapshot", zap.Any("volume", oldVol)) req := template + req.SetSnapshotId(oldVol.SnapshotID) + + // set target AZ if targetAZ == "" { req.SetAvailabilityZone(oldVol.VolumeAZ) } else { req.SetAvailabilityZone(targetAZ) } + + // Copy interested tags of snapshots to the restored volume + tags := []*ec2.Tag{ + ec2Tag("TiDBCluster-BR", "new"), + ec2Tag("ebs.csi.aws.com/cluster", "true"), + } + snapshotIds := make([]*string, 0) + + snapshotIds = append(snapshotIds, &oldVol.SnapshotID) + resp, err := e.ec2.DescribeSnapshots(&ec2.DescribeSnapshotsInput{SnapshotIds: snapshotIds}) + if err != nil { + return errors.Trace(err) + } + if len(resp.Snapshots) <= 0 { + return errors.Errorf("specified snapshot [%s] is not found", oldVol.SnapshotID) + } + + snapshotTags := resp.Snapshots[0].Tags + tags = append(tags, ec2Tag("snapshot/createdFromSnapshotId", oldVol.SnapshotID), + ec2Tag("snapshot/"+SourcePvcNameKey, fetchTagValue(snapshotTags, SourcePvcNameKey)), + ec2Tag("snapshot/"+SourceVolumeIdKey, fetchTagValue(snapshotTags, SourceVolumeIdKey)), + ec2Tag("snapshot/"+SourceTikvNameKey, fetchTagValue(snapshotTags, SourceTikvNameKey)), + ec2Tag("snapshot/"+SourceNamespaceKey, fetchTagValue(snapshotTags, SourceNamespaceKey)), + ec2Tag("snapshot/"+SourceContextKey, fetchTagValue(snapshotTags, SourceContextKey))) + + req.SetTagSpecifications([]*ec2.TagSpecification{ + { + ResourceType: aws.String(ec2.ResourceTypeVolume), + Tags: tags, + }, + }) + newVol, err := e.ec2.CreateVolume(&req) if err != nil { return errors.Trace(err) diff --git a/br/pkg/config/BUILD.bazel b/br/pkg/config/BUILD.bazel index 610787d039894..4bddb6debfa2a 100644 --- a/br/pkg/config/BUILD.bazel +++ b/br/pkg/config/BUILD.bazel @@ -10,6 +10,7 @@ go_library( "//br/pkg/storage", "@com_github_masterminds_semver//:semver", "@com_github_pingcap_errors//:errors", + "@io_k8s_api//core/v1:core", ], ) diff --git a/br/pkg/config/ebs.go b/br/pkg/config/ebs.go index 985e6ec14d01e..deedb2d384403 100644 --- a/br/pkg/config/ebs.go +++ b/br/pkg/config/ebs.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/metautil" "github.com/pingcap/tidb/br/pkg/storage" + corev1 "k8s.io/api/core/v1" ) type EBSVolumeType string @@ -63,10 +64,10 @@ type ClusterInfo struct { } type Kubernetes struct { - PVs []interface{} `json:"pvs" toml:"pvs"` - PVCs []interface{} `json:"pvcs" toml:"pvcs"` - CRD interface{} `json:"crd_tidb_cluster" toml:"crd_tidb_cluster"` - Options map[string]interface{} `json:"options" toml:"options"` + PVs []*corev1.PersistentVolume `json:"pvs" toml:"pvs"` + PVCs []*corev1.PersistentVolumeClaim `json:"pvcs" toml:"pvcs"` + CRD interface{} `json:"crd_tidb_cluster" toml:"crd_tidb_cluster"` + Options map[string]interface{} `json:"options" toml:"options"` } type TiKVComponent struct { diff --git a/go.mod b/go.mod index c515d7ea7cdb1..dfe0a0d14ac66 100644 --- a/go.mod +++ b/go.mod @@ -127,6 +127,7 @@ require ( google.golang.org/grpc v1.54.0 gopkg.in/yaml.v2 v2.4.0 honnef.co/go/tools v0.4.3 + k8s.io/api v0.27.2 sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 ) @@ -173,11 +174,13 @@ require ( github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect github.com/go-kit/kit v0.9.0 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect + github.com/go-logr/logr v1.2.3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/goccy/go-json v0.9.11 // indirect github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.5.9 // indirect + github.com/google/gofuzz v1.1.0 // indirect github.com/google/licensecheck v0.3.1 // indirect github.com/google/renameio/v2 v2.0.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect @@ -223,7 +226,6 @@ require ( github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/gomega v1.23.0 // indirect github.com/petermattis/goid v0.0.0-20211229010228-4d14c490ee36 // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 // indirect @@ -237,7 +239,7 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/shoenig/go-m1cpu v0.1.5 // indirect github.com/shopspring/decimal v1.2.0 // indirect github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect @@ -274,8 +276,14 @@ require ( google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect google.golang.org/protobuf v1.30.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/apimachinery v0.27.2 // indirect + k8s.io/klog/v2 v2.90.1 // indirect + k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect stathat.com/c/consistent v1.0.0 // indirect ) diff --git a/go.sum b/go.sum index 4af7605a7f282..3c29bacd94e23 100644 --- a/go.sum +++ b/go.sum @@ -327,6 +327,9 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= @@ -434,6 +437,8 @@ github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/licensecheck v0.3.1 h1:QoxgoDkaeC4nFrtGN1jV7IPmDCHFNIVh54e5hSt6sPs= github.com/google/licensecheck v0.3.1/go.mod h1:ORkR35t/JjW+emNKtfJDII0zlciG9JgbT7SmsohlHmY= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= @@ -738,8 +743,7 @@ github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1ls github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys= -github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= +github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= github.com/opentracing-contrib/go-stdlib v0.0.0-20170113013457-1de4cc2120e7/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= @@ -855,8 +859,9 @@ github.com/rlmcpherson/s3gof3r v0.5.0/go.mod h1:s7vv7SMDPInkitQMuZzH615G7yWHdrU2 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rubyist/circuitbreaker v2.2.1+incompatible/go.mod h1:Ycs3JgJADPuzJDwffe12k6BZT8hxVi6lFK+gWYJLN4A= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1538,6 +1543,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/fsnotify/fsnotify.v1 v1.3.1/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -1578,15 +1584,27 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.27.2 h1:+H17AJpUMvl+clT+BPnKf0E3ksMAzoBBg7CntpSuADo= +k8s.io/api v0.27.2/go.mod h1:ENmbocXfBT2ADujUXcBhHV55RIT31IIEvkntP6vZKS4= k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.27.2 h1:vBjGaKKieaIreI+oQwELalVG4d8f3YAMNpWLzDXkxeg= +k8s.io/apimachinery v0.27.2/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20180629012420-d83b052f768a/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/utils v0.0.0-20190308190857-21c4ce38f2a7/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= +k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY= +k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=