Skip to content

Commit 198ad37

Browse files
Release libs cortex v0.0.43 + bundles v0.0.56 and shim charts v0.0.2 (#722)
## Changelog Changes to the committed resource reservations feature: - Commitments usage api uses postgres database instead of calling nova - Refinements to the committed resource alerts - Added optional `VideoRAMMiB` field to the commitments usage api - Check hypervisor resources against reservations - Remove unused database connection and unused databaseSecretRef configuration in cortex-nova bundle Changes related to placement api shim: - Expose metrics that measure the down/upstream request duration and number of errors - Add alerts based on the exposed metrics - Use controller-runtime logging consistently and provide traceability - Add e2e tests checking all endpoints of the passthrough Changes to the failover reservations feature: - Track the state of reservations and expose metrics Changes regarding infrastructure dashboard and ops: - Add vmware commitments kpi - Add hypervisor family label to flavor usage kpi - Fix links in cortex alerts - External dependency upgrades
2 parents 4b8a694 + e5a7c6e commit 198ad37

80 files changed

Lines changed: 7792 additions & 838 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/test.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,13 @@ jobs:
4949
go test -v \
5050
-coverpkg=./internal/... \
5151
-coverprofile=profile.cov ./internal/...
52-
go tool cover -func profile.cov > func_coverage.txt
52+
53+
# Exclude e2e files from the coverage profile so they don't
54+
# count against the coverage percentage.
55+
head -1 profile.cov > profile_filtered.cov
56+
tail -n +2 profile.cov | grep -v '_e2e\.go' >> profile_filtered.cov || true
57+
58+
go tool cover -func profile_filtered.cov > func_coverage.txt
5359
5460
- name: Upload coverage files
5561
uses: actions/upload-artifact@v7

Tiltfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,13 @@ if 'pods' in ACTIVE_DEPLOYMENTS:
279279
if 'placement' in ACTIVE_DEPLOYMENTS:
280280
print("Activating Cortex Placement Shim bundle")
281281
k8s_yaml(helm('./helm/bundles/cortex-placement-shim', name='cortex-placement-shim', values=tilt_values, set=env_set_overrides))
282+
local_resource(
283+
'Placement Shim E2E Tests',
284+
'/bin/sh -c "kubectl exec deploy/cortex-placement-shim -- /main --e2e-placement-shim"',
285+
labels=['Cortex-Placement'],
286+
trigger_mode=TRIGGER_MODE_MANUAL,
287+
auto_init=False,
288+
)
282289

283290
########### Dev Dependencies
284291
local('sh helm/sync.sh helm/dev/cortex-prometheus-operator')

cmd/manager/main.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,15 @@ func main() {
358358
detectorPipelineMonitor := schedulinglib.NewDetectorPipelineMonitor()
359359
metrics.Registry.MustRegister(&detectorPipelineMonitor)
360360

361+
// Initialize commitments API for LIQUID interface (Postgres-backed usage reporting).
362+
commitmentsConfig := conf.GetConfigOrDie[commitments.Config]()
363+
var commitmentsUsageDB commitments.UsageDBClient
364+
if commitmentsConfig.DatasourceName != "" {
365+
commitmentsUsageDB = commitments.NewDBUsageClient(multiclusterClient, commitmentsConfig.DatasourceName)
366+
}
367+
commitmentsAPI := commitments.NewAPIWithConfig(multiclusterClient, commitmentsConfig, commitmentsUsageDB)
368+
commitmentsAPI.Init(mux, metrics.Registry, ctrl.Log.WithName("commitments-api"))
369+
361370
if slices.Contains(mainConfig.EnabledControllers, "nova-pipeline-controllers") {
362371
// Filter-weigher pipeline controller setup.
363372
filterWeigherController := &nova.FilterWeigherPipelineController{
@@ -385,11 +394,6 @@ func main() {
385394
os.Exit(1)
386395
}
387396

388-
// Initialize commitments API for LIQUID interface (with Nova client for usage reporting)
389-
commitmentsConfig := conf.GetConfigOrDie[commitments.Config]()
390-
commitmentsAPI := commitments.NewAPIWithConfig(multiclusterClient, commitmentsConfig, novaClient)
391-
commitmentsAPI.Init(mux, metrics.Registry, ctrl.Log.WithName("commitments-api"))
392-
393397
deschedulingsController := &nova.DetectorPipelineController{
394398
Monitor: detectorPipelineMonitor,
395399
Breaker: &nova.DetectorCycleBreaker{NovaClient: novaClient},
@@ -611,6 +615,12 @@ func main() {
611615
// The scheduler client calls the nova external scheduler API to get placement decisions
612616
schedulerClient := reservations.NewSchedulerClient(failoverConfig.SchedulerURL)
613617

618+
failoverMonitor := failover.NewFailoverMonitor()
619+
if err := metrics.Registry.Register(failoverMonitor); err != nil {
620+
setupLog.Error(err, "failed to register failover monitor metrics, continuing without metrics")
621+
failoverMonitor = nil
622+
}
623+
614624
// Defer the initialization of PostgresReader until the manager starts
615625
// because the cache is not ready during setup
616626
if err := mgr.Add(manager.RunnableFunc(func(ctx context.Context) error {
@@ -636,6 +646,7 @@ func main() {
636646
vmSource,
637647
failoverConfig,
638648
schedulerClient,
649+
failoverMonitor,
639650
)
640651

641652
// Set up the watch-based reconciler for per-reservation reconciliation

cmd/shim/main.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func init() {
5151

5252
func main() {
5353
ctx := ctrl.SetupSignalHandler()
54+
5455
restConfig := ctrl.GetConfigOrDie()
5556

5657
var metricsAddr string
@@ -64,6 +65,7 @@ func main() {
6465
var secureMetrics bool
6566
var enableHTTP2 bool
6667
var enablePlacementShim bool
68+
var runPlacementShimE2E bool
6769
var tlsOpts []func(*tls.Config)
6870
flag.StringVar(&metricsAddr, "metrics-bind-address", "0", "The address the metrics endpoint binds to. "+
6971
"Use :8443 for HTTPS or :8080 for HTTP, or leave as 0 to disable the metrics service.")
@@ -85,6 +87,8 @@ func main() {
8587
"If set, HTTP/2 will be enabled for the metrics and webhook servers")
8688
flag.BoolVar(&enablePlacementShim, "placement-shim", false,
8789
"If set, the placement API shim handlers are registered on the API server.")
90+
flag.BoolVar(&runPlacementShimE2E, "e2e-placement-shim", false,
91+
"If set, runs end-to-end tests for the placement shim instead of starting the manager. ")
8892
opts := zap.Options{
8993
Development: true,
9094
}
@@ -107,6 +111,15 @@ func main() {
107111

108112
ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
109113

114+
// Custom entrypoint for placement shim e2e tests.
115+
if runPlacementShimE2E {
116+
if err := placement.RunE2E(ctx); err != nil {
117+
setupLog.Error(err, "E2E tests failed")
118+
os.Exit(1)
119+
}
120+
os.Exit(0)
121+
}
122+
110123
// if the enable-http2 flag is false (the default), http/2 should be disabled
111124
// due to its vulnerabilities. More specifically, disabling http/2 will
112125
// prevent from being vulnerable to the HTTP/2 Stream Cancellation and
@@ -246,6 +259,7 @@ func main() {
246259
setupLog.Error(err, "unable to set up placement shim")
247260
os.Exit(1)
248261
}
262+
metrics.Registry.MustRegister(placementShim)
249263
placementShim.RegisterRoutes(mux)
250264
}
251265

docs/architecture.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,32 @@ Cortex receives the list of possible hosts and their weights from Nova. It then
2929

3030
> [!NOTE]
3131
> Since, by default, Nova does not support calling an external service, this functionality needs to be added like in [SAP's fork of Nova](https://github.com/sapcc/nova/blob/stable/2023.2-m3/nova/scheduler/external.py).
32+
33+
## Placement API Shim
34+
35+
[Placement](https://github.com/openstack/placement) is OpenStack's resource inventory service. It provides an API to query the inventory of resources in the OpenStack cloud, such as compute nodes, their available resources, and the current resource usage. In the OpenStack realm, Placement is used by [Nova](https://github.com/openstack/nova) to carry out virtual machine scheduling, as well as [Neutron](https://github.com/openstack/neutron) for network resource allocation.
36+
37+
As part of the [CobaltCore](https://cobaltcore-dev.github.io/docs/) stack, we provide a Placement-like API shim, which translates requests from Nova and Neutron to the [Hypervisor CRD](https://github.com/cobaltcore-dev/openstack-hypervisor-operator) based on the KVM stack provided by [IronCore](https://ironcore.dev/), [Gardener](https://gardener.cloud/) and [Garden Linux](https://gardenlinux.io/). This means, instead of managing resource inventories in Placement's database, the Hypervisor CRD is used to track resource allocations and hypervisor capabilities.
38+
39+
### Passthrough
40+
41+
Placement maintains hypervisors of various kinds, such as [Ironic](https://github.com/openstack/ironic) or VMware vCenter Servers, not only KVM. However, only KVM hypervisors can be managed by the Cortex Placement API Shim. This means, when Nova or Neutron ask for VMware or Ironic resource providers, the shim needs to forward this request to another Placement instance. We call this the passthrough, and it looks like this:
42+
43+
```mermaid
44+
graph LR;
45+
nn(OpenStack Nova/Neutron) <--> api
46+
subgraph shim [Cortex Placement API Shim]
47+
api(API) <--> router(Routing and Aggregation)
48+
router <-- KVM (QEMU/CH) --> tl
49+
tl(Translation)
50+
end
51+
router <-- VMware/Ironic --> pl(OpenStack Placement)
52+
tl <--> crd(Hypervisor CRD)
53+
```
54+
55+
After a request was received by the API, it is processed in two ways depending on the kind of endpoint that was requested:
56+
57+
1. **Aggregated forwarding**: For requests that ask for a list of resource providers, such as `GET /resource_providers`, the shim needs to forward the request to both the KVM translation and the passthrough. The responses from both sides are then aggregated and returned to the caller.
58+
2. **Per-request forwarding**: For requests that ask for a specific resource provider, such as `GET /resource_providers/{uuid}`, the shim needs to determine if the requested resource provider is managed by the KVM translation or the passthrough. This can be done by checking the UUID of the resource provider against a list of known KVM resource providers. If it is a KVM resource provider, the request is forwarded to the translation; otherwise, it is forwarded to the OpenStack Placement instance.
59+
60+
The translation layer is responsible for translating the requests and responses between the OpenStack Placement API and the Hypervisor CRD. This includes mapping resource provider attributes, inventory, and allocations to the corresponding fields in the Hypervisor CRD.

docs/reservations/committed-resource-reservations.md

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -83,46 +83,43 @@ VM allocations are tracked within reservations:
8383
flowchart LR
8484
subgraph State
8585
Res[(Reservation CRDs)]
86+
HV[(Hypervisor CRDs)]
8687
end
8788
A[Nova Scheduler] -->|VM Create/Migrate/Resize| B[Scheduling Pipeline]
8889
B -->|update Spec.Allocations| Res
89-
Res -->|watch| Controller
90-
Res -->|periodic reconcile| Controller
91-
Controller -->|update Spec/Status.Allocations| Res
90+
Res -->|watch| C[Controller]
91+
HV -->|watch - instance changes| C
92+
Res -->|periodic safety-net requeue| C
93+
C -->|update Spec/Status.Allocations| Res
9294
```
9395

9496
| Component | Event | Timing | Action |
9597
|-----------|-------|--------|--------|
9698
| **Scheduling Pipeline** | VM Create, Migrate, Resize | Immediate | Add VM to `Spec.Allocations` |
97-
| **Controller** | Reservation CRD updated | `committedResourceRequeueIntervalGracePeriod` (default: 1 min) | Verify new VMs via Nova API; update `Status.Allocations` |
98-
| **Controller** | Periodic check | `committedResourceRequeueIntervalActive` (default: 5 min) | Verify established VMs via Hypervisor CRD; remove gone VMs from `Spec.Allocations` |
99+
| **Controller** | Reservation CRD updated | `committedResourceRequeueIntervalGracePeriod` (default: 1 min) | Defer verification for new VMs still spawning; update `Status.Allocations` |
100+
| **Controller** | Hypervisor CRD updated (VM appeared/disappeared) | Immediate (event-driven) | Verify allocations via Hypervisor CRD; remove gone VMs from `Spec.Allocations` |
101+
| **Controller** | Periodic safety-net | `committedResourceRequeueIntervalActive` (default: 5 min) | Same as above; catches any missed events |
99102

100103
**Allocation fields**:
101104
- `Spec.Allocations` — Expected VMs (written by the scheduling pipeline on placement)
102105
- `Status.Allocations` — Confirmed VMs (written by the controller after verifying the VM is on the expected host)
103106

104107
**VM allocation state diagram**:
105108

106-
The controller uses two sources to verify VM allocations, depending on how recently the VM was placed:
107-
- **Nova API** — used during the grace period (`committedResourceAllocationGracePeriod`, default: 15 min) where the VM may still be starting up; provides real-time host assignment
108-
- **Hypervisor CRD** — used for established allocations; reflects the set of instances the hypervisor operator observes on the host
109+
The controller uses the **Hypervisor CRD** as the sole source of truth for VM allocation verification:
110+
- **Hypervisor CRD** — used for all allocation checks; reflects the set of instances the hypervisor operator observes on the host
109111

110112
```mermaid
111113
stateDiagram-v2
112114
direction LR
113-
[*] --> SpecOnly : placement (create, migrate, resize)
114-
SpecOnly --> Confirmed : on expected host
115-
SpecOnly --> WrongHost : on different host
116-
SpecOnly --> [*] : not confirmed after grace period
117-
Confirmed --> WrongHost : not on HV CRD, found elsewhere
118-
Confirmed --> [*] : not on HV CRD, Nova 404
119-
WrongHost --> Confirmed : back on expected host
120-
WrongHost --> [*] : VM gone (404)
121-
WrongHost --> [*] : on wrong host > grace period
122-
123115
state "Spec only (grace period)" as SpecOnly
124116
state "Spec + Status (on expected host)" as Confirmed
125-
state "Spec + Status (host mismatch)" as WrongHost
117+
118+
[*] --> SpecOnly : placement (create, migrate, resize)
119+
SpecOnly --> SpecOnly : within grace period
120+
SpecOnly --> Confirmed : found on HV CRD after grace period
121+
SpecOnly --> [*] : not on HV CRD after grace period
122+
Confirmed --> [*] : not on HV CRD
126123
```
127124

128125
**Note**: VM allocations may not consume all resources of a reservation slot. A reservation with 128 GB may have VMs totaling only 96 GB if that fits the project's needs. Allocations may exceed reservation capacity (e.g., after VM resize).
@@ -185,10 +182,12 @@ The controller watches Reservation CRDs and performs two types of reconciliation
185182

186183
**Placement** - Finds hosts for new reservations (calls scheduler API)
187184

188-
**Allocation Verification** - Tracks VM lifecycle on reservations. VMs take time to appear on a host after scheduling, so new allocations are verified more frequently via the Nova API for real-time status, while established allocations are verified via the Hypervisor CRD:
189-
- New VMs (within `committedResourceAllocationGracePeriod`, default: 15 min): checked via Nova API every `committedResourceRequeueIntervalGracePeriod` (default: 1 min)
190-
- Established VMs: checked via Hypervisor CRD every `committedResourceRequeueIntervalActive` (default: 5 min)
191-
- Missing VMs: removed from `Spec.Allocations` after Nova API confirms 404
185+
**Allocation Verification** - Tracks VM lifecycle on reservations. The controller uses the Hypervisor CRD as the sole source of truth, with two triggers:
186+
- New VMs (within `committedResourceAllocationGracePeriod`, default: 15 min): verification deferred — VM may still be spawning; requeued every `committedResourceRequeueIntervalGracePeriod` (default: 1 min)
187+
- Established VMs: verified reactively when the Hypervisor CRD changes (VM appeared or disappeared in `Status.Instances`), with `committedResourceRequeueIntervalActive` (default: 5 min) as a safety-net fallback
188+
- Missing VMs: removed from `Spec.Allocations` when not found on the Hypervisor CRD after the grace period
189+
190+
**Reservation migration is not supported yet.**
192191

193192
### Usage API
194193

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ module github.com/cobaltcore-dev/cortex
33
go 1.26
44

55
require (
6-
github.com/cobaltcore-dev/openstack-hypervisor-operator v1.0.2-0.20260409190432-b3a7a2d19d59
6+
github.com/cobaltcore-dev/openstack-hypervisor-operator v1.0.2-0.20260416190048-8c00b47ee107
77
github.com/go-gorp/gorp v2.2.0+incompatible
8-
github.com/gophercloud/gophercloud/v2 v2.11.1
8+
github.com/gophercloud/gophercloud/v2 v2.12.0
99
github.com/ironcore-dev/ironcore v0.3.0
1010
github.com/majewsky/gg v1.6.0
1111
github.com/prometheus/client_golang v1.23.2
1212
github.com/prometheus/client_model v0.6.2
13-
github.com/sapcc/go-bits v0.0.0-20260409170436-d7b7822ab7d3
14-
k8s.io/api v0.35.3
15-
k8s.io/apimachinery v0.35.3
16-
k8s.io/client-go v0.35.3
13+
github.com/sapcc/go-bits v0.0.0-20260416170349-9b32d8192041
14+
k8s.io/api v0.35.4
15+
k8s.io/apimachinery v0.35.4
16+
k8s.io/client-go v0.35.4
1717
sigs.k8s.io/controller-runtime v0.23.3
1818
)
1919

go.sum

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1x
2020
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
2121
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
2222
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
23-
github.com/cobaltcore-dev/openstack-hypervisor-operator v1.0.2-0.20260409190432-b3a7a2d19d59 h1:x+rALnsEGyL5zEtFMHC5MS8PwZ4qOLkbwe+k8USvMLA=
24-
github.com/cobaltcore-dev/openstack-hypervisor-operator v1.0.2-0.20260409190432-b3a7a2d19d59/go.mod h1:3mGzxYvL0kFyV5AEvHhsX58Q4uzAmPm0oAfmYwJ9T6U=
23+
github.com/cobaltcore-dev/openstack-hypervisor-operator v1.0.2-0.20260416190048-8c00b47ee107 h1:VbRlMS8+6uDz3Z+GUhlYk1gnHgHYIQ+Zw8d6A2IBlnc=
24+
github.com/cobaltcore-dev/openstack-hypervisor-operator v1.0.2-0.20260416190048-8c00b47ee107/go.mod h1:5biTY1L6snS1++gM7Vz2r3TnqNwXFklnmxZ41TM3yd8=
2525
github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4=
2626
github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE=
2727
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
@@ -125,8 +125,8 @@ github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/v
125125
github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI=
126126
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
127127
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
128-
github.com/gophercloud/gophercloud/v2 v2.11.1 h1:jCs4vLH8sJgRqrPzqVfWgl7uI6JnIIlsgeIRM0uHjxY=
129-
github.com/gophercloud/gophercloud/v2 v2.11.1/go.mod h1:Rm0YvKQ4QYX2rY9XaDKnjRzSGwlG5ge4h6ABYnmkKQM=
128+
github.com/gophercloud/gophercloud/v2 v2.12.0 h1:Gxmc/Bog1UDKkxTcQW7MSPTDviJXpLeEgVeN5KrxoCo=
129+
github.com/gophercloud/gophercloud/v2 v2.12.0/go.mod h1:H7TTOxbLy8RIaHSNhI2GCrWIzw4Xpw8Xn2mBhCUT5kA=
130130
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
131131
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
132132
github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI=
@@ -208,8 +208,8 @@ github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7
208208
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
209209
github.com/sapcc/go-api-declarations v1.21.0 h1:Ag6GXgJLTFdBDKmrJU4QFllQbgGSenSGeHpLuvuxeDk=
210210
github.com/sapcc/go-api-declarations v1.21.0/go.mod h1:eiRrXXUeQS5C/1kKn8/KMjk0Y0goUzgDQswj30rH0Zc=
211-
github.com/sapcc/go-bits v0.0.0-20260409170436-d7b7822ab7d3 h1:x6loYoCC8+gP+51y4kSzF0bmHsp8UxBfjkU25f1/jUM=
212-
github.com/sapcc/go-bits v0.0.0-20260409170436-d7b7822ab7d3/go.mod h1:o1ld51gRnKbNYTUtx5czsuO8zczc9/iGkEjcwDQb9wA=
211+
github.com/sapcc/go-bits v0.0.0-20260416170349-9b32d8192041 h1:oNaNyLQ32/rdaG2YljF1eMXeA2KxXVnWiPUSDg1fcgo=
212+
github.com/sapcc/go-bits v0.0.0-20260416170349-9b32d8192041/go.mod h1:o1ld51gRnKbNYTUtx5czsuO8zczc9/iGkEjcwDQb9wA=
213213
github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
214214
github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
215215
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
@@ -315,16 +315,16 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
315315
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
316316
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
317317
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
318-
k8s.io/api v0.35.3 h1:pA2fiBc6+N9PDf7SAiluKGEBuScsTzd2uYBkA5RzNWQ=
319-
k8s.io/api v0.35.3/go.mod h1:9Y9tkBcFwKNq2sxwZTQh1Njh9qHl81D0As56tu42GA4=
318+
k8s.io/api v0.35.4 h1:P7nFYKl5vo9AGUp1Z+Pmd3p2tA7bX2wbFWCvDeRv988=
319+
k8s.io/api v0.35.4/go.mod h1:yl4lqySWOgYJJf9RERXKUwE9g2y+CkuwG+xmcOK8wXU=
320320
k8s.io/apiextensions-apiserver v0.35.2 h1:iyStXHoJZsUXPh/nFAsjC29rjJWdSgUmG1XpApE29c0=
321321
k8s.io/apiextensions-apiserver v0.35.2/go.mod h1:OdyGvcO1FtMDWQ+rRh/Ei3b6X3g2+ZDHd0MSRGeS8rU=
322-
k8s.io/apimachinery v0.35.3 h1:MeaUwQCV3tjKP4bcwWGgZ/cp/vpsRnQzqO6J6tJyoF8=
323-
k8s.io/apimachinery v0.35.3/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
322+
k8s.io/apimachinery v0.35.4 h1:xtdom9RG7e+yDp71uoXoJDWEE2eOiHgeO4GdBzwWpds=
323+
k8s.io/apimachinery v0.35.4/go.mod h1:NNi1taPOpep0jOj+oRha3mBJPqvi0hGdaV8TCqGQ+cc=
324324
k8s.io/apiserver v0.35.2 h1:rb52v0CZGEL0FkhjS+I6jHflAp7fZ4MIaKcEHX7wmDk=
325325
k8s.io/apiserver v0.35.2/go.mod h1:CROJUAu0tfjZLyYgSeBsBan2T7LUJGh0ucWwTCSSk7g=
326-
k8s.io/client-go v0.35.3 h1:s1lZbpN4uI6IxeTM2cpdtrwHcSOBML1ODNTCCfsP1pg=
327-
k8s.io/client-go v0.35.3/go.mod h1:RzoXkc0mzpWIDvBrRnD+VlfXP+lRzqQjCmKtiwZ8Q9c=
326+
k8s.io/client-go v0.35.4 h1:DN6fyaGuzK64UvnKO5fOA6ymSjvfGAnCAHAR0C66kD8=
327+
k8s.io/client-go v0.35.4/go.mod h1:2Pg9WpsS4NeOpoYTfHHfMxBG8zFMSAUi4O/qoiJC3nY=
328328
k8s.io/component-base v0.35.2 h1:btgR+qNrpWuRSuvWSnQYsZy88yf5gVwemvz0yw79pGc=
329329
k8s.io/component-base v0.35.2/go.mod h1:B1iBJjooe6xIJYUucAxb26RwhAjzx0gHnqO9htWIX+0=
330330
k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=

0 commit comments

Comments
 (0)