From 324816a883b0cdd016acd277617d41071b368a29 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Tue, 14 Nov 2023 13:49:02 +0100 Subject: [PATCH] dra: enable adding ReservedFor entries through strategic-merge-patch When moving the reservation of a claim for a pod into the PreBind phase in a future commit, multiple different update attempts will be executed concurrently. We want an attempt to succeed if and only if adding the entry passes validation. Without patch strategy and key, strategic-merge-patch replaces the entire ReservedFor instead of adding new entries. Server-side-apply cannot be used because each attempt may start with a stale ResourceClaim (thus cannot send the entire ReservedFor) and SSA doesn't support merging when using the same manager string. Using different managers (one for each entry) would work, but sounds like a bad hack. --- api/openapi-spec/swagger.json | 4 +++- .../v3/apis__resource.k8s.io__v1alpha2_openapi.json | 4 +++- pkg/generated/openapi/zz_generated.openapi.go | 4 +++- staging/src/k8s.io/api/resource/v1alpha2/generated.proto | 2 ++ staging/src/k8s.io/api/resource/v1alpha2/types.go | 4 +++- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 46401f328bd..ea2cd2e0322 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -14387,7 +14387,9 @@ "x-kubernetes-list-map-keys": [ "uid" ], - "x-kubernetes-list-type": "map" + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "uid", + "x-kubernetes-patch-strategy": "merge" } }, "type": "object" diff --git a/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha2_openapi.json b/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha2_openapi.json index ed38f16c5c2..00c4318126f 100644 --- a/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha2_openapi.json +++ b/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha2_openapi.json @@ -478,7 +478,9 @@ "x-kubernetes-list-map-keys": [ "uid" ], - "x-kubernetes-list-type": "map" + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "uid", + "x-kubernetes-patch-strategy": "merge" } }, "type": "object" diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index 5240e056689..574f7f75604 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -42805,7 +42805,9 @@ func schema_k8sio_api_resource_v1alpha2_ResourceClaimStatus(ref common.Reference "x-kubernetes-list-map-keys": []interface{}{ "uid", }, - "x-kubernetes-list-type": "map", + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "uid", + "x-kubernetes-patch-strategy": "merge", }, }, SchemaProps: spec.SchemaProps{ diff --git a/staging/src/k8s.io/api/resource/v1alpha2/generated.proto b/staging/src/k8s.io/api/resource/v1alpha2/generated.proto index f7748f9a1a2..c9f1ec1c0ff 100644 --- a/staging/src/k8s.io/api/resource/v1alpha2/generated.proto +++ b/staging/src/k8s.io/api/resource/v1alpha2/generated.proto @@ -257,6 +257,8 @@ message ResourceClaimStatus { // // +listType=map // +listMapKey=uid + // +patchStrategy=merge + // +patchMergeKey=uid // +optional repeated ResourceClaimConsumerReference reservedFor = 3; diff --git a/staging/src/k8s.io/api/resource/v1alpha2/types.go b/staging/src/k8s.io/api/resource/v1alpha2/types.go index a614ff9dc1b..f862cd960b4 100644 --- a/staging/src/k8s.io/api/resource/v1alpha2/types.go +++ b/staging/src/k8s.io/api/resource/v1alpha2/types.go @@ -114,8 +114,10 @@ type ResourceClaimStatus struct { // // +listType=map // +listMapKey=uid + // +patchStrategy=merge + // +patchMergeKey=uid // +optional - ReservedFor []ResourceClaimConsumerReference `json:"reservedFor,omitempty" protobuf:"bytes,3,opt,name=reservedFor"` + ReservedFor []ResourceClaimConsumerReference `json:"reservedFor,omitempty" protobuf:"bytes,3,opt,name=reservedFor" patchStrategy:"merge" patchMergeKey:"uid"` // DeallocationRequested indicates that a ResourceClaim is to be // deallocated.