From 3e595db0af9cb3f566b39736376e7038b64374c7 Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Wed, 2 Oct 2024 11:02:33 +0200 Subject: [PATCH 01/17] [KEP-4817] API, validation and feature-gate * Add status * Add validation to check if fields are correct (Network field, device has been allocated)) * Add feature-gate * Drop field if feature-gate not set Signed-off-by: Lionel Jouin --- pkg/apis/resource/types.go | 86 ++++++++ pkg/apis/resource/validation/validation.go | 73 +++++++ .../validation_resourceclaim_test.go | 115 +++++++++++ pkg/features/kube_features.go | 8 + pkg/features/versioned_kube_features.go | 4 + .../resource/resourceclaim/strategy.go | 7 + .../src/k8s.io/api/resource/v1alpha3/types.go | 86 ++++++++ .../feature_enable_disable_test.go | 187 ++++++++++++++++++ test/integration/resourceclaim/main_test.go | 27 +++ 9 files changed, 593 insertions(+) create mode 100644 test/integration/resourceclaim/feature_enable_disable_test.go create mode 100644 test/integration/resourceclaim/main_test.go diff --git a/pkg/apis/resource/types.go b/pkg/apis/resource/types.go index 95377a45452..ff7b704cb87 100644 --- a/pkg/apis/resource/types.go +++ b/pkg/apis/resource/types.go @@ -703,6 +703,18 @@ type ResourceClaimStatus struct { // it got removed. May be reused once decoding v1alpha3 is no longer // supported. // DeallocationRequested bool + + // Devices contains the status of each device allocated for this + // claim, as reported by the driver. This can include driver-specific + // information. Entries are owned by their respective drivers. + // + // +optional + // +listType=map + // +listMapKey=driver + // +listMapKey=device + // +listMapKey=pool + // +featureGate=DRAResourceClaimDeviceStatus + Devices []AllocatedDeviceStatus } // ReservedForMaxSize is the maximum number of entries in @@ -975,3 +987,77 @@ type ResourceClaimTemplateList struct { // Items is the list of resource claim templates. Items []ResourceClaimTemplate } + +// AllocatedDeviceStatus contains the status of an allocated device, if the +// driver chooses to report it. This may include driver-specific information. +type AllocatedDeviceStatus struct { + // Driver specifies the name of the DRA driver whose kubelet + // plugin should be invoked to process the allocation once the claim is + // needed on a node. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + Driver string + + // This name together with the driver name and the device name field + // identify which device was allocated (`//`). + // + // Must not be longer than 253 characters and may contain one or more + // DNS sub-domains separated by slashes. + // + // +required + Pool string + + // Device references one device instance via its name in the driver's + // resource pool. It must be a DNS label. + // + // +required + Device string + + // Conditions contains the latest observation of the device's state. + // If the device has been configured according to the class and claim + // config references, the `Ready` condition should be True. + // + // +optional + // +listType=atomic + Conditions []metav1.Condition + + // Data contains arbitrary driver-specific data. + // + // +optional + Data *runtime.RawExtension + + // NetworkData contains network-related information specific to the device. + // + // +optional + NetworkData *NetworkDeviceData +} + +// NetworkDeviceData provides network-related details for the allocated device. +// This information may be filled by drivers or other components to configure +// or identify the device within a network context. +type NetworkDeviceData struct { + // InterfaceName specifies the name of the network interface associated with + // the allocated device. This might be the name of a physical or virtual + // network interface. + // + // +optional + InterfaceName *string + + // Addresses lists the network addresses assigned to the device's network interface. + // This can include both IPv4 and IPv6 addresses. + // The addresses are in the CIDR notation, which includes both the address and the + // associated subnet mask. + // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. + // + // +optional + // +listType=atomic + Addresses []string + + // HWAddress represents the hardware address (e.g. MAC Address) of the device's network interface. + // + // +optional + HWAddress *string +} diff --git a/pkg/apis/resource/validation/validation.go b/pkg/apis/resource/validation/validation.go index a12abf5a5c3..866ed2fffe3 100644 --- a/pkg/apis/resource/validation/validation.go +++ b/pkg/apis/resource/validation/validation.go @@ -25,15 +25,20 @@ import ( apiequality "k8s.io/apimachinery/pkg/api/equality" apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apiserver/pkg/cel" "k8s.io/apiserver/pkg/cel/environment" + utilfeature "k8s.io/apiserver/pkg/util/feature" dracel "k8s.io/dynamic-resource-allocation/cel" + "k8s.io/dynamic-resource-allocation/structured" corevalidation "k8s.io/kubernetes/pkg/apis/core/validation" "k8s.io/kubernetes/pkg/apis/resource" + "k8s.io/kubernetes/pkg/features" ) var ( @@ -123,6 +128,15 @@ func gatherRequestNames(deviceClaim *resource.DeviceClaim) sets.Set[string] { return requestNames } +func gatherAllocatedDevices(allocationResult *resource.DeviceAllocationResult) sets.Set[structured.DeviceID] { + allocatedDevices := sets.New[structured.DeviceID]() + for _, result := range allocationResult.Results { + deviceID := structured.DeviceID{Driver: result.Driver, Pool: result.Pool, Device: result.Device} + allocatedDevices.Insert(deviceID) + } + return allocatedDevices +} + func validateDeviceRequest(request resource.DeviceRequest, fldPath *field.Path, stored bool) field.ErrorList { allErrs := validateRequestName(request.Name, fldPath.Child("name")) if request.DeviceClassName == "" { @@ -271,6 +285,21 @@ func validateResourceClaimStatusUpdate(status, oldStatus *resource.ResourceClaim func(consumer resource.ResourceClaimConsumerReference) (types.UID, string) { return consumer.UID, "uid" }, fldPath.Child("reservedFor"))...) + if utilfeature.DefaultFeatureGate.Enabled(features.DRAResourceClaimDeviceStatus) { + var allocatedDevices sets.Set[structured.DeviceID] + if status.Allocation != nil { + allocatedDevices = gatherAllocatedDevices(&status.Allocation.Devices) + } + allErrs = append(allErrs, validateSet(status.Devices, -1, + func(device resource.AllocatedDeviceStatus, fldPath *field.Path) field.ErrorList { + return validateDeviceStatus(device, fldPath, allocatedDevices) + }, + func(device resource.AllocatedDeviceStatus) (structured.DeviceID, string) { + return structured.DeviceID{Driver: device.Driver, Pool: device.Pool, Device: device.Device}, "deviceID" + }, + fldPath.Child("devices"))...) + } + // Now check for invariants that must be valid for a ResourceClaim. if len(status.ReservedFor) > 0 { if status.Allocation == nil { @@ -729,3 +758,47 @@ func truncateIfTooLong(str string, maxLen int) string { remaining := maxLen - len(ellipsis) return str[0:(remaining+1)/2] + ellipsis + str[len(str)-remaining/2:] } + +func validateDeviceStatus(device resource.AllocatedDeviceStatus, fldPath *field.Path, allocatedDevices sets.Set[structured.DeviceID]) field.ErrorList { + var allErrs field.ErrorList + deviceID := structured.DeviceID{Driver: device.Driver, Pool: device.Pool, Device: device.Device} + if !allocatedDevices.Has(deviceID) { + allErrs = append(allErrs, field.Invalid(fldPath, deviceID, "must be an allocated device in the claim")) + } + allErrs = append(allErrs, validateSlice(device.Conditions, -1, + func(condition metav1.Condition, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + return allErrs + }, fldPath.Child("conditions"))...) + allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"))...) + allErrs = append(allErrs, validateNetworkDeviceData(device.NetworkData, fldPath.Child("networkData"))...) + return allErrs +} + +func validateRawExtension(rawExtension *runtime.RawExtension, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + if rawExtension == nil { + return allErrs + } + var v any + if err := json.Unmarshal(rawExtension.Raw, &v); err != nil { + allErrs = append(allErrs, field.Invalid(fldPath, "", fmt.Sprintf("error parsing data: %v", err.Error()))) + } else if _, isObject := v.(map[string]any); !isObject { + allErrs = append(allErrs, field.Invalid(fldPath, "", "parameters must be a valid JSON object")) + } + return allErrs +} + +func validateNetworkDeviceData(networkDeviceData *resource.NetworkDeviceData, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + if networkDeviceData == nil { + return allErrs + } + allErrs = append(allErrs, validateSlice(networkDeviceData.Addresses, -1, + func(address string, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + allErrs = append(allErrs, validation.IsValidCIDR(fldPath, address)...) + return allErrs + }, fldPath.Child("addresses"))...) + return allErrs +} diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index ce29a0106a7..060b701a2c9 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -27,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" utilfeature "k8s.io/apiserver/pkg/util/feature" featuregatetesting "k8s.io/component-base/featuregate/testing" + "k8s.io/dynamic-resource-allocation/structured" "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/resource" "k8s.io/kubernetes/pkg/features" @@ -597,6 +598,8 @@ func TestValidateClaimUpdate(t *testing.T) { } func TestValidateClaimStatusUpdate(t *testing.T) { + featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.DRAResourceClaimDeviceStatus, true) + validAllocatedClaim := validClaim.DeepCopy() validAllocatedClaim.Status = resource.ResourceClaimStatus{ Allocation: &resource.AllocationResult{ @@ -983,6 +986,118 @@ func TestValidateClaimStatusUpdate(t *testing.T) { return claim }, }, + "valid-network-device-status": { + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim = claim.DeepCopy() + claim.Status.Devices = []resource.AllocatedDeviceStatus{ + { + Driver: goodName, + Pool: goodName, + Device: goodName, + Conditions: []metav1.Condition{ + { + Type: "test", + Status: metav1.ConditionTrue, + }, + }, + Data: &runtime.RawExtension{ + Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), + }, + NetworkData: &resource.NetworkDeviceData{ + InterfaceName: ptr.To("net-1"), + Addresses: []string{ + "10.9.8.0/24", + "2001:db8::/64", + }, + HWAddress: ptr.To("ea:9f:cb:40:b1:7b"), + }, + }, + } + return claim + }, + }, + "invalid-device-status-duplicate": { + wantFailures: field.ErrorList{ + field.Duplicate(field.NewPath("status", "devices").Index(1).Child("deviceID"), structured.DeviceID{Driver: goodName, Pool: goodName, Device: goodName}), + }, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim = claim.DeepCopy() + claim.Status.Devices = []resource.AllocatedDeviceStatus{ + { + Driver: goodName, + Pool: goodName, + Device: goodName, + }, + { + Driver: goodName, + Pool: goodName, + Device: goodName, + }, + } + return claim + }, + }, + "invalid-network-device-status": { + wantFailures: field.ErrorList{ + field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(0), "300.9.8.0/24", "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)"), + }, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim = claim.DeepCopy() + claim.Status.Devices = []resource.AllocatedDeviceStatus{ + { + Driver: goodName, + Pool: goodName, + Device: goodName, + NetworkData: &resource.NetworkDeviceData{ + Addresses: []string{ + "300.9.8.0/24", + }, + }, + }, + } + return claim + }, + }, + "invalid-data-device-status": { + wantFailures: field.ErrorList{ + field.Invalid(field.NewPath("status", "devices").Index(0).Child("data"), "", "error parsing data: invalid character 'o' in literal false (expecting 'a')"), + }, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim = claim.DeepCopy() + claim.Status.Devices = []resource.AllocatedDeviceStatus{ + { + Driver: goodName, + Pool: goodName, + Device: goodName, + Data: &runtime.RawExtension{ + Raw: []byte(`foo`), + }, + }, + } + return claim + }, + }, + "invalid-device-status-no-device": { + wantFailures: field.ErrorList{ + field.Invalid(field.NewPath("status", "devices").Index(0), structured.DeviceID{Driver: "b", Pool: "a", Device: "r"}, "must be an allocated device in the claim"), + }, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim = claim.DeepCopy() + claim.Status.Devices = []resource.AllocatedDeviceStatus{ + { + Driver: "b", + Pool: "a", + Device: "r", + }, + } + return claim + }, + }, } for name, scenario := range scenarios { diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index aca2150f4ad..b6dea880dce 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -223,6 +223,14 @@ const ( // based on "structured parameters". DynamicResourceAllocation featuregate.Feature = "DynamicResourceAllocation" + // owner: @LionelJouin + // kep: http://kep.k8s.io/4817 + // alpha: v1.32 + // + // Enables support the ResourceClaim.status.devices field and for setting this + // status from DRA drivers. + DRAResourceClaimDeviceStatus featuregate.Feature = "DRAResourceClaimDeviceStatus" + // owner: @harche // kep: http://kep.k8s.io/3386 // diff --git a/pkg/features/versioned_kube_features.go b/pkg/features/versioned_kube_features.go index 4e306502e96..80588b79741 100644 --- a/pkg/features/versioned_kube_features.go +++ b/pkg/features/versioned_kube_features.go @@ -182,6 +182,10 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate {Version: version.MustParse("1.32"), Default: false, PreRelease: featuregate.Beta}, }, + DRAResourceClaimDeviceStatus: { + {Version: version.MustParse("1.32"), Default: false, PreRelease: featuregate.Alpha}, + }, + ElasticIndexedJob: { {Version: version.MustParse("1.27"), Default: true, PreRelease: featuregate.Beta}, {Version: version.MustParse("1.31"), Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // GA in 1.31, remove in 1.32 diff --git a/pkg/registry/resource/resourceclaim/strategy.go b/pkg/registry/resource/resourceclaim/strategy.go index 4313577f97b..e8b783f4c7d 100644 --- a/pkg/registry/resource/resourceclaim/strategy.go +++ b/pkg/registry/resource/resourceclaim/strategy.go @@ -181,6 +181,7 @@ func toSelectableFields(claim *resource.ResourceClaim) fields.Set { // dropDisabledFields removes fields which are covered by a feature gate. func dropDisabledFields(newClaim, oldClaim *resource.ResourceClaim) { dropDisabledDRAAdminAccessFields(newClaim, oldClaim) + dropDisabledDRAResourceClaimDeviceStatusFields(newClaim, oldClaim) } func dropDisabledDRAAdminAccessFields(newClaim, oldClaim *resource.ResourceClaim) { @@ -231,3 +232,9 @@ func draAdminAccessFeatureInUse(claim *resource.ResourceClaim) bool { return false } + +func dropDisabledDRAResourceClaimDeviceStatusFields(newClaim, oldClaim *resource.ResourceClaim) { + if !utilfeature.DefaultFeatureGate.Enabled(features.DRAResourceClaimDeviceStatus) { + newClaim.Status.Devices = nil + } +} diff --git a/staging/src/k8s.io/api/resource/v1alpha3/types.go b/staging/src/k8s.io/api/resource/v1alpha3/types.go index bae302e6b84..cfe018d2709 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/types.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/types.go @@ -701,6 +701,18 @@ type ResourceClaimStatus struct { // it got removed. May be reused once decoding v1alpha3 is no longer // supported. // DeallocationRequested bool `json:"deallocationRequested,omitempty" protobuf:"bytes,3,opt,name=deallocationRequested"` + + // Devices contains the status of each device allocated for this + // claim, as reported by the driver. This can include driver-specific + // information. Entries are owned by their respective drivers. + // + // +optional + // +listType=map + // +listMapKey=driver + // +listMapKey=device + // +listMapKey=pool + // +featureGate=DRAResourceClaimDeviceStatus + Devices []AllocatedDeviceStatus `json:"devices,omitempty" protobuf:"bytes,4,opt,name=devices"` } // ReservedForMaxSize is the maximum number of entries in @@ -986,3 +998,77 @@ type ResourceClaimTemplateList struct { // Items is the list of resource claim templates. Items []ResourceClaimTemplate `json:"items" protobuf:"bytes,2,rep,name=items"` } + +// AllocatedDeviceStatus contains the status of an allocated device, if the +// driver chooses to report it. This may include driver-specific information. +type AllocatedDeviceStatus struct { + // Driver specifies the name of the DRA driver whose kubelet + // plugin should be invoked to process the allocation once the claim is + // needed on a node. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + Driver string `json:"driver" protobuf:"bytes,1,rep,name=driver"` + + // This name together with the driver name and the device name field + // identify which device was allocated (`//`). + // + // Must not be longer than 253 characters and may contain one or more + // DNS sub-domains separated by slashes. + // + // +required + Pool string `json:"pool" protobuf:"bytes,2,rep,name=pool"` + + // Device references one device instance via its name in the driver's + // resource pool. It must be a DNS label. + // + // +required + Device string `json:"device" protobuf:"bytes,3,rep,name=device"` + + // Conditions contains the latest observation of the device's state. + // If the device has been configured according to the class and claim + // config references, the `Ready` condition should be True. + // + // +optional + // +listType=atomic + Conditions []metav1.Condition `json:"conditions" protobuf:"bytes,4,opt,name=conditions"` + + // Data contains arbitrary driver-specific data. + // + // +optional + Data *runtime.RawExtension `json:"data,omitempty" protobuf:"bytes,5,opt,name=data"` + + // NetworkData contains network-related information specific to the device. + // + // +optional + NetworkData *NetworkDeviceData `json:"networkData,omitempty" protobuf:"bytes,6,opt,name=networkData"` +} + +// NetworkDeviceData provides network-related details for the allocated device. +// This information may be filled by drivers or other components to configure +// or identify the device within a network context. +type NetworkDeviceData struct { + // InterfaceName specifies the name of the network interface associated with + // the allocated device. This might be the name of a physical or virtual + // network interface. + // + // +optional + InterfaceName *string `json:"interfaceName,omitempty" protobuf:"bytes,1,opt,name=interfaceName"` + + // Addresses lists the network addresses assigned to the device's network interface. + // This can include both IPv4 and IPv6 addresses. + // The addresses are in the CIDR notation, which includes both the address and the + // associated subnet mask. + // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. + // + // +optional + // +listType=atomic + Addresses []string `json:"addresses,omitempty" protobuf:"bytes,2,opt,name=addresses"` + + // HWAddress represents the hardware address (e.g. MAC Address) of the device's network interface. + // + // +optional + HWAddress *string `json:"hwAddress,omitempty" protobuf:"bytes,3,opt,name=hwAddress"` +} diff --git a/test/integration/resourceclaim/feature_enable_disable_test.go b/test/integration/resourceclaim/feature_enable_disable_test.go new file mode 100644 index 00000000000..b980195d033 --- /dev/null +++ b/test/integration/resourceclaim/feature_enable_disable_test.go @@ -0,0 +1,187 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package resourceclaim + +import ( + "context" + "fmt" + "testing" + + "k8s.io/api/resource/v1alpha3" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientset "k8s.io/client-go/kubernetes" + kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" + "k8s.io/kubernetes/pkg/features" + "k8s.io/kubernetes/test/integration/framework" +) + +// TestEnableDisableDRAResourceClaimDeviceStatus first test the feature gate disabled +// by creating a ResourceClaim with an invalid device (not allocated device) and checks +// the object is not validated. +// Then the feature gate is created, and an attempt to create similar invalid ResourceClaim +// is done with no success. +func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { + // start etcd instance + etcdOptions := framework.SharedEtcd() + apiServerOptions := kubeapiservertesting.NewDefaultTestServerOptions() + // apiserver with the feature disabled + server1 := kubeapiservertesting.StartTestServerOrDie(t, apiServerOptions, + []string{ + fmt.Sprintf("--feature-gates=%s=true,%s=false", features.DynamicResourceAllocation, features.DRAResourceClaimDeviceStatus), + }, + etcdOptions) + client1, err := clientset.NewForConfig(server1.ClientConfig) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + ns := framework.CreateNamespaceOrDie(client1, "test-enable-dra-resourceclaim-device-status", t) + + rcDisabledName := "test-enable-dra-resourceclaim-device-status-rc-disabled" + rcDisabled := &v1alpha3.ResourceClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: rcDisabledName, + }, + Spec: v1alpha3.ResourceClaimSpec{ + Devices: v1alpha3.DeviceClaim{ + Requests: []v1alpha3.DeviceRequest{ + { + Name: "foo", + DeviceClassName: "foo", + Count: 1, + AllocationMode: v1alpha3.DeviceAllocationModeExactCount, + }, + }, + }, + }, + } + + if _, err := client1.ResourceV1alpha3().ResourceClaims(ns.Name).Create(context.TODO(), rcDisabled, metav1.CreateOptions{}); err != nil { + t.Fatal(err) + } + + rcDisabled.Status = v1alpha3.ResourceClaimStatus{ + Devices: []v1alpha3.AllocatedDeviceStatus{ + { + Driver: "foo", + Pool: "foo", + Device: "foo", + }, + }, + } + if _, err := client1.ResourceV1alpha3().ResourceClaims(ns.Name).UpdateStatus(context.TODO(), rcDisabled, metav1.UpdateOptions{}); err != nil { + t.Fatal(err) + } + + rcDisabled, err = client1.ResourceV1alpha3().ResourceClaims(ns.Name).Get(context.TODO(), rcDisabledName, metav1.GetOptions{}) + if err != nil { + t.Fatal(err) + } + // No devices as the Kubernetes api-server dropped these fields since the feature is disabled. + if len(rcDisabled.Status.Devices) != 0 { + t.Fatalf("expected 0 Device in status got %d", len(rcDisabled.Status.Devices)) + } + + // shutdown apiserver with the feature disabled + server1.TearDownFn() + + // apiserver with the feature enabled + server2 := kubeapiservertesting.StartTestServerOrDie(t, apiServerOptions, + []string{ + fmt.Sprintf("--feature-gates=%s=true,%s=true", features.DynamicResourceAllocation, features.DRAResourceClaimDeviceStatus), + }, + etcdOptions) + client2, err := clientset.NewForConfig(server2.ClientConfig) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + rcEnabledName := "test-enable-dra-resourceclaim-device-status-rc-enabled" + rcEnabled := &v1alpha3.ResourceClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: rcEnabledName, + }, + Spec: v1alpha3.ResourceClaimSpec{ + Devices: v1alpha3.DeviceClaim{ + Requests: []v1alpha3.DeviceRequest{ + { + Name: "bar", + DeviceClassName: "bar", + Count: 1, + AllocationMode: v1alpha3.DeviceAllocationModeExactCount, + }, + }, + }, + }, + } + + if _, err := client2.ResourceV1alpha3().ResourceClaims(ns.Name).Create(context.TODO(), rcEnabled, metav1.CreateOptions{}); err != nil { + t.Fatal(err) + } + + // Tests the validation is enabled. + // validation will refuse this update as the device is not allocated. + rcEnabled.Status = v1alpha3.ResourceClaimStatus{ + Devices: []v1alpha3.AllocatedDeviceStatus{ + { + Driver: "bar", + Pool: "bar", + Device: "bar", + }, + }, + } + if _, err := client2.ResourceV1alpha3().ResourceClaims(ns.Name).UpdateStatus(context.TODO(), rcEnabled, metav1.UpdateOptions{}); err == nil { + t.Fatalf("Expected error (must be an allocated device in the claim)") + } + + rcEnabled.Status = v1alpha3.ResourceClaimStatus{ + Allocation: &v1alpha3.AllocationResult{ + Devices: v1alpha3.DeviceAllocationResult{ + Results: []v1alpha3.DeviceRequestAllocationResult{ + { + Request: "bar", + Driver: "bar", + Pool: "bar", + Device: "bar", + }, + }, + }, + }, + Devices: []v1alpha3.AllocatedDeviceStatus{ + { + Driver: "bar", + Pool: "bar", + Device: "bar", + }, + }, + } + if _, err := client2.ResourceV1alpha3().ResourceClaims(ns.Name).UpdateStatus(context.TODO(), rcEnabled, metav1.UpdateOptions{}); err != nil { + t.Fatal(err) + } + + // Tests the field is enabled. + rcEnabled, err = client2.ResourceV1alpha3().ResourceClaims(ns.Name).Get(context.TODO(), rcEnabledName, metav1.GetOptions{}) + if err != nil { + t.Fatal(err) + } + if len(rcEnabled.Status.Devices) != 1 { + t.Fatalf("expected 1 Device in status got %d", len(rcEnabled.Status.Devices)) + } + + // shutdown apiserver with the feature enabled + server2.TearDownFn() +} diff --git a/test/integration/resourceclaim/main_test.go b/test/integration/resourceclaim/main_test.go new file mode 100644 index 00000000000..7b48de60741 --- /dev/null +++ b/test/integration/resourceclaim/main_test.go @@ -0,0 +1,27 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package resourceclaim + +import ( + "testing" + + "k8s.io/kubernetes/test/integration/framework" +) + +func TestMain(m *testing.M) { + framework.EtcdMain(m.Run) +} From 4bd62e5234de537877522e8b0cf05edff2c8cbbe Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Tue, 22 Oct 2024 17:17:02 +0200 Subject: [PATCH 02/17] [KEP-4817] Fix fuzz API tests and ./hack/update-featuregates.sh Signed-off-by: Lionel Jouin --- pkg/apis/resource/fuzzer/fuzzer.go | 8 ++++++++ .../test_data/versioned_feature_list.yaml | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/pkg/apis/resource/fuzzer/fuzzer.go b/pkg/apis/resource/fuzzer/fuzzer.go index 9ad8ad32fcf..f9fa97a102a 100644 --- a/pkg/apis/resource/fuzzer/fuzzer.go +++ b/pkg/apis/resource/fuzzer/fuzzer.go @@ -56,5 +56,13 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { // might be valid JSON which changes during re-encoding. r.Parameters = runtime.RawExtension{Raw: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`)} }, + func(r *resource.AllocatedDeviceStatus, c fuzz.Continue) { + c.FuzzNoCustom(r) + // Match the fuzzer default content for runtime.Object. + // + // This is necessary because randomly generated content + // might be valid JSON which changes during re-encoding. + r.Data = &runtime.RawExtension{Raw: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`)} + }, } } diff --git a/test/featuregates_linter/test_data/versioned_feature_list.yaml b/test/featuregates_linter/test_data/versioned_feature_list.yaml index 591cb636af2..93f24ea9fd7 100644 --- a/test/featuregates_linter/test_data/versioned_feature_list.yaml +++ b/test/featuregates_linter/test_data/versioned_feature_list.yaml @@ -406,6 +406,12 @@ lockToDefault: false preRelease: Alpha version: "1.32" +- name: DRAResourceClaimDeviceStatus + versionedSpecs: + - default: false + lockToDefault: false + preRelease: Alpha + version: "1.32" - name: DynamicResourceAllocation versionedSpecs: - default: false From 5d7a16b0a56f12345e92b7fcf6db914f5dbef21b Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Tue, 22 Oct 2024 18:08:57 +0200 Subject: [PATCH 03/17] [KEP-4817] improve testing * Test feature-gate enabled/disabled for validation * Test pkg/registry/resource/resourceclaim * Add Data and NetworkData to integration test Signed-off-by: Lionel Jouin --- pkg/apis/resource/validation/validation.go | 1 + .../validation_resourceclaim_test.go | 95 ++++++++++++++-- .../resource/resourceclaim/strategy_test.go | 102 +++++++++++++++++- .../feature_enable_disable_test.go | 35 ++++++ 4 files changed, 222 insertions(+), 11 deletions(-) diff --git a/pkg/apis/resource/validation/validation.go b/pkg/apis/resource/validation/validation.go index 866ed2fffe3..8349a1a84b5 100644 --- a/pkg/apis/resource/validation/validation.go +++ b/pkg/apis/resource/validation/validation.go @@ -780,6 +780,7 @@ func validateRawExtension(rawExtension *runtime.RawExtension, fldPath *field.Pat if rawExtension == nil { return allErrs } + // Validation of RawExtension as in https://github.com/kubernetes/kubernetes/pull/125549/ var v any if err := json.Unmarshal(rawExtension.Raw, &v); err != nil { allErrs = append(allErrs, field.Invalid(fldPath, "", fmt.Sprintf("error parsing data: %v", err.Error()))) diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index 060b701a2c9..72d8b96c29f 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -598,8 +598,6 @@ func TestValidateClaimUpdate(t *testing.T) { } func TestValidateClaimStatusUpdate(t *testing.T) { - featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.DRAResourceClaimDeviceStatus, true) - validAllocatedClaim := validClaim.DeepCopy() validAllocatedClaim.Status = resource.ResourceClaimStatus{ Allocation: &resource.AllocationResult{ @@ -618,10 +616,11 @@ func TestValidateClaimStatusUpdate(t *testing.T) { validAllocatedClaimOld.Status.Allocation.Devices.Results[0].AdminAccess = nil // Not required in 1.31. scenarios := map[string]struct { - adminAccess bool - oldClaim *resource.ResourceClaim - update func(claim *resource.ResourceClaim) *resource.ResourceClaim - wantFailures field.ErrorList + adminAccess bool + deviceStatusFeatureGate bool + oldClaim *resource.ResourceClaim + update func(claim *resource.ResourceClaim) *resource.ResourceClaim + wantFailures field.ErrorList }{ "valid-no-op-update": { oldClaim: validClaim, @@ -1016,6 +1015,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { } return claim }, + deviceStatusFeatureGate: true, }, "invalid-device-status-duplicate": { wantFailures: field.ErrorList{ @@ -1038,6 +1038,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { } return claim }, + deviceStatusFeatureGate: true, }, "invalid-network-device-status": { wantFailures: field.ErrorList{ @@ -1060,6 +1061,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { } return claim }, + deviceStatusFeatureGate: true, }, "invalid-data-device-status": { wantFailures: field.ErrorList{ @@ -1080,6 +1082,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { } return claim }, + deviceStatusFeatureGate: true, }, "invalid-device-status-no-device": { wantFailures: field.ErrorList{ @@ -1097,12 +1100,92 @@ func TestValidateClaimStatusUpdate(t *testing.T) { } return claim }, + deviceStatusFeatureGate: true, + }, + "invalid-device-status-duplicate-disabled-feature-gate": { + wantFailures: nil, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim = claim.DeepCopy() + claim.Status.Devices = []resource.AllocatedDeviceStatus{ + { + Driver: goodName, + Pool: goodName, + Device: goodName, + }, + { + Driver: goodName, + Pool: goodName, + Device: goodName, + }, + } + return claim + }, + deviceStatusFeatureGate: false, + }, + "invalid-network-device-status-disabled-feature-gate": { + wantFailures: nil, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim = claim.DeepCopy() + claim.Status.Devices = []resource.AllocatedDeviceStatus{ + { + Driver: goodName, + Pool: goodName, + Device: goodName, + NetworkData: &resource.NetworkDeviceData{ + Addresses: []string{ + "300.9.8.0/24", + }, + }, + }, + } + return claim + }, + deviceStatusFeatureGate: false, + }, + "invalid-data-device-status-disabled-feature-gate": { + wantFailures: nil, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim = claim.DeepCopy() + claim.Status.Devices = []resource.AllocatedDeviceStatus{ + { + Driver: goodName, + Pool: goodName, + Device: goodName, + Data: &runtime.RawExtension{ + Raw: []byte(`foo`), + }, + }, + } + return claim + }, + deviceStatusFeatureGate: false, + }, + "invalid-device-status-no-device-disabled-feature-gate": { + wantFailures: nil, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim = claim.DeepCopy() + claim.Status.Devices = []resource.AllocatedDeviceStatus{ + { + Driver: "b", + Pool: "a", + Device: "r", + }, + } + return claim + }, + deviceStatusFeatureGate: false, }, } for name, scenario := range scenarios { t.Run(name, func(t *testing.T) { featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.DRAAdminAccess, scenario.adminAccess) + featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.DRAResourceClaimDeviceStatus, scenario.deviceStatusFeatureGate) + scenario.oldClaim.ResourceVersion = "1" errs := ValidateResourceClaimStatusUpdate(scenario.update(scenario.oldClaim.DeepCopy()), scenario.oldClaim) assertFailures(t, scenario.wantFailures, errs) diff --git a/pkg/registry/resource/resourceclaim/strategy_test.go b/pkg/registry/resource/resourceclaim/strategy_test.go index 3c43558d18f..96741ad79fd 100644 --- a/pkg/registry/resource/resourceclaim/strategy_test.go +++ b/pkg/registry/resource/resourceclaim/strategy_test.go @@ -133,6 +133,79 @@ var objWithAdminAccessStatus = &resource.ResourceClaim{ }, } +var objWithRequestAndStatus = &resource.ResourceClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "valid-claim", + Namespace: "default", + }, + Spec: resource.ResourceClaimSpec{ + Devices: resource.DeviceClaim{ + Requests: []resource.DeviceRequest{ + { + Name: "test-request", + DeviceClassName: "test-device-class", + AllocationMode: resource.DeviceAllocationModeExactCount, + Count: 1, + }, + }, + }, + }, + Status: resource.ResourceClaimStatus{ + Allocation: &resource.AllocationResult{ + Devices: resource.DeviceAllocationResult{ + Results: []resource.DeviceRequestAllocationResult{ + { + Request: "test-request", + Driver: "test-driver", + Pool: "test-pool", + Device: "test-device", + }, + }, + }, + }, + }, +} + +var objWithGatedStatusFields = &resource.ResourceClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "valid-claim", + Namespace: "default", + }, + Spec: resource.ResourceClaimSpec{ + Devices: resource.DeviceClaim{ + Requests: []resource.DeviceRequest{ + { + Name: "test-request", + DeviceClassName: "test-device-class", + AllocationMode: resource.DeviceAllocationModeExactCount, + Count: 1, + }, + }, + }, + }, + Status: resource.ResourceClaimStatus{ + Allocation: &resource.AllocationResult{ + Devices: resource.DeviceAllocationResult{ + Results: []resource.DeviceRequestAllocationResult{ + { + Request: "test-request", + Driver: "test-driver", + Pool: "test-pool", + Device: "test-device", + }, + }, + }, + }, + Devices: []resource.AllocatedDeviceStatus{ + { + Driver: "test-driver", + Pool: "test-pool", + Device: "test-device", + }, + }, + }, +} + func TestStrategy(t *testing.T) { if !Strategy.NamespaceScoped() { t.Errorf("ResourceClaim must be namespace scoped") @@ -275,11 +348,12 @@ func TestStatusStrategyUpdate(t *testing.T) { ctx := genericapirequest.NewDefaultContext() testcases := map[string]struct { - oldObj *resource.ResourceClaim - newObj *resource.ResourceClaim - adminAccess bool - expectValidationError bool - expectObj *resource.ResourceClaim + oldObj *resource.ResourceClaim + newObj *resource.ResourceClaim + adminAccess bool + deviceStatusFeatureGate bool + expectValidationError bool + expectObj *resource.ResourceClaim }{ "no-changes-okay": { oldObj: obj, @@ -347,11 +421,29 @@ func TestStatusStrategyUpdate(t *testing.T) { return oldObj }(), }, + "drop-fields-devices-status": { + oldObj: objWithRequestAndStatus, + newObj: objWithGatedStatusFields, + deviceStatusFeatureGate: false, + expectObj: objWithRequestAndStatus, + }, + "keep-fields-devices-status": { + oldObj: objWithRequestAndStatus, + newObj: objWithGatedStatusFields, + deviceStatusFeatureGate: true, + expectObj: func() *resource.ResourceClaim { + expectObj := objWithGatedStatusFields.DeepCopy() + // Spec remains unchanged. + expectObj.Spec = objWithRequestAndStatus.Spec + return expectObj + }(), + }, } for name, tc := range testcases { t.Run(name, func(t *testing.T) { featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.DRAAdminAccess, tc.adminAccess) + featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.DRAResourceClaimDeviceStatus, tc.deviceStatusFeatureGate) oldObj := tc.oldObj.DeepCopy() newObj := tc.newObj.DeepCopy() diff --git a/test/integration/resourceclaim/feature_enable_disable_test.go b/test/integration/resourceclaim/feature_enable_disable_test.go index b980195d033..88213c4674b 100644 --- a/test/integration/resourceclaim/feature_enable_disable_test.go +++ b/test/integration/resourceclaim/feature_enable_disable_test.go @@ -23,10 +23,12 @@ import ( "k8s.io/api/resource/v1alpha3" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" clientset "k8s.io/client-go/kubernetes" kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/test/integration/framework" + "k8s.io/utils/ptr" ) // TestEnableDisableDRAResourceClaimDeviceStatus first test the feature gate disabled @@ -80,6 +82,17 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Driver: "foo", Pool: "foo", Device: "foo", + Data: &runtime.RawExtension{ + Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), + }, + NetworkData: &v1alpha3.NetworkDeviceData{ + InterfaceName: ptr.To("net-1"), + Addresses: []string{ + "10.9.8.0/24", + "2001:db8::/64", + }, + HWAddress: ptr.To("ea:9f:cb:40:b1:7b"), + }, }, }, } @@ -141,6 +154,17 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Driver: "bar", Pool: "bar", Device: "bar", + Data: &runtime.RawExtension{ + Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), + }, + NetworkData: &v1alpha3.NetworkDeviceData{ + InterfaceName: ptr.To("net-1"), + Addresses: []string{ + "10.9.8.0/24", + "2001:db8::/64", + }, + HWAddress: ptr.To("ea:9f:cb:40:b1:7b"), + }, }, }, } @@ -166,6 +190,17 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Driver: "bar", Pool: "bar", Device: "bar", + Data: &runtime.RawExtension{ + Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), + }, + NetworkData: &v1alpha3.NetworkDeviceData{ + InterfaceName: ptr.To("net-1"), + Addresses: []string{ + "10.9.8.0/24", + "2001:db8::/64", + }, + HWAddress: ptr.To("ea:9f:cb:40:b1:7b"), + }, }, }, } From c59359289f190b138efa04314a2739400a39b3ae Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Tue, 22 Oct 2024 20:11:36 +0200 Subject: [PATCH 04/17] [KEP-4817] Drop deallocated devices from resourceclaim.status.devices Signed-off-by: Lionel Jouin --- .../resource/resourceclaim/strategy.go | 47 +++++ .../resource/resourceclaim/strategy_test.go | 171 +++++++++--------- 2 files changed, 136 insertions(+), 82 deletions(-) diff --git a/pkg/registry/resource/resourceclaim/strategy.go b/pkg/registry/resource/resourceclaim/strategy.go index e8b783f4c7d..6aa41f5bcfc 100644 --- a/pkg/registry/resource/resourceclaim/strategy.go +++ b/pkg/registry/resource/resourceclaim/strategy.go @@ -24,11 +24,13 @@ import ( "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/dynamic-resource-allocation/structured" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/resource" "k8s.io/kubernetes/pkg/apis/resource/validation" @@ -140,6 +142,7 @@ func (resourceclaimStatusStrategy) PrepareForUpdate(ctx context.Context, obj, ol newClaim.Spec = oldClaim.Spec metav1.ResetObjectMetaForStatus(&newClaim.ObjectMeta, &oldClaim.ObjectMeta) + dropDeallocatedStatusDevices(newClaim, oldClaim) dropDisabledFields(newClaim, oldClaim) } @@ -238,3 +241,47 @@ func dropDisabledDRAResourceClaimDeviceStatusFields(newClaim, oldClaim *resource newClaim.Status.Devices = nil } } + +// dropDeallocatedStatusDevices removes the status.devices that were allocated +// in the oldClaim and that have been removed in the newClaim. +func dropDeallocatedStatusDevices(newClaim, oldClaim *resource.ResourceClaim) { + if !utilfeature.DefaultFeatureGate.Enabled(features.DRAResourceClaimDeviceStatus) { + return + } + + deallocatedDevices := sets.New[structured.DeviceID]() + + if oldClaim.Status.Allocation != nil { + // Get all devices in the oldClaim. + for _, result := range oldClaim.Status.Allocation.Devices.Results { + deviceID := structured.DeviceID{Driver: result.Driver, Pool: result.Pool, Device: result.Device} + deallocatedDevices.Insert(deviceID) + } + } + + // Remove devices from deallocatedDevices that are still in newClaim. + if newClaim.Status.Allocation != nil { + for _, result := range newClaim.Status.Allocation.Devices.Results { + deviceID := structured.DeviceID{Driver: result.Driver, Pool: result.Pool, Device: result.Device} + deallocatedDevices.Delete(deviceID) + } + } + + // Remove from newClaim.Status.Devices. + for i := len(newClaim.Status.Devices) - 1; i >= 0; i-- { + deviceID := structured.DeviceID{ + Driver: newClaim.Status.Devices[i].Driver, + Pool: newClaim.Status.Devices[i].Pool, + Device: newClaim.Status.Devices[i].Device, + } + // Device was in the oldClaim.Status.Allocation.Devices but is no longer in the + // newClaim.Status.Allocation.Devices so it must be removed from the newClaim.Status.Devices. + if deallocatedDevices.Has(deviceID) { + newClaim.Status.Devices = append(newClaim.Status.Devices[:i], newClaim.Status.Devices[i+1:]...) + } + } + + if len(newClaim.Status.Devices) == 0 { + newClaim.Status.Devices = nil + } +} diff --git a/pkg/registry/resource/resourceclaim/strategy_test.go b/pkg/registry/resource/resourceclaim/strategy_test.go index 96741ad79fd..fe227f7eaf7 100644 --- a/pkg/registry/resource/resourceclaim/strategy_test.go +++ b/pkg/registry/resource/resourceclaim/strategy_test.go @@ -133,78 +133,10 @@ var objWithAdminAccessStatus = &resource.ResourceClaim{ }, } -var objWithRequestAndStatus = &resource.ResourceClaim{ - ObjectMeta: metav1.ObjectMeta{ - Name: "valid-claim", - Namespace: "default", - }, - Spec: resource.ResourceClaimSpec{ - Devices: resource.DeviceClaim{ - Requests: []resource.DeviceRequest{ - { - Name: "test-request", - DeviceClassName: "test-device-class", - AllocationMode: resource.DeviceAllocationModeExactCount, - Count: 1, - }, - }, - }, - }, - Status: resource.ResourceClaimStatus{ - Allocation: &resource.AllocationResult{ - Devices: resource.DeviceAllocationResult{ - Results: []resource.DeviceRequestAllocationResult{ - { - Request: "test-request", - Driver: "test-driver", - Pool: "test-pool", - Device: "test-device", - }, - }, - }, - }, - }, -} - -var objWithGatedStatusFields = &resource.ResourceClaim{ - ObjectMeta: metav1.ObjectMeta{ - Name: "valid-claim", - Namespace: "default", - }, - Spec: resource.ResourceClaimSpec{ - Devices: resource.DeviceClaim{ - Requests: []resource.DeviceRequest{ - { - Name: "test-request", - DeviceClassName: "test-device-class", - AllocationMode: resource.DeviceAllocationModeExactCount, - Count: 1, - }, - }, - }, - }, - Status: resource.ResourceClaimStatus{ - Allocation: &resource.AllocationResult{ - Devices: resource.DeviceAllocationResult{ - Results: []resource.DeviceRequestAllocationResult{ - { - Request: "test-request", - Driver: "test-driver", - Pool: "test-pool", - Device: "test-device", - }, - }, - }, - }, - Devices: []resource.AllocatedDeviceStatus{ - { - Driver: "test-driver", - Pool: "test-pool", - Device: "test-device", - }, - }, - }, -} +var testRequest = "test-request" +var testDriver = "test-driver" +var testPool = "test-pool" +var testDevice = "test-device" func TestStrategy(t *testing.T) { if !Strategy.NamespaceScoped() { @@ -422,20 +354,69 @@ func TestStatusStrategyUpdate(t *testing.T) { }(), }, "drop-fields-devices-status": { - oldObj: objWithRequestAndStatus, - newObj: objWithGatedStatusFields, + oldObj: func() *resource.ResourceClaim { + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusAllocationDevicesResults(obj, testDriver, testPool, testDevice, testRequest) + return obj + }(), + newObj: func() *resource.ResourceClaim { // Status is added + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusAllocationDevicesResults(obj, testDriver, testPool, testDevice, testRequest) + addStatusDevices(obj, testDriver, testPool, testDevice) + return obj + }(), deviceStatusFeatureGate: false, - expectObj: objWithRequestAndStatus, + expectObj: func() *resource.ResourceClaim { // Status is no longer there + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusAllocationDevicesResults(obj, testDriver, testPool, testDevice, testRequest) + return obj + }(), }, "keep-fields-devices-status": { - oldObj: objWithRequestAndStatus, - newObj: objWithGatedStatusFields, + oldObj: func() *resource.ResourceClaim { + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusAllocationDevicesResults(obj, testDriver, testPool, testDevice, testRequest) + return obj + }(), + newObj: func() *resource.ResourceClaim { // Status is added + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusAllocationDevicesResults(obj, testDriver, testPool, testDevice, testRequest) + addStatusDevices(obj, testDriver, testPool, testDevice) + return obj + }(), deviceStatusFeatureGate: true, - expectObj: func() *resource.ResourceClaim { - expectObj := objWithGatedStatusFields.DeepCopy() - // Spec remains unchanged. - expectObj.Spec = objWithRequestAndStatus.Spec - return expectObj + expectObj: func() *resource.ResourceClaim { // Status is still there + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusAllocationDevicesResults(obj, testDriver, testPool, testDevice, testRequest) + addStatusDevices(obj, testDriver, testPool, testDevice) + return obj + }(), + }, + "drop-status-deallocated-device": { + oldObj: func() *resource.ResourceClaim { + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusAllocationDevicesResults(obj, testDriver, testPool, testDevice, testRequest) + addStatusDevices(obj, testDriver, testPool, testDevice) + return obj + }(), + newObj: func() *resource.ResourceClaim { // device is deallocated + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusDevices(obj, testDriver, testPool, testDevice) + return obj + }(), + deviceStatusFeatureGate: true, + expectObj: func() *resource.ResourceClaim { // Status is no longer there + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + return obj }(), }, } @@ -469,3 +450,29 @@ func TestStatusStrategyUpdate(t *testing.T) { }) } } + +func addSpecDevicesRequest(resourceClaim *resource.ResourceClaim, request string) { + resourceClaim.Spec.Devices.Requests = append(resourceClaim.Spec.Devices.Requests, resource.DeviceRequest{ + Name: request, + }) +} + +func addStatusAllocationDevicesResults(resourceClaim *resource.ResourceClaim, driver string, pool string, device string, request string) { + if resourceClaim.Status.Allocation == nil { + resourceClaim.Status.Allocation = &resource.AllocationResult{} + } + resourceClaim.Status.Allocation.Devices.Results = append(resourceClaim.Status.Allocation.Devices.Results, resource.DeviceRequestAllocationResult{ + Request: request, + Driver: driver, + Pool: pool, + Device: device, + }) +} + +func addStatusDevices(resourceClaim *resource.ResourceClaim, driver string, pool string, device string) { + resourceClaim.Status.Devices = append(resourceClaim.Status.Devices, resource.AllocatedDeviceStatus{ + Driver: driver, + Pool: pool, + Device: device, + }) +} From 8be335a75547815369d05041524a8fc70c8dde5e Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Sat, 26 Oct 2024 21:14:57 +0200 Subject: [PATCH 05/17] [KEP-4817] E2E: Update ResourceClaim.Status.Devices Signed-off-by: Lionel Jouin --- test/e2e/dra/dra.go | 67 +++++++++++++++++++ test/e2e/dra/test-driver/app/kubeletplugin.go | 4 ++ .../deploy/example/plugin-permissions.yaml | 3 + test/e2e/feature/feature.go | 9 +++ 4 files changed, 83 insertions(+) diff --git a/test/e2e/dra/dra.go b/test/e2e/dra/dra.go index cb2324e0a5e..7fa3aab928a 100644 --- a/test/e2e/dra/dra.go +++ b/test/e2e/dra/dra.go @@ -403,6 +403,73 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, return b.f.ClientSet.ResourceV1beta1().ResourceClaims(b.f.Namespace.Name).Get(ctx, claim.Name, metav1.GetOptions{}) }).WithTimeout(f.Timeouts.PodDelete).Should(gomega.HaveField("Status.Allocation", (*resourceapi.AllocationResult)(nil))) }) + + f.It("must be possible for the driver to update the ResourceClaim.Status.Devices once allocated", feature.DRAResourceClaimDeviceStatus, func(ctx context.Context) { + pod := b.podExternal() + claim := b.externalClaim() + b.create(ctx, claim, pod) + + // Waits for the ResourceClaim to be allocated and the pod to be scheduled. + var allocatedResourceClaim *resourceapi.ResourceClaim + var scheduledPod *v1.Pod + + gomega.Eventually(ctx, func(ctx context.Context) (*resourceapi.ResourceClaim, error) { + var err error + allocatedResourceClaim, err = b.f.ClientSet.ResourceV1alpha3().ResourceClaims(b.f.Namespace.Name).Get(ctx, claim.Name, metav1.GetOptions{}) + return allocatedResourceClaim, err + }).WithTimeout(f.Timeouts.PodDelete).ShouldNot(gomega.HaveField("Status.Allocation", (*resourceapi.AllocationResult)(nil))) + + gomega.Eventually(ctx, func(ctx context.Context) error { + var err error + scheduledPod, err = b.f.ClientSet.CoreV1().Pods(pod.Namespace).Get(ctx, pod.Name, metav1.GetOptions{}) + if err != nil && scheduledPod.Spec.NodeName != "" { + return fmt.Errorf("expected the test pod %s to exist and to be scheduled on a node: %w", pod.Name, err) + } + return nil + }).WithTimeout(f.Timeouts.PodDelete).Should(gomega.BeNil()) + + gomega.Expect(allocatedResourceClaim.Status.Allocation).ToNot(gomega.BeNil()) + gomega.Expect(allocatedResourceClaim.Status.Allocation.Devices.Results).To(gomega.HaveLen(1)) + + ginkgo.By("Setting the device status a first time") + allocatedResourceClaim.Status.Devices = append(allocatedResourceClaim.Status.Devices, + resourceapi.AllocatedDeviceStatus{ + Driver: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Driver, + Pool: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Pool, + Device: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Device, + Conditions: []metav1.Condition{{Type: "a", Status: "b", Message: "c", Reason: "d"}}, + Data: &runtime.RawExtension{Raw: []byte(`{"foo":"bar"}`)}, + NetworkData: &resourceapi.NetworkDeviceData{ + InterfaceName: ptr.To("inf1"), + Addresses: []string{"10.9.8.0/24", "2001:db8::/64"}, + HWAddress: ptr.To("bc:1c:b6:3e:b8:25"), + }, + }) + // Updates the ResourceClaim from the driver on the same node as the pod. + updatedResourceClaim, err := driver.Nodes[scheduledPod.Spec.NodeName].ExamplePlugin.UpdateStatus(ctx, allocatedResourceClaim) + framework.ExpectNoError(err) + gomega.Expect(updatedResourceClaim).ToNot(gomega.BeNil()) + gomega.Expect(updatedResourceClaim.Status.Devices).To(gomega.Equal(allocatedResourceClaim.Status.Devices)) + + ginkgo.By("Updating the device status") + updatedResourceClaim.Status.Devices[0] = resourceapi.AllocatedDeviceStatus{ + Driver: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Driver, + Pool: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Pool, + Device: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Device, + Conditions: []metav1.Condition{{Type: "e", Status: "f", Message: "g", Reason: "h"}}, + Data: &runtime.RawExtension{Raw: []byte(`{"bar":"foo"}`)}, + NetworkData: &resourceapi.NetworkDeviceData{ + InterfaceName: ptr.To("inf2"), + Addresses: []string{"10.9.8.1/24", "2001:db8::1/64"}, + HWAddress: ptr.To("bc:1c:b6:3e:b8:26"), + }, + } + updatedResourceClaim2, err := driver.Nodes[scheduledPod.Spec.NodeName].ExamplePlugin.UpdateStatus(ctx, updatedResourceClaim) + framework.ExpectNoError(err) + gomega.Expect(updatedResourceClaim2).ToNot(gomega.BeNil()) + gomega.Expect(updatedResourceClaim2.Status.Devices).To(gomega.Equal(updatedResourceClaim.Status.Devices)) + + }) } singleNodeTests := func() { diff --git a/test/e2e/dra/test-driver/app/kubeletplugin.go b/test/e2e/dra/test-driver/app/kubeletplugin.go index 242832bc21d..04b6c1cfde5 100644 --- a/test/e2e/dra/test-driver/app/kubeletplugin.go +++ b/test/e2e/dra/test-driver/app/kubeletplugin.go @@ -560,3 +560,7 @@ func (ex *ExamplePlugin) CountCalls(methodSuffix string) int { } return count } + +func (ex *ExamplePlugin) UpdateStatus(ctx context.Context, resourceClaim *resourceapi.ResourceClaim) (*resourceapi.ResourceClaim, error) { + return ex.kubeClient.ResourceV1alpha3().ResourceClaims(resourceClaim.Namespace).UpdateStatus(ctx, resourceClaim, metav1.UpdateOptions{}) +} diff --git a/test/e2e/dra/test-driver/deploy/example/plugin-permissions.yaml b/test/e2e/dra/test-driver/deploy/example/plugin-permissions.yaml index 14c897ac08b..0c35cbacfbb 100644 --- a/test/e2e/dra/test-driver/deploy/example/plugin-permissions.yaml +++ b/test/e2e/dra/test-driver/deploy/example/plugin-permissions.yaml @@ -15,6 +15,9 @@ rules: - apiGroups: ["resource.k8s.io"] resources: ["resourceclaims"] verbs: ["get"] +- apiGroups: ["resource.k8s.io"] + resources: ["resourceclaims/status"] + verbs: ["update"] - apiGroups: [""] resources: ["nodes"] verbs: ["get"] diff --git a/test/e2e/feature/feature.go b/test/e2e/feature/feature.go index 557d0930cee..81d4fa67336 100644 --- a/test/e2e/feature/feature.go +++ b/test/e2e/feature/feature.go @@ -91,6 +91,15 @@ var ( // TODO: document the feature (owning SIG, when to use this feature for a test) Downgrade = framework.WithFeature(framework.ValidFeatures.Add("Downgrade")) + // owning-sig: sig-node + // kep: https://kep.k8s.io/4817 + // test-infra jobs: + // - "dra-alpha" in https://testgrid.k8s.io/sig-node-dynamic-resource-allocation + // + // This label is used for tests which need: + // - the DynamicResourceAllocation *and* DRAResourceClaimDeviceStatus feature gates + DRAResourceClaimDeviceStatus = framework.WithFeature(framework.ValidFeatures.Add("DRAResourceClaimDeviceStatus")) + // owning-sig: sig-node // kep: https://kep.k8s.io/4381 // test-infra jobs: From cb9ee1d4fe8b8280382e74cbb071bee96537db9c Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Mon, 28 Oct 2024 14:41:18 +0100 Subject: [PATCH 06/17] [KEP-4817] Remove pointer on Data, InterfaceName and HWAddress fields Adapat validation and tests based on these API changes Signed-off-by: Lionel Jouin --- pkg/apis/resource/fuzzer/fuzzer.go | 2 +- pkg/apis/resource/types.go | 6 ++-- pkg/apis/resource/validation/validation.go | 34 ++++++------------- .../validation_resourceclaim_test.go | 10 +++--- .../src/k8s.io/api/resource/v1alpha3/types.go | 6 ++-- test/e2e/dra/dra.go | 12 +++---- .../feature_enable_disable_test.go | 19 +++++------ 7 files changed, 37 insertions(+), 52 deletions(-) diff --git a/pkg/apis/resource/fuzzer/fuzzer.go b/pkg/apis/resource/fuzzer/fuzzer.go index f9fa97a102a..31b64886e00 100644 --- a/pkg/apis/resource/fuzzer/fuzzer.go +++ b/pkg/apis/resource/fuzzer/fuzzer.go @@ -62,7 +62,7 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { // // This is necessary because randomly generated content // might be valid JSON which changes during re-encoding. - r.Data = &runtime.RawExtension{Raw: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`)} + r.Data = runtime.RawExtension{Raw: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`)} }, } } diff --git a/pkg/apis/resource/types.go b/pkg/apis/resource/types.go index ff7b704cb87..9aa9a3981a4 100644 --- a/pkg/apis/resource/types.go +++ b/pkg/apis/resource/types.go @@ -1027,7 +1027,7 @@ type AllocatedDeviceStatus struct { // Data contains arbitrary driver-specific data. // // +optional - Data *runtime.RawExtension + Data runtime.RawExtension // NetworkData contains network-related information specific to the device. // @@ -1044,7 +1044,7 @@ type NetworkDeviceData struct { // network interface. // // +optional - InterfaceName *string + InterfaceName string // Addresses lists the network addresses assigned to the device's network interface. // This can include both IPv4 and IPv6 addresses. @@ -1059,5 +1059,5 @@ type NetworkDeviceData struct { // HWAddress represents the hardware address (e.g. MAC Address) of the device's network interface. // // +optional - HWAddress *string + HWAddress string } diff --git a/pkg/apis/resource/validation/validation.go b/pkg/apis/resource/validation/validation.go index 8349a1a84b5..0b717ad8864 100644 --- a/pkg/apis/resource/validation/validation.go +++ b/pkg/apis/resource/validation/validation.go @@ -257,24 +257,7 @@ func validateDeviceConfiguration(config resource.DeviceConfiguration, fldPath *f func validateOpaqueConfiguration(config resource.OpaqueDeviceConfiguration, fldPath *field.Path, stored bool) field.ErrorList { var allErrs field.ErrorList allErrs = append(allErrs, validateDriverName(config.Driver, fldPath.Child("driver"))...) - // Validation of RawExtension as in https://github.com/kubernetes/kubernetes/pull/125549/ - var v any - if len(config.Parameters.Raw) == 0 { - allErrs = append(allErrs, field.Required(fldPath.Child("parameters"), "")) - } else if !stored && len(config.Parameters.Raw) > resource.OpaqueParametersMaxLength { - // Don't even bother with parsing when too large. - // Only applies on create. Existing parameters are grand-fathered in - // because the limit was introduced in 1.32. This also means that it - // can be changed in the future. - allErrs = append(allErrs, field.TooLong(fldPath.Child("parameters"), "" /* unused */, resource.OpaqueParametersMaxLength)) - } else if err := json.Unmarshal(config.Parameters.Raw, &v); err != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("parameters"), "", fmt.Sprintf("error parsing data as JSON: %v", err.Error()))) - } else if v == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("parameters"), "")) - } else if _, isObject := v.(map[string]any); !isObject { - allErrs = append(allErrs, field.Invalid(fldPath.Child("parameters"), "", "parameters must be a valid JSON object")) - } - + allErrs = append(allErrs, validateRawExtension(config.Parameters, fldPath.Child("parameters"))...) return allErrs } @@ -770,20 +753,23 @@ func validateDeviceStatus(device resource.AllocatedDeviceStatus, fldPath *field. var allErrs field.ErrorList return allErrs }, fldPath.Child("conditions"))...) - allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"))...) + if len(device.Data.Raw) > 0 { // Data is an optional field. + allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"))...) + } allErrs = append(allErrs, validateNetworkDeviceData(device.NetworkData, fldPath.Child("networkData"))...) return allErrs } -func validateRawExtension(rawExtension *runtime.RawExtension, fldPath *field.Path) field.ErrorList { +func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList - if rawExtension == nil { - return allErrs - } // Validation of RawExtension as in https://github.com/kubernetes/kubernetes/pull/125549/ var v any - if err := json.Unmarshal(rawExtension.Raw, &v); err != nil { + if len(rawExtension.Raw) == 0 { + allErrs = append(allErrs, field.Required(fldPath, "")) + } else if err := json.Unmarshal(rawExtension.Raw, &v); err != nil { allErrs = append(allErrs, field.Invalid(fldPath, "", fmt.Sprintf("error parsing data: %v", err.Error()))) + } else if v == nil { + allErrs = append(allErrs, field.Required(fldPath, "")) } else if _, isObject := v.(map[string]any); !isObject { allErrs = append(allErrs, field.Invalid(fldPath, "", "parameters must be a valid JSON object")) } diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index 72d8b96c29f..c155b4a16d5 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -1000,16 +1000,16 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Status: metav1.ConditionTrue, }, }, - Data: &runtime.RawExtension{ + Data: runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, NetworkData: &resource.NetworkDeviceData{ - InterfaceName: ptr.To("net-1"), + InterfaceName: "net-1", Addresses: []string{ "10.9.8.0/24", "2001:db8::/64", }, - HWAddress: ptr.To("ea:9f:cb:40:b1:7b"), + HWAddress: "ea:9f:cb:40:b1:7b", }, }, } @@ -1075,7 +1075,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Driver: goodName, Pool: goodName, Device: goodName, - Data: &runtime.RawExtension{ + Data: runtime.RawExtension{ Raw: []byte(`foo`), }, }, @@ -1154,7 +1154,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Driver: goodName, Pool: goodName, Device: goodName, - Data: &runtime.RawExtension{ + Data: runtime.RawExtension{ Raw: []byte(`foo`), }, }, diff --git a/staging/src/k8s.io/api/resource/v1alpha3/types.go b/staging/src/k8s.io/api/resource/v1alpha3/types.go index cfe018d2709..8ea60822241 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/types.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/types.go @@ -1038,7 +1038,7 @@ type AllocatedDeviceStatus struct { // Data contains arbitrary driver-specific data. // // +optional - Data *runtime.RawExtension `json:"data,omitempty" protobuf:"bytes,5,opt,name=data"` + Data runtime.RawExtension `json:"data,omitempty" protobuf:"bytes,5,opt,name=data"` // NetworkData contains network-related information specific to the device. // @@ -1055,7 +1055,7 @@ type NetworkDeviceData struct { // network interface. // // +optional - InterfaceName *string `json:"interfaceName,omitempty" protobuf:"bytes,1,opt,name=interfaceName"` + InterfaceName string `json:"interfaceName,omitempty" protobuf:"bytes,1,opt,name=interfaceName"` // Addresses lists the network addresses assigned to the device's network interface. // This can include both IPv4 and IPv6 addresses. @@ -1070,5 +1070,5 @@ type NetworkDeviceData struct { // HWAddress represents the hardware address (e.g. MAC Address) of the device's network interface. // // +optional - HWAddress *string `json:"hwAddress,omitempty" protobuf:"bytes,3,opt,name=hwAddress"` + HWAddress string `json:"hwAddress,omitempty" protobuf:"bytes,3,opt,name=hwAddress"` } diff --git a/test/e2e/dra/dra.go b/test/e2e/dra/dra.go index 7fa3aab928a..eb53bb72243 100644 --- a/test/e2e/dra/dra.go +++ b/test/e2e/dra/dra.go @@ -438,11 +438,11 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, Pool: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Pool, Device: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Device, Conditions: []metav1.Condition{{Type: "a", Status: "b", Message: "c", Reason: "d"}}, - Data: &runtime.RawExtension{Raw: []byte(`{"foo":"bar"}`)}, + Data: runtime.RawExtension{Raw: []byte(`{"foo":"bar"}`)}, NetworkData: &resourceapi.NetworkDeviceData{ - InterfaceName: ptr.To("inf1"), + InterfaceName: "inf1", Addresses: []string{"10.9.8.0/24", "2001:db8::/64"}, - HWAddress: ptr.To("bc:1c:b6:3e:b8:25"), + HWAddress: "bc:1c:b6:3e:b8:25", }, }) // Updates the ResourceClaim from the driver on the same node as the pod. @@ -457,11 +457,11 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, Pool: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Pool, Device: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Device, Conditions: []metav1.Condition{{Type: "e", Status: "f", Message: "g", Reason: "h"}}, - Data: &runtime.RawExtension{Raw: []byte(`{"bar":"foo"}`)}, + Data: runtime.RawExtension{Raw: []byte(`{"bar":"foo"}`)}, NetworkData: &resourceapi.NetworkDeviceData{ - InterfaceName: ptr.To("inf2"), + InterfaceName: "inf2", Addresses: []string{"10.9.8.1/24", "2001:db8::1/64"}, - HWAddress: ptr.To("bc:1c:b6:3e:b8:26"), + HWAddress: "bc:1c:b6:3e:b8:26", }, } updatedResourceClaim2, err := driver.Nodes[scheduledPod.Spec.NodeName].ExamplePlugin.UpdateStatus(ctx, updatedResourceClaim) diff --git a/test/integration/resourceclaim/feature_enable_disable_test.go b/test/integration/resourceclaim/feature_enable_disable_test.go index 88213c4674b..526d04fc119 100644 --- a/test/integration/resourceclaim/feature_enable_disable_test.go +++ b/test/integration/resourceclaim/feature_enable_disable_test.go @@ -28,7 +28,6 @@ import ( kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/test/integration/framework" - "k8s.io/utils/ptr" ) // TestEnableDisableDRAResourceClaimDeviceStatus first test the feature gate disabled @@ -82,16 +81,16 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Driver: "foo", Pool: "foo", Device: "foo", - Data: &runtime.RawExtension{ + Data: runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, NetworkData: &v1alpha3.NetworkDeviceData{ - InterfaceName: ptr.To("net-1"), + InterfaceName: "net-1", Addresses: []string{ "10.9.8.0/24", "2001:db8::/64", }, - HWAddress: ptr.To("ea:9f:cb:40:b1:7b"), + HWAddress: "ea:9f:cb:40:b1:7b", }, }, }, @@ -154,16 +153,16 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Driver: "bar", Pool: "bar", Device: "bar", - Data: &runtime.RawExtension{ + Data: runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, NetworkData: &v1alpha3.NetworkDeviceData{ - InterfaceName: ptr.To("net-1"), + InterfaceName: "net-1", Addresses: []string{ "10.9.8.0/24", "2001:db8::/64", }, - HWAddress: ptr.To("ea:9f:cb:40:b1:7b"), + HWAddress: "ea:9f:cb:40:b1:7b", }, }, }, @@ -190,16 +189,16 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Driver: "bar", Pool: "bar", Device: "bar", - Data: &runtime.RawExtension{ + Data: runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, NetworkData: &v1alpha3.NetworkDeviceData{ - InterfaceName: ptr.To("net-1"), + InterfaceName: "net-1", Addresses: []string{ "10.9.8.0/24", "2001:db8::/64", }, - HWAddress: ptr.To("ea:9f:cb:40:b1:7b"), + HWAddress: "ea:9f:cb:40:b1:7b", }, }, }, From 5df47a64d34a05f95294a00485fd6d6680110ad3 Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Wed, 30 Oct 2024 11:15:55 +0100 Subject: [PATCH 07/17] [KEP-4817] Remove unnecessary DeepCopy in validation tests Signed-off-by: Lionel Jouin --- .../resource/validation/validation_resourceclaim_test.go | 9 --------- 1 file changed, 9 deletions(-) diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index c155b4a16d5..b028d86e4ec 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -988,7 +988,6 @@ func TestValidateClaimStatusUpdate(t *testing.T) { "valid-network-device-status": { oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim = claim.DeepCopy() claim.Status.Devices = []resource.AllocatedDeviceStatus{ { Driver: goodName, @@ -1023,7 +1022,6 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim = claim.DeepCopy() claim.Status.Devices = []resource.AllocatedDeviceStatus{ { Driver: goodName, @@ -1046,7 +1044,6 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim = claim.DeepCopy() claim.Status.Devices = []resource.AllocatedDeviceStatus{ { Driver: goodName, @@ -1069,7 +1066,6 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim = claim.DeepCopy() claim.Status.Devices = []resource.AllocatedDeviceStatus{ { Driver: goodName, @@ -1090,7 +1086,6 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim = claim.DeepCopy() claim.Status.Devices = []resource.AllocatedDeviceStatus{ { Driver: "b", @@ -1106,7 +1101,6 @@ func TestValidateClaimStatusUpdate(t *testing.T) { wantFailures: nil, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim = claim.DeepCopy() claim.Status.Devices = []resource.AllocatedDeviceStatus{ { Driver: goodName, @@ -1127,7 +1121,6 @@ func TestValidateClaimStatusUpdate(t *testing.T) { wantFailures: nil, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim = claim.DeepCopy() claim.Status.Devices = []resource.AllocatedDeviceStatus{ { Driver: goodName, @@ -1148,7 +1141,6 @@ func TestValidateClaimStatusUpdate(t *testing.T) { wantFailures: nil, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim = claim.DeepCopy() claim.Status.Devices = []resource.AllocatedDeviceStatus{ { Driver: goodName, @@ -1167,7 +1159,6 @@ func TestValidateClaimStatusUpdate(t *testing.T) { wantFailures: nil, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim = claim.DeepCopy() claim.Status.Devices = []resource.AllocatedDeviceStatus{ { Driver: "b", From a062f91106e408b137c7dcab6429e7672bb2bf39 Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Mon, 4 Nov 2024 10:03:29 +0100 Subject: [PATCH 08/17] [KEP-4817] Fixes based on review * Rename HWAddress to HardwareAddress * Fix condition validation * Remove feature gate validation * Fix drop field on disabled feature gate Signed-off-by: Lionel Jouin --- pkg/apis/resource/types.go | 4 +- pkg/apis/resource/validation/validation.go | 36 +++++------- .../validation_resourceclaim_test.go | 33 +++++++---- .../resource/resourceclaim/strategy.go | 24 ++++---- .../resource/resourceclaim/strategy_test.go | 55 +++++++++++++++++-- .../src/k8s.io/api/resource/v1alpha3/types.go | 4 +- test/e2e/dra/dra.go | 20 ++++--- .../feature_enable_disable_test.go | 6 +- 8 files changed, 120 insertions(+), 62 deletions(-) diff --git a/pkg/apis/resource/types.go b/pkg/apis/resource/types.go index 9aa9a3981a4..6ae50a1aa3b 100644 --- a/pkg/apis/resource/types.go +++ b/pkg/apis/resource/types.go @@ -1056,8 +1056,8 @@ type NetworkDeviceData struct { // +listType=atomic Addresses []string - // HWAddress represents the hardware address (e.g. MAC Address) of the device's network interface. + // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. // // +optional - HWAddress string + HardwareAddress string } diff --git a/pkg/apis/resource/validation/validation.go b/pkg/apis/resource/validation/validation.go index 0b717ad8864..abbfa479355 100644 --- a/pkg/apis/resource/validation/validation.go +++ b/pkg/apis/resource/validation/validation.go @@ -25,7 +25,7 @@ import ( apiequality "k8s.io/apimachinery/pkg/api/equality" apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1validation "k8s.io/apimachinery/pkg/apis/meta/v1/validation" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" @@ -33,12 +33,10 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apiserver/pkg/cel" "k8s.io/apiserver/pkg/cel/environment" - utilfeature "k8s.io/apiserver/pkg/util/feature" dracel "k8s.io/dynamic-resource-allocation/cel" "k8s.io/dynamic-resource-allocation/structured" corevalidation "k8s.io/kubernetes/pkg/apis/core/validation" "k8s.io/kubernetes/pkg/apis/resource" - "k8s.io/kubernetes/pkg/features" ) var ( @@ -268,20 +266,18 @@ func validateResourceClaimStatusUpdate(status, oldStatus *resource.ResourceClaim func(consumer resource.ResourceClaimConsumerReference) (types.UID, string) { return consumer.UID, "uid" }, fldPath.Child("reservedFor"))...) - if utilfeature.DefaultFeatureGate.Enabled(features.DRAResourceClaimDeviceStatus) { - var allocatedDevices sets.Set[structured.DeviceID] - if status.Allocation != nil { - allocatedDevices = gatherAllocatedDevices(&status.Allocation.Devices) - } - allErrs = append(allErrs, validateSet(status.Devices, -1, - func(device resource.AllocatedDeviceStatus, fldPath *field.Path) field.ErrorList { - return validateDeviceStatus(device, fldPath, allocatedDevices) - }, - func(device resource.AllocatedDeviceStatus) (structured.DeviceID, string) { - return structured.DeviceID{Driver: device.Driver, Pool: device.Pool, Device: device.Device}, "deviceID" - }, - fldPath.Child("devices"))...) + var allocatedDevices sets.Set[structured.DeviceID] + if status.Allocation != nil { + allocatedDevices = gatherAllocatedDevices(&status.Allocation.Devices) } + allErrs = append(allErrs, validateSet(status.Devices, -1, + func(device resource.AllocatedDeviceStatus, fldPath *field.Path) field.ErrorList { + return validateDeviceStatus(device, fldPath, allocatedDevices) + }, + func(device resource.AllocatedDeviceStatus) (structured.DeviceID, string) { + return structured.DeviceID{Driver: device.Driver, Pool: device.Pool, Device: device.Device}, "deviceID" + }, + fldPath.Child("devices"))...) // Now check for invariants that must be valid for a ResourceClaim. if len(status.ReservedFor) > 0 { @@ -748,11 +744,7 @@ func validateDeviceStatus(device resource.AllocatedDeviceStatus, fldPath *field. if !allocatedDevices.Has(deviceID) { allErrs = append(allErrs, field.Invalid(fldPath, deviceID, "must be an allocated device in the claim")) } - allErrs = append(allErrs, validateSlice(device.Conditions, -1, - func(condition metav1.Condition, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - return allErrs - }, fldPath.Child("conditions"))...) + allErrs = append(allErrs, metav1validation.ValidateConditions(device.Conditions, fldPath.Child("conditions"))...) if len(device.Data.Raw) > 0 { // Data is an optional field. allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"))...) } @@ -760,9 +752,9 @@ func validateDeviceStatus(device resource.AllocatedDeviceStatus, fldPath *field. return allErrs } +// validateRawExtension validates RawExtension as in https://github.com/kubernetes/kubernetes/pull/125549/ func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList - // Validation of RawExtension as in https://github.com/kubernetes/kubernetes/pull/125549/ var v any if len(rawExtension.Raw) == 0 { allErrs = append(allErrs, field.Required(fldPath, "")) diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index b028d86e4ec..4bcf0b65215 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -995,8 +995,11 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Device: goodName, Conditions: []metav1.Condition{ { - Type: "test", - Status: metav1.ConditionTrue, + Type: "test", + Status: metav1.ConditionTrue, + Reason: "test_reason", + LastTransitionTime: metav1.Now(), + ObservedGeneration: 0, }, }, Data: runtime.RawExtension{ @@ -1008,7 +1011,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { "10.9.8.0/24", "2001:db8::/64", }, - HWAddress: "ea:9f:cb:40:b1:7b", + HardwareAddress: "ea:9f:cb:40:b1:7b", }, }, } @@ -1098,8 +1101,10 @@ func TestValidateClaimStatusUpdate(t *testing.T) { deviceStatusFeatureGate: true, }, "invalid-device-status-duplicate-disabled-feature-gate": { - wantFailures: nil, - oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + wantFailures: field.ErrorList{ + field.Duplicate(field.NewPath("status", "devices").Index(1).Child("deviceID"), structured.DeviceID{Driver: goodName, Pool: goodName, Device: goodName}), + }, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { claim.Status.Devices = []resource.AllocatedDeviceStatus{ { @@ -1118,8 +1123,10 @@ func TestValidateClaimStatusUpdate(t *testing.T) { deviceStatusFeatureGate: false, }, "invalid-network-device-status-disabled-feature-gate": { - wantFailures: nil, - oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + wantFailures: field.ErrorList{ + field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(0), "300.9.8.0/24", "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)"), + }, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { claim.Status.Devices = []resource.AllocatedDeviceStatus{ { @@ -1138,8 +1145,10 @@ func TestValidateClaimStatusUpdate(t *testing.T) { deviceStatusFeatureGate: false, }, "invalid-data-device-status-disabled-feature-gate": { - wantFailures: nil, - oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + wantFailures: field.ErrorList{ + field.Invalid(field.NewPath("status", "devices").Index(0).Child("data"), "", "error parsing data: invalid character 'o' in literal false (expecting 'a')"), + }, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { claim.Status.Devices = []resource.AllocatedDeviceStatus{ { @@ -1156,8 +1165,10 @@ func TestValidateClaimStatusUpdate(t *testing.T) { deviceStatusFeatureGate: false, }, "invalid-device-status-no-device-disabled-feature-gate": { - wantFailures: nil, - oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + wantFailures: field.ErrorList{ + field.Invalid(field.NewPath("status", "devices").Index(0), structured.DeviceID{Driver: "b", Pool: "a", Device: "r"}, "must be an allocated device in the claim"), + }, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { claim.Status.Devices = []resource.AllocatedDeviceStatus{ { diff --git a/pkg/registry/resource/resourceclaim/strategy.go b/pkg/registry/resource/resourceclaim/strategy.go index 6aa41f5bcfc..f6daf7a5185 100644 --- a/pkg/registry/resource/resourceclaim/strategy.go +++ b/pkg/registry/resource/resourceclaim/strategy.go @@ -237,7 +237,9 @@ func draAdminAccessFeatureInUse(claim *resource.ResourceClaim) bool { } func dropDisabledDRAResourceClaimDeviceStatusFields(newClaim, oldClaim *resource.ResourceClaim) { - if !utilfeature.DefaultFeatureGate.Enabled(features.DRAResourceClaimDeviceStatus) { + isDRAResourceClaimDeviceStatusInUse := (oldClaim != nil && len(oldClaim.Status.Devices) > 0) + // drop resourceClaim.Status.Devices field if feature gate is not enabled and it was not in use + if !utilfeature.DefaultFeatureGate.Enabled(features.DRAResourceClaimDeviceStatus) && !isDRAResourceClaimDeviceStatusInUse { newClaim.Status.Devices = nil } } @@ -245,7 +247,8 @@ func dropDisabledDRAResourceClaimDeviceStatusFields(newClaim, oldClaim *resource // dropDeallocatedStatusDevices removes the status.devices that were allocated // in the oldClaim and that have been removed in the newClaim. func dropDeallocatedStatusDevices(newClaim, oldClaim *resource.ResourceClaim) { - if !utilfeature.DefaultFeatureGate.Enabled(features.DRAResourceClaimDeviceStatus) { + isDRAResourceClaimDeviceStatusInUse := (oldClaim != nil && len(oldClaim.Status.Devices) > 0) + if !utilfeature.DefaultFeatureGate.Enabled(features.DRAResourceClaimDeviceStatus) && !isDRAResourceClaimDeviceStatusInUse { return } @@ -268,18 +271,19 @@ func dropDeallocatedStatusDevices(newClaim, oldClaim *resource.ResourceClaim) { } // Remove from newClaim.Status.Devices. - for i := len(newClaim.Status.Devices) - 1; i >= 0; i-- { + n := 0 + for _, device := range newClaim.Status.Devices { deviceID := structured.DeviceID{ - Driver: newClaim.Status.Devices[i].Driver, - Pool: newClaim.Status.Devices[i].Pool, - Device: newClaim.Status.Devices[i].Device, + Driver: device.Driver, + Pool: device.Pool, + Device: device.Device, } - // Device was in the oldClaim.Status.Allocation.Devices but is no longer in the - // newClaim.Status.Allocation.Devices so it must be removed from the newClaim.Status.Devices. - if deallocatedDevices.Has(deviceID) { - newClaim.Status.Devices = append(newClaim.Status.Devices[:i], newClaim.Status.Devices[i+1:]...) + if !deallocatedDevices.Has(deviceID) { + newClaim.Status.Devices[n] = device + n++ } } + newClaim.Status.Devices = newClaim.Status.Devices[:n] if len(newClaim.Status.Devices) == 0 { newClaim.Status.Devices = nil diff --git a/pkg/registry/resource/resourceclaim/strategy_test.go b/pkg/registry/resource/resourceclaim/strategy_test.go index fe227f7eaf7..c65092cb5a4 100644 --- a/pkg/registry/resource/resourceclaim/strategy_test.go +++ b/pkg/registry/resource/resourceclaim/strategy_test.go @@ -133,10 +133,12 @@ var objWithAdminAccessStatus = &resource.ResourceClaim{ }, } -var testRequest = "test-request" -var testDriver = "test-driver" -var testPool = "test-pool" -var testDevice = "test-device" +const ( + testRequest = "test-request" + testDriver = "test-driver" + testPool = "test-pool" + testDevice = "test-device" +) func TestStrategy(t *testing.T) { if !Strategy.NamespaceScoped() { @@ -375,6 +377,30 @@ func TestStatusStrategyUpdate(t *testing.T) { return obj }(), }, + "keep-fields-devices-status-disable-feature-gate": { + oldObj: func() *resource.ResourceClaim { + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusAllocationDevicesResults(obj, testDriver, testPool, testDevice, testRequest) + addStatusDevices(obj, testDriver, testPool, testDevice) + return obj + }(), + newObj: func() *resource.ResourceClaim { // Status is added + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusAllocationDevicesResults(obj, testDriver, testPool, testDevice, testRequest) + addStatusDevices(obj, testDriver, testPool, testDevice) + return obj + }(), + deviceStatusFeatureGate: false, + expectObj: func() *resource.ResourceClaim { // Status is still there (as the status was set in the old object) + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusAllocationDevicesResults(obj, testDriver, testPool, testDevice, testRequest) + addStatusDevices(obj, testDriver, testPool, testDevice) + return obj + }(), + }, "keep-fields-devices-status": { oldObj: func() *resource.ResourceClaim { obj := obj.DeepCopy() @@ -419,6 +445,27 @@ func TestStatusStrategyUpdate(t *testing.T) { return obj }(), }, + "drop-status-deallocated-device-disable-feature-gate": { + oldObj: func() *resource.ResourceClaim { + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusAllocationDevicesResults(obj, testDriver, testPool, testDevice, testRequest) + addStatusDevices(obj, testDriver, testPool, testDevice) + return obj + }(), + newObj: func() *resource.ResourceClaim { // device is deallocated + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + addStatusDevices(obj, testDriver, testPool, testDevice) + return obj + }(), + deviceStatusFeatureGate: false, + expectObj: func() *resource.ResourceClaim { // Status is no longer there + obj := obj.DeepCopy() + addSpecDevicesRequest(obj, testRequest) + return obj + }(), + }, } for name, tc := range testcases { diff --git a/staging/src/k8s.io/api/resource/v1alpha3/types.go b/staging/src/k8s.io/api/resource/v1alpha3/types.go index 8ea60822241..8dd8c744f54 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/types.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/types.go @@ -1067,8 +1067,8 @@ type NetworkDeviceData struct { // +listType=atomic Addresses []string `json:"addresses,omitempty" protobuf:"bytes,2,opt,name=addresses"` - // HWAddress represents the hardware address (e.g. MAC Address) of the device's network interface. + // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. // // +optional - HWAddress string `json:"hwAddress,omitempty" protobuf:"bytes,3,opt,name=hwAddress"` + HardwareAddress string `json:"hardwareAddress,omitempty" protobuf:"bytes,3,opt,name=hardwareAddress"` } diff --git a/test/e2e/dra/dra.go b/test/e2e/dra/dra.go index eb53bb72243..4d293d52ab1 100644 --- a/test/e2e/dra/dra.go +++ b/test/e2e/dra/dra.go @@ -437,12 +437,12 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, Driver: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Driver, Pool: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Pool, Device: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Device, - Conditions: []metav1.Condition{{Type: "a", Status: "b", Message: "c", Reason: "d"}}, + Conditions: []metav1.Condition{{Type: "a", Status: "True", Message: "c", Reason: "d", LastTransitionTime: metav1.NewTime(time.Now().Truncate(time.Second))}}, Data: runtime.RawExtension{Raw: []byte(`{"foo":"bar"}`)}, NetworkData: &resourceapi.NetworkDeviceData{ - InterfaceName: "inf1", - Addresses: []string{"10.9.8.0/24", "2001:db8::/64"}, - HWAddress: "bc:1c:b6:3e:b8:25", + InterfaceName: "inf1", + Addresses: []string{"10.9.8.0/24", "2001:db8::/64"}, + HardwareAddress: "bc:1c:b6:3e:b8:25", }, }) // Updates the ResourceClaim from the driver on the same node as the pod. @@ -456,12 +456,12 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, Driver: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Driver, Pool: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Pool, Device: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Device, - Conditions: []metav1.Condition{{Type: "e", Status: "f", Message: "g", Reason: "h"}}, + Conditions: []metav1.Condition{{Type: "e", Status: "True", Message: "g", Reason: "h", LastTransitionTime: metav1.NewTime(time.Now().Truncate(time.Second))}}, Data: runtime.RawExtension{Raw: []byte(`{"bar":"foo"}`)}, NetworkData: &resourceapi.NetworkDeviceData{ - InterfaceName: "inf2", - Addresses: []string{"10.9.8.1/24", "2001:db8::1/64"}, - HWAddress: "bc:1c:b6:3e:b8:26", + InterfaceName: "inf2", + Addresses: []string{"10.9.8.1/24", "2001:db8::1/64"}, + HardwareAddress: "bc:1c:b6:3e:b8:26", }, } updatedResourceClaim2, err := driver.Nodes[scheduledPod.Spec.NodeName].ExamplePlugin.UpdateStatus(ctx, updatedResourceClaim) @@ -469,6 +469,10 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, gomega.Expect(updatedResourceClaim2).ToNot(gomega.BeNil()) gomega.Expect(updatedResourceClaim2.Status.Devices).To(gomega.Equal(updatedResourceClaim.Status.Devices)) + getResourceClaim, err := b.f.ClientSet.ResourceV1alpha3().ResourceClaims(b.f.Namespace.Name).Get(ctx, claim.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + gomega.Expect(getResourceClaim).ToNot(gomega.BeNil()) + gomega.Expect(getResourceClaim.Status.Devices).To(gomega.Equal(updatedResourceClaim.Status.Devices)) }) } diff --git a/test/integration/resourceclaim/feature_enable_disable_test.go b/test/integration/resourceclaim/feature_enable_disable_test.go index 526d04fc119..30a6543a7a9 100644 --- a/test/integration/resourceclaim/feature_enable_disable_test.go +++ b/test/integration/resourceclaim/feature_enable_disable_test.go @@ -90,7 +90,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { "10.9.8.0/24", "2001:db8::/64", }, - HWAddress: "ea:9f:cb:40:b1:7b", + HardwareAddress: "ea:9f:cb:40:b1:7b", }, }, }, @@ -162,7 +162,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { "10.9.8.0/24", "2001:db8::/64", }, - HWAddress: "ea:9f:cb:40:b1:7b", + HardwareAddress: "ea:9f:cb:40:b1:7b", }, }, }, @@ -198,7 +198,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { "10.9.8.0/24", "2001:db8::/64", }, - HWAddress: "ea:9f:cb:40:b1:7b", + HardwareAddress: "ea:9f:cb:40:b1:7b", }, }, }, From 8ab33b8413124ef397bf8e188a963d65f21cbb9c Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Tue, 5 Nov 2024 18:30:45 +0100 Subject: [PATCH 09/17] [KEP-4817] Improve NetworkData Validation * Add max length for InterfaceName and HardwareAddress * Prevent duplicated Addresses Signed-off-by: Lionel Jouin --- pkg/apis/resource/validation/validation.go | 37 ++++++++++++++++--- .../validation_resourceclaim_test.go | 32 ++++++++++++++-- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/pkg/apis/resource/validation/validation.go b/pkg/apis/resource/validation/validation.go index abbfa479355..e1fe31296ba 100644 --- a/pkg/apis/resource/validation/validation.go +++ b/pkg/apis/resource/validation/validation.go @@ -37,6 +37,7 @@ import ( "k8s.io/dynamic-resource-allocation/structured" corevalidation "k8s.io/kubernetes/pkg/apis/core/validation" "k8s.io/kubernetes/pkg/apis/resource" + netutils "k8s.io/utils/net" ) var ( @@ -740,6 +741,9 @@ func truncateIfTooLong(str string, maxLen int) string { func validateDeviceStatus(device resource.AllocatedDeviceStatus, fldPath *field.Path, allocatedDevices sets.Set[structured.DeviceID]) field.ErrorList { var allErrs field.ErrorList + allErrs = append(allErrs, validateDriverName(device.Driver, fldPath.Child("driver"))...) + allErrs = append(allErrs, validatePoolName(device.Pool, fldPath.Child("pool"))...) + allErrs = append(allErrs, validateDeviceName(device.Device, fldPath.Child("device"))...) deviceID := structured.DeviceID{Driver: device.Driver, Pool: device.Pool, Device: device.Device} if !allocatedDevices.Has(deviceID) { allErrs = append(allErrs, field.Invalid(fldPath, deviceID, "must be an allocated device in the claim")) @@ -759,7 +763,7 @@ func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path if len(rawExtension.Raw) == 0 { allErrs = append(allErrs, field.Required(fldPath, "")) } else if err := json.Unmarshal(rawExtension.Raw, &v); err != nil { - allErrs = append(allErrs, field.Invalid(fldPath, "", fmt.Sprintf("error parsing data: %v", err.Error()))) + allErrs = append(allErrs, field.Invalid(fldPath, "", fmt.Sprintf("error parsing data as JSON: %v", err.Error()))) } else if v == nil { allErrs = append(allErrs, field.Required(fldPath, "")) } else if _, isObject := v.(map[string]any); !isObject { @@ -768,16 +772,37 @@ func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path return allErrs } +const interfaceNameMaxLength int = 256 +const hardwareAddressMaxLength int = 128 + func validateNetworkDeviceData(networkDeviceData *resource.NetworkDeviceData, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList if networkDeviceData == nil { return allErrs } - allErrs = append(allErrs, validateSlice(networkDeviceData.Addresses, -1, + + if len(networkDeviceData.InterfaceName) > interfaceNameMaxLength { + allErrs = append(allErrs, field.TooLong(fldPath.Child("interfaceName"), "" /* unused */, interfaceNameMaxLength)) + } + + if len(networkDeviceData.HardwareAddress) > hardwareAddressMaxLength { + allErrs = append(allErrs, field.TooLong(fldPath.Child("hardwareAddress"), "" /* unused */, hardwareAddressMaxLength)) + } + + allErrs = append(allErrs, validateSet(networkDeviceData.Addresses, -1, func(address string, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - allErrs = append(allErrs, validation.IsValidCIDR(fldPath, address)...) - return allErrs - }, fldPath.Child("addresses"))...) + return validation.IsValidCIDR(fldPath, address) + }, + func(address string) (string, string) { + // reformat CIDR to handle different ways IPs can be written + // (e.g. 2001:db8::1/64 == 2001:0db8::1/64) + ip, ipNet, err := netutils.ParseCIDRSloppy(address) + if err != nil { + return "", "" // will fail at IsValidCIDR + } + maskSize, _ := ipNet.Mask.Size() + return fmt.Sprintf("%s/%d", ip.String(), maskSize), "" + }, + fldPath.Child("addresses"))...) return allErrs } diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index 4bcf0b65215..811474b10f6 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -1006,12 +1006,14 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, NetworkData: &resource.NetworkDeviceData{ - InterfaceName: "net-1", + InterfaceName: strings.Repeat("x", 256), + HardwareAddress: strings.Repeat("x", 128), Addresses: []string{ "10.9.8.0/24", "2001:db8::/64", + "10.9.8.1/24", + "2001:db8::1/64", }, - HardwareAddress: "ea:9f:cb:40:b1:7b", }, }, } @@ -1021,6 +1023,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-device-status-duplicate": { wantFailures: field.ErrorList{ + field.Duplicate(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(1), "2001:db8::1/64"), field.Duplicate(field.NewPath("status", "devices").Index(1).Child("deviceID"), structured.DeviceID{Driver: goodName, Pool: goodName, Device: goodName}), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), @@ -1030,6 +1033,12 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Driver: goodName, Pool: goodName, Device: goodName, + NetworkData: &resource.NetworkDeviceData{ + Addresses: []string{ + "2001:db8::1/64", + "2001:0db8::1/64", + }, + }, }, { Driver: goodName, @@ -1043,6 +1052,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-network-device-status": { wantFailures: field.ErrorList{ + field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", interfaceNameMaxLength), + field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", hardwareAddressMaxLength), field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(0), "300.9.8.0/24", "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)"), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), @@ -1053,6 +1064,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Pool: goodName, Device: goodName, NetworkData: &resource.NetworkDeviceData{ + InterfaceName: strings.Repeat("x", interfaceNameMaxLength+1), + HardwareAddress: strings.Repeat("x", hardwareAddressMaxLength+1), Addresses: []string{ "300.9.8.0/24", }, @@ -1065,7 +1078,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-data-device-status": { wantFailures: field.ErrorList{ - field.Invalid(field.NewPath("status", "devices").Index(0).Child("data"), "", "error parsing data: invalid character 'o' in literal false (expecting 'a')"), + field.Invalid(field.NewPath("status", "devices").Index(0).Child("data"), "", "error parsing data as JSON: invalid character 'o' in literal false (expecting 'a')"), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { @@ -1102,6 +1115,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-device-status-duplicate-disabled-feature-gate": { wantFailures: field.ErrorList{ + field.Duplicate(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(1), "2001:db8::1/64"), field.Duplicate(field.NewPath("status", "devices").Index(1).Child("deviceID"), structured.DeviceID{Driver: goodName, Pool: goodName, Device: goodName}), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), @@ -1111,6 +1125,12 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Driver: goodName, Pool: goodName, Device: goodName, + NetworkData: &resource.NetworkDeviceData{ + Addresses: []string{ + "2001:db8::1/64", + "2001:0db8::1/64", + }, + }, }, { Driver: goodName, @@ -1124,6 +1144,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-network-device-status-disabled-feature-gate": { wantFailures: field.ErrorList{ + field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", interfaceNameMaxLength), + field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", hardwareAddressMaxLength), field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(0), "300.9.8.0/24", "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)"), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), @@ -1134,6 +1156,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Pool: goodName, Device: goodName, NetworkData: &resource.NetworkDeviceData{ + InterfaceName: strings.Repeat("x", interfaceNameMaxLength+1), + HardwareAddress: strings.Repeat("x", hardwareAddressMaxLength+1), Addresses: []string{ "300.9.8.0/24", }, @@ -1146,7 +1170,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-data-device-status-disabled-feature-gate": { wantFailures: field.ErrorList{ - field.Invalid(field.NewPath("status", "devices").Index(0).Child("data"), "", "error parsing data: invalid character 'o' in literal false (expecting 'a')"), + field.Invalid(field.NewPath("status", "devices").Index(0).Child("data"), "", "error parsing data as JSON: invalid character 'o' in literal false (expecting 'a')"), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { From 43d23b89940b74cff2e4444e59c0e1a6cdcaedd2 Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Wed, 6 Nov 2024 10:49:37 +0100 Subject: [PATCH 10/17] [KEP-4817] Use structured.MakeDeviceID Signed-off-by: Lionel Jouin --- pkg/apis/resource/validation/validation.go | 6 +++--- .../validation/validation_resourceclaim_test.go | 8 ++++---- pkg/registry/resource/resourceclaim/strategy.go | 10 +++------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/pkg/apis/resource/validation/validation.go b/pkg/apis/resource/validation/validation.go index e1fe31296ba..902914f9b4a 100644 --- a/pkg/apis/resource/validation/validation.go +++ b/pkg/apis/resource/validation/validation.go @@ -130,7 +130,7 @@ func gatherRequestNames(deviceClaim *resource.DeviceClaim) sets.Set[string] { func gatherAllocatedDevices(allocationResult *resource.DeviceAllocationResult) sets.Set[structured.DeviceID] { allocatedDevices := sets.New[structured.DeviceID]() for _, result := range allocationResult.Results { - deviceID := structured.DeviceID{Driver: result.Driver, Pool: result.Pool, Device: result.Device} + deviceID := structured.MakeDeviceID(result.Driver, result.Pool, result.Device) allocatedDevices.Insert(deviceID) } return allocatedDevices @@ -276,7 +276,7 @@ func validateResourceClaimStatusUpdate(status, oldStatus *resource.ResourceClaim return validateDeviceStatus(device, fldPath, allocatedDevices) }, func(device resource.AllocatedDeviceStatus) (structured.DeviceID, string) { - return structured.DeviceID{Driver: device.Driver, Pool: device.Pool, Device: device.Device}, "deviceID" + return structured.MakeDeviceID(device.Driver, device.Pool, device.Device), "deviceID" }, fldPath.Child("devices"))...) @@ -744,7 +744,7 @@ func validateDeviceStatus(device resource.AllocatedDeviceStatus, fldPath *field. allErrs = append(allErrs, validateDriverName(device.Driver, fldPath.Child("driver"))...) allErrs = append(allErrs, validatePoolName(device.Pool, fldPath.Child("pool"))...) allErrs = append(allErrs, validateDeviceName(device.Device, fldPath.Child("device"))...) - deviceID := structured.DeviceID{Driver: device.Driver, Pool: device.Pool, Device: device.Device} + deviceID := structured.MakeDeviceID(device.Driver, device.Pool, device.Device) if !allocatedDevices.Has(deviceID) { allErrs = append(allErrs, field.Invalid(fldPath, deviceID, "must be an allocated device in the claim")) } diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index 811474b10f6..8a5bef16a17 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -1024,7 +1024,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { "invalid-device-status-duplicate": { wantFailures: field.ErrorList{ field.Duplicate(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(1), "2001:db8::1/64"), - field.Duplicate(field.NewPath("status", "devices").Index(1).Child("deviceID"), structured.DeviceID{Driver: goodName, Pool: goodName, Device: goodName}), + field.Duplicate(field.NewPath("status", "devices").Index(1).Child("deviceID"), structured.MakeDeviceID(goodName, goodName, goodName)), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { @@ -1098,7 +1098,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-device-status-no-device": { wantFailures: field.ErrorList{ - field.Invalid(field.NewPath("status", "devices").Index(0), structured.DeviceID{Driver: "b", Pool: "a", Device: "r"}, "must be an allocated device in the claim"), + field.Invalid(field.NewPath("status", "devices").Index(0), structured.MakeDeviceID("b", "a", "r"), "must be an allocated device in the claim"), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { @@ -1116,7 +1116,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { "invalid-device-status-duplicate-disabled-feature-gate": { wantFailures: field.ErrorList{ field.Duplicate(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(1), "2001:db8::1/64"), - field.Duplicate(field.NewPath("status", "devices").Index(1).Child("deviceID"), structured.DeviceID{Driver: goodName, Pool: goodName, Device: goodName}), + field.Duplicate(field.NewPath("status", "devices").Index(1).Child("deviceID"), structured.MakeDeviceID(goodName, goodName, goodName)), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { @@ -1190,7 +1190,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-device-status-no-device-disabled-feature-gate": { wantFailures: field.ErrorList{ - field.Invalid(field.NewPath("status", "devices").Index(0), structured.DeviceID{Driver: "b", Pool: "a", Device: "r"}, "must be an allocated device in the claim"), + field.Invalid(field.NewPath("status", "devices").Index(0), structured.MakeDeviceID("b", "a", "r"), "must be an allocated device in the claim"), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { diff --git a/pkg/registry/resource/resourceclaim/strategy.go b/pkg/registry/resource/resourceclaim/strategy.go index f6daf7a5185..336f09b1515 100644 --- a/pkg/registry/resource/resourceclaim/strategy.go +++ b/pkg/registry/resource/resourceclaim/strategy.go @@ -257,7 +257,7 @@ func dropDeallocatedStatusDevices(newClaim, oldClaim *resource.ResourceClaim) { if oldClaim.Status.Allocation != nil { // Get all devices in the oldClaim. for _, result := range oldClaim.Status.Allocation.Devices.Results { - deviceID := structured.DeviceID{Driver: result.Driver, Pool: result.Pool, Device: result.Device} + deviceID := structured.MakeDeviceID(result.Driver, result.Pool, result.Device) deallocatedDevices.Insert(deviceID) } } @@ -265,7 +265,7 @@ func dropDeallocatedStatusDevices(newClaim, oldClaim *resource.ResourceClaim) { // Remove devices from deallocatedDevices that are still in newClaim. if newClaim.Status.Allocation != nil { for _, result := range newClaim.Status.Allocation.Devices.Results { - deviceID := structured.DeviceID{Driver: result.Driver, Pool: result.Pool, Device: result.Device} + deviceID := structured.MakeDeviceID(result.Driver, result.Pool, result.Device) deallocatedDevices.Delete(deviceID) } } @@ -273,11 +273,7 @@ func dropDeallocatedStatusDevices(newClaim, oldClaim *resource.ResourceClaim) { // Remove from newClaim.Status.Devices. n := 0 for _, device := range newClaim.Status.Devices { - deviceID := structured.DeviceID{ - Driver: device.Driver, - Pool: device.Pool, - Device: device.Device, - } + deviceID := structured.MakeDeviceID(device.Driver, device.Pool, device.Device) if !deallocatedDevices.Has(deviceID) { newClaim.Status.Devices[n] = device n++ From 4b76ba1a8705f34d155d7f3ed90504b1fd37bd1b Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Wed, 6 Nov 2024 13:43:17 +0100 Subject: [PATCH 11/17] [KEP-4817] Rename Addresses to IPs Signed-off-by: Lionel Jouin --- pkg/apis/resource/types.go | 6 +++--- pkg/apis/resource/validation/validation.go | 4 ++-- .../validation_resourceclaim_test.go | 18 +++++++++--------- .../src/k8s.io/api/resource/v1alpha3/types.go | 6 +++--- test/e2e/dra/dra.go | 4 ++-- .../feature_enable_disable_test.go | 6 +++--- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pkg/apis/resource/types.go b/pkg/apis/resource/types.go index 6ae50a1aa3b..b09691a10c5 100644 --- a/pkg/apis/resource/types.go +++ b/pkg/apis/resource/types.go @@ -1046,15 +1046,15 @@ type NetworkDeviceData struct { // +optional InterfaceName string - // Addresses lists the network addresses assigned to the device's network interface. + // IPs lists the network addresses assigned to the device's network interface. // This can include both IPv4 and IPv6 addresses. - // The addresses are in the CIDR notation, which includes both the address and the + // The IPs are in the CIDR notation, which includes both the address and the // associated subnet mask. // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. // // +optional // +listType=atomic - Addresses []string + IPs []string // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. // diff --git a/pkg/apis/resource/validation/validation.go b/pkg/apis/resource/validation/validation.go index 902914f9b4a..7dc902dd354 100644 --- a/pkg/apis/resource/validation/validation.go +++ b/pkg/apis/resource/validation/validation.go @@ -789,7 +789,7 @@ func validateNetworkDeviceData(networkDeviceData *resource.NetworkDeviceData, fl allErrs = append(allErrs, field.TooLong(fldPath.Child("hardwareAddress"), "" /* unused */, hardwareAddressMaxLength)) } - allErrs = append(allErrs, validateSet(networkDeviceData.Addresses, -1, + allErrs = append(allErrs, validateSet(networkDeviceData.IPs, -1, func(address string, fldPath *field.Path) field.ErrorList { return validation.IsValidCIDR(fldPath, address) }, @@ -803,6 +803,6 @@ func validateNetworkDeviceData(networkDeviceData *resource.NetworkDeviceData, fl maskSize, _ := ipNet.Mask.Size() return fmt.Sprintf("%s/%d", ip.String(), maskSize), "" }, - fldPath.Child("addresses"))...) + fldPath.Child("ips"))...) return allErrs } diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index 8a5bef16a17..7089acc7b9b 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -1008,7 +1008,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { NetworkData: &resource.NetworkDeviceData{ InterfaceName: strings.Repeat("x", 256), HardwareAddress: strings.Repeat("x", 128), - Addresses: []string{ + IPs: []string{ "10.9.8.0/24", "2001:db8::/64", "10.9.8.1/24", @@ -1023,7 +1023,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-device-status-duplicate": { wantFailures: field.ErrorList{ - field.Duplicate(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(1), "2001:db8::1/64"), + field.Duplicate(field.NewPath("status", "devices").Index(0).Child("networkData", "ips").Index(1), "2001:db8::1/64"), field.Duplicate(field.NewPath("status", "devices").Index(1).Child("deviceID"), structured.MakeDeviceID(goodName, goodName, goodName)), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), @@ -1034,7 +1034,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Pool: goodName, Device: goodName, NetworkData: &resource.NetworkDeviceData{ - Addresses: []string{ + IPs: []string{ "2001:db8::1/64", "2001:0db8::1/64", }, @@ -1054,7 +1054,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { wantFailures: field.ErrorList{ field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", interfaceNameMaxLength), field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", hardwareAddressMaxLength), - field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(0), "300.9.8.0/24", "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)"), + field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "ips").Index(0), "300.9.8.0/24", "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)"), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { @@ -1066,7 +1066,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { NetworkData: &resource.NetworkDeviceData{ InterfaceName: strings.Repeat("x", interfaceNameMaxLength+1), HardwareAddress: strings.Repeat("x", hardwareAddressMaxLength+1), - Addresses: []string{ + IPs: []string{ "300.9.8.0/24", }, }, @@ -1115,7 +1115,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-device-status-duplicate-disabled-feature-gate": { wantFailures: field.ErrorList{ - field.Duplicate(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(1), "2001:db8::1/64"), + field.Duplicate(field.NewPath("status", "devices").Index(0).Child("networkData", "ips").Index(1), "2001:db8::1/64"), field.Duplicate(field.NewPath("status", "devices").Index(1).Child("deviceID"), structured.MakeDeviceID(goodName, goodName, goodName)), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), @@ -1126,7 +1126,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Pool: goodName, Device: goodName, NetworkData: &resource.NetworkDeviceData{ - Addresses: []string{ + IPs: []string{ "2001:db8::1/64", "2001:0db8::1/64", }, @@ -1146,7 +1146,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { wantFailures: field.ErrorList{ field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", interfaceNameMaxLength), field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", hardwareAddressMaxLength), - field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "addresses").Index(0), "300.9.8.0/24", "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)"), + field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "ips").Index(0), "300.9.8.0/24", "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)"), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { @@ -1158,7 +1158,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { NetworkData: &resource.NetworkDeviceData{ InterfaceName: strings.Repeat("x", interfaceNameMaxLength+1), HardwareAddress: strings.Repeat("x", hardwareAddressMaxLength+1), - Addresses: []string{ + IPs: []string{ "300.9.8.0/24", }, }, diff --git a/staging/src/k8s.io/api/resource/v1alpha3/types.go b/staging/src/k8s.io/api/resource/v1alpha3/types.go index 8dd8c744f54..65bdd55f2cc 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/types.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/types.go @@ -1057,15 +1057,15 @@ type NetworkDeviceData struct { // +optional InterfaceName string `json:"interfaceName,omitempty" protobuf:"bytes,1,opt,name=interfaceName"` - // Addresses lists the network addresses assigned to the device's network interface. + // IPs lists the network addresses assigned to the device's network interface. // This can include both IPv4 and IPv6 addresses. - // The addresses are in the CIDR notation, which includes both the address and the + // The IPs are in the CIDR notation, which includes both the address and the // associated subnet mask. // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. // // +optional // +listType=atomic - Addresses []string `json:"addresses,omitempty" protobuf:"bytes,2,opt,name=addresses"` + IPs []string `json:"ips,omitempty" protobuf:"bytes,2,opt,name=ips"` // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. // diff --git a/test/e2e/dra/dra.go b/test/e2e/dra/dra.go index 4d293d52ab1..ac5f3343313 100644 --- a/test/e2e/dra/dra.go +++ b/test/e2e/dra/dra.go @@ -441,7 +441,7 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, Data: runtime.RawExtension{Raw: []byte(`{"foo":"bar"}`)}, NetworkData: &resourceapi.NetworkDeviceData{ InterfaceName: "inf1", - Addresses: []string{"10.9.8.0/24", "2001:db8::/64"}, + IPs: []string{"10.9.8.0/24", "2001:db8::/64"}, HardwareAddress: "bc:1c:b6:3e:b8:25", }, }) @@ -460,7 +460,7 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, Data: runtime.RawExtension{Raw: []byte(`{"bar":"foo"}`)}, NetworkData: &resourceapi.NetworkDeviceData{ InterfaceName: "inf2", - Addresses: []string{"10.9.8.1/24", "2001:db8::1/64"}, + IPs: []string{"10.9.8.1/24", "2001:db8::1/64"}, HardwareAddress: "bc:1c:b6:3e:b8:26", }, } diff --git a/test/integration/resourceclaim/feature_enable_disable_test.go b/test/integration/resourceclaim/feature_enable_disable_test.go index 30a6543a7a9..725a074b8fc 100644 --- a/test/integration/resourceclaim/feature_enable_disable_test.go +++ b/test/integration/resourceclaim/feature_enable_disable_test.go @@ -86,7 +86,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { }, NetworkData: &v1alpha3.NetworkDeviceData{ InterfaceName: "net-1", - Addresses: []string{ + IPs: []string{ "10.9.8.0/24", "2001:db8::/64", }, @@ -158,7 +158,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { }, NetworkData: &v1alpha3.NetworkDeviceData{ InterfaceName: "net-1", - Addresses: []string{ + IPs: []string{ "10.9.8.0/24", "2001:db8::/64", }, @@ -194,7 +194,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { }, NetworkData: &v1alpha3.NetworkDeviceData{ InterfaceName: "net-1", - Addresses: []string{ + IPs: []string{ "10.9.8.0/24", "2001:db8::/64", }, From 7e0035ec866e3bb4a09b8c6e91b8db5fc93d1134 Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Wed, 6 Nov 2024 21:22:55 +0100 Subject: [PATCH 12/17] [KEP-4817] Update to v1beta1 Signed-off-by: Lionel Jouin --- .../src/k8s.io/api/resource/v1beta1/types.go | 86 +++++++++++++++++++ test/e2e/dra/dra.go | 4 +- test/e2e/dra/test-driver/app/kubeletplugin.go | 2 +- .../feature_enable_disable_test.go | 60 ++++++------- 4 files changed, 119 insertions(+), 33 deletions(-) diff --git a/staging/src/k8s.io/api/resource/v1beta1/types.go b/staging/src/k8s.io/api/resource/v1beta1/types.go index 075ba0cda2b..1f1b7dcb746 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/types.go +++ b/staging/src/k8s.io/api/resource/v1beta1/types.go @@ -709,6 +709,18 @@ type ResourceClaimStatus struct { // it got removed. May be reused once decoding v1alpha3 is no longer // supported. // DeallocationRequested bool `json:"deallocationRequested,omitempty" protobuf:"bytes,3,opt,name=deallocationRequested"` + + // Devices contains the status of each device allocated for this + // claim, as reported by the driver. This can include driver-specific + // information. Entries are owned by their respective drivers. + // + // +optional + // +listType=map + // +listMapKey=driver + // +listMapKey=device + // +listMapKey=pool + // +featureGate=DRAResourceClaimDeviceStatus + Devices []AllocatedDeviceStatus `json:"devices,omitempty" protobuf:"bytes,4,opt,name=devices"` } // ReservedForMaxSize is the maximum number of entries in @@ -989,3 +1001,77 @@ type ResourceClaimTemplateList struct { // Items is the list of resource claim templates. Items []ResourceClaimTemplate `json:"items" protobuf:"bytes,2,rep,name=items"` } + +// AllocatedDeviceStatus contains the status of an allocated device, if the +// driver chooses to report it. This may include driver-specific information. +type AllocatedDeviceStatus struct { + // Driver specifies the name of the DRA driver whose kubelet + // plugin should be invoked to process the allocation once the claim is + // needed on a node. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + Driver string `json:"driver" protobuf:"bytes,1,rep,name=driver"` + + // This name together with the driver name and the device name field + // identify which device was allocated (`//`). + // + // Must not be longer than 253 characters and may contain one or more + // DNS sub-domains separated by slashes. + // + // +required + Pool string `json:"pool" protobuf:"bytes,2,rep,name=pool"` + + // Device references one device instance via its name in the driver's + // resource pool. It must be a DNS label. + // + // +required + Device string `json:"device" protobuf:"bytes,3,rep,name=device"` + + // Conditions contains the latest observation of the device's state. + // If the device has been configured according to the class and claim + // config references, the `Ready` condition should be True. + // + // +optional + // +listType=atomic + Conditions []metav1.Condition `json:"conditions" protobuf:"bytes,4,opt,name=conditions"` + + // Data contains arbitrary driver-specific data. + // + // +optional + Data runtime.RawExtension `json:"data,omitempty" protobuf:"bytes,5,opt,name=data"` + + // NetworkData contains network-related information specific to the device. + // + // +optional + NetworkData *NetworkDeviceData `json:"networkData,omitempty" protobuf:"bytes,6,opt,name=networkData"` +} + +// NetworkDeviceData provides network-related details for the allocated device. +// This information may be filled by drivers or other components to configure +// or identify the device within a network context. +type NetworkDeviceData struct { + // InterfaceName specifies the name of the network interface associated with + // the allocated device. This might be the name of a physical or virtual + // network interface. + // + // +optional + InterfaceName string `json:"interfaceName,omitempty" protobuf:"bytes,1,opt,name=interfaceName"` + + // IPs lists the network addresses assigned to the device's network interface. + // This can include both IPv4 and IPv6 addresses. + // The IPs are in the CIDR notation, which includes both the address and the + // associated subnet mask. + // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. + // + // +optional + // +listType=atomic + IPs []string `json:"ips,omitempty" protobuf:"bytes,2,opt,name=ips"` + + // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. + // + // +optional + HardwareAddress string `json:"hardwareAddress,omitempty" protobuf:"bytes,3,opt,name=hardwareAddress"` +} diff --git a/test/e2e/dra/dra.go b/test/e2e/dra/dra.go index ac5f3343313..d8296d85113 100644 --- a/test/e2e/dra/dra.go +++ b/test/e2e/dra/dra.go @@ -415,7 +415,7 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, gomega.Eventually(ctx, func(ctx context.Context) (*resourceapi.ResourceClaim, error) { var err error - allocatedResourceClaim, err = b.f.ClientSet.ResourceV1alpha3().ResourceClaims(b.f.Namespace.Name).Get(ctx, claim.Name, metav1.GetOptions{}) + allocatedResourceClaim, err = b.f.ClientSet.ResourceV1beta1().ResourceClaims(b.f.Namespace.Name).Get(ctx, claim.Name, metav1.GetOptions{}) return allocatedResourceClaim, err }).WithTimeout(f.Timeouts.PodDelete).ShouldNot(gomega.HaveField("Status.Allocation", (*resourceapi.AllocationResult)(nil))) @@ -469,7 +469,7 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, gomega.Expect(updatedResourceClaim2).ToNot(gomega.BeNil()) gomega.Expect(updatedResourceClaim2.Status.Devices).To(gomega.Equal(updatedResourceClaim.Status.Devices)) - getResourceClaim, err := b.f.ClientSet.ResourceV1alpha3().ResourceClaims(b.f.Namespace.Name).Get(ctx, claim.Name, metav1.GetOptions{}) + getResourceClaim, err := b.f.ClientSet.ResourceV1beta1().ResourceClaims(b.f.Namespace.Name).Get(ctx, claim.Name, metav1.GetOptions{}) framework.ExpectNoError(err) gomega.Expect(getResourceClaim).ToNot(gomega.BeNil()) gomega.Expect(getResourceClaim.Status.Devices).To(gomega.Equal(updatedResourceClaim.Status.Devices)) diff --git a/test/e2e/dra/test-driver/app/kubeletplugin.go b/test/e2e/dra/test-driver/app/kubeletplugin.go index 04b6c1cfde5..68061f142f2 100644 --- a/test/e2e/dra/test-driver/app/kubeletplugin.go +++ b/test/e2e/dra/test-driver/app/kubeletplugin.go @@ -562,5 +562,5 @@ func (ex *ExamplePlugin) CountCalls(methodSuffix string) int { } func (ex *ExamplePlugin) UpdateStatus(ctx context.Context, resourceClaim *resourceapi.ResourceClaim) (*resourceapi.ResourceClaim, error) { - return ex.kubeClient.ResourceV1alpha3().ResourceClaims(resourceClaim.Namespace).UpdateStatus(ctx, resourceClaim, metav1.UpdateOptions{}) + return ex.kubeClient.ResourceV1beta1().ResourceClaims(resourceClaim.Namespace).UpdateStatus(ctx, resourceClaim, metav1.UpdateOptions{}) } diff --git a/test/integration/resourceclaim/feature_enable_disable_test.go b/test/integration/resourceclaim/feature_enable_disable_test.go index 725a074b8fc..7921190e604 100644 --- a/test/integration/resourceclaim/feature_enable_disable_test.go +++ b/test/integration/resourceclaim/feature_enable_disable_test.go @@ -21,7 +21,7 @@ import ( "fmt" "testing" - "k8s.io/api/resource/v1alpha3" + "k8s.io/api/resource/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" clientset "k8s.io/client-go/kubernetes" @@ -53,30 +53,30 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { ns := framework.CreateNamespaceOrDie(client1, "test-enable-dra-resourceclaim-device-status", t) rcDisabledName := "test-enable-dra-resourceclaim-device-status-rc-disabled" - rcDisabled := &v1alpha3.ResourceClaim{ + rcDisabled := &v1beta1.ResourceClaim{ ObjectMeta: metav1.ObjectMeta{ Name: rcDisabledName, }, - Spec: v1alpha3.ResourceClaimSpec{ - Devices: v1alpha3.DeviceClaim{ - Requests: []v1alpha3.DeviceRequest{ + Spec: v1beta1.ResourceClaimSpec{ + Devices: v1beta1.DeviceClaim{ + Requests: []v1beta1.DeviceRequest{ { Name: "foo", DeviceClassName: "foo", Count: 1, - AllocationMode: v1alpha3.DeviceAllocationModeExactCount, + AllocationMode: v1beta1.DeviceAllocationModeExactCount, }, }, }, }, } - if _, err := client1.ResourceV1alpha3().ResourceClaims(ns.Name).Create(context.TODO(), rcDisabled, metav1.CreateOptions{}); err != nil { + if _, err := client1.ResourceV1beta1().ResourceClaims(ns.Name).Create(context.TODO(), rcDisabled, metav1.CreateOptions{}); err != nil { t.Fatal(err) } - rcDisabled.Status = v1alpha3.ResourceClaimStatus{ - Devices: []v1alpha3.AllocatedDeviceStatus{ + rcDisabled.Status = v1beta1.ResourceClaimStatus{ + Devices: []v1beta1.AllocatedDeviceStatus{ { Driver: "foo", Pool: "foo", @@ -84,7 +84,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Data: runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, - NetworkData: &v1alpha3.NetworkDeviceData{ + NetworkData: &v1beta1.NetworkDeviceData{ InterfaceName: "net-1", IPs: []string{ "10.9.8.0/24", @@ -95,11 +95,11 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { }, }, } - if _, err := client1.ResourceV1alpha3().ResourceClaims(ns.Name).UpdateStatus(context.TODO(), rcDisabled, metav1.UpdateOptions{}); err != nil { + if _, err := client1.ResourceV1beta1().ResourceClaims(ns.Name).UpdateStatus(context.TODO(), rcDisabled, metav1.UpdateOptions{}); err != nil { t.Fatal(err) } - rcDisabled, err = client1.ResourceV1alpha3().ResourceClaims(ns.Name).Get(context.TODO(), rcDisabledName, metav1.GetOptions{}) + rcDisabled, err = client1.ResourceV1beta1().ResourceClaims(ns.Name).Get(context.TODO(), rcDisabledName, metav1.GetOptions{}) if err != nil { t.Fatal(err) } @@ -123,32 +123,32 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { } rcEnabledName := "test-enable-dra-resourceclaim-device-status-rc-enabled" - rcEnabled := &v1alpha3.ResourceClaim{ + rcEnabled := &v1beta1.ResourceClaim{ ObjectMeta: metav1.ObjectMeta{ Name: rcEnabledName, }, - Spec: v1alpha3.ResourceClaimSpec{ - Devices: v1alpha3.DeviceClaim{ - Requests: []v1alpha3.DeviceRequest{ + Spec: v1beta1.ResourceClaimSpec{ + Devices: v1beta1.DeviceClaim{ + Requests: []v1beta1.DeviceRequest{ { Name: "bar", DeviceClassName: "bar", Count: 1, - AllocationMode: v1alpha3.DeviceAllocationModeExactCount, + AllocationMode: v1beta1.DeviceAllocationModeExactCount, }, }, }, }, } - if _, err := client2.ResourceV1alpha3().ResourceClaims(ns.Name).Create(context.TODO(), rcEnabled, metav1.CreateOptions{}); err != nil { + if _, err := client2.ResourceV1beta1().ResourceClaims(ns.Name).Create(context.TODO(), rcEnabled, metav1.CreateOptions{}); err != nil { t.Fatal(err) } // Tests the validation is enabled. // validation will refuse this update as the device is not allocated. - rcEnabled.Status = v1alpha3.ResourceClaimStatus{ - Devices: []v1alpha3.AllocatedDeviceStatus{ + rcEnabled.Status = v1beta1.ResourceClaimStatus{ + Devices: []v1beta1.AllocatedDeviceStatus{ { Driver: "bar", Pool: "bar", @@ -156,7 +156,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Data: runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, - NetworkData: &v1alpha3.NetworkDeviceData{ + NetworkData: &v1beta1.NetworkDeviceData{ InterfaceName: "net-1", IPs: []string{ "10.9.8.0/24", @@ -167,14 +167,14 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { }, }, } - if _, err := client2.ResourceV1alpha3().ResourceClaims(ns.Name).UpdateStatus(context.TODO(), rcEnabled, metav1.UpdateOptions{}); err == nil { + if _, err := client2.ResourceV1beta1().ResourceClaims(ns.Name).UpdateStatus(context.TODO(), rcEnabled, metav1.UpdateOptions{}); err == nil { t.Fatalf("Expected error (must be an allocated device in the claim)") } - rcEnabled.Status = v1alpha3.ResourceClaimStatus{ - Allocation: &v1alpha3.AllocationResult{ - Devices: v1alpha3.DeviceAllocationResult{ - Results: []v1alpha3.DeviceRequestAllocationResult{ + rcEnabled.Status = v1beta1.ResourceClaimStatus{ + Allocation: &v1beta1.AllocationResult{ + Devices: v1beta1.DeviceAllocationResult{ + Results: []v1beta1.DeviceRequestAllocationResult{ { Request: "bar", Driver: "bar", @@ -184,7 +184,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { }, }, }, - Devices: []v1alpha3.AllocatedDeviceStatus{ + Devices: []v1beta1.AllocatedDeviceStatus{ { Driver: "bar", Pool: "bar", @@ -192,7 +192,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Data: runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, - NetworkData: &v1alpha3.NetworkDeviceData{ + NetworkData: &v1beta1.NetworkDeviceData{ InterfaceName: "net-1", IPs: []string{ "10.9.8.0/24", @@ -203,12 +203,12 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { }, }, } - if _, err := client2.ResourceV1alpha3().ResourceClaims(ns.Name).UpdateStatus(context.TODO(), rcEnabled, metav1.UpdateOptions{}); err != nil { + if _, err := client2.ResourceV1beta1().ResourceClaims(ns.Name).UpdateStatus(context.TODO(), rcEnabled, metav1.UpdateOptions{}); err != nil { t.Fatal(err) } // Tests the field is enabled. - rcEnabled, err = client2.ResourceV1alpha3().ResourceClaims(ns.Name).Get(context.TODO(), rcEnabledName, metav1.GetOptions{}) + rcEnabled, err = client2.ResourceV1beta1().ResourceClaims(ns.Name).Get(context.TODO(), rcEnabledName, metav1.GetOptions{}) if err != nil { t.Fatal(err) } From 39f55e1cd0642e6e9ff511416931c96808b4c1ee Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Thu, 7 Nov 2024 10:35:29 +0100 Subject: [PATCH 13/17] [KEP-4817] Add data length limit (from #128601) Signed-off-by: Lionel Jouin --- pkg/apis/resource/validation/validation.go | 12 +++++-- .../validation_resourceclaim_test.go | 36 +++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/pkg/apis/resource/validation/validation.go b/pkg/apis/resource/validation/validation.go index 7dc902dd354..ca7611cc66c 100644 --- a/pkg/apis/resource/validation/validation.go +++ b/pkg/apis/resource/validation/validation.go @@ -256,7 +256,7 @@ func validateDeviceConfiguration(config resource.DeviceConfiguration, fldPath *f func validateOpaqueConfiguration(config resource.OpaqueDeviceConfiguration, fldPath *field.Path, stored bool) field.ErrorList { var allErrs field.ErrorList allErrs = append(allErrs, validateDriverName(config.Driver, fldPath.Child("driver"))...) - allErrs = append(allErrs, validateRawExtension(config.Parameters, fldPath.Child("parameters"))...) + allErrs = append(allErrs, validateRawExtension(config.Parameters, fldPath.Child("parameters"), stored)...) return allErrs } @@ -750,18 +750,24 @@ func validateDeviceStatus(device resource.AllocatedDeviceStatus, fldPath *field. } allErrs = append(allErrs, metav1validation.ValidateConditions(device.Conditions, fldPath.Child("conditions"))...) if len(device.Data.Raw) > 0 { // Data is an optional field. - allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"))...) + allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"), false)...) } allErrs = append(allErrs, validateNetworkDeviceData(device.NetworkData, fldPath.Child("networkData"))...) return allErrs } // validateRawExtension validates RawExtension as in https://github.com/kubernetes/kubernetes/pull/125549/ -func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path) field.ErrorList { +func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path, stored bool) field.ErrorList { var allErrs field.ErrorList var v any if len(rawExtension.Raw) == 0 { allErrs = append(allErrs, field.Required(fldPath, "")) + } else if !stored && len(rawExtension.Raw) > resource.OpaqueParametersMaxLength { + // Don't even bother with parsing when too large. + // Only applies on create. Existing parameters are grand-fathered in + // because the limit was introduced in 1.32. This also means that it + // can be changed in the future. + allErrs = append(allErrs, field.TooLong(fldPath, "" /* unused */, resource.OpaqueParametersMaxLength)) } else if err := json.Unmarshal(rawExtension.Raw, &v); err != nil { allErrs = append(allErrs, field.Invalid(fldPath, "", fmt.Sprintf("error parsing data as JSON: %v", err.Error()))) } else if v == nil { diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index 7089acc7b9b..50b32312677 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -1096,6 +1096,24 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, deviceStatusFeatureGate: true, }, + "invalid-data-device-status-too-long": { + wantFailures: field.ErrorList{ + field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.OpaqueParametersMaxLength), + }, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim.Status.Devices = []resource.AllocatedDeviceStatus{ + { + Driver: goodName, + Pool: goodName, + Device: goodName, + Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.OpaqueParametersMaxLength-9-2+1 /* too large by one */) + `"}`)}, + }, + } + return claim + }, + deviceStatusFeatureGate: true, + }, "invalid-device-status-no-device": { wantFailures: field.ErrorList{ field.Invalid(field.NewPath("status", "devices").Index(0), structured.MakeDeviceID("b", "a", "r"), "must be an allocated device in the claim"), @@ -1188,6 +1206,24 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, deviceStatusFeatureGate: false, }, + "invalid-data-device-status-too-long-feature-gate": { + wantFailures: field.ErrorList{ + field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.OpaqueParametersMaxLength), + }, + oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim.Status.Devices = []resource.AllocatedDeviceStatus{ + { + Driver: goodName, + Pool: goodName, + Device: goodName, + Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.OpaqueParametersMaxLength-9-2+1 /* too large by one */) + `"}`)}, + }, + } + return claim + }, + deviceStatusFeatureGate: false, + }, "invalid-device-status-no-device-disabled-feature-gate": { wantFailures: field.ErrorList{ field.Invalid(field.NewPath("status", "devices").Index(0), structured.MakeDeviceID("b", "a", "r"), "must be an allocated device in the claim"), From d28b50e0a04a4c5bbf494a423ad7851f0393467c Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Thu, 7 Nov 2024 10:36:09 +0100 Subject: [PATCH 14/17] [KEP-4817] make update Signed-off-by: Lionel Jouin --- api/openapi-spec/swagger.json | 148 +++ ...is__resource.k8s.io__v1alpha3_openapi.json | 142 +++ ...pis__resource.k8s.io__v1beta1_openapi.json | 142 +++ .../v1alpha3/zz_generated.conversion.go | 83 +- .../v1beta1/zz_generated.conversion.go | 83 +- pkg/apis/resource/zz_generated.deepcopy.go | 58 + pkg/generated/openapi/zz_generated.openapi.go | 292 ++++- .../api/resource/v1alpha3/generated.pb.go | 1040 +++++++++++++--- .../api/resource/v1alpha3/generated.proto | 86 ++ .../v1alpha3/types_swagger_doc_generated.go | 26 + .../v1alpha3/zz_generated.deepcopy.go | 64 +- .../api/resource/v1beta1/generated.pb.go | 1047 ++++++++++++++--- .../api/resource/v1beta1/generated.proto | 86 ++ .../v1beta1/types_swagger_doc_generated.go | 26 + .../resource/v1beta1/zz_generated.deepcopy.go | 64 +- ...esource.k8s.io.v1alpha3.ResourceClaim.json | 34 + .../resource.k8s.io.v1alpha3.ResourceClaim.pb | Bin 1022 -> 1283 bytes ...esource.k8s.io.v1alpha3.ResourceClaim.yaml | 23 + ...resource.k8s.io.v1beta1.ResourceClaim.json | 34 + .../resource.k8s.io.v1beta1.ResourceClaim.pb | Bin 1021 -> 1282 bytes ...resource.k8s.io.v1beta1.ResourceClaim.yaml | 23 + .../applyconfigurations/internal/internal.go | 104 ++ .../v1alpha3/allocateddevicestatus.go | 94 ++ .../resource/v1alpha3/networkdevicedata.go | 59 + .../resource/v1alpha3/resourceclaimstatus.go | 14 + .../resource/v1beta1/allocateddevicestatus.go | 94 ++ .../resource/v1beta1/networkdevicedata.go | 59 + .../resource/v1beta1/resourceclaimstatus.go | 14 + .../client-go/applyconfigurations/utils.go | 8 + 29 files changed, 3610 insertions(+), 337 deletions(-) create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/allocateddevicestatus.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/networkdevicedata.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1beta1/allocateddevicestatus.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1beta1/networkdevicedata.go diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 50485db757d..d62316f8a08 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -14437,6 +14437,45 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "io.k8s.api.resource.v1alpha3.AllocatedDeviceStatus": { + "description": "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", + "properties": { + "conditions": { + "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Condition" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "data": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", + "description": "Data contains arbitrary driver-specific data." + }, + "device": { + "description": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", + "type": "string" + }, + "driver": { + "description": "Driver specifies the name of the DRA driver whose kubelet plugin should be invoked to process the allocation once the claim is needed on a node.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", + "type": "string" + }, + "networkData": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.NetworkDeviceData", + "description": "NetworkData contains network-related information specific to the device." + }, + "pool": { + "description": "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", + "type": "string" + } + }, + "required": [ + "driver", + "pool", + "device" + ], + "type": "object" + }, "io.k8s.api.resource.v1alpha3.AllocationResult": { "description": "AllocationResult contains attributes of an allocated resource.", "properties": { @@ -14817,6 +14856,28 @@ }, "type": "object" }, + "io.k8s.api.resource.v1alpha3.NetworkDeviceData": { + "description": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", + "properties": { + "hardwareAddress": { + "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + "type": "string" + }, + "interfaceName": { + "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "type": "string" + }, + "ips": { + "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, "io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration": { "description": "OpaqueDeviceConfiguration contains configuration parameters for a driver in a format defined by the driver vendor.", "properties": { @@ -14950,6 +15011,19 @@ "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.AllocationResult", "description": "Allocation is set once the claim has been allocated successfully." }, + "devices": { + "description": "Devices contains the status of each device allocated for this claim, as reported by the driver. This can include driver-specific information. Entries are owned by their respective drivers.", + "items": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.AllocatedDeviceStatus" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "driver", + "device", + "pool" + ], + "x-kubernetes-list-type": "map" + }, "reservedFor": { "description": "ReservedFor indicates which entities are currently allowed to use the claim. A Pod which references a ResourceClaim which is not reserved for that Pod will not be started. A claim that is in use or might be in use because it has been reserved must not get deallocated.\n\nIn a cluster with multiple scheduler instances, two pods might get scheduled concurrently by different schedulers. When they reference the same ResourceClaim which already has reached its maximum number of consumers, only one pod can be scheduled.\n\nBoth schedulers try to add their pod to the claim.status.reservedFor field, but only the update that reaches the API server first gets stored. The other one fails with an error and the scheduler which issued it knows that it must put the pod back into the queue, waiting for the ResourceClaim to become usable again.\n\nThere can be at most 32 such reservations. This may get increased in the future, but not reduced.", "items": { @@ -15180,6 +15254,45 @@ ], "type": "object" }, + "io.k8s.api.resource.v1beta1.AllocatedDeviceStatus": { + "description": "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", + "properties": { + "conditions": { + "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Condition" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "data": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", + "description": "Data contains arbitrary driver-specific data." + }, + "device": { + "description": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", + "type": "string" + }, + "driver": { + "description": "Driver specifies the name of the DRA driver whose kubelet plugin should be invoked to process the allocation once the claim is needed on a node.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", + "type": "string" + }, + "networkData": { + "$ref": "#/definitions/io.k8s.api.resource.v1beta1.NetworkDeviceData", + "description": "NetworkData contains network-related information specific to the device." + }, + "pool": { + "description": "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", + "type": "string" + } + }, + "required": [ + "driver", + "pool", + "device" + ], + "type": "object" + }, "io.k8s.api.resource.v1beta1.AllocationResult": { "description": "AllocationResult contains attributes of an allocated resource.", "properties": { @@ -15573,6 +15686,28 @@ }, "type": "object" }, + "io.k8s.api.resource.v1beta1.NetworkDeviceData": { + "description": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", + "properties": { + "hardwareAddress": { + "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + "type": "string" + }, + "interfaceName": { + "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "type": "string" + }, + "ips": { + "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, "io.k8s.api.resource.v1beta1.OpaqueDeviceConfiguration": { "description": "OpaqueDeviceConfiguration contains configuration parameters for a driver in a format defined by the driver vendor.", "properties": { @@ -15706,6 +15841,19 @@ "$ref": "#/definitions/io.k8s.api.resource.v1beta1.AllocationResult", "description": "Allocation is set once the claim has been allocated successfully." }, + "devices": { + "description": "Devices contains the status of each device allocated for this claim, as reported by the driver. This can include driver-specific information. Entries are owned by their respective drivers.", + "items": { + "$ref": "#/definitions/io.k8s.api.resource.v1beta1.AllocatedDeviceStatus" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "driver", + "device", + "pool" + ], + "x-kubernetes-list-type": "map" + }, "reservedFor": { "description": "ReservedFor indicates which entities are currently allowed to use the claim. A Pod which references a ResourceClaim which is not reserved for that Pod will not be started. A claim that is in use or might be in use because it has been reserved must not get deallocated.\n\nIn a cluster with multiple scheduler instances, two pods might get scheduled concurrently by different schedulers. When they reference the same ResourceClaim which already has reached its maximum number of consumers, only one pod can be scheduled.\n\nBoth schedulers try to add their pod to the claim.status.reservedFor field, but only the update that reaches the API server first gets stored. The other one fails with an error and the scheduler which issued it knows that it must put the pod back into the queue, waiting for the ResourceClaim to become usable again.\n\nThere can be at most 32 such reservations. This may get increased in the future, but not reduced.", "items": { diff --git a/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json b/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json index a0692a06ff2..2ba1ece886f 100644 --- a/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json +++ b/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json @@ -86,6 +86,61 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "io.k8s.api.resource.v1alpha3.AllocatedDeviceStatus": { + "description": "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", + "properties": { + "conditions": { + "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Condition" + } + ], + "default": {} + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "data": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" + } + ], + "description": "Data contains arbitrary driver-specific data." + }, + "device": { + "default": "", + "description": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", + "type": "string" + }, + "driver": { + "default": "", + "description": "Driver specifies the name of the DRA driver whose kubelet plugin should be invoked to process the allocation once the claim is needed on a node.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", + "type": "string" + }, + "networkData": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.NetworkDeviceData" + } + ], + "description": "NetworkData contains network-related information specific to the device." + }, + "pool": { + "default": "", + "description": "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", + "type": "string" + } + }, + "required": [ + "driver", + "pool", + "device" + ], + "type": "object" + }, "io.k8s.api.resource.v1alpha3.AllocationResult": { "description": "AllocationResult contains attributes of an allocated resource.", "properties": { @@ -572,6 +627,29 @@ }, "type": "object" }, + "io.k8s.api.resource.v1alpha3.NetworkDeviceData": { + "description": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", + "properties": { + "hardwareAddress": { + "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + "type": "string" + }, + "interfaceName": { + "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "type": "string" + }, + "ips": { + "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "items": { + "default": "", + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, "io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration": { "description": "OpaqueDeviceConfiguration contains configuration parameters for a driver in a format defined by the driver vendor.", "properties": { @@ -747,6 +825,24 @@ ], "description": "Allocation is set once the claim has been allocated successfully." }, + "devices": { + "description": "Devices contains the status of each device allocated for this claim, as reported by the driver. This can include driver-specific information. Entries are owned by their respective drivers.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.AllocatedDeviceStatus" + } + ], + "default": {} + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "driver", + "device", + "pool" + ], + "x-kubernetes-list-type": "map" + }, "reservedFor": { "description": "ReservedFor indicates which entities are currently allowed to use the claim. A Pod which references a ResourceClaim which is not reserved for that Pod will not be started. A claim that is in use or might be in use because it has been reserved must not get deallocated.\n\nIn a cluster with multiple scheduler instances, two pods might get scheduled concurrently by different schedulers. When they reference the same ResourceClaim which already has reached its maximum number of consumers, only one pod can be scheduled.\n\nBoth schedulers try to add their pod to the claim.status.reservedFor field, but only the update that reaches the API server first gets stored. The other one fails with an error and the scheduler which issued it knows that it must put the pod back into the queue, waiting for the ResourceClaim to become usable again.\n\nThere can be at most 32 such reservations. This may get increased in the future, but not reduced.", "items": { @@ -1175,6 +1271,52 @@ } ] }, + "io.k8s.apimachinery.pkg.apis.meta.v1.Condition": { + "description": "Condition contains details for one aspect of the current state of this API Resource.", + "properties": { + "lastTransitionTime": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + } + ], + "description": "lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable." + }, + "message": { + "default": "", + "description": "message is a human readable message indicating details about the transition. This may be an empty string.", + "type": "string" + }, + "observedGeneration": { + "description": "observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance.", + "format": "int64", + "type": "integer" + }, + "reason": { + "default": "", + "description": "reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty.", + "type": "string" + }, + "status": { + "default": "", + "description": "status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "default": "", + "description": "type of condition in CamelCase or in foo.example.com/CamelCase.", + "type": "string" + } + }, + "required": [ + "type", + "status", + "lastTransitionTime", + "reason", + "message" + ], + "type": "object" + }, "io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions": { "description": "DeleteOptions may be provided when deleting an API object.", "properties": { diff --git a/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json b/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json index a38201587c5..5c056541230 100644 --- a/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json +++ b/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json @@ -86,6 +86,61 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "io.k8s.api.resource.v1beta1.AllocatedDeviceStatus": { + "description": "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", + "properties": { + "conditions": { + "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Condition" + } + ], + "default": {} + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "data": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" + } + ], + "description": "Data contains arbitrary driver-specific data." + }, + "device": { + "default": "", + "description": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", + "type": "string" + }, + "driver": { + "default": "", + "description": "Driver specifies the name of the DRA driver whose kubelet plugin should be invoked to process the allocation once the claim is needed on a node.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", + "type": "string" + }, + "networkData": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1beta1.NetworkDeviceData" + } + ], + "description": "NetworkData contains network-related information specific to the device." + }, + "pool": { + "default": "", + "description": "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", + "type": "string" + } + }, + "required": [ + "driver", + "pool", + "device" + ], + "type": "object" + }, "io.k8s.api.resource.v1beta1.AllocationResult": { "description": "AllocationResult contains attributes of an allocated resource.", "properties": { @@ -594,6 +649,29 @@ }, "type": "object" }, + "io.k8s.api.resource.v1beta1.NetworkDeviceData": { + "description": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", + "properties": { + "hardwareAddress": { + "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + "type": "string" + }, + "interfaceName": { + "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "type": "string" + }, + "ips": { + "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "items": { + "default": "", + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, "io.k8s.api.resource.v1beta1.OpaqueDeviceConfiguration": { "description": "OpaqueDeviceConfiguration contains configuration parameters for a driver in a format defined by the driver vendor.", "properties": { @@ -769,6 +847,24 @@ ], "description": "Allocation is set once the claim has been allocated successfully." }, + "devices": { + "description": "Devices contains the status of each device allocated for this claim, as reported by the driver. This can include driver-specific information. Entries are owned by their respective drivers.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1beta1.AllocatedDeviceStatus" + } + ], + "default": {} + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "driver", + "device", + "pool" + ], + "x-kubernetes-list-type": "map" + }, "reservedFor": { "description": "ReservedFor indicates which entities are currently allowed to use the claim. A Pod which references a ResourceClaim which is not reserved for that Pod will not be started. A claim that is in use or might be in use because it has been reserved must not get deallocated.\n\nIn a cluster with multiple scheduler instances, two pods might get scheduled concurrently by different schedulers. When they reference the same ResourceClaim which already has reached its maximum number of consumers, only one pod can be scheduled.\n\nBoth schedulers try to add their pod to the claim.status.reservedFor field, but only the update that reaches the API server first gets stored. The other one fails with an error and the scheduler which issued it knows that it must put the pod back into the queue, waiting for the ResourceClaim to become usable again.\n\nThere can be at most 32 such reservations. This may get increased in the future, but not reduced.", "items": { @@ -1197,6 +1293,52 @@ } ] }, + "io.k8s.apimachinery.pkg.apis.meta.v1.Condition": { + "description": "Condition contains details for one aspect of the current state of this API Resource.", + "properties": { + "lastTransitionTime": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + } + ], + "description": "lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable." + }, + "message": { + "default": "", + "description": "message is a human readable message indicating details about the transition. This may be an empty string.", + "type": "string" + }, + "observedGeneration": { + "description": "observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance.", + "format": "int64", + "type": "integer" + }, + "reason": { + "default": "", + "description": "reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty.", + "type": "string" + }, + "status": { + "default": "", + "description": "status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "default": "", + "description": "type of condition in CamelCase or in foo.example.com/CamelCase.", + "type": "string" + } + }, + "required": [ + "type", + "status", + "lastTransitionTime", + "reason", + "message" + ], + "type": "object" + }, "io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions": { "description": "DeleteOptions may be provided when deleting an API object.", "properties": { diff --git a/pkg/apis/resource/v1alpha3/zz_generated.conversion.go b/pkg/apis/resource/v1alpha3/zz_generated.conversion.go index 12a4a12a6be..9f9e01b24d3 100644 --- a/pkg/apis/resource/v1alpha3/zz_generated.conversion.go +++ b/pkg/apis/resource/v1alpha3/zz_generated.conversion.go @@ -24,9 +24,10 @@ package v1alpha3 import ( unsafe "unsafe" - v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" resourcev1alpha3 "k8s.io/api/resource/v1alpha3" apiresource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" types "k8s.io/apimachinery/pkg/types" @@ -41,6 +42,16 @@ func init() { // RegisterConversions adds conversion functions to the given scheme. // Public to allow building arbitrary schemes. func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddGeneratedConversionFunc((*resourcev1alpha3.AllocatedDeviceStatus)(nil), (*resource.AllocatedDeviceStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatus(a.(*resourcev1alpha3.AllocatedDeviceStatus), b.(*resource.AllocatedDeviceStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*resource.AllocatedDeviceStatus)(nil), (*resourcev1alpha3.AllocatedDeviceStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_AllocatedDeviceStatus_To_v1alpha3_AllocatedDeviceStatus(a.(*resource.AllocatedDeviceStatus), b.(*resourcev1alpha3.AllocatedDeviceStatus), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*resourcev1alpha3.AllocationResult)(nil), (*resource.AllocationResult)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha3_AllocationResult_To_resource_AllocationResult(a.(*resourcev1alpha3.AllocationResult), b.(*resource.AllocationResult), scope) }); err != nil { @@ -221,6 +232,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*resourcev1alpha3.NetworkDeviceData)(nil), (*resource.NetworkDeviceData)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_NetworkDeviceData_To_resource_NetworkDeviceData(a.(*resourcev1alpha3.NetworkDeviceData), b.(*resource.NetworkDeviceData), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*resource.NetworkDeviceData)(nil), (*resourcev1alpha3.NetworkDeviceData)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_NetworkDeviceData_To_v1alpha3_NetworkDeviceData(a.(*resource.NetworkDeviceData), b.(*resourcev1alpha3.NetworkDeviceData), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*resourcev1alpha3.OpaqueDeviceConfiguration)(nil), (*resource.OpaqueDeviceConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha3_OpaqueDeviceConfiguration_To_resource_OpaqueDeviceConfiguration(a.(*resourcev1alpha3.OpaqueDeviceConfiguration), b.(*resource.OpaqueDeviceConfiguration), scope) }); err != nil { @@ -364,6 +385,36 @@ func RegisterConversions(s *runtime.Scheme) error { return nil } +func autoConvert_v1alpha3_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatus(in *resourcev1alpha3.AllocatedDeviceStatus, out *resource.AllocatedDeviceStatus, s conversion.Scope) error { + out.Driver = in.Driver + out.Pool = in.Pool + out.Device = in.Device + out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions)) + out.Data = in.Data + out.NetworkData = (*resource.NetworkDeviceData)(unsafe.Pointer(in.NetworkData)) + return nil +} + +// Convert_v1alpha3_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatus is an autogenerated conversion function. +func Convert_v1alpha3_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatus(in *resourcev1alpha3.AllocatedDeviceStatus, out *resource.AllocatedDeviceStatus, s conversion.Scope) error { + return autoConvert_v1alpha3_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatus(in, out, s) +} + +func autoConvert_resource_AllocatedDeviceStatus_To_v1alpha3_AllocatedDeviceStatus(in *resource.AllocatedDeviceStatus, out *resourcev1alpha3.AllocatedDeviceStatus, s conversion.Scope) error { + out.Driver = in.Driver + out.Pool = in.Pool + out.Device = in.Device + out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions)) + out.Data = in.Data + out.NetworkData = (*resourcev1alpha3.NetworkDeviceData)(unsafe.Pointer(in.NetworkData)) + return nil +} + +// Convert_resource_AllocatedDeviceStatus_To_v1alpha3_AllocatedDeviceStatus is an autogenerated conversion function. +func Convert_resource_AllocatedDeviceStatus_To_v1alpha3_AllocatedDeviceStatus(in *resource.AllocatedDeviceStatus, out *resourcev1alpha3.AllocatedDeviceStatus, s conversion.Scope) error { + return autoConvert_resource_AllocatedDeviceStatus_To_v1alpha3_AllocatedDeviceStatus(in, out, s) +} + func autoConvert_v1alpha3_AllocationResult_To_resource_AllocationResult(in *resourcev1alpha3.AllocationResult, out *resource.AllocationResult, s conversion.Scope) error { if err := Convert_v1alpha3_DeviceAllocationResult_To_resource_DeviceAllocationResult(&in.Devices, &out.Devices, s); err != nil { return err @@ -381,7 +432,7 @@ func autoConvert_resource_AllocationResult_To_v1alpha3_AllocationResult(in *reso if err := Convert_resource_DeviceAllocationResult_To_v1alpha3_DeviceAllocationResult(&in.Devices, &out.Devices, s); err != nil { return err } - out.NodeSelector = (*v1.NodeSelector)(unsafe.Pointer(in.NodeSelector)) + out.NodeSelector = (*corev1.NodeSelector)(unsafe.Pointer(in.NodeSelector)) return nil } @@ -834,6 +885,30 @@ func Convert_resource_DeviceSelector_To_v1alpha3_DeviceSelector(in *resource.Dev return autoConvert_resource_DeviceSelector_To_v1alpha3_DeviceSelector(in, out, s) } +func autoConvert_v1alpha3_NetworkDeviceData_To_resource_NetworkDeviceData(in *resourcev1alpha3.NetworkDeviceData, out *resource.NetworkDeviceData, s conversion.Scope) error { + out.InterfaceName = in.InterfaceName + out.IPs = *(*[]string)(unsafe.Pointer(&in.IPs)) + out.HardwareAddress = in.HardwareAddress + return nil +} + +// Convert_v1alpha3_NetworkDeviceData_To_resource_NetworkDeviceData is an autogenerated conversion function. +func Convert_v1alpha3_NetworkDeviceData_To_resource_NetworkDeviceData(in *resourcev1alpha3.NetworkDeviceData, out *resource.NetworkDeviceData, s conversion.Scope) error { + return autoConvert_v1alpha3_NetworkDeviceData_To_resource_NetworkDeviceData(in, out, s) +} + +func autoConvert_resource_NetworkDeviceData_To_v1alpha3_NetworkDeviceData(in *resource.NetworkDeviceData, out *resourcev1alpha3.NetworkDeviceData, s conversion.Scope) error { + out.InterfaceName = in.InterfaceName + out.IPs = *(*[]string)(unsafe.Pointer(&in.IPs)) + out.HardwareAddress = in.HardwareAddress + return nil +} + +// Convert_resource_NetworkDeviceData_To_v1alpha3_NetworkDeviceData is an autogenerated conversion function. +func Convert_resource_NetworkDeviceData_To_v1alpha3_NetworkDeviceData(in *resource.NetworkDeviceData, out *resourcev1alpha3.NetworkDeviceData, s conversion.Scope) error { + return autoConvert_resource_NetworkDeviceData_To_v1alpha3_NetworkDeviceData(in, out, s) +} + func autoConvert_v1alpha3_OpaqueDeviceConfiguration_To_resource_OpaqueDeviceConfiguration(in *resourcev1alpha3.OpaqueDeviceConfiguration, out *resource.OpaqueDeviceConfiguration, s conversion.Scope) error { out.Driver = in.Driver out.Parameters = in.Parameters @@ -963,6 +1038,7 @@ func Convert_resource_ResourceClaimSpec_To_v1alpha3_ResourceClaimSpec(in *resour func autoConvert_v1alpha3_ResourceClaimStatus_To_resource_ResourceClaimStatus(in *resourcev1alpha3.ResourceClaimStatus, out *resource.ResourceClaimStatus, s conversion.Scope) error { out.Allocation = (*resource.AllocationResult)(unsafe.Pointer(in.Allocation)) out.ReservedFor = *(*[]resource.ResourceClaimConsumerReference)(unsafe.Pointer(&in.ReservedFor)) + out.Devices = *(*[]resource.AllocatedDeviceStatus)(unsafe.Pointer(&in.Devices)) return nil } @@ -974,6 +1050,7 @@ func Convert_v1alpha3_ResourceClaimStatus_To_resource_ResourceClaimStatus(in *re func autoConvert_resource_ResourceClaimStatus_To_v1alpha3_ResourceClaimStatus(in *resource.ResourceClaimStatus, out *resourcev1alpha3.ResourceClaimStatus, s conversion.Scope) error { out.Allocation = (*resourcev1alpha3.AllocationResult)(unsafe.Pointer(in.Allocation)) out.ReservedFor = *(*[]resourcev1alpha3.ResourceClaimConsumerReference)(unsafe.Pointer(&in.ReservedFor)) + out.Devices = *(*[]resourcev1alpha3.AllocatedDeviceStatus)(unsafe.Pointer(&in.Devices)) return nil } @@ -1181,7 +1258,7 @@ func autoConvert_resource_ResourceSliceSpec_To_v1alpha3_ResourceSliceSpec(in *re return err } out.NodeName = in.NodeName - out.NodeSelector = (*v1.NodeSelector)(unsafe.Pointer(in.NodeSelector)) + out.NodeSelector = (*corev1.NodeSelector)(unsafe.Pointer(in.NodeSelector)) out.AllNodes = in.AllNodes if in.Devices != nil { in, out := &in.Devices, &out.Devices diff --git a/pkg/apis/resource/v1beta1/zz_generated.conversion.go b/pkg/apis/resource/v1beta1/zz_generated.conversion.go index 095d9e2344d..8406ef4c6d7 100644 --- a/pkg/apis/resource/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/resource/v1beta1/zz_generated.conversion.go @@ -24,8 +24,9 @@ package v1beta1 import ( unsafe "unsafe" - v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" resourcev1beta1 "k8s.io/api/resource/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" types "k8s.io/apimachinery/pkg/types" @@ -40,6 +41,16 @@ func init() { // RegisterConversions adds conversion functions to the given scheme. // Public to allow building arbitrary schemes. func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddGeneratedConversionFunc((*resourcev1beta1.AllocatedDeviceStatus)(nil), (*resource.AllocatedDeviceStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatus(a.(*resourcev1beta1.AllocatedDeviceStatus), b.(*resource.AllocatedDeviceStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*resource.AllocatedDeviceStatus)(nil), (*resourcev1beta1.AllocatedDeviceStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_AllocatedDeviceStatus_To_v1beta1_AllocatedDeviceStatus(a.(*resource.AllocatedDeviceStatus), b.(*resourcev1beta1.AllocatedDeviceStatus), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*resourcev1beta1.AllocationResult)(nil), (*resource.AllocationResult)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_AllocationResult_To_resource_AllocationResult(a.(*resourcev1beta1.AllocationResult), b.(*resource.AllocationResult), scope) }); err != nil { @@ -230,6 +241,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*resourcev1beta1.NetworkDeviceData)(nil), (*resource.NetworkDeviceData)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_NetworkDeviceData_To_resource_NetworkDeviceData(a.(*resourcev1beta1.NetworkDeviceData), b.(*resource.NetworkDeviceData), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*resource.NetworkDeviceData)(nil), (*resourcev1beta1.NetworkDeviceData)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_NetworkDeviceData_To_v1beta1_NetworkDeviceData(a.(*resource.NetworkDeviceData), b.(*resourcev1beta1.NetworkDeviceData), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*resourcev1beta1.OpaqueDeviceConfiguration)(nil), (*resource.OpaqueDeviceConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_OpaqueDeviceConfiguration_To_resource_OpaqueDeviceConfiguration(a.(*resourcev1beta1.OpaqueDeviceConfiguration), b.(*resource.OpaqueDeviceConfiguration), scope) }); err != nil { @@ -363,6 +384,36 @@ func RegisterConversions(s *runtime.Scheme) error { return nil } +func autoConvert_v1beta1_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatus(in *resourcev1beta1.AllocatedDeviceStatus, out *resource.AllocatedDeviceStatus, s conversion.Scope) error { + out.Driver = in.Driver + out.Pool = in.Pool + out.Device = in.Device + out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions)) + out.Data = in.Data + out.NetworkData = (*resource.NetworkDeviceData)(unsafe.Pointer(in.NetworkData)) + return nil +} + +// Convert_v1beta1_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatus is an autogenerated conversion function. +func Convert_v1beta1_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatus(in *resourcev1beta1.AllocatedDeviceStatus, out *resource.AllocatedDeviceStatus, s conversion.Scope) error { + return autoConvert_v1beta1_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatus(in, out, s) +} + +func autoConvert_resource_AllocatedDeviceStatus_To_v1beta1_AllocatedDeviceStatus(in *resource.AllocatedDeviceStatus, out *resourcev1beta1.AllocatedDeviceStatus, s conversion.Scope) error { + out.Driver = in.Driver + out.Pool = in.Pool + out.Device = in.Device + out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions)) + out.Data = in.Data + out.NetworkData = (*resourcev1beta1.NetworkDeviceData)(unsafe.Pointer(in.NetworkData)) + return nil +} + +// Convert_resource_AllocatedDeviceStatus_To_v1beta1_AllocatedDeviceStatus is an autogenerated conversion function. +func Convert_resource_AllocatedDeviceStatus_To_v1beta1_AllocatedDeviceStatus(in *resource.AllocatedDeviceStatus, out *resourcev1beta1.AllocatedDeviceStatus, s conversion.Scope) error { + return autoConvert_resource_AllocatedDeviceStatus_To_v1beta1_AllocatedDeviceStatus(in, out, s) +} + func autoConvert_v1beta1_AllocationResult_To_resource_AllocationResult(in *resourcev1beta1.AllocationResult, out *resource.AllocationResult, s conversion.Scope) error { if err := Convert_v1beta1_DeviceAllocationResult_To_resource_DeviceAllocationResult(&in.Devices, &out.Devices, s); err != nil { return err @@ -380,7 +431,7 @@ func autoConvert_resource_AllocationResult_To_v1beta1_AllocationResult(in *resou if err := Convert_resource_DeviceAllocationResult_To_v1beta1_DeviceAllocationResult(&in.Devices, &out.Devices, s); err != nil { return err } - out.NodeSelector = (*v1.NodeSelector)(unsafe.Pointer(in.NodeSelector)) + out.NodeSelector = (*corev1.NodeSelector)(unsafe.Pointer(in.NodeSelector)) return nil } @@ -813,6 +864,30 @@ func Convert_resource_DeviceSelector_To_v1beta1_DeviceSelector(in *resource.Devi return autoConvert_resource_DeviceSelector_To_v1beta1_DeviceSelector(in, out, s) } +func autoConvert_v1beta1_NetworkDeviceData_To_resource_NetworkDeviceData(in *resourcev1beta1.NetworkDeviceData, out *resource.NetworkDeviceData, s conversion.Scope) error { + out.InterfaceName = in.InterfaceName + out.IPs = *(*[]string)(unsafe.Pointer(&in.IPs)) + out.HardwareAddress = in.HardwareAddress + return nil +} + +// Convert_v1beta1_NetworkDeviceData_To_resource_NetworkDeviceData is an autogenerated conversion function. +func Convert_v1beta1_NetworkDeviceData_To_resource_NetworkDeviceData(in *resourcev1beta1.NetworkDeviceData, out *resource.NetworkDeviceData, s conversion.Scope) error { + return autoConvert_v1beta1_NetworkDeviceData_To_resource_NetworkDeviceData(in, out, s) +} + +func autoConvert_resource_NetworkDeviceData_To_v1beta1_NetworkDeviceData(in *resource.NetworkDeviceData, out *resourcev1beta1.NetworkDeviceData, s conversion.Scope) error { + out.InterfaceName = in.InterfaceName + out.IPs = *(*[]string)(unsafe.Pointer(&in.IPs)) + out.HardwareAddress = in.HardwareAddress + return nil +} + +// Convert_resource_NetworkDeviceData_To_v1beta1_NetworkDeviceData is an autogenerated conversion function. +func Convert_resource_NetworkDeviceData_To_v1beta1_NetworkDeviceData(in *resource.NetworkDeviceData, out *resourcev1beta1.NetworkDeviceData, s conversion.Scope) error { + return autoConvert_resource_NetworkDeviceData_To_v1beta1_NetworkDeviceData(in, out, s) +} + func autoConvert_v1beta1_OpaqueDeviceConfiguration_To_resource_OpaqueDeviceConfiguration(in *resourcev1beta1.OpaqueDeviceConfiguration, out *resource.OpaqueDeviceConfiguration, s conversion.Scope) error { out.Driver = in.Driver out.Parameters = in.Parameters @@ -942,6 +1017,7 @@ func Convert_resource_ResourceClaimSpec_To_v1beta1_ResourceClaimSpec(in *resourc func autoConvert_v1beta1_ResourceClaimStatus_To_resource_ResourceClaimStatus(in *resourcev1beta1.ResourceClaimStatus, out *resource.ResourceClaimStatus, s conversion.Scope) error { out.Allocation = (*resource.AllocationResult)(unsafe.Pointer(in.Allocation)) out.ReservedFor = *(*[]resource.ResourceClaimConsumerReference)(unsafe.Pointer(&in.ReservedFor)) + out.Devices = *(*[]resource.AllocatedDeviceStatus)(unsafe.Pointer(&in.Devices)) return nil } @@ -953,6 +1029,7 @@ func Convert_v1beta1_ResourceClaimStatus_To_resource_ResourceClaimStatus(in *res func autoConvert_resource_ResourceClaimStatus_To_v1beta1_ResourceClaimStatus(in *resource.ResourceClaimStatus, out *resourcev1beta1.ResourceClaimStatus, s conversion.Scope) error { out.Allocation = (*resourcev1beta1.AllocationResult)(unsafe.Pointer(in.Allocation)) out.ReservedFor = *(*[]resourcev1beta1.ResourceClaimConsumerReference)(unsafe.Pointer(&in.ReservedFor)) + out.Devices = *(*[]resourcev1beta1.AllocatedDeviceStatus)(unsafe.Pointer(&in.Devices)) return nil } @@ -1130,7 +1207,7 @@ func autoConvert_resource_ResourceSliceSpec_To_v1beta1_ResourceSliceSpec(in *res return err } out.NodeName = in.NodeName - out.NodeSelector = (*v1.NodeSelector)(unsafe.Pointer(in.NodeSelector)) + out.NodeSelector = (*corev1.NodeSelector)(unsafe.Pointer(in.NodeSelector)) out.AllNodes = in.AllNodes out.Devices = *(*[]resourcev1beta1.Device)(unsafe.Pointer(&in.Devices)) return nil diff --git a/pkg/apis/resource/zz_generated.deepcopy.go b/pkg/apis/resource/zz_generated.deepcopy.go index fc212e60b8d..9b49a4e3c14 100644 --- a/pkg/apis/resource/zz_generated.deepcopy.go +++ b/pkg/apis/resource/zz_generated.deepcopy.go @@ -22,10 +22,40 @@ limitations under the License. package resource import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" core "k8s.io/kubernetes/pkg/apis/core" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AllocatedDeviceStatus) DeepCopyInto(out *AllocatedDeviceStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.Data.DeepCopyInto(&out.Data) + if in.NetworkData != nil { + in, out := &in.NetworkData, &out.NetworkData + *out = new(NetworkDeviceData) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AllocatedDeviceStatus. +func (in *AllocatedDeviceStatus) DeepCopy() *AllocatedDeviceStatus { + if in == nil { + return nil + } + out := new(AllocatedDeviceStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AllocationResult) DeepCopyInto(out *AllocationResult) { *out = *in @@ -503,6 +533,27 @@ func (in *DeviceSelector) DeepCopy() *DeviceSelector { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkDeviceData) DeepCopyInto(out *NetworkDeviceData) { + *out = *in + if in.IPs != nil { + in, out := &in.IPs, &out.IPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkDeviceData. +func (in *NetworkDeviceData) DeepCopy() *NetworkDeviceData { + if in == nil { + return nil + } + out := new(NetworkDeviceData) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *OpaqueDeviceConfiguration) DeepCopyInto(out *OpaqueDeviceConfiguration) { *out = *in @@ -627,6 +678,13 @@ func (in *ResourceClaimStatus) DeepCopyInto(out *ResourceClaimStatus) { *out = make([]ResourceClaimConsumerReference, len(*in)) copy(*out, *in) } + if in.Devices != nil { + in, out := &in.Devices, &out.Devices + *out = make([]AllocatedDeviceStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index ec48fc14331..ce4ca0fd321 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -900,6 +900,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/rbac/v1beta1.RoleList": schema_k8sio_api_rbac_v1beta1_RoleList(ref), "k8s.io/api/rbac/v1beta1.RoleRef": schema_k8sio_api_rbac_v1beta1_RoleRef(ref), "k8s.io/api/rbac/v1beta1.Subject": schema_k8sio_api_rbac_v1beta1_Subject(ref), + "k8s.io/api/resource/v1alpha3.AllocatedDeviceStatus": schema_k8sio_api_resource_v1alpha3_AllocatedDeviceStatus(ref), "k8s.io/api/resource/v1alpha3.AllocationResult": schema_k8sio_api_resource_v1alpha3_AllocationResult(ref), "k8s.io/api/resource/v1alpha3.BasicDevice": schema_k8sio_api_resource_v1alpha3_BasicDevice(ref), "k8s.io/api/resource/v1alpha3.CELDeviceSelector": schema_k8sio_api_resource_v1alpha3_CELDeviceSelector(ref), @@ -918,6 +919,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/resource/v1alpha3.DeviceRequest": schema_k8sio_api_resource_v1alpha3_DeviceRequest(ref), "k8s.io/api/resource/v1alpha3.DeviceRequestAllocationResult": schema_k8sio_api_resource_v1alpha3_DeviceRequestAllocationResult(ref), "k8s.io/api/resource/v1alpha3.DeviceSelector": schema_k8sio_api_resource_v1alpha3_DeviceSelector(ref), + "k8s.io/api/resource/v1alpha3.NetworkDeviceData": schema_k8sio_api_resource_v1alpha3_NetworkDeviceData(ref), "k8s.io/api/resource/v1alpha3.OpaqueDeviceConfiguration": schema_k8sio_api_resource_v1alpha3_OpaqueDeviceConfiguration(ref), "k8s.io/api/resource/v1alpha3.ResourceClaim": schema_k8sio_api_resource_v1alpha3_ResourceClaim(ref), "k8s.io/api/resource/v1alpha3.ResourceClaimConsumerReference": schema_k8sio_api_resource_v1alpha3_ResourceClaimConsumerReference(ref), @@ -931,6 +933,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/resource/v1alpha3.ResourceSlice": schema_k8sio_api_resource_v1alpha3_ResourceSlice(ref), "k8s.io/api/resource/v1alpha3.ResourceSliceList": schema_k8sio_api_resource_v1alpha3_ResourceSliceList(ref), "k8s.io/api/resource/v1alpha3.ResourceSliceSpec": schema_k8sio_api_resource_v1alpha3_ResourceSliceSpec(ref), + "k8s.io/api/resource/v1beta1.AllocatedDeviceStatus": schema_k8sio_api_resource_v1beta1_AllocatedDeviceStatus(ref), "k8s.io/api/resource/v1beta1.AllocationResult": schema_k8sio_api_resource_v1beta1_AllocationResult(ref), "k8s.io/api/resource/v1beta1.BasicDevice": schema_k8sio_api_resource_v1beta1_BasicDevice(ref), "k8s.io/api/resource/v1beta1.CELDeviceSelector": schema_k8sio_api_resource_v1beta1_CELDeviceSelector(ref), @@ -950,6 +953,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/resource/v1beta1.DeviceRequest": schema_k8sio_api_resource_v1beta1_DeviceRequest(ref), "k8s.io/api/resource/v1beta1.DeviceRequestAllocationResult": schema_k8sio_api_resource_v1beta1_DeviceRequestAllocationResult(ref), "k8s.io/api/resource/v1beta1.DeviceSelector": schema_k8sio_api_resource_v1beta1_DeviceSelector(ref), + "k8s.io/api/resource/v1beta1.NetworkDeviceData": schema_k8sio_api_resource_v1beta1_NetworkDeviceData(ref), "k8s.io/api/resource/v1beta1.OpaqueDeviceConfiguration": schema_k8sio_api_resource_v1beta1_OpaqueDeviceConfiguration(ref), "k8s.io/api/resource/v1beta1.ResourceClaim": schema_k8sio_api_resource_v1beta1_ResourceClaim(ref), "k8s.io/api/resource/v1beta1.ResourceClaimConsumerReference": schema_k8sio_api_resource_v1beta1_ResourceClaimConsumerReference(ref), @@ -46287,6 +46291,77 @@ func schema_k8sio_api_rbac_v1beta1_Subject(ref common.ReferenceCallback) common. } } +func schema_k8sio_api_resource_v1alpha3_AllocatedDeviceStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "driver": { + SchemaProps: spec.SchemaProps{ + Description: "Driver specifies the name of the DRA driver whose kubelet plugin should be invoked to process the allocation once the claim is needed on a node.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "pool": { + SchemaProps: spec.SchemaProps{ + Description: "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "device": { + SchemaProps: spec.SchemaProps{ + Description: "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "conditions": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Condition"), + }, + }, + }, + }, + }, + "data": { + SchemaProps: spec.SchemaProps{ + Description: "Data contains arbitrary driver-specific data.", + Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), + }, + }, + "networkData": { + SchemaProps: spec.SchemaProps{ + Description: "NetworkData contains network-related information specific to the device.", + Ref: ref("k8s.io/api/resource/v1alpha3.NetworkDeviceData"), + }, + }, + }, + Required: []string{"driver", "pool", "device"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.NetworkDeviceData", "k8s.io/apimachinery/pkg/apis/meta/v1.Condition", "k8s.io/apimachinery/pkg/runtime.RawExtension"}, + } +} + func schema_k8sio_api_resource_v1alpha3_AllocationResult(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -47044,6 +47119,53 @@ func schema_k8sio_api_resource_v1alpha3_DeviceSelector(ref common.ReferenceCallb } } +func schema_k8sio_api_resource_v1alpha3_NetworkDeviceData(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "interfaceName": { + SchemaProps: spec.SchemaProps{ + Description: "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + Type: []string{"string"}, + Format: "", + }, + }, + "ips": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "hardwareAddress": { + SchemaProps: spec.SchemaProps{ + Description: "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + } +} + func schema_k8sio_api_resource_v1alpha3_OpaqueDeviceConfiguration(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -47280,11 +47402,35 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaimStatus(ref common.Reference }, }, }, + "devices": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-map-keys": []interface{}{ + "driver", + "device", + "pool", + }, + "x-kubernetes-list-type": "map", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Devices contains the status of each device allocated for this claim, as reported by the driver. This can include driver-specific information. Entries are owned by their respective drivers.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.AllocatedDeviceStatus"), + }, + }, + }, + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.AllocationResult", "k8s.io/api/resource/v1alpha3.ResourceClaimConsumerReference"}, + "k8s.io/api/resource/v1alpha3.AllocatedDeviceStatus", "k8s.io/api/resource/v1alpha3.AllocationResult", "k8s.io/api/resource/v1alpha3.ResourceClaimConsumerReference"}, } } @@ -47616,6 +47762,77 @@ func schema_k8sio_api_resource_v1alpha3_ResourceSliceSpec(ref common.ReferenceCa } } +func schema_k8sio_api_resource_v1beta1_AllocatedDeviceStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "driver": { + SchemaProps: spec.SchemaProps{ + Description: "Driver specifies the name of the DRA driver whose kubelet plugin should be invoked to process the allocation once the claim is needed on a node.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "pool": { + SchemaProps: spec.SchemaProps{ + Description: "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "device": { + SchemaProps: spec.SchemaProps{ + Description: "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "conditions": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Condition"), + }, + }, + }, + }, + }, + "data": { + SchemaProps: spec.SchemaProps{ + Description: "Data contains arbitrary driver-specific data.", + Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), + }, + }, + "networkData": { + SchemaProps: spec.SchemaProps{ + Description: "NetworkData contains network-related information specific to the device.", + Ref: ref("k8s.io/api/resource/v1beta1.NetworkDeviceData"), + }, + }, + }, + Required: []string{"driver", "pool", "device"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1beta1.NetworkDeviceData", "k8s.io/apimachinery/pkg/apis/meta/v1.Condition", "k8s.io/apimachinery/pkg/runtime.RawExtension"}, + } +} + func schema_k8sio_api_resource_v1beta1_AllocationResult(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -48396,6 +48613,53 @@ func schema_k8sio_api_resource_v1beta1_DeviceSelector(ref common.ReferenceCallba } } +func schema_k8sio_api_resource_v1beta1_NetworkDeviceData(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "interfaceName": { + SchemaProps: spec.SchemaProps{ + Description: "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + Type: []string{"string"}, + Format: "", + }, + }, + "ips": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "hardwareAddress": { + SchemaProps: spec.SchemaProps{ + Description: "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + } +} + func schema_k8sio_api_resource_v1beta1_OpaqueDeviceConfiguration(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -48632,11 +48896,35 @@ func schema_k8sio_api_resource_v1beta1_ResourceClaimStatus(ref common.ReferenceC }, }, }, + "devices": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-map-keys": []interface{}{ + "driver", + "device", + "pool", + }, + "x-kubernetes-list-type": "map", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Devices contains the status of each device allocated for this claim, as reported by the driver. This can include driver-specific information. Entries are owned by their respective drivers.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1beta1.AllocatedDeviceStatus"), + }, + }, + }, + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/api/resource/v1beta1.AllocationResult", "k8s.io/api/resource/v1beta1.ResourceClaimConsumerReference"}, + "k8s.io/api/resource/v1beta1.AllocatedDeviceStatus", "k8s.io/api/resource/v1beta1.AllocationResult", "k8s.io/api/resource/v1beta1.ResourceClaimConsumerReference"}, } } diff --git a/staging/src/k8s.io/api/resource/v1alpha3/generated.pb.go b/staging/src/k8s.io/api/resource/v1alpha3/generated.pb.go index c9d4bae7976..540f7b8184a 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/generated.pb.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/generated.pb.go @@ -26,8 +26,9 @@ import ( proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" - v1 "k8s.io/api/core/v1" + v11 "k8s.io/api/core/v1" resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" math "math" math_bits "math/bits" @@ -48,10 +49,38 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +func (m *AllocatedDeviceStatus) Reset() { *m = AllocatedDeviceStatus{} } +func (*AllocatedDeviceStatus) ProtoMessage() {} +func (*AllocatedDeviceStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_66649ee9bbcd89d2, []int{0} +} +func (m *AllocatedDeviceStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AllocatedDeviceStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *AllocatedDeviceStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_AllocatedDeviceStatus.Merge(m, src) +} +func (m *AllocatedDeviceStatus) XXX_Size() int { + return m.Size() +} +func (m *AllocatedDeviceStatus) XXX_DiscardUnknown() { + xxx_messageInfo_AllocatedDeviceStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_AllocatedDeviceStatus proto.InternalMessageInfo + func (m *AllocationResult) Reset() { *m = AllocationResult{} } func (*AllocationResult) ProtoMessage() {} func (*AllocationResult) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{0} + return fileDescriptor_66649ee9bbcd89d2, []int{1} } func (m *AllocationResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -79,7 +108,7 @@ var xxx_messageInfo_AllocationResult proto.InternalMessageInfo func (m *BasicDevice) Reset() { *m = BasicDevice{} } func (*BasicDevice) ProtoMessage() {} func (*BasicDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{1} + return fileDescriptor_66649ee9bbcd89d2, []int{2} } func (m *BasicDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -107,7 +136,7 @@ var xxx_messageInfo_BasicDevice proto.InternalMessageInfo func (m *CELDeviceSelector) Reset() { *m = CELDeviceSelector{} } func (*CELDeviceSelector) ProtoMessage() {} func (*CELDeviceSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{2} + return fileDescriptor_66649ee9bbcd89d2, []int{3} } func (m *CELDeviceSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -135,7 +164,7 @@ var xxx_messageInfo_CELDeviceSelector proto.InternalMessageInfo func (m *Device) Reset() { *m = Device{} } func (*Device) ProtoMessage() {} func (*Device) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{3} + return fileDescriptor_66649ee9bbcd89d2, []int{4} } func (m *Device) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -163,7 +192,7 @@ var xxx_messageInfo_Device proto.InternalMessageInfo func (m *DeviceAllocationConfiguration) Reset() { *m = DeviceAllocationConfiguration{} } func (*DeviceAllocationConfiguration) ProtoMessage() {} func (*DeviceAllocationConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{4} + return fileDescriptor_66649ee9bbcd89d2, []int{5} } func (m *DeviceAllocationConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -191,7 +220,7 @@ var xxx_messageInfo_DeviceAllocationConfiguration proto.InternalMessageInfo func (m *DeviceAllocationResult) Reset() { *m = DeviceAllocationResult{} } func (*DeviceAllocationResult) ProtoMessage() {} func (*DeviceAllocationResult) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{5} + return fileDescriptor_66649ee9bbcd89d2, []int{6} } func (m *DeviceAllocationResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -219,7 +248,7 @@ var xxx_messageInfo_DeviceAllocationResult proto.InternalMessageInfo func (m *DeviceAttribute) Reset() { *m = DeviceAttribute{} } func (*DeviceAttribute) ProtoMessage() {} func (*DeviceAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{6} + return fileDescriptor_66649ee9bbcd89d2, []int{7} } func (m *DeviceAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -247,7 +276,7 @@ var xxx_messageInfo_DeviceAttribute proto.InternalMessageInfo func (m *DeviceClaim) Reset() { *m = DeviceClaim{} } func (*DeviceClaim) ProtoMessage() {} func (*DeviceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{7} + return fileDescriptor_66649ee9bbcd89d2, []int{8} } func (m *DeviceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -275,7 +304,7 @@ var xxx_messageInfo_DeviceClaim proto.InternalMessageInfo func (m *DeviceClaimConfiguration) Reset() { *m = DeviceClaimConfiguration{} } func (*DeviceClaimConfiguration) ProtoMessage() {} func (*DeviceClaimConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{8} + return fileDescriptor_66649ee9bbcd89d2, []int{9} } func (m *DeviceClaimConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -303,7 +332,7 @@ var xxx_messageInfo_DeviceClaimConfiguration proto.InternalMessageInfo func (m *DeviceClass) Reset() { *m = DeviceClass{} } func (*DeviceClass) ProtoMessage() {} func (*DeviceClass) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{9} + return fileDescriptor_66649ee9bbcd89d2, []int{10} } func (m *DeviceClass) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -331,7 +360,7 @@ var xxx_messageInfo_DeviceClass proto.InternalMessageInfo func (m *DeviceClassConfiguration) Reset() { *m = DeviceClassConfiguration{} } func (*DeviceClassConfiguration) ProtoMessage() {} func (*DeviceClassConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{10} + return fileDescriptor_66649ee9bbcd89d2, []int{11} } func (m *DeviceClassConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -359,7 +388,7 @@ var xxx_messageInfo_DeviceClassConfiguration proto.InternalMessageInfo func (m *DeviceClassList) Reset() { *m = DeviceClassList{} } func (*DeviceClassList) ProtoMessage() {} func (*DeviceClassList) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{11} + return fileDescriptor_66649ee9bbcd89d2, []int{12} } func (m *DeviceClassList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -387,7 +416,7 @@ var xxx_messageInfo_DeviceClassList proto.InternalMessageInfo func (m *DeviceClassSpec) Reset() { *m = DeviceClassSpec{} } func (*DeviceClassSpec) ProtoMessage() {} func (*DeviceClassSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{12} + return fileDescriptor_66649ee9bbcd89d2, []int{13} } func (m *DeviceClassSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -415,7 +444,7 @@ var xxx_messageInfo_DeviceClassSpec proto.InternalMessageInfo func (m *DeviceConfiguration) Reset() { *m = DeviceConfiguration{} } func (*DeviceConfiguration) ProtoMessage() {} func (*DeviceConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{13} + return fileDescriptor_66649ee9bbcd89d2, []int{14} } func (m *DeviceConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -443,7 +472,7 @@ var xxx_messageInfo_DeviceConfiguration proto.InternalMessageInfo func (m *DeviceConstraint) Reset() { *m = DeviceConstraint{} } func (*DeviceConstraint) ProtoMessage() {} func (*DeviceConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{14} + return fileDescriptor_66649ee9bbcd89d2, []int{15} } func (m *DeviceConstraint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -471,7 +500,7 @@ var xxx_messageInfo_DeviceConstraint proto.InternalMessageInfo func (m *DeviceRequest) Reset() { *m = DeviceRequest{} } func (*DeviceRequest) ProtoMessage() {} func (*DeviceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{15} + return fileDescriptor_66649ee9bbcd89d2, []int{16} } func (m *DeviceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -499,7 +528,7 @@ var xxx_messageInfo_DeviceRequest proto.InternalMessageInfo func (m *DeviceRequestAllocationResult) Reset() { *m = DeviceRequestAllocationResult{} } func (*DeviceRequestAllocationResult) ProtoMessage() {} func (*DeviceRequestAllocationResult) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{16} + return fileDescriptor_66649ee9bbcd89d2, []int{17} } func (m *DeviceRequestAllocationResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -527,7 +556,7 @@ var xxx_messageInfo_DeviceRequestAllocationResult proto.InternalMessageInfo func (m *DeviceSelector) Reset() { *m = DeviceSelector{} } func (*DeviceSelector) ProtoMessage() {} func (*DeviceSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{17} + return fileDescriptor_66649ee9bbcd89d2, []int{18} } func (m *DeviceSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -552,10 +581,38 @@ func (m *DeviceSelector) XXX_DiscardUnknown() { var xxx_messageInfo_DeviceSelector proto.InternalMessageInfo +func (m *NetworkDeviceData) Reset() { *m = NetworkDeviceData{} } +func (*NetworkDeviceData) ProtoMessage() {} +func (*NetworkDeviceData) Descriptor() ([]byte, []int) { + return fileDescriptor_66649ee9bbcd89d2, []int{19} +} +func (m *NetworkDeviceData) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NetworkDeviceData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *NetworkDeviceData) XXX_Merge(src proto.Message) { + xxx_messageInfo_NetworkDeviceData.Merge(m, src) +} +func (m *NetworkDeviceData) XXX_Size() int { + return m.Size() +} +func (m *NetworkDeviceData) XXX_DiscardUnknown() { + xxx_messageInfo_NetworkDeviceData.DiscardUnknown(m) +} + +var xxx_messageInfo_NetworkDeviceData proto.InternalMessageInfo + func (m *OpaqueDeviceConfiguration) Reset() { *m = OpaqueDeviceConfiguration{} } func (*OpaqueDeviceConfiguration) ProtoMessage() {} func (*OpaqueDeviceConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{18} + return fileDescriptor_66649ee9bbcd89d2, []int{20} } func (m *OpaqueDeviceConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -583,7 +640,7 @@ var xxx_messageInfo_OpaqueDeviceConfiguration proto.InternalMessageInfo func (m *ResourceClaim) Reset() { *m = ResourceClaim{} } func (*ResourceClaim) ProtoMessage() {} func (*ResourceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{19} + return fileDescriptor_66649ee9bbcd89d2, []int{21} } func (m *ResourceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -611,7 +668,7 @@ var xxx_messageInfo_ResourceClaim proto.InternalMessageInfo func (m *ResourceClaimConsumerReference) Reset() { *m = ResourceClaimConsumerReference{} } func (*ResourceClaimConsumerReference) ProtoMessage() {} func (*ResourceClaimConsumerReference) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{20} + return fileDescriptor_66649ee9bbcd89d2, []int{22} } func (m *ResourceClaimConsumerReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -639,7 +696,7 @@ var xxx_messageInfo_ResourceClaimConsumerReference proto.InternalMessageInfo func (m *ResourceClaimList) Reset() { *m = ResourceClaimList{} } func (*ResourceClaimList) ProtoMessage() {} func (*ResourceClaimList) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{21} + return fileDescriptor_66649ee9bbcd89d2, []int{23} } func (m *ResourceClaimList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -667,7 +724,7 @@ var xxx_messageInfo_ResourceClaimList proto.InternalMessageInfo func (m *ResourceClaimSpec) Reset() { *m = ResourceClaimSpec{} } func (*ResourceClaimSpec) ProtoMessage() {} func (*ResourceClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{22} + return fileDescriptor_66649ee9bbcd89d2, []int{24} } func (m *ResourceClaimSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -695,7 +752,7 @@ var xxx_messageInfo_ResourceClaimSpec proto.InternalMessageInfo func (m *ResourceClaimStatus) Reset() { *m = ResourceClaimStatus{} } func (*ResourceClaimStatus) ProtoMessage() {} func (*ResourceClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{23} + return fileDescriptor_66649ee9bbcd89d2, []int{25} } func (m *ResourceClaimStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -723,7 +780,7 @@ var xxx_messageInfo_ResourceClaimStatus proto.InternalMessageInfo func (m *ResourceClaimTemplate) Reset() { *m = ResourceClaimTemplate{} } func (*ResourceClaimTemplate) ProtoMessage() {} func (*ResourceClaimTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{24} + return fileDescriptor_66649ee9bbcd89d2, []int{26} } func (m *ResourceClaimTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -751,7 +808,7 @@ var xxx_messageInfo_ResourceClaimTemplate proto.InternalMessageInfo func (m *ResourceClaimTemplateList) Reset() { *m = ResourceClaimTemplateList{} } func (*ResourceClaimTemplateList) ProtoMessage() {} func (*ResourceClaimTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{25} + return fileDescriptor_66649ee9bbcd89d2, []int{27} } func (m *ResourceClaimTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -779,7 +836,7 @@ var xxx_messageInfo_ResourceClaimTemplateList proto.InternalMessageInfo func (m *ResourceClaimTemplateSpec) Reset() { *m = ResourceClaimTemplateSpec{} } func (*ResourceClaimTemplateSpec) ProtoMessage() {} func (*ResourceClaimTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{26} + return fileDescriptor_66649ee9bbcd89d2, []int{28} } func (m *ResourceClaimTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -807,7 +864,7 @@ var xxx_messageInfo_ResourceClaimTemplateSpec proto.InternalMessageInfo func (m *ResourcePool) Reset() { *m = ResourcePool{} } func (*ResourcePool) ProtoMessage() {} func (*ResourcePool) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{27} + return fileDescriptor_66649ee9bbcd89d2, []int{29} } func (m *ResourcePool) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -835,7 +892,7 @@ var xxx_messageInfo_ResourcePool proto.InternalMessageInfo func (m *ResourceSlice) Reset() { *m = ResourceSlice{} } func (*ResourceSlice) ProtoMessage() {} func (*ResourceSlice) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{28} + return fileDescriptor_66649ee9bbcd89d2, []int{30} } func (m *ResourceSlice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -863,7 +920,7 @@ var xxx_messageInfo_ResourceSlice proto.InternalMessageInfo func (m *ResourceSliceList) Reset() { *m = ResourceSliceList{} } func (*ResourceSliceList) ProtoMessage() {} func (*ResourceSliceList) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{29} + return fileDescriptor_66649ee9bbcd89d2, []int{31} } func (m *ResourceSliceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -891,7 +948,7 @@ var xxx_messageInfo_ResourceSliceList proto.InternalMessageInfo func (m *ResourceSliceSpec) Reset() { *m = ResourceSliceSpec{} } func (*ResourceSliceSpec) ProtoMessage() {} func (*ResourceSliceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{30} + return fileDescriptor_66649ee9bbcd89d2, []int{32} } func (m *ResourceSliceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -917,6 +974,7 @@ func (m *ResourceSliceSpec) XXX_DiscardUnknown() { var xxx_messageInfo_ResourceSliceSpec proto.InternalMessageInfo func init() { + proto.RegisterType((*AllocatedDeviceStatus)(nil), "k8s.io.api.resource.v1alpha3.AllocatedDeviceStatus") proto.RegisterType((*AllocationResult)(nil), "k8s.io.api.resource.v1alpha3.AllocationResult") proto.RegisterType((*BasicDevice)(nil), "k8s.io.api.resource.v1alpha3.BasicDevice") proto.RegisterMapType((map[QualifiedName]DeviceAttribute)(nil), "k8s.io.api.resource.v1alpha3.BasicDevice.AttributesEntry") @@ -937,6 +995,7 @@ func init() { proto.RegisterType((*DeviceRequest)(nil), "k8s.io.api.resource.v1alpha3.DeviceRequest") proto.RegisterType((*DeviceRequestAllocationResult)(nil), "k8s.io.api.resource.v1alpha3.DeviceRequestAllocationResult") proto.RegisterType((*DeviceSelector)(nil), "k8s.io.api.resource.v1alpha3.DeviceSelector") + proto.RegisterType((*NetworkDeviceData)(nil), "k8s.io.api.resource.v1alpha3.NetworkDeviceData") proto.RegisterType((*OpaqueDeviceConfiguration)(nil), "k8s.io.api.resource.v1alpha3.OpaqueDeviceConfiguration") proto.RegisterType((*ResourceClaim)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaim") proto.RegisterType((*ResourceClaimConsumerReference)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimConsumerReference") @@ -957,122 +1016,208 @@ func init() { } var fileDescriptor_66649ee9bbcd89d2 = []byte{ - // 1835 bytes of a gzipped FileDescriptorProto + // 2030 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x19, 0xcd, 0x6f, 0x1c, 0x57, - 0xdd, 0xb3, 0xe3, 0x5d, 0xdb, 0xbf, 0xf5, 0x57, 0x5e, 0xa0, 0x38, 0xa6, 0xec, 0x26, 0x53, 0x04, - 0x4e, 0x9b, 0xce, 0x36, 0x69, 0xd5, 0x16, 0xca, 0x01, 0x8f, 0xed, 0x46, 0x8e, 0xf2, 0xe1, 0x3c, - 0xb7, 0x11, 0x81, 0x52, 0x78, 0x9e, 0x7d, 0x5e, 0x0f, 0x9e, 0x9d, 0x99, 0xce, 0x7b, 0xb3, 0xd4, - 0x17, 0x54, 0xc1, 0x3d, 0xe2, 0x1f, 0x40, 0xdc, 0x90, 0x38, 0xc1, 0x7f, 0x00, 0x12, 0x48, 0x44, - 0xe2, 0x12, 0x09, 0x0e, 0x3d, 0x2d, 0xcd, 0x22, 0x2e, 0x5c, 0xb8, 0xfb, 0x84, 0xe6, 0xcd, 0x9b, - 0xcf, 0xdd, 0x71, 0x66, 0xab, 0x62, 0x85, 0xdb, 0xce, 0xef, 0xfb, 0xfb, 0xf7, 0x9b, 0x59, 0xb8, - 0x76, 0xfc, 0x36, 0xd3, 0x2d, 0xb7, 0x43, 0x3c, 0xab, 0xe3, 0x53, 0xe6, 0x06, 0xbe, 0x49, 0x3b, - 0x83, 0xeb, 0xc4, 0xf6, 0x8e, 0xc8, 0xeb, 0x9d, 0x1e, 0x75, 0xa8, 0x4f, 0x38, 0xed, 0xea, 0x9e, - 0xef, 0x72, 0x17, 0xbd, 0x18, 0x51, 0xeb, 0xc4, 0xb3, 0xf4, 0x98, 0x5a, 0x8f, 0xa9, 0xd7, 0x5f, - 0xed, 0x59, 0xfc, 0x28, 0x38, 0xd0, 0x4d, 0xb7, 0xdf, 0xe9, 0xb9, 0x3d, 0xb7, 0x23, 0x98, 0x0e, - 0x82, 0x43, 0xf1, 0x24, 0x1e, 0xc4, 0xaf, 0x48, 0xd8, 0xba, 0x96, 0x51, 0x6d, 0xba, 0x7e, 0xa8, - 0xb6, 0xa8, 0x70, 0xfd, 0x8d, 0x94, 0xa6, 0x4f, 0xcc, 0x23, 0xcb, 0xa1, 0xfe, 0x49, 0xc7, 0x3b, - 0xee, 0xe5, 0xed, 0x9d, 0x86, 0x8b, 0x75, 0xfa, 0x94, 0x93, 0x49, 0xba, 0x3a, 0x65, 0x5c, 0x7e, - 0xe0, 0x70, 0xab, 0x3f, 0xae, 0xe6, 0xcd, 0x67, 0x31, 0x30, 0xf3, 0x88, 0xf6, 0x49, 0x91, 0x4f, - 0xfb, 0xab, 0x02, 0xab, 0x9b, 0xb6, 0xed, 0x9a, 0x84, 0x5b, 0xae, 0x83, 0x29, 0x0b, 0x6c, 0x8e, - 0x7e, 0x04, 0x73, 0x5d, 0x3a, 0xb0, 0x4c, 0xca, 0xd6, 0x94, 0xcb, 0xca, 0x46, 0xf3, 0xc6, 0x1b, - 0xfa, 0x59, 0xc1, 0xd6, 0xb7, 0x05, 0x71, 0x51, 0x8c, 0xb1, 0xf2, 0x78, 0xd8, 0x9e, 0x19, 0x0d, - 0xdb, 0x73, 0x11, 0x9e, 0xe1, 0x58, 0x2a, 0x7a, 0x00, 0x8b, 0x8e, 0xdb, 0xa5, 0xfb, 0xd4, 0xa6, - 0x26, 0x77, 0xfd, 0x35, 0x55, 0x68, 0xb9, 0x9c, 0xd5, 0x12, 0x66, 0x41, 0x1f, 0x5c, 0xd7, 0xef, - 0x66, 0xe8, 0x8c, 0xd5, 0xd1, 0xb0, 0xbd, 0x98, 0x85, 0xe0, 0x9c, 0x1c, 0xed, 0x33, 0x15, 0x9a, - 0x06, 0x61, 0x96, 0x19, 0x69, 0x44, 0x3f, 0x03, 0x20, 0x9c, 0xfb, 0xd6, 0x41, 0xc0, 0x85, 0x2f, - 0xea, 0x46, 0xf3, 0xc6, 0xb7, 0xce, 0xf6, 0x25, 0xc3, 0xae, 0x6f, 0x26, 0xbc, 0x3b, 0x0e, 0xf7, - 0x4f, 0x8c, 0x97, 0xa4, 0x43, 0x90, 0x22, 0x7e, 0xfe, 0x8f, 0xf6, 0xd2, 0xfd, 0x80, 0xd8, 0xd6, - 0xa1, 0x45, 0xbb, 0x77, 0x49, 0x9f, 0xe2, 0x8c, 0x46, 0x34, 0x80, 0x79, 0x93, 0x78, 0xc4, 0xb4, - 0xf8, 0xc9, 0x5a, 0x4d, 0x68, 0x7f, 0xab, 0xba, 0xf6, 0x2d, 0xc9, 0x19, 0xe9, 0xbe, 0x22, 0x75, - 0xcf, 0xc7, 0xe0, 0x71, 0xcd, 0x89, 0xae, 0x75, 0x1b, 0x56, 0x0a, 0xb6, 0xa3, 0x55, 0x50, 0x8f, - 0xe9, 0x89, 0xc8, 0xe7, 0x02, 0x0e, 0x7f, 0xa2, 0x2d, 0xa8, 0x0f, 0x88, 0x1d, 0xd0, 0xb5, 0x9a, - 0x88, 0xfe, 0xab, 0x95, 0x72, 0x1c, 0x4b, 0xc5, 0x11, 0xef, 0xb7, 0x6b, 0x6f, 0x2b, 0xeb, 0xc7, - 0xb0, 0x94, 0xb3, 0x75, 0x82, 0xae, 0xed, 0xbc, 0x2e, 0x3d, 0xa3, 0x2b, 0x29, 0x57, 0xdd, 0x3b, - 0xee, 0xe5, 0x95, 0xdf, 0x0f, 0x88, 0xc3, 0x2d, 0x7e, 0x92, 0x51, 0xa6, 0xdd, 0x84, 0x0b, 0x5b, - 0x3b, 0xb7, 0x23, 0x6b, 0xe2, 0xbc, 0xa3, 0x1b, 0x00, 0xf4, 0x63, 0xcf, 0xa7, 0x8c, 0x59, 0xae, - 0x13, 0xe9, 0x35, 0x50, 0x9c, 0xac, 0x9d, 0x04, 0x83, 0x33, 0x54, 0xda, 0x00, 0x1a, 0xb2, 0x4a, - 0x2e, 0xc3, 0xac, 0x43, 0xfa, 0x54, 0xf2, 0x2d, 0x4a, 0xbe, 0x59, 0x11, 0x53, 0x81, 0x41, 0xb7, - 0xa0, 0x7e, 0x10, 0x66, 0x46, 0x9a, 0x7f, 0xb5, 0x72, 0x12, 0x8d, 0x85, 0xd1, 0xb0, 0x5d, 0x17, - 0x00, 0x1c, 0x89, 0xd0, 0x1e, 0xd5, 0xe0, 0x6b, 0xc5, 0x86, 0xd9, 0x72, 0x9d, 0x43, 0xab, 0x17, - 0xf8, 0xe2, 0x01, 0x7d, 0x17, 0x1a, 0x91, 0x48, 0x69, 0xd1, 0x86, 0xb4, 0xa8, 0xb1, 0x2f, 0xa0, - 0xa7, 0xc3, 0xf6, 0x0b, 0x45, 0xd6, 0x08, 0x83, 0x25, 0x1f, 0xda, 0x80, 0x79, 0x9f, 0x7e, 0x14, - 0x50, 0xc6, 0x99, 0xa8, 0xbb, 0x05, 0x63, 0x31, 0x2c, 0x1d, 0x2c, 0x61, 0x38, 0xc1, 0xa2, 0x4f, - 0x14, 0xb8, 0x18, 0x75, 0x65, 0xce, 0x06, 0xd9, 0x91, 0xd7, 0xab, 0xd4, 0x44, 0x8e, 0xd1, 0xf8, - 0xaa, 0x34, 0xf6, 0xe2, 0x04, 0x24, 0x9e, 0xa4, 0x4a, 0xfb, 0x97, 0x02, 0x2f, 0x4c, 0x9e, 0x20, - 0xe8, 0x10, 0xe6, 0x7c, 0xf1, 0x2b, 0x6e, 0xde, 0x77, 0xaa, 0x18, 0x24, 0xdd, 0x2c, 0x9f, 0x47, - 0xd1, 0x33, 0xc3, 0xb1, 0x70, 0x64, 0x42, 0xc3, 0x14, 0x36, 0xc9, 0x2e, 0x7d, 0x67, 0xba, 0x79, - 0x97, 0x8f, 0xc0, 0x72, 0x9c, 0xae, 0x08, 0x8c, 0xa5, 0x68, 0xed, 0xb7, 0x0a, 0xac, 0x14, 0xba, - 0x08, 0xb5, 0x40, 0xb5, 0x1c, 0x2e, 0xca, 0x4a, 0x8d, 0x72, 0xb4, 0xeb, 0xf0, 0x07, 0x61, 0xb1, - 0xe3, 0x10, 0x81, 0xae, 0xc0, 0xec, 0x81, 0xeb, 0xda, 0x22, 0x1d, 0xf3, 0xc6, 0xd2, 0x68, 0xd8, - 0x5e, 0x30, 0x5c, 0xd7, 0x8e, 0x28, 0x04, 0x0a, 0x7d, 0x13, 0x1a, 0x8c, 0xfb, 0x96, 0xd3, 0x5b, - 0x9b, 0x15, 0xd5, 0xb2, 0x32, 0x1a, 0xb6, 0x9b, 0xfb, 0x02, 0x12, 0x91, 0x49, 0x34, 0x7a, 0x19, - 0xe6, 0x06, 0xd4, 0x17, 0x1d, 0x52, 0x17, 0x94, 0x62, 0x9a, 0x3e, 0x88, 0x40, 0x11, 0x69, 0x4c, - 0xa0, 0xfd, 0xae, 0x06, 0x4d, 0x99, 0x40, 0x9b, 0x58, 0x7d, 0xf4, 0x30, 0x53, 0x50, 0x51, 0x26, - 0x5e, 0x99, 0x22, 0x13, 0xc6, 0x6a, 0x3c, 0xbc, 0x26, 0x54, 0x20, 0x85, 0xa6, 0xe9, 0x3a, 0x8c, - 0xfb, 0xc4, 0x72, 0x64, 0xb9, 0xe6, 0x07, 0xc4, 0x59, 0x85, 0x27, 0xd9, 0x8c, 0x8b, 0x52, 0x41, - 0x33, 0x85, 0x31, 0x9c, 0x95, 0x8b, 0x3e, 0x4c, 0x52, 0xac, 0x0a, 0x0d, 0x6f, 0x56, 0xd2, 0x10, - 0x3a, 0x5f, 0x2d, 0xbb, 0x7f, 0x51, 0x60, 0xad, 0x8c, 0x29, 0xd7, 0x8f, 0xca, 0xe7, 0xea, 0xc7, - 0xda, 0xf9, 0xf5, 0xe3, 0x1f, 0x95, 0x4c, 0xee, 0x19, 0x43, 0x3f, 0x86, 0xf9, 0xf0, 0x4c, 0xe9, - 0x12, 0x4e, 0xe4, 0x39, 0xf0, 0xda, 0x59, 0xe3, 0x9b, 0xe9, 0x21, 0x75, 0xb8, 0xba, 0xef, 0x1d, - 0xfc, 0x84, 0x9a, 0xfc, 0x0e, 0xe5, 0x24, 0x1d, 0xc6, 0x29, 0x0c, 0x27, 0x52, 0xd1, 0x3d, 0x98, - 0x65, 0x1e, 0x35, 0xa7, 0x59, 0x44, 0xc2, 0xb4, 0x7d, 0x8f, 0x9a, 0xe9, 0xbc, 0x0e, 0x9f, 0xb0, - 0x10, 0xa4, 0xfd, 0x2a, 0x9b, 0x0c, 0xc6, 0xf2, 0xc9, 0x28, 0x0b, 0xb1, 0x72, 0x7e, 0x21, 0xfe, - 0x43, 0x32, 0x0a, 0x84, 0x7d, 0xb7, 0x2d, 0xc6, 0xd1, 0x07, 0x63, 0x61, 0xd6, 0xab, 0x85, 0x39, - 0xe4, 0x16, 0x41, 0x4e, 0xba, 0x2c, 0x86, 0x64, 0x42, 0x7c, 0x17, 0xea, 0x16, 0xa7, 0xfd, 0xb8, - 0xbf, 0xae, 0x56, 0x8e, 0xb1, 0xb1, 0x24, 0xa5, 0xd6, 0x77, 0x43, 0x7e, 0x1c, 0x89, 0xd1, 0x9e, - 0xe4, 0x3d, 0x08, 0x63, 0x8f, 0x7e, 0x08, 0x0b, 0x4c, 0x6e, 0xe4, 0x78, 0x4a, 0x5c, 0xab, 0xa2, - 0x27, 0x39, 0xef, 0x2e, 0x48, 0x55, 0x0b, 0x31, 0x84, 0xe1, 0x54, 0x62, 0xa6, 0x83, 0x6b, 0x53, - 0x75, 0x70, 0x21, 0xff, 0xa5, 0x1d, 0xec, 0xc3, 0xa4, 0x04, 0xa2, 0x1f, 0x40, 0xc3, 0xf5, 0xc8, - 0x47, 0x01, 0x95, 0x59, 0x79, 0xc6, 0x05, 0x77, 0x4f, 0xd0, 0x4e, 0x2a, 0x13, 0x08, 0x75, 0x46, - 0x68, 0x2c, 0x45, 0x6a, 0x8f, 0x14, 0x58, 0x2d, 0x0e, 0xb3, 0x29, 0xa6, 0xc5, 0x1e, 0x2c, 0xf7, - 0x09, 0x37, 0x8f, 0x92, 0x85, 0x22, 0x5a, 0x68, 0xc1, 0xd8, 0x18, 0x0d, 0xdb, 0xcb, 0x77, 0x72, - 0x98, 0xd3, 0x61, 0x1b, 0xbd, 0x1b, 0xd8, 0xf6, 0x49, 0xfe, 0x66, 0x2c, 0xf0, 0x6b, 0xbf, 0x50, - 0x61, 0x29, 0x37, 0xbb, 0x2b, 0x5c, 0x47, 0x9b, 0xb0, 0xd2, 0x4d, 0x83, 0x1d, 0x22, 0xa4, 0x19, - 0x5f, 0x91, 0xc4, 0xd9, 0x4a, 0x11, 0x7c, 0x45, 0xfa, 0x7c, 0xe9, 0xa8, 0x5f, 0x78, 0xe9, 0x3c, - 0x80, 0x65, 0x92, 0x6c, 0xeb, 0x3b, 0x6e, 0x97, 0xca, 0x5d, 0xa9, 0x4b, 0xae, 0xe5, 0xcd, 0x1c, - 0xf6, 0x74, 0xd8, 0xfe, 0x52, 0x71, 0xc7, 0x87, 0x70, 0x5c, 0x90, 0x82, 0x5e, 0x82, 0xba, 0xe9, - 0x06, 0x0e, 0x17, 0x0b, 0x55, 0x4d, 0x5b, 0x65, 0x2b, 0x04, 0xe2, 0x08, 0x87, 0xae, 0x43, 0x93, - 0x74, 0xfb, 0x96, 0xb3, 0x69, 0x9a, 0x94, 0xb1, 0xb5, 0x86, 0x58, 0xe5, 0x62, 0x4b, 0x6f, 0xa6, - 0x60, 0x9c, 0xa5, 0xd1, 0xfe, 0xa3, 0xc4, 0x37, 0x62, 0xc9, 0x2d, 0x83, 0xae, 0x86, 0x97, 0x91, - 0x40, 0xc9, 0xc4, 0x64, 0x8e, 0x1b, 0x01, 0xc6, 0x31, 0x1e, 0x7d, 0x03, 0x1a, 0x5d, 0xdf, 0x1a, - 0x50, 0x5f, 0x66, 0x25, 0xa9, 0xff, 0x6d, 0x01, 0xc5, 0x12, 0x1b, 0x26, 0xda, 0x8b, 0x6f, 0x8d, - 0x4c, 0xa2, 0xf7, 0x5c, 0xd7, 0xc6, 0x02, 0x23, 0x24, 0x09, 0xab, 0x64, 0xf8, 0x52, 0x49, 0x91, - 0xad, 0x12, 0x5b, 0xf4, 0xb8, 0x5e, 0xc1, 0xe3, 0x0f, 0x60, 0xb9, 0x70, 0xd3, 0xdf, 0x02, 0xd5, - 0xa4, 0xb6, 0x6c, 0xba, 0xce, 0xd9, 0xc5, 0x30, 0xf6, 0x46, 0x60, 0xcc, 0x8d, 0x86, 0x6d, 0x75, - 0x6b, 0xe7, 0x36, 0x0e, 0x85, 0x68, 0xbf, 0x51, 0xe0, 0x52, 0x69, 0x63, 0x66, 0x02, 0xa4, 0x9c, - 0x19, 0x20, 0x02, 0xe0, 0x11, 0x9f, 0xf4, 0x29, 0xa7, 0x3e, 0x9b, 0xb0, 0xac, 0xf2, 0x33, 0x5a, - 0xbe, 0x78, 0xeb, 0x98, 0xfc, 0x74, 0xe7, 0x63, 0x4e, 0x9d, 0xf0, 0xae, 0x4a, 0xf7, 0xe0, 0x5e, - 0x22, 0x08, 0x67, 0x84, 0x6a, 0xbf, 0xae, 0xc1, 0x12, 0x96, 0xee, 0x45, 0x97, 0xd7, 0xff, 0x7e, - 0xfb, 0xde, 0xcf, 0x6d, 0xdf, 0x67, 0x44, 0x3a, 0x67, 0x5c, 0xd9, 0xfe, 0x45, 0x0f, 0xc3, 0x9b, - 0x94, 0xf0, 0x80, 0x55, 0x7b, 0x8f, 0xc8, 0x0b, 0x15, 0x8c, 0x69, 0x12, 0xa2, 0x67, 0x2c, 0x05, - 0x6a, 0x23, 0x05, 0x5a, 0x39, 0xfa, 0x70, 0x70, 0x06, 0x7d, 0xea, 0x63, 0x7a, 0x48, 0x7d, 0xea, - 0x98, 0x14, 0x5d, 0x83, 0x79, 0xe2, 0x59, 0x37, 0x7d, 0x37, 0xf0, 0x64, 0x46, 0x93, 0xcd, 0xb8, - 0xb9, 0xb7, 0x2b, 0xe0, 0x38, 0xa1, 0x08, 0xa9, 0x63, 0x8b, 0x64, 0xe9, 0x67, 0xae, 0xd5, 0x08, - 0x8e, 0x13, 0x8a, 0x64, 0x1a, 0xce, 0x96, 0x4e, 0x43, 0x03, 0xd4, 0xc0, 0xea, 0xca, 0x13, 0xfb, - 0x35, 0x49, 0xa0, 0xbe, 0xbf, 0xbb, 0x7d, 0x3a, 0x6c, 0x5f, 0x29, 0xfb, 0x4a, 0xc3, 0x4f, 0x3c, - 0xca, 0xf4, 0xf7, 0x77, 0xb7, 0x71, 0xc8, 0xac, 0xfd, 0x49, 0x81, 0x0b, 0x39, 0x27, 0xcf, 0xe1, - 0x42, 0xd8, 0xcb, 0x5f, 0x08, 0xaf, 0x4c, 0x91, 0xb2, 0x92, 0x1b, 0xc1, 0x2a, 0x38, 0x21, 0x8e, - 0x84, 0xf7, 0x8a, 0xdf, 0x96, 0xae, 0x56, 0x3e, 0xc4, 0xcb, 0x3f, 0x28, 0x69, 0xff, 0x56, 0xe0, - 0xe2, 0x84, 0x2a, 0x42, 0x1f, 0x02, 0xa4, 0x23, 0x7b, 0x42, 0xd0, 0x26, 0x28, 0x1c, 0x7b, 0x6d, - 0x5c, 0x16, 0x5f, 0x7c, 0x52, 0x68, 0x46, 0x22, 0x62, 0xd0, 0xf4, 0x29, 0xa3, 0xfe, 0x80, 0x76, - 0xdf, 0x75, 0x7d, 0x19, 0xba, 0xef, 0x4c, 0x11, 0xba, 0xb1, 0xea, 0x4d, 0x5f, 0x65, 0x70, 0x2a, - 0x18, 0x67, 0xb5, 0x68, 0x7f, 0x57, 0xe0, 0xcb, 0x39, 0x21, 0xef, 0xd1, 0xbe, 0x67, 0x13, 0x4e, - 0xcf, 0x61, 0x58, 0x3c, 0xcc, 0x0d, 0x8b, 0xb7, 0xa6, 0xf0, 0x34, 0x36, 0xb2, 0xf4, 0x68, 0xff, - 0x9b, 0x02, 0x97, 0x26, 0x72, 0x9c, 0x43, 0xf1, 0x7f, 0x2f, 0x5f, 0xfc, 0xaf, 0x7f, 0x0e, 0xbf, - 0xca, 0x0f, 0xe5, 0x4b, 0xa5, 0x71, 0xf8, 0xbf, 0x9c, 0xee, 0xda, 0xef, 0x15, 0x58, 0x8c, 0x29, - 0xc3, 0xeb, 0xa0, 0xc2, 0x89, 0x78, 0x03, 0x40, 0x7e, 0x79, 0x8e, 0x5f, 0x66, 0xd5, 0xd4, 0xee, - 0x9b, 0x09, 0x06, 0x67, 0xa8, 0xd0, 0x2d, 0x40, 0xb1, 0x85, 0xfb, 0xb6, 0x58, 0xda, 0xe1, 0xa5, - 0xa5, 0x0a, 0xde, 0x75, 0xc9, 0x8b, 0xf0, 0x18, 0x05, 0x9e, 0xc0, 0xa5, 0xfd, 0x59, 0x49, 0xf7, - 0xaa, 0x00, 0x3f, 0xaf, 0x91, 0x17, 0xc6, 0x95, 0x46, 0x3e, 0xbb, 0x17, 0x04, 0xe5, 0x73, 0xbb, - 0x17, 0x84, 0x75, 0x25, 0x2d, 0xf1, 0x48, 0x2d, 0x78, 0x21, 0x5a, 0xa1, 0xea, 0x15, 0x76, 0x5b, - 0x9e, 0xa9, 0x51, 0x58, 0x5f, 0xae, 0x66, 0x4e, 0x58, 0xa6, 0x13, 0x4f, 0xda, 0x6b, 0x30, 0xef, - 0xb8, 0x5d, 0x2a, 0x5e, 0x5a, 0x0a, 0xdb, 0xff, 0xae, 0x84, 0xe3, 0x84, 0x62, 0xec, 0x7f, 0x8b, - 0xd9, 0x2f, 0xe6, 0x7f, 0x0b, 0x71, 0xb1, 0xd8, 0x76, 0x48, 0x10, 0x5f, 0xcb, 0xe9, 0xc5, 0x22, - 0xe1, 0x38, 0xa1, 0x40, 0xf7, 0xd2, 0x15, 0xda, 0x10, 0x39, 0xf9, 0x7a, 0x95, 0x15, 0x5a, 0xbe, - 0x3d, 0x0d, 0xe3, 0xf1, 0xd3, 0xd6, 0xcc, 0x93, 0xa7, 0xad, 0x99, 0x4f, 0x9f, 0xb6, 0x66, 0x3e, - 0x19, 0xb5, 0x94, 0xc7, 0xa3, 0x96, 0xf2, 0x64, 0xd4, 0x52, 0x3e, 0x1d, 0xb5, 0x94, 0xcf, 0x46, - 0x2d, 0xe5, 0x97, 0xff, 0x6c, 0xcd, 0x7c, 0xff, 0xc5, 0xb3, 0xfe, 0x9e, 0xfb, 0x6f, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x3c, 0xd4, 0x2c, 0x15, 0xbd, 0x1b, 0x00, 0x00, + 0xdd, 0xb3, 0xe3, 0xcf, 0xdf, 0xfa, 0x2b, 0x2f, 0xa4, 0x38, 0xa6, 0xec, 0x3a, 0x53, 0x04, 0x4e, + 0x9b, 0xee, 0x36, 0x4e, 0xd5, 0x16, 0xc2, 0x01, 0x8f, 0xed, 0x06, 0x47, 0x89, 0xe3, 0x3c, 0xb7, + 0x11, 0x81, 0x12, 0x78, 0x9e, 0x7d, 0xb6, 0x07, 0xcf, 0xce, 0x4c, 0xe7, 0xbd, 0x71, 0xea, 0x0b, + 0xaa, 0xe0, 0x1e, 0xf1, 0x0f, 0x20, 0x0e, 0x48, 0x48, 0x5c, 0x80, 0xff, 0x00, 0x24, 0x90, 0x88, + 0xe0, 0x12, 0x09, 0x0e, 0x3d, 0x2d, 0xcd, 0x22, 0xce, 0xdc, 0x73, 0x42, 0xef, 0xcd, 0x9b, 0xcf, + 0xdd, 0x71, 0xc6, 0x55, 0xb1, 0xd2, 0xdb, 0xce, 0xef, 0xfb, 0xfd, 0xbe, 0xdf, 0x5b, 0xb8, 0x72, + 0xf8, 0x0e, 0x6b, 0xd9, 0x5e, 0x9b, 0xf8, 0x76, 0x3b, 0xa0, 0xcc, 0x0b, 0x03, 0x8b, 0xb6, 0x8f, + 0xae, 0x12, 0xc7, 0x3f, 0x20, 0xd7, 0xda, 0xfb, 0xd4, 0xa5, 0x01, 0xe1, 0xb4, 0xd3, 0xf2, 0x03, + 0x8f, 0x7b, 0xe8, 0xe5, 0x88, 0xba, 0x45, 0x7c, 0xbb, 0x15, 0x53, 0xb7, 0x62, 0xea, 0xc5, 0xd7, + 0xf7, 0x6d, 0x7e, 0x10, 0xee, 0xb6, 0x2c, 0xaf, 0xdb, 0xde, 0xf7, 0xf6, 0xbd, 0xb6, 0x64, 0xda, + 0x0d, 0xf7, 0xe4, 0x97, 0xfc, 0x90, 0xbf, 0x22, 0x61, 0x8b, 0x46, 0x46, 0xb5, 0xe5, 0x05, 0x42, + 0x6d, 0x51, 0xe1, 0xe2, 0x9b, 0x29, 0x4d, 0x97, 0x58, 0x07, 0xb6, 0x4b, 0x83, 0xe3, 0xb6, 0x7f, + 0xb8, 0x9f, 0xb7, 0xf7, 0x34, 0x5c, 0xac, 0xdd, 0xa5, 0x9c, 0x0c, 0xd3, 0xd5, 0x2e, 0xe3, 0x0a, + 0x42, 0x97, 0xdb, 0xdd, 0x41, 0x35, 0x6f, 0x3d, 0x8f, 0x81, 0x59, 0x07, 0xb4, 0x4b, 0x8a, 0x7c, + 0xc6, 0xaf, 0x75, 0xb8, 0xb0, 0xea, 0x38, 0x9e, 0x25, 0x60, 0xeb, 0xf4, 0xc8, 0xb6, 0xe8, 0x0e, + 0x27, 0x3c, 0x64, 0xe8, 0xeb, 0x30, 0xde, 0x09, 0xec, 0x23, 0x1a, 0x2c, 0x68, 0x4b, 0xda, 0xf2, + 0x94, 0x39, 0xfb, 0xb8, 0xd7, 0x1c, 0xe9, 0xf7, 0x9a, 0xe3, 0xeb, 0x12, 0x8a, 0x15, 0x16, 0x2d, + 0xc1, 0xa8, 0xef, 0x79, 0xce, 0x42, 0x4d, 0x52, 0x4d, 0x2b, 0xaa, 0xd1, 0x6d, 0xcf, 0x73, 0xb0, + 0xc4, 0x48, 0x49, 0x52, 0xf2, 0x82, 0x5e, 0x90, 0x24, 0xa1, 0x58, 0x61, 0x91, 0x05, 0x60, 0x79, + 0x6e, 0xc7, 0xe6, 0xb6, 0xe7, 0xb2, 0x85, 0xd1, 0x25, 0x7d, 0xb9, 0xbe, 0xd2, 0x6e, 0xa5, 0x61, + 0x4e, 0x0e, 0xd6, 0xf2, 0x0f, 0xf7, 0x05, 0x80, 0xb5, 0x84, 0xff, 0x5a, 0x47, 0x57, 0x5b, 0x6b, + 0x31, 0x9f, 0x89, 0x94, 0x70, 0x48, 0x40, 0x0c, 0x67, 0xc4, 0xa2, 0x3b, 0x30, 0xda, 0x21, 0x9c, + 0x2c, 0x8c, 0x2d, 0x69, 0xcb, 0xf5, 0x95, 0xd7, 0x4b, 0xc5, 0x2b, 0xbf, 0xb5, 0x30, 0x79, 0xb8, + 0xf1, 0x11, 0xa7, 0x2e, 0x13, 0xc2, 0x93, 0xd3, 0xad, 0x13, 0x4e, 0xb0, 0x14, 0x84, 0x76, 0xa1, + 0xee, 0x52, 0xfe, 0xd0, 0x0b, 0x0e, 0x05, 0x70, 0x61, 0x5c, 0xca, 0xcd, 0x9a, 0x3d, 0x98, 0x9d, + 0xad, 0x2d, 0xc5, 0x20, 0xcf, 0x2d, 0xd8, 0xcc, 0xb9, 0x7e, 0xaf, 0x59, 0xdf, 0x4a, 0xe5, 0xe0, + 0xac, 0x50, 0xe3, 0xef, 0x1a, 0xcc, 0xab, 0x28, 0xd9, 0x9e, 0x8b, 0x29, 0x0b, 0x1d, 0x8e, 0x7e, + 0x04, 0x13, 0x91, 0xe3, 0x98, 0x8c, 0x50, 0x7d, 0xe5, 0xcd, 0x93, 0x95, 0x46, 0xda, 0x8a, 0x62, + 0xcc, 0x39, 0x75, 0xa6, 0x89, 0x08, 0xcf, 0x70, 0x2c, 0x15, 0xdd, 0x83, 0x69, 0xd7, 0xeb, 0xd0, + 0x1d, 0xea, 0x50, 0x8b, 0x7b, 0x81, 0x8c, 0x5e, 0x7d, 0x65, 0x29, 0xab, 0x45, 0xd4, 0x8a, 0xf0, + 0xff, 0x56, 0x86, 0xce, 0x9c, 0xef, 0xf7, 0x9a, 0xd3, 0x59, 0x08, 0xce, 0xc9, 0x31, 0x3e, 0xd5, + 0xa1, 0x6e, 0x12, 0x66, 0x5b, 0x91, 0x46, 0xf4, 0x53, 0x00, 0xc2, 0x79, 0x60, 0xef, 0x86, 0x5c, + 0x9e, 0x45, 0xc4, 0xfd, 0x9b, 0x27, 0x9f, 0x25, 0xc3, 0xde, 0x5a, 0x4d, 0x78, 0x37, 0x5c, 0x1e, + 0x1c, 0x9b, 0xaf, 0xc4, 0x19, 0x90, 0x22, 0x7e, 0xf6, 0xaf, 0xe6, 0xcc, 0xdd, 0x90, 0x38, 0xf6, + 0x9e, 0x4d, 0x3b, 0x5b, 0xa4, 0x4b, 0x71, 0x46, 0x23, 0x3a, 0x82, 0x49, 0x8b, 0xf8, 0xc4, 0xb2, + 0xf9, 0xf1, 0x42, 0x4d, 0x6a, 0x7f, 0xbb, 0xba, 0xf6, 0x35, 0xc5, 0x19, 0xe9, 0xbe, 0xa4, 0x74, + 0x4f, 0xc6, 0xe0, 0x41, 0xcd, 0x89, 0xae, 0x45, 0x07, 0xe6, 0x0a, 0xb6, 0xa3, 0x79, 0xd0, 0x0f, + 0xe9, 0x71, 0x54, 0x71, 0x58, 0xfc, 0x44, 0x6b, 0x30, 0x76, 0x44, 0x9c, 0x90, 0xca, 0xfa, 0xca, + 0x27, 0x6c, 0x79, 0x8c, 0x63, 0xa9, 0x38, 0xe2, 0xfd, 0x56, 0xed, 0x1d, 0x6d, 0xf1, 0x10, 0x66, + 0x72, 0xb6, 0x0e, 0xd1, 0xb5, 0x9e, 0xd7, 0xd5, 0x3a, 0xa9, 0xf6, 0x52, 0xe5, 0x77, 0x43, 0xe2, + 0x72, 0x9b, 0x1f, 0x67, 0x94, 0x19, 0x37, 0xe0, 0xdc, 0xda, 0xc6, 0x2d, 0xd5, 0x4f, 0x54, 0xdc, + 0xd1, 0x0a, 0x00, 0xfd, 0xc8, 0x0f, 0x28, 0x13, 0xb5, 0xa4, 0xba, 0x4a, 0x52, 0xae, 0x1b, 0x09, + 0x06, 0x67, 0xa8, 0x8c, 0x23, 0x50, 0x5d, 0x42, 0xf4, 0x19, 0x97, 0x74, 0xa9, 0xe2, 0x4b, 0x2a, + 0x51, 0xfa, 0x54, 0x62, 0xd0, 0x4d, 0x18, 0xdb, 0x15, 0x91, 0x51, 0xe6, 0x5f, 0xae, 0x1c, 0x44, + 0x73, 0xaa, 0xdf, 0x6b, 0x8e, 0x49, 0x00, 0x8e, 0x44, 0x18, 0x8f, 0x6a, 0xf0, 0xd5, 0x62, 0xc1, + 0xac, 0x79, 0xee, 0x9e, 0xbd, 0x1f, 0x06, 0xf2, 0x03, 0x7d, 0x07, 0xc6, 0x23, 0x91, 0xca, 0xa2, + 0xe5, 0xb8, 0xab, 0xed, 0x48, 0xe8, 0xb3, 0x5e, 0xf3, 0xa5, 0x22, 0x6b, 0x84, 0xc1, 0x8a, 0x0f, + 0x2d, 0xc3, 0x64, 0x40, 0x3f, 0x0c, 0x29, 0xe3, 0x4c, 0xe6, 0xdd, 0x94, 0x39, 0x2d, 0x52, 0x07, + 0x2b, 0x18, 0x4e, 0xb0, 0xe8, 0x63, 0x0d, 0xce, 0x47, 0x55, 0x99, 0xb3, 0x41, 0x55, 0xe4, 0xd5, + 0x2a, 0x39, 0x91, 0x63, 0x34, 0xbf, 0xa2, 0x8c, 0x3d, 0x3f, 0x04, 0x89, 0x87, 0xa9, 0x32, 0xfe, + 0xa3, 0xc1, 0x4b, 0xc3, 0x3b, 0x08, 0xda, 0x83, 0x89, 0x40, 0xfe, 0x8a, 0x8b, 0xf7, 0x7a, 0x15, + 0x83, 0xd4, 0x31, 0xcb, 0xfb, 0x51, 0xf4, 0xcd, 0x70, 0x2c, 0x1c, 0x59, 0x30, 0x6e, 0x49, 0x9b, + 0x54, 0x95, 0x5e, 0x3f, 0x5d, 0xbf, 0xcb, 0x7b, 0x20, 0x19, 0x42, 0x11, 0x18, 0x2b, 0xd1, 0xc6, + 0x6f, 0x35, 0x98, 0x2b, 0x54, 0x11, 0x6a, 0x80, 0x6e, 0xbb, 0x5c, 0xa6, 0x95, 0x1e, 0xc5, 0x68, + 0xd3, 0xe5, 0xf7, 0x44, 0xb2, 0x63, 0x81, 0x40, 0x97, 0x60, 0x74, 0x57, 0x8c, 0x40, 0x11, 0x8e, + 0x49, 0x73, 0xa6, 0xdf, 0x6b, 0x4e, 0x99, 0x9e, 0xe7, 0x44, 0x14, 0x12, 0x85, 0xbe, 0x01, 0xe3, + 0x8c, 0x07, 0xb6, 0xbb, 0xbf, 0x30, 0x2a, 0xb3, 0x45, 0xf6, 0xfb, 0x1d, 0x09, 0x89, 0xc8, 0x14, + 0x1a, 0xbd, 0x0a, 0x13, 0x47, 0x34, 0x90, 0x15, 0x32, 0x26, 0x29, 0x65, 0x37, 0xbd, 0x17, 0x81, + 0x22, 0xd2, 0x98, 0xc0, 0xf8, 0x7d, 0x0d, 0xea, 0x2a, 0x80, 0x0e, 0xb1, 0xbb, 0xe8, 0x7e, 0x26, + 0xa1, 0xa2, 0x48, 0xbc, 0x76, 0x8a, 0x48, 0x98, 0xf3, 0x71, 0xf3, 0x1a, 0x92, 0x81, 0x14, 0xea, + 0x96, 0xe7, 0x32, 0x1e, 0x10, 0xdb, 0x55, 0xe9, 0x9a, 0x6f, 0x10, 0x27, 0x25, 0x9e, 0x62, 0x33, + 0xcf, 0x2b, 0x05, 0xf5, 0x14, 0xc6, 0x70, 0x56, 0x2e, 0x7a, 0x90, 0x84, 0x58, 0x97, 0x1a, 0xde, + 0xaa, 0xa4, 0x41, 0x1c, 0xbe, 0x5a, 0x74, 0xff, 0xaa, 0xc1, 0x42, 0x19, 0x53, 0xae, 0x1e, 0xb5, + 0xcf, 0x54, 0x8f, 0xb5, 0xb3, 0xab, 0xc7, 0x3f, 0x69, 0x99, 0xd8, 0x33, 0x86, 0x7e, 0x0c, 0x93, + 0x62, 0x19, 0x92, 0xbb, 0x4d, 0xb4, 0x0e, 0xbc, 0x51, 0x6d, 0x75, 0xba, 0xb3, 0xfb, 0x13, 0x6a, + 0xf1, 0xdb, 0x94, 0x93, 0xb4, 0x19, 0xa7, 0x30, 0x9c, 0x48, 0x15, 0x9b, 0x13, 0xf3, 0xa9, 0x75, + 0x9a, 0x41, 0x24, 0x4d, 0xdb, 0xf1, 0xa9, 0x95, 0xf6, 0x6b, 0xf1, 0x85, 0xa5, 0x20, 0xe3, 0x97, + 0xd9, 0x60, 0x30, 0x96, 0x0f, 0x46, 0x99, 0x8b, 0xb5, 0xb3, 0x73, 0xf1, 0x1f, 0x93, 0x56, 0x20, + 0xed, 0xbb, 0x65, 0x33, 0x8e, 0x3e, 0x18, 0x70, 0x73, 0xab, 0x9a, 0x9b, 0x05, 0xb7, 0x74, 0x72, + 0x52, 0x65, 0x31, 0x24, 0xe3, 0xe2, 0x2d, 0x18, 0xb3, 0x39, 0xed, 0xc6, 0xf5, 0x75, 0xb9, 0xb2, + 0x8f, 0xcd, 0x19, 0x25, 0x75, 0x6c, 0x53, 0xf0, 0xe3, 0x48, 0x8c, 0xf1, 0x24, 0x7f, 0x02, 0xe1, + 0x7b, 0xf4, 0x43, 0x98, 0x62, 0x6a, 0x22, 0xc7, 0x5d, 0xe2, 0x4a, 0x15, 0x3d, 0xc9, 0x7a, 0x77, + 0x4e, 0xa9, 0x9a, 0x8a, 0x21, 0x0c, 0xa7, 0x12, 0x33, 0x15, 0x5c, 0x3b, 0x55, 0x05, 0x17, 0xe2, + 0x5f, 0x5a, 0xc1, 0x01, 0x0c, 0x0b, 0x20, 0xfa, 0x01, 0x8c, 0x7b, 0x3e, 0xf9, 0x30, 0xa4, 0x2a, + 0x2a, 0xcf, 0xd9, 0xe0, 0xee, 0x48, 0xda, 0x61, 0x69, 0x02, 0x42, 0x67, 0x84, 0xc6, 0x4a, 0xa4, + 0xf1, 0x48, 0x83, 0xf9, 0x62, 0x33, 0x3b, 0x45, 0xb7, 0xd8, 0x86, 0xd9, 0x2e, 0xe1, 0xd6, 0x41, + 0x32, 0x50, 0xd4, 0x5d, 0x69, 0xb9, 0xdf, 0x6b, 0xce, 0xde, 0xce, 0x61, 0x9e, 0xf5, 0x9a, 0xe8, + 0xdd, 0xd0, 0x71, 0x8e, 0xf3, 0x3b, 0x63, 0x81, 0xdf, 0xf8, 0xb9, 0x0e, 0x33, 0xb9, 0xde, 0x5d, + 0x61, 0x3b, 0x5a, 0x85, 0xb9, 0x4e, 0xea, 0x6c, 0x81, 0x50, 0x66, 0x7c, 0x59, 0x11, 0x67, 0x33, + 0x45, 0xf2, 0x15, 0xe9, 0xf3, 0xa9, 0xa3, 0x7f, 0xee, 0xa9, 0x73, 0x0f, 0x66, 0x49, 0x32, 0xad, + 0x6f, 0x7b, 0x1d, 0xaa, 0x66, 0x65, 0x4b, 0x71, 0xcd, 0xae, 0xe6, 0xb0, 0xcf, 0x7a, 0xcd, 0x2f, + 0x15, 0x67, 0xbc, 0x80, 0xe3, 0x82, 0x14, 0xf4, 0x0a, 0x8c, 0x59, 0x5e, 0xe8, 0x72, 0x39, 0x50, + 0xf5, 0xb4, 0x54, 0xd6, 0x04, 0x10, 0x47, 0x38, 0x74, 0x15, 0xea, 0xa4, 0xd3, 0xb5, 0xdd, 0x55, + 0xcb, 0xa2, 0x8c, 0xc9, 0x6b, 0xdc, 0x64, 0x34, 0xa5, 0x57, 0x53, 0x30, 0xce, 0xd2, 0x18, 0xff, + 0xd5, 0xe2, 0x1d, 0xb1, 0x64, 0x97, 0x41, 0x97, 0xc5, 0x66, 0x24, 0x51, 0x2a, 0x30, 0x99, 0xe5, + 0x46, 0x82, 0x71, 0x8c, 0xcf, 0x5c, 0xb7, 0x6b, 0x95, 0xae, 0xdb, 0x7a, 0x85, 0xeb, 0xf6, 0xe8, + 0x89, 0xd7, 0xed, 0xc2, 0x89, 0xc7, 0x2a, 0x9c, 0xf8, 0x03, 0x98, 0x2d, 0xec, 0xf4, 0x37, 0x41, + 0xb7, 0xa8, 0xa3, 0x8a, 0xee, 0x39, 0xb7, 0xde, 0x81, 0x1b, 0x81, 0x39, 0xd1, 0xef, 0x35, 0xf5, + 0xb5, 0x8d, 0x5b, 0x58, 0x08, 0x31, 0x7e, 0xa7, 0xc1, 0xb9, 0x81, 0x9b, 0x31, 0xba, 0x0e, 0x33, + 0xb6, 0xcb, 0x69, 0xb0, 0x47, 0x2c, 0xba, 0x95, 0xa6, 0xf8, 0x05, 0x75, 0xaa, 0x99, 0xcd, 0x2c, + 0x12, 0xe7, 0x69, 0xd1, 0x45, 0xd0, 0x6d, 0x3f, 0xde, 0xae, 0xa5, 0xb6, 0xcd, 0x6d, 0x86, 0x05, + 0x4c, 0xd4, 0xc3, 0x01, 0x09, 0x3a, 0x0f, 0x49, 0x40, 0x57, 0x3b, 0x1d, 0x71, 0xdf, 0x50, 0x3e, + 0x4d, 0xea, 0xe1, 0xbb, 0x79, 0x34, 0x2e, 0xd2, 0x1b, 0xbf, 0xd1, 0xe0, 0x62, 0x69, 0x27, 0xa9, + 0xfc, 0x80, 0x42, 0x00, 0x7c, 0x12, 0x90, 0x2e, 0xe5, 0x34, 0x60, 0x43, 0xa6, 0x6b, 0x85, 0x77, + 0x89, 0x64, 0x70, 0x6f, 0x27, 0x82, 0x70, 0x46, 0xa8, 0xf1, 0xab, 0x1a, 0xcc, 0x60, 0x15, 0x8f, + 0x68, 0x55, 0xfc, 0xff, 0xaf, 0x0b, 0x77, 0x73, 0xeb, 0xc2, 0x73, 0x52, 0x23, 0x67, 0x5c, 0xd9, + 0xc2, 0x80, 0xee, 0x8b, 0x25, 0x9a, 0xf0, 0x90, 0x55, 0xbb, 0xf8, 0xe4, 0x85, 0x4a, 0xc6, 0x34, + 0x08, 0xd1, 0x37, 0x56, 0x02, 0x8d, 0xbe, 0x06, 0x8d, 0x1c, 0xbd, 0xe8, 0xf4, 0x61, 0x97, 0x06, + 0x98, 0xee, 0xd1, 0x80, 0xba, 0x16, 0x45, 0x57, 0x60, 0x92, 0xf8, 0xf6, 0x8d, 0xc0, 0x0b, 0x7d, + 0x15, 0xd1, 0x64, 0x94, 0xaf, 0x6e, 0x6f, 0x4a, 0x38, 0x4e, 0x28, 0x04, 0x75, 0x6c, 0x91, 0xca, + 0xab, 0xcc, 0x7a, 0x1d, 0xc1, 0x71, 0x42, 0x91, 0xb4, 0xef, 0xd1, 0xd2, 0xf6, 0x6d, 0x82, 0x1e, + 0xda, 0x1d, 0x75, 0x27, 0x78, 0x43, 0x11, 0xe8, 0xef, 0x6f, 0xae, 0x3f, 0xeb, 0x35, 0x2f, 0x95, + 0x3d, 0xfe, 0xf1, 0x63, 0x9f, 0xb2, 0xd6, 0xfb, 0x9b, 0xeb, 0x58, 0x30, 0x1b, 0x7f, 0xd6, 0xe0, + 0x5c, 0xee, 0x90, 0x67, 0xb0, 0xd2, 0x6c, 0xe7, 0x57, 0x9a, 0xd7, 0x4e, 0x11, 0xb2, 0x92, 0xa5, + 0xc6, 0x2e, 0x1c, 0x42, 0x6e, 0x35, 0xef, 0x15, 0x1f, 0xc3, 0x2e, 0x57, 0xbe, 0x39, 0x94, 0xbf, + 0x80, 0x19, 0x7f, 0xab, 0xc1, 0xf9, 0x21, 0x59, 0x84, 0x1e, 0x00, 0xa4, 0x33, 0x66, 0x88, 0xd3, + 0x86, 0x28, 0x1c, 0xb8, 0xe7, 0xce, 0xca, 0x27, 0xaa, 0x14, 0x9a, 0x91, 0x88, 0x18, 0xd4, 0x03, + 0xca, 0x68, 0x70, 0x44, 0x3b, 0xef, 0x7a, 0x81, 0x72, 0xdd, 0xb7, 0x4f, 0xe1, 0xba, 0x81, 0xec, + 0x4d, 0xef, 0x5e, 0x38, 0x15, 0x8c, 0xb3, 0x5a, 0xd0, 0x83, 0xd4, 0x85, 0xd1, 0xdb, 0xeb, 0xb5, + 0x4a, 0x27, 0xca, 0x3f, 0x1b, 0x9f, 0xe0, 0xcc, 0x7f, 0x6a, 0x70, 0x21, 0x67, 0xe4, 0x7b, 0xb4, + 0xeb, 0x3b, 0x84, 0xd3, 0x33, 0x68, 0x46, 0xf7, 0x73, 0xcd, 0xe8, 0xed, 0x53, 0x78, 0x32, 0x36, + 0xb2, 0xf4, 0x16, 0xf3, 0x0f, 0x0d, 0x2e, 0x0e, 0xe5, 0x38, 0x83, 0xe2, 0xfa, 0x5e, 0xbe, 0xb8, + 0xae, 0x7d, 0x86, 0x73, 0x95, 0xdf, 0x1c, 0x2e, 0x96, 0xfa, 0xe1, 0x0b, 0x39, 0x3d, 0x8c, 0x3f, + 0x68, 0x30, 0x1d, 0x53, 0x8a, 0x75, 0xa9, 0xc2, 0xce, 0xbc, 0x02, 0xa0, 0xfe, 0x30, 0x89, 0x6f, + 0xf7, 0x7a, 0x6a, 0xf7, 0x8d, 0x04, 0x83, 0x33, 0x54, 0xe8, 0x26, 0xa0, 0xd8, 0xc2, 0x1d, 0x47, + 0x2e, 0x05, 0x62, 0xf5, 0xd4, 0x25, 0xef, 0xa2, 0xe2, 0x45, 0x78, 0x80, 0x02, 0x0f, 0xe1, 0x32, + 0xfe, 0xa2, 0xa5, 0x73, 0x5b, 0x82, 0x5f, 0x54, 0xcf, 0x4b, 0xe3, 0x4a, 0x3d, 0x9f, 0x9d, 0x3b, + 0x92, 0xf2, 0x85, 0x9d, 0x3b, 0xd2, 0xba, 0x92, 0x92, 0x78, 0xa4, 0x17, 0x4e, 0x21, 0x4b, 0xa1, + 0xea, 0x96, 0x77, 0x2b, 0xf3, 0x37, 0x59, 0x7d, 0xe5, 0xd5, 0x6a, 0xe6, 0x88, 0x34, 0x1d, 0xba, + 0xe3, 0x5f, 0x81, 0x49, 0xd7, 0xeb, 0x44, 0xfb, 0x70, 0x61, 0xbb, 0xd8, 0x52, 0x70, 0x9c, 0x50, + 0x0c, 0xfc, 0x91, 0x33, 0xfa, 0xf9, 0xfc, 0x91, 0x23, 0x37, 0x22, 0xc7, 0x11, 0x04, 0xf1, 0xf5, + 0x21, 0xdd, 0x88, 0x14, 0x1c, 0x27, 0x14, 0xe8, 0x4e, 0x3a, 0x5f, 0xc6, 0x65, 0x4c, 0xbe, 0x56, + 0x65, 0x44, 0x97, 0x0f, 0x14, 0xd3, 0x7c, 0xfc, 0xb4, 0x31, 0xf2, 0xe4, 0x69, 0x63, 0xe4, 0x93, + 0xa7, 0x8d, 0x91, 0x8f, 0xfb, 0x0d, 0xed, 0x71, 0xbf, 0xa1, 0x3d, 0xe9, 0x37, 0xb4, 0x4f, 0xfa, + 0x0d, 0xed, 0xd3, 0x7e, 0x43, 0xfb, 0xc5, 0xbf, 0x1b, 0x23, 0xdf, 0x7f, 0xf9, 0xa4, 0x7f, 0x95, + 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0xbd, 0x60, 0x85, 0x64, 0x74, 0x1e, 0x00, 0x00, +} + +func (m *AllocatedDeviceStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AllocatedDeviceStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AllocatedDeviceStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.NetworkData != nil { + { + size, err := m.NetworkData.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + { + size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + i -= len(m.Device) + copy(dAtA[i:], m.Device) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Device))) + i-- + dAtA[i] = 0x1a + i -= len(m.Pool) + copy(dAtA[i:], m.Pool) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Pool))) + i-- + dAtA[i] = 0x12 + i -= len(m.Driver) + copy(dAtA[i:], m.Driver) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } func (m *AllocationResult) Marshal() (dAtA []byte, err error) { @@ -1927,6 +2072,48 @@ func (m *DeviceSelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *NetworkDeviceData) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NetworkDeviceData) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NetworkDeviceData) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.HardwareAddress) + copy(dAtA[i:], m.HardwareAddress) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.HardwareAddress))) + i-- + dAtA[i] = 0x1a + if len(m.IPs) > 0 { + for iNdEx := len(m.IPs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.IPs[iNdEx]) + copy(dAtA[i:], m.IPs[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.IPs[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.InterfaceName) + copy(dAtA[i:], m.InterfaceName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.InterfaceName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *OpaqueDeviceConfiguration) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2161,6 +2348,20 @@ func (m *ResourceClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Devices) > 0 { + for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } if len(m.ReservedFor) > 0 { for iNdEx := len(m.ReservedFor) - 1; iNdEx >= 0; iNdEx-- { { @@ -2535,6 +2736,33 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *AllocatedDeviceStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Pool) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Device) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.Data.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.NetworkData != nil { + l = m.NetworkData.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *AllocationResult) Size() (n int) { if m == nil { return 0 @@ -2862,6 +3090,25 @@ func (m *DeviceSelector) Size() (n int) { return n } +func (m *NetworkDeviceData) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.InterfaceName) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.IPs) > 0 { + for _, s := range m.IPs { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.HardwareAddress) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *OpaqueDeviceConfiguration) Size() (n int) { if m == nil { return 0 @@ -2951,6 +3198,12 @@ func (m *ResourceClaimStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if len(m.Devices) > 0 { + for _, e := range m.Devices { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -3072,13 +3325,33 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *AllocatedDeviceStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForConditions := "[]Condition{" + for _, f := range this.Conditions { + repeatedStringForConditions += fmt.Sprintf("%v", f) + "," + } + repeatedStringForConditions += "}" + s := strings.Join([]string{`&AllocatedDeviceStatus{`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Pool:` + fmt.Sprintf("%v", this.Pool) + `,`, + `Device:` + fmt.Sprintf("%v", this.Device) + `,`, + `Conditions:` + repeatedStringForConditions + `,`, + `Data:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Data), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, + `NetworkData:` + strings.Replace(this.NetworkData.String(), "NetworkDeviceData", "NetworkDeviceData", 1) + `,`, + `}`, + }, "") + return s +} func (this *AllocationResult) String() string { if this == nil { return "nil" } s := strings.Join([]string{`&AllocationResult{`, `Devices:` + strings.Replace(strings.Replace(this.Devices.String(), "DeviceAllocationResult", "DeviceAllocationResult", 1), `&`, ``, 1) + `,`, - `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v1.NodeSelector", 1) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v11.NodeSelector", 1) + `,`, `}`, }, "") return s @@ -3224,7 +3497,7 @@ func (this *DeviceClass) String() string { return "nil" } s := strings.Join([]string{`&DeviceClass{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "DeviceClassSpec", "DeviceClassSpec", 1), `&`, ``, 1) + `,`, `}`, }, "") @@ -3250,7 +3523,7 @@ func (this *DeviceClassList) String() string { } repeatedStringForItems += "}" s := strings.Join([]string{`&DeviceClassList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, `Items:` + repeatedStringForItems + `,`, `}`, }, "") @@ -3342,6 +3615,18 @@ func (this *DeviceSelector) String() string { }, "") return s } +func (this *NetworkDeviceData) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NetworkDeviceData{`, + `InterfaceName:` + fmt.Sprintf("%v", this.InterfaceName) + `,`, + `IPs:` + fmt.Sprintf("%v", this.IPs) + `,`, + `HardwareAddress:` + fmt.Sprintf("%v", this.HardwareAddress) + `,`, + `}`, + }, "") + return s +} func (this *OpaqueDeviceConfiguration) String() string { if this == nil { return "nil" @@ -3358,7 +3643,7 @@ func (this *ResourceClaim) String() string { return "nil" } s := strings.Join([]string{`&ResourceClaim{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimSpec", "ResourceClaimSpec", 1), `&`, ``, 1) + `,`, `Status:` + strings.Replace(strings.Replace(this.Status.String(), "ResourceClaimStatus", "ResourceClaimStatus", 1), `&`, ``, 1) + `,`, `}`, @@ -3388,7 +3673,7 @@ func (this *ResourceClaimList) String() string { } repeatedStringForItems += "}" s := strings.Join([]string{`&ResourceClaimList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, `Items:` + repeatedStringForItems + `,`, `}`, }, "") @@ -3413,9 +3698,15 @@ func (this *ResourceClaimStatus) String() string { repeatedStringForReservedFor += strings.Replace(strings.Replace(f.String(), "ResourceClaimConsumerReference", "ResourceClaimConsumerReference", 1), `&`, ``, 1) + "," } repeatedStringForReservedFor += "}" + repeatedStringForDevices := "[]AllocatedDeviceStatus{" + for _, f := range this.Devices { + repeatedStringForDevices += strings.Replace(strings.Replace(f.String(), "AllocatedDeviceStatus", "AllocatedDeviceStatus", 1), `&`, ``, 1) + "," + } + repeatedStringForDevices += "}" s := strings.Join([]string{`&ResourceClaimStatus{`, `Allocation:` + strings.Replace(this.Allocation.String(), "AllocationResult", "AllocationResult", 1) + `,`, `ReservedFor:` + repeatedStringForReservedFor + `,`, + `Devices:` + repeatedStringForDevices + `,`, `}`, }, "") return s @@ -3425,7 +3716,7 @@ func (this *ResourceClaimTemplate) String() string { return "nil" } s := strings.Join([]string{`&ResourceClaimTemplate{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimTemplateSpec", "ResourceClaimTemplateSpec", 1), `&`, ``, 1) + `,`, `}`, }, "") @@ -3441,7 +3732,7 @@ func (this *ResourceClaimTemplateList) String() string { } repeatedStringForItems += "}" s := strings.Join([]string{`&ResourceClaimTemplateList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, `Items:` + repeatedStringForItems + `,`, `}`, }, "") @@ -3452,7 +3743,7 @@ func (this *ResourceClaimTemplateSpec) String() string { return "nil" } s := strings.Join([]string{`&ResourceClaimTemplateSpec{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimSpec", "ResourceClaimSpec", 1), `&`, ``, 1) + `,`, `}`, }, "") @@ -3475,7 +3766,7 @@ func (this *ResourceSlice) String() string { return "nil" } s := strings.Join([]string{`&ResourceSlice{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceSliceSpec", "ResourceSliceSpec", 1), `&`, ``, 1) + `,`, `}`, }, "") @@ -3491,7 +3782,7 @@ func (this *ResourceSliceList) String() string { } repeatedStringForItems += "}" s := strings.Join([]string{`&ResourceSliceList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, `Items:` + repeatedStringForItems + `,`, `}`, }, "") @@ -3510,7 +3801,7 @@ func (this *ResourceSliceSpec) String() string { `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, `Pool:` + strings.Replace(strings.Replace(this.Pool.String(), "ResourcePool", "ResourcePool", 1), `&`, ``, 1) + `,`, `NodeName:` + fmt.Sprintf("%v", this.NodeName) + `,`, - `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v1.NodeSelector", 1) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v11.NodeSelector", 1) + `,`, `AllNodes:` + fmt.Sprintf("%v", this.AllNodes) + `,`, `Devices:` + repeatedStringForDevices + `,`, `}`, @@ -3525,6 +3816,255 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *AllocatedDeviceStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AllocatedDeviceStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AllocatedDeviceStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Driver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pool = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Device", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Device = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, v1.Condition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NetworkData", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NetworkData == nil { + m.NetworkData = &NetworkDeviceData{} + } + if err := m.NetworkData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *AllocationResult) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3617,7 +4157,7 @@ func (m *AllocationResult) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.NodeSelector == nil { - m.NodeSelector = &v1.NodeSelector{} + m.NodeSelector = &v11.NodeSelector{} } if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -5981,6 +6521,152 @@ func (m *DeviceSelector) Unmarshal(dAtA []byte) error { } return nil } +func (m *NetworkDeviceData) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NetworkDeviceData: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NetworkDeviceData: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InterfaceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InterfaceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IPs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IPs = append(m.IPs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HardwareAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.HardwareAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *OpaqueDeviceConfiguration) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -6722,6 +7408,40 @@ func (m *ResourceClaimStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Devices = append(m.Devices, AllocatedDeviceStatus{}) + if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -7601,7 +8321,7 @@ func (m *ResourceSliceSpec) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.NodeSelector == nil { - m.NodeSelector = &v1.NodeSelector{} + m.NodeSelector = &v11.NodeSelector{} } if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/staging/src/k8s.io/api/resource/v1alpha3/generated.proto b/staging/src/k8s.io/api/resource/v1alpha3/generated.proto index 253bf17ba39..26ef30f604d 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/generated.proto +++ b/staging/src/k8s.io/api/resource/v1alpha3/generated.proto @@ -30,6 +30,53 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "k8s.io/api/resource/v1alpha3"; +// AllocatedDeviceStatus contains the status of an allocated device, if the +// driver chooses to report it. This may include driver-specific information. +message AllocatedDeviceStatus { + // Driver specifies the name of the DRA driver whose kubelet + // plugin should be invoked to process the allocation once the claim is + // needed on a node. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + optional string driver = 1; + + // This name together with the driver name and the device name field + // identify which device was allocated (`//`). + // + // Must not be longer than 253 characters and may contain one or more + // DNS sub-domains separated by slashes. + // + // +required + optional string pool = 2; + + // Device references one device instance via its name in the driver's + // resource pool. It must be a DNS label. + // + // +required + optional string device = 3; + + // Conditions contains the latest observation of the device's state. + // If the device has been configured according to the class and claim + // config references, the `Ready` condition should be True. + // + // +optional + // +listType=atomic + repeated .k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 4; + + // Data contains arbitrary driver-specific data. + // + // +optional + optional .k8s.io.apimachinery.pkg.runtime.RawExtension data = 5; + + // NetworkData contains network-related information specific to the device. + // + // +optional + optional NetworkDeviceData networkData = 6; +} + // AllocationResult contains attributes of an allocated resource. message AllocationResult { // Devices is the result of allocating devices. @@ -480,6 +527,33 @@ message DeviceSelector { optional CELDeviceSelector cel = 1; } +// NetworkDeviceData provides network-related details for the allocated device. +// This information may be filled by drivers or other components to configure +// or identify the device within a network context. +message NetworkDeviceData { + // InterfaceName specifies the name of the network interface associated with + // the allocated device. This might be the name of a physical or virtual + // network interface. + // + // +optional + optional string interfaceName = 1; + + // IPs lists the network addresses assigned to the device's network interface. + // This can include both IPv4 and IPv6 addresses. + // The IPs are in the CIDR notation, which includes both the address and the + // associated subnet mask. + // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. + // + // +optional + // +listType=atomic + repeated string ips = 2; + + // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. + // + // +optional + optional string hardwareAddress = 3; +} + // OpaqueDeviceConfiguration contains configuration parameters for a driver // in a format defined by the driver vendor. message OpaqueDeviceConfiguration { @@ -603,6 +677,18 @@ message ResourceClaimStatus { // +patchStrategy=merge // +patchMergeKey=uid repeated ResourceClaimConsumerReference reservedFor = 2; + + // Devices contains the status of each device allocated for this + // claim, as reported by the driver. This can include driver-specific + // information. Entries are owned by their respective drivers. + // + // +optional + // +listType=map + // +listMapKey=driver + // +listMapKey=device + // +listMapKey=pool + // +featureGate=DRAResourceClaimDeviceStatus + repeated AllocatedDeviceStatus devices = 4; } // ResourceClaimTemplate is used to produce ResourceClaim objects. diff --git a/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go b/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go index f9a9614e34e..ac517b69810 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go @@ -27,6 +27,20 @@ package v1alpha3 // Those methods can be generated by using hack/update-codegen.sh // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_AllocatedDeviceStatus = map[string]string{ + "": "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", + "driver": "Driver specifies the name of the DRA driver whose kubelet plugin should be invoked to process the allocation once the claim is needed on a node.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", + "pool": "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", + "device": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", + "conditions": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "data": "Data contains arbitrary driver-specific data.", + "networkData": "NetworkData contains network-related information specific to the device.", +} + +func (AllocatedDeviceStatus) SwaggerDoc() map[string]string { + return map_AllocatedDeviceStatus +} + var map_AllocationResult = map[string]string{ "": "AllocationResult contains attributes of an allocated resource.", "devices": "Devices is the result of allocating devices.", @@ -211,6 +225,17 @@ func (DeviceSelector) SwaggerDoc() map[string]string { return map_DeviceSelector } +var map_NetworkDeviceData = map[string]string{ + "": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", + "interfaceName": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "ips": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "hardwareAddress": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", +} + +func (NetworkDeviceData) SwaggerDoc() map[string]string { + return map_NetworkDeviceData +} + var map_OpaqueDeviceConfiguration = map[string]string{ "": "OpaqueDeviceConfiguration contains configuration parameters for a driver in a format defined by the driver vendor.", "driver": "Driver is used to determine which kubelet plugin needs to be passed these configuration parameters.\n\nAn admission policy provided by the driver developer could use this to decide whether it needs to validate them.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", @@ -267,6 +292,7 @@ var map_ResourceClaimStatus = map[string]string{ "": "ResourceClaimStatus tracks whether the resource has been allocated and what the result of that was.", "allocation": "Allocation is set once the claim has been allocated successfully.", "reservedFor": "ReservedFor indicates which entities are currently allowed to use the claim. A Pod which references a ResourceClaim which is not reserved for that Pod will not be started. A claim that is in use or might be in use because it has been reserved must not get deallocated.\n\nIn a cluster with multiple scheduler instances, two pods might get scheduled concurrently by different schedulers. When they reference the same ResourceClaim which already has reached its maximum number of consumers, only one pod can be scheduled.\n\nBoth schedulers try to add their pod to the claim.status.reservedFor field, but only the update that reaches the API server first gets stored. The other one fails with an error and the scheduler which issued it knows that it must put the pod back into the queue, waiting for the ResourceClaim to become usable again.\n\nThere can be at most 32 such reservations. This may get increased in the future, but not reduced.", + "devices": "Devices contains the status of each device allocated for this claim, as reported by the driver. This can include driver-specific information. Entries are owned by their respective drivers.", } func (ResourceClaimStatus) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/resource/v1alpha3/zz_generated.deepcopy.go b/staging/src/k8s.io/api/resource/v1alpha3/zz_generated.deepcopy.go index 68d24f53c3b..07ba47b59bd 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/zz_generated.deepcopy.go @@ -22,18 +22,48 @@ limitations under the License. package v1alpha3 import ( - v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AllocatedDeviceStatus) DeepCopyInto(out *AllocatedDeviceStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.Data.DeepCopyInto(&out.Data) + if in.NetworkData != nil { + in, out := &in.NetworkData, &out.NetworkData + *out = new(NetworkDeviceData) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AllocatedDeviceStatus. +func (in *AllocatedDeviceStatus) DeepCopy() *AllocatedDeviceStatus { + if in == nil { + return nil + } + out := new(AllocatedDeviceStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AllocationResult) DeepCopyInto(out *AllocationResult) { *out = *in in.Devices.DeepCopyInto(&out.Devices) if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector - *out = new(v1.NodeSelector) + *out = new(corev1.NodeSelector) (*in).DeepCopyInto(*out) } return @@ -487,6 +517,27 @@ func (in *DeviceSelector) DeepCopy() *DeviceSelector { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkDeviceData) DeepCopyInto(out *NetworkDeviceData) { + *out = *in + if in.IPs != nil { + in, out := &in.IPs, &out.IPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkDeviceData. +func (in *NetworkDeviceData) DeepCopy() *NetworkDeviceData { + if in == nil { + return nil + } + out := new(NetworkDeviceData) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *OpaqueDeviceConfiguration) DeepCopyInto(out *OpaqueDeviceConfiguration) { *out = *in @@ -611,6 +662,13 @@ func (in *ResourceClaimStatus) DeepCopyInto(out *ResourceClaimStatus) { *out = make([]ResourceClaimConsumerReference, len(*in)) copy(*out, *in) } + if in.Devices != nil { + in, out := &in.Devices, &out.Devices + *out = make([]AllocatedDeviceStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -784,7 +842,7 @@ func (in *ResourceSliceSpec) DeepCopyInto(out *ResourceSliceSpec) { out.Pool = in.Pool if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector - *out = new(v1.NodeSelector) + *out = new(corev1.NodeSelector) (*in).DeepCopyInto(*out) } if in.Devices != nil { diff --git a/staging/src/k8s.io/api/resource/v1beta1/generated.pb.go b/staging/src/k8s.io/api/resource/v1beta1/generated.pb.go index c2d2e3a5b13..df4e68f306b 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/resource/v1beta1/generated.pb.go @@ -26,7 +26,8 @@ import ( proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" - v1 "k8s.io/api/core/v1" + v11 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" math "math" math_bits "math/bits" @@ -47,10 +48,38 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +func (m *AllocatedDeviceStatus) Reset() { *m = AllocatedDeviceStatus{} } +func (*AllocatedDeviceStatus) ProtoMessage() {} +func (*AllocatedDeviceStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_ba331e3ec6484c27, []int{0} +} +func (m *AllocatedDeviceStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AllocatedDeviceStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *AllocatedDeviceStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_AllocatedDeviceStatus.Merge(m, src) +} +func (m *AllocatedDeviceStatus) XXX_Size() int { + return m.Size() +} +func (m *AllocatedDeviceStatus) XXX_DiscardUnknown() { + xxx_messageInfo_AllocatedDeviceStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_AllocatedDeviceStatus proto.InternalMessageInfo + func (m *AllocationResult) Reset() { *m = AllocationResult{} } func (*AllocationResult) ProtoMessage() {} func (*AllocationResult) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{0} + return fileDescriptor_ba331e3ec6484c27, []int{1} } func (m *AllocationResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -78,7 +107,7 @@ var xxx_messageInfo_AllocationResult proto.InternalMessageInfo func (m *BasicDevice) Reset() { *m = BasicDevice{} } func (*BasicDevice) ProtoMessage() {} func (*BasicDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{1} + return fileDescriptor_ba331e3ec6484c27, []int{2} } func (m *BasicDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -106,7 +135,7 @@ var xxx_messageInfo_BasicDevice proto.InternalMessageInfo func (m *CELDeviceSelector) Reset() { *m = CELDeviceSelector{} } func (*CELDeviceSelector) ProtoMessage() {} func (*CELDeviceSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{2} + return fileDescriptor_ba331e3ec6484c27, []int{3} } func (m *CELDeviceSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -134,7 +163,7 @@ var xxx_messageInfo_CELDeviceSelector proto.InternalMessageInfo func (m *Device) Reset() { *m = Device{} } func (*Device) ProtoMessage() {} func (*Device) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{3} + return fileDescriptor_ba331e3ec6484c27, []int{4} } func (m *Device) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -162,7 +191,7 @@ var xxx_messageInfo_Device proto.InternalMessageInfo func (m *DeviceAllocationConfiguration) Reset() { *m = DeviceAllocationConfiguration{} } func (*DeviceAllocationConfiguration) ProtoMessage() {} func (*DeviceAllocationConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{4} + return fileDescriptor_ba331e3ec6484c27, []int{5} } func (m *DeviceAllocationConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -190,7 +219,7 @@ var xxx_messageInfo_DeviceAllocationConfiguration proto.InternalMessageInfo func (m *DeviceAllocationResult) Reset() { *m = DeviceAllocationResult{} } func (*DeviceAllocationResult) ProtoMessage() {} func (*DeviceAllocationResult) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{5} + return fileDescriptor_ba331e3ec6484c27, []int{6} } func (m *DeviceAllocationResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -218,7 +247,7 @@ var xxx_messageInfo_DeviceAllocationResult proto.InternalMessageInfo func (m *DeviceAttribute) Reset() { *m = DeviceAttribute{} } func (*DeviceAttribute) ProtoMessage() {} func (*DeviceAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{6} + return fileDescriptor_ba331e3ec6484c27, []int{7} } func (m *DeviceAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -246,7 +275,7 @@ var xxx_messageInfo_DeviceAttribute proto.InternalMessageInfo func (m *DeviceCapacity) Reset() { *m = DeviceCapacity{} } func (*DeviceCapacity) ProtoMessage() {} func (*DeviceCapacity) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{7} + return fileDescriptor_ba331e3ec6484c27, []int{8} } func (m *DeviceCapacity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -274,7 +303,7 @@ var xxx_messageInfo_DeviceCapacity proto.InternalMessageInfo func (m *DeviceClaim) Reset() { *m = DeviceClaim{} } func (*DeviceClaim) ProtoMessage() {} func (*DeviceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{8} + return fileDescriptor_ba331e3ec6484c27, []int{9} } func (m *DeviceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -302,7 +331,7 @@ var xxx_messageInfo_DeviceClaim proto.InternalMessageInfo func (m *DeviceClaimConfiguration) Reset() { *m = DeviceClaimConfiguration{} } func (*DeviceClaimConfiguration) ProtoMessage() {} func (*DeviceClaimConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{9} + return fileDescriptor_ba331e3ec6484c27, []int{10} } func (m *DeviceClaimConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -330,7 +359,7 @@ var xxx_messageInfo_DeviceClaimConfiguration proto.InternalMessageInfo func (m *DeviceClass) Reset() { *m = DeviceClass{} } func (*DeviceClass) ProtoMessage() {} func (*DeviceClass) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{10} + return fileDescriptor_ba331e3ec6484c27, []int{11} } func (m *DeviceClass) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -358,7 +387,7 @@ var xxx_messageInfo_DeviceClass proto.InternalMessageInfo func (m *DeviceClassConfiguration) Reset() { *m = DeviceClassConfiguration{} } func (*DeviceClassConfiguration) ProtoMessage() {} func (*DeviceClassConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{11} + return fileDescriptor_ba331e3ec6484c27, []int{12} } func (m *DeviceClassConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -386,7 +415,7 @@ var xxx_messageInfo_DeviceClassConfiguration proto.InternalMessageInfo func (m *DeviceClassList) Reset() { *m = DeviceClassList{} } func (*DeviceClassList) ProtoMessage() {} func (*DeviceClassList) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{12} + return fileDescriptor_ba331e3ec6484c27, []int{13} } func (m *DeviceClassList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -414,7 +443,7 @@ var xxx_messageInfo_DeviceClassList proto.InternalMessageInfo func (m *DeviceClassSpec) Reset() { *m = DeviceClassSpec{} } func (*DeviceClassSpec) ProtoMessage() {} func (*DeviceClassSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{13} + return fileDescriptor_ba331e3ec6484c27, []int{14} } func (m *DeviceClassSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -442,7 +471,7 @@ var xxx_messageInfo_DeviceClassSpec proto.InternalMessageInfo func (m *DeviceConfiguration) Reset() { *m = DeviceConfiguration{} } func (*DeviceConfiguration) ProtoMessage() {} func (*DeviceConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{14} + return fileDescriptor_ba331e3ec6484c27, []int{15} } func (m *DeviceConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -470,7 +499,7 @@ var xxx_messageInfo_DeviceConfiguration proto.InternalMessageInfo func (m *DeviceConstraint) Reset() { *m = DeviceConstraint{} } func (*DeviceConstraint) ProtoMessage() {} func (*DeviceConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{15} + return fileDescriptor_ba331e3ec6484c27, []int{16} } func (m *DeviceConstraint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -498,7 +527,7 @@ var xxx_messageInfo_DeviceConstraint proto.InternalMessageInfo func (m *DeviceRequest) Reset() { *m = DeviceRequest{} } func (*DeviceRequest) ProtoMessage() {} func (*DeviceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{16} + return fileDescriptor_ba331e3ec6484c27, []int{17} } func (m *DeviceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -526,7 +555,7 @@ var xxx_messageInfo_DeviceRequest proto.InternalMessageInfo func (m *DeviceRequestAllocationResult) Reset() { *m = DeviceRequestAllocationResult{} } func (*DeviceRequestAllocationResult) ProtoMessage() {} func (*DeviceRequestAllocationResult) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{17} + return fileDescriptor_ba331e3ec6484c27, []int{18} } func (m *DeviceRequestAllocationResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -554,7 +583,7 @@ var xxx_messageInfo_DeviceRequestAllocationResult proto.InternalMessageInfo func (m *DeviceSelector) Reset() { *m = DeviceSelector{} } func (*DeviceSelector) ProtoMessage() {} func (*DeviceSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{18} + return fileDescriptor_ba331e3ec6484c27, []int{19} } func (m *DeviceSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -579,10 +608,38 @@ func (m *DeviceSelector) XXX_DiscardUnknown() { var xxx_messageInfo_DeviceSelector proto.InternalMessageInfo +func (m *NetworkDeviceData) Reset() { *m = NetworkDeviceData{} } +func (*NetworkDeviceData) ProtoMessage() {} +func (*NetworkDeviceData) Descriptor() ([]byte, []int) { + return fileDescriptor_ba331e3ec6484c27, []int{20} +} +func (m *NetworkDeviceData) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NetworkDeviceData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *NetworkDeviceData) XXX_Merge(src proto.Message) { + xxx_messageInfo_NetworkDeviceData.Merge(m, src) +} +func (m *NetworkDeviceData) XXX_Size() int { + return m.Size() +} +func (m *NetworkDeviceData) XXX_DiscardUnknown() { + xxx_messageInfo_NetworkDeviceData.DiscardUnknown(m) +} + +var xxx_messageInfo_NetworkDeviceData proto.InternalMessageInfo + func (m *OpaqueDeviceConfiguration) Reset() { *m = OpaqueDeviceConfiguration{} } func (*OpaqueDeviceConfiguration) ProtoMessage() {} func (*OpaqueDeviceConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{19} + return fileDescriptor_ba331e3ec6484c27, []int{21} } func (m *OpaqueDeviceConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -610,7 +667,7 @@ var xxx_messageInfo_OpaqueDeviceConfiguration proto.InternalMessageInfo func (m *ResourceClaim) Reset() { *m = ResourceClaim{} } func (*ResourceClaim) ProtoMessage() {} func (*ResourceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{20} + return fileDescriptor_ba331e3ec6484c27, []int{22} } func (m *ResourceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -638,7 +695,7 @@ var xxx_messageInfo_ResourceClaim proto.InternalMessageInfo func (m *ResourceClaimConsumerReference) Reset() { *m = ResourceClaimConsumerReference{} } func (*ResourceClaimConsumerReference) ProtoMessage() {} func (*ResourceClaimConsumerReference) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{21} + return fileDescriptor_ba331e3ec6484c27, []int{23} } func (m *ResourceClaimConsumerReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -666,7 +723,7 @@ var xxx_messageInfo_ResourceClaimConsumerReference proto.InternalMessageInfo func (m *ResourceClaimList) Reset() { *m = ResourceClaimList{} } func (*ResourceClaimList) ProtoMessage() {} func (*ResourceClaimList) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{22} + return fileDescriptor_ba331e3ec6484c27, []int{24} } func (m *ResourceClaimList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -694,7 +751,7 @@ var xxx_messageInfo_ResourceClaimList proto.InternalMessageInfo func (m *ResourceClaimSpec) Reset() { *m = ResourceClaimSpec{} } func (*ResourceClaimSpec) ProtoMessage() {} func (*ResourceClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{23} + return fileDescriptor_ba331e3ec6484c27, []int{25} } func (m *ResourceClaimSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -722,7 +779,7 @@ var xxx_messageInfo_ResourceClaimSpec proto.InternalMessageInfo func (m *ResourceClaimStatus) Reset() { *m = ResourceClaimStatus{} } func (*ResourceClaimStatus) ProtoMessage() {} func (*ResourceClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{24} + return fileDescriptor_ba331e3ec6484c27, []int{26} } func (m *ResourceClaimStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -750,7 +807,7 @@ var xxx_messageInfo_ResourceClaimStatus proto.InternalMessageInfo func (m *ResourceClaimTemplate) Reset() { *m = ResourceClaimTemplate{} } func (*ResourceClaimTemplate) ProtoMessage() {} func (*ResourceClaimTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{25} + return fileDescriptor_ba331e3ec6484c27, []int{27} } func (m *ResourceClaimTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -778,7 +835,7 @@ var xxx_messageInfo_ResourceClaimTemplate proto.InternalMessageInfo func (m *ResourceClaimTemplateList) Reset() { *m = ResourceClaimTemplateList{} } func (*ResourceClaimTemplateList) ProtoMessage() {} func (*ResourceClaimTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{26} + return fileDescriptor_ba331e3ec6484c27, []int{28} } func (m *ResourceClaimTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -806,7 +863,7 @@ var xxx_messageInfo_ResourceClaimTemplateList proto.InternalMessageInfo func (m *ResourceClaimTemplateSpec) Reset() { *m = ResourceClaimTemplateSpec{} } func (*ResourceClaimTemplateSpec) ProtoMessage() {} func (*ResourceClaimTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{27} + return fileDescriptor_ba331e3ec6484c27, []int{29} } func (m *ResourceClaimTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -834,7 +891,7 @@ var xxx_messageInfo_ResourceClaimTemplateSpec proto.InternalMessageInfo func (m *ResourcePool) Reset() { *m = ResourcePool{} } func (*ResourcePool) ProtoMessage() {} func (*ResourcePool) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{28} + return fileDescriptor_ba331e3ec6484c27, []int{30} } func (m *ResourcePool) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -862,7 +919,7 @@ var xxx_messageInfo_ResourcePool proto.InternalMessageInfo func (m *ResourceSlice) Reset() { *m = ResourceSlice{} } func (*ResourceSlice) ProtoMessage() {} func (*ResourceSlice) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{29} + return fileDescriptor_ba331e3ec6484c27, []int{31} } func (m *ResourceSlice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -890,7 +947,7 @@ var xxx_messageInfo_ResourceSlice proto.InternalMessageInfo func (m *ResourceSliceList) Reset() { *m = ResourceSliceList{} } func (*ResourceSliceList) ProtoMessage() {} func (*ResourceSliceList) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{30} + return fileDescriptor_ba331e3ec6484c27, []int{32} } func (m *ResourceSliceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -918,7 +975,7 @@ var xxx_messageInfo_ResourceSliceList proto.InternalMessageInfo func (m *ResourceSliceSpec) Reset() { *m = ResourceSliceSpec{} } func (*ResourceSliceSpec) ProtoMessage() {} func (*ResourceSliceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_ba331e3ec6484c27, []int{31} + return fileDescriptor_ba331e3ec6484c27, []int{33} } func (m *ResourceSliceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -944,6 +1001,7 @@ func (m *ResourceSliceSpec) XXX_DiscardUnknown() { var xxx_messageInfo_ResourceSliceSpec proto.InternalMessageInfo func init() { + proto.RegisterType((*AllocatedDeviceStatus)(nil), "k8s.io.api.resource.v1beta1.AllocatedDeviceStatus") proto.RegisterType((*AllocationResult)(nil), "k8s.io.api.resource.v1beta1.AllocationResult") proto.RegisterType((*BasicDevice)(nil), "k8s.io.api.resource.v1beta1.BasicDevice") proto.RegisterMapType((map[QualifiedName]DeviceAttribute)(nil), "k8s.io.api.resource.v1beta1.BasicDevice.AttributesEntry") @@ -965,6 +1023,7 @@ func init() { proto.RegisterType((*DeviceRequest)(nil), "k8s.io.api.resource.v1beta1.DeviceRequest") proto.RegisterType((*DeviceRequestAllocationResult)(nil), "k8s.io.api.resource.v1beta1.DeviceRequestAllocationResult") proto.RegisterType((*DeviceSelector)(nil), "k8s.io.api.resource.v1beta1.DeviceSelector") + proto.RegisterType((*NetworkDeviceData)(nil), "k8s.io.api.resource.v1beta1.NetworkDeviceData") proto.RegisterType((*OpaqueDeviceConfiguration)(nil), "k8s.io.api.resource.v1beta1.OpaqueDeviceConfiguration") proto.RegisterType((*ResourceClaim)(nil), "k8s.io.api.resource.v1beta1.ResourceClaim") proto.RegisterType((*ResourceClaimConsumerReference)(nil), "k8s.io.api.resource.v1beta1.ResourceClaimConsumerReference") @@ -985,123 +1044,210 @@ func init() { } var fileDescriptor_ba331e3ec6484c27 = []byte{ - // 1855 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x19, 0xcd, 0x6f, 0xdc, 0x58, - 0x3d, 0x1e, 0x67, 0x26, 0xc9, 0x6f, 0xf2, 0xd5, 0x57, 0x58, 0xb2, 0xa9, 0x98, 0x69, 0x5d, 0x09, - 0x66, 0xbb, 0xad, 0xa7, 0x09, 0x50, 0x55, 0xe5, 0xc2, 0x38, 0xc9, 0x56, 0x81, 0x26, 0xcd, 0xbe, - 0xb0, 0xa1, 0x5a, 0x76, 0x11, 0x6f, 0x3c, 0x2f, 0x13, 0x13, 0x8f, 0xed, 0xda, 0xcf, 0x61, 0x73, - 0x40, 0xa0, 0x3d, 0xaf, 0x10, 0x77, 0xc4, 0x15, 0x09, 0x89, 0x03, 0x7f, 0x01, 0x48, 0x20, 0xa4, - 0x8a, 0x03, 0xac, 0xe0, 0xb2, 0xe2, 0x30, 0xd0, 0xd9, 0x0b, 0x37, 0xee, 0x39, 0x21, 0x3f, 0x3f, - 0x7f, 0xce, 0x78, 0x70, 0xd0, 0x12, 0xed, 0xde, 0xc6, 0xbf, 0xef, 0xef, 0xdf, 0xcf, 0x1e, 0x78, - 0xfd, 0xf4, 0xa1, 0xa7, 0x1a, 0x76, 0x9b, 0x38, 0x46, 0xdb, 0xa5, 0x9e, 0xed, 0xbb, 0x3a, 0x6d, - 0x9f, 0x6d, 0x74, 0x29, 0x23, 0x1b, 0xed, 0x3e, 0xb5, 0xa8, 0x4b, 0x18, 0xed, 0xa9, 0x8e, 0x6b, - 0x33, 0x1b, 0xdd, 0x08, 0x89, 0x55, 0xe2, 0x18, 0x6a, 0x44, 0xac, 0x0a, 0xe2, 0xf5, 0x7b, 0x7d, - 0x83, 0x9d, 0xf8, 0x5d, 0x55, 0xb7, 0x07, 0xed, 0xbe, 0xdd, 0xb7, 0xdb, 0x9c, 0xa7, 0xeb, 0x1f, - 0xf3, 0x27, 0xfe, 0xc0, 0x7f, 0x85, 0xb2, 0xd6, 0x95, 0x94, 0x62, 0xdd, 0x76, 0x03, 0xa5, 0x79, - 0x7d, 0xeb, 0x5f, 0x4d, 0x68, 0x06, 0x44, 0x3f, 0x31, 0x2c, 0xea, 0x9e, 0xb7, 0x9d, 0xd3, 0x7e, - 0xd6, 0xda, 0xcb, 0x70, 0x79, 0xed, 0x01, 0x65, 0x64, 0x92, 0xae, 0x76, 0x11, 0x97, 0xeb, 0x5b, - 0xcc, 0x18, 0x8c, 0xab, 0x79, 0xf0, 0xdf, 0x18, 0x3c, 0xfd, 0x84, 0x0e, 0x48, 0x9e, 0x4f, 0xf9, - 0x93, 0x04, 0xab, 0x1d, 0xd3, 0xb4, 0x75, 0xc2, 0x0c, 0xdb, 0xc2, 0xd4, 0xf3, 0x4d, 0x86, 0xbe, - 0x07, 0x73, 0x3d, 0x7a, 0x66, 0xe8, 0xd4, 0x5b, 0x93, 0x6e, 0x4a, 0xad, 0xfa, 0xe6, 0x57, 0xd4, - 0x29, 0xb1, 0x56, 0xb7, 0x39, 0x6d, 0x5e, 0x8a, 0xb6, 0xf2, 0x62, 0xd8, 0x9c, 0x19, 0x0d, 0x9b, - 0x73, 0x21, 0xde, 0xc3, 0x91, 0x50, 0x74, 0x04, 0x8b, 0x96, 0xdd, 0xa3, 0x87, 0xd4, 0xa4, 0x3a, - 0xb3, 0xdd, 0x35, 0x99, 0x2b, 0xb9, 0x99, 0x56, 0x12, 0x24, 0x41, 0x3d, 0xdb, 0x50, 0xf7, 0x53, - 0x74, 0xda, 0xea, 0x68, 0xd8, 0x5c, 0x4c, 0x43, 0x70, 0x46, 0x8e, 0xf2, 0x77, 0x19, 0xea, 0x1a, - 0xf1, 0x0c, 0x3d, 0xd4, 0x88, 0x7e, 0x04, 0x40, 0x18, 0x73, 0x8d, 0xae, 0xcf, 0xb8, 0x2b, 0x72, - 0xab, 0xbe, 0xf9, 0x70, 0xaa, 0x2b, 0x29, 0x6e, 0xb5, 0x13, 0xb3, 0xee, 0x58, 0xcc, 0x3d, 0xd7, - 0x6e, 0x0b, 0x7f, 0x20, 0x41, 0xbc, 0xff, 0x8f, 0xe6, 0xd2, 0x9b, 0x3e, 0x31, 0x8d, 0x63, 0x83, - 0xf6, 0xf6, 0xc9, 0x80, 0xe2, 0x94, 0x42, 0xe4, 0xc3, 0xbc, 0x4e, 0x1c, 0xa2, 0x1b, 0xec, 0x7c, - 0xad, 0xc2, 0x95, 0x3f, 0x28, 0xad, 0x7c, 0x4b, 0x30, 0x86, 0xaa, 0x6f, 0x09, 0xd5, 0xf3, 0x11, - 0x78, 0x5c, 0x71, 0xac, 0x6a, 0xfd, 0x14, 0x56, 0x72, 0xa6, 0xa3, 0x55, 0x90, 0x4f, 0xe9, 0x39, - 0x4f, 0xe6, 0x02, 0x0e, 0x7e, 0x22, 0x0d, 0xaa, 0x67, 0xc4, 0xf4, 0xe9, 0x5a, 0x85, 0xc7, 0xfe, - 0x6e, 0x99, 0x04, 0x47, 0x42, 0x71, 0xc8, 0xfa, 0xa8, 0xf2, 0x50, 0x5a, 0x3f, 0x81, 0xa5, 0x8c, - 0xa9, 0x13, 0x54, 0x75, 0xb2, 0xaa, 0x5e, 0x2f, 0xa1, 0x2a, 0x12, 0x99, 0xd2, 0xa4, 0x3c, 0x86, - 0x6b, 0x5b, 0x3b, 0x4f, 0x42, 0x7c, 0x94, 0x71, 0xb4, 0x09, 0x40, 0xdf, 0x73, 0x5c, 0xea, 0x79, - 0x86, 0x6d, 0x85, 0x4a, 0x35, 0x14, 0xe5, 0x69, 0x27, 0xc6, 0xe0, 0x14, 0x95, 0xe2, 0x43, 0x4d, - 0xd4, 0xc7, 0x4d, 0x98, 0xb5, 0xc8, 0x80, 0x0a, 0xbe, 0x45, 0xc1, 0x37, 0xcb, 0xe3, 0xc9, 0x31, - 0x68, 0x17, 0xaa, 0xdd, 0x20, 0x2b, 0xc2, 0xf6, 0x56, 0xd9, 0xfc, 0x69, 0x0b, 0xa3, 0x61, 0xb3, - 0xca, 0x01, 0x38, 0x94, 0xa0, 0x7c, 0x50, 0x81, 0x2f, 0xe6, 0x3b, 0x65, 0xcb, 0xb6, 0x8e, 0x8d, - 0xbe, 0xef, 0xf2, 0x07, 0xf4, 0x0d, 0xa8, 0x85, 0x12, 0x85, 0x41, 0x2d, 0x61, 0x50, 0xed, 0x90, - 0x43, 0x2f, 0x86, 0xcd, 0x57, 0xf2, 0xac, 0x21, 0x06, 0x0b, 0x3e, 0xd4, 0x82, 0x79, 0x97, 0x3e, - 0xf7, 0xa9, 0xc7, 0x3c, 0x5e, 0x71, 0x0b, 0xda, 0x62, 0x50, 0x35, 0x58, 0xc0, 0x70, 0x8c, 0x45, - 0x3f, 0x86, 0xeb, 0x61, 0x37, 0x66, 0x4c, 0x10, 0x9d, 0x78, 0xbf, 0x4c, 0x8a, 0xd2, 0x7c, 0xda, - 0x0d, 0x61, 0xea, 0xf5, 0x09, 0x48, 0x3c, 0x49, 0x93, 0xf2, 0xb1, 0x04, 0xaf, 0x4c, 0x1e, 0x1c, - 0x88, 0xc2, 0x9c, 0xcb, 0x7f, 0x45, 0x3d, 0xfb, 0xa8, 0x84, 0x3d, 0xc2, 0xc7, 0xe2, 0x29, 0x14, - 0x3e, 0x7b, 0x38, 0x92, 0x8d, 0xba, 0x50, 0xd3, 0xb9, 0x49, 0xa2, 0x39, 0x1f, 0x5d, 0x6a, 0xc8, - 0x65, 0xfd, 0x5f, 0x8e, 0x52, 0x15, 0x82, 0xb1, 0x90, 0xac, 0xfc, 0x4a, 0x82, 0x95, 0x5c, 0xf7, - 0xa0, 0x06, 0xc8, 0x86, 0xc5, 0x78, 0x45, 0xc9, 0x61, 0x7e, 0x76, 0x2d, 0x76, 0x14, 0xd4, 0x39, - 0x0e, 0x10, 0xe8, 0x16, 0xcc, 0x76, 0x6d, 0xdb, 0xe4, 0xb9, 0x98, 0xd7, 0x96, 0x46, 0xc3, 0xe6, - 0x82, 0x66, 0xdb, 0x66, 0x48, 0xc1, 0x51, 0xe8, 0xcb, 0x50, 0xf3, 0x98, 0x6b, 0x58, 0xfd, 0xb5, - 0x59, 0x5e, 0x29, 0x2b, 0xa3, 0x61, 0xb3, 0x7e, 0xc8, 0x21, 0x21, 0x99, 0x40, 0xa3, 0x3b, 0x30, - 0x77, 0x46, 0x5d, 0xde, 0x1c, 0x55, 0x4e, 0xc9, 0x47, 0xe8, 0x51, 0x08, 0x0a, 0x49, 0x23, 0x02, - 0x85, 0xc2, 0x72, 0xb6, 0xfb, 0xd0, 0x61, 0xd4, 0xb9, 0xe1, 0x16, 0x50, 0x53, 0x01, 0x8a, 0x97, - 0x8c, 0xea, 0x9c, 0xf6, 0xb3, 0x11, 0x7b, 0xd3, 0x27, 0x16, 0x33, 0xd8, 0xb9, 0xb6, 0x24, 0x82, - 0x52, 0x0d, 0x15, 0x85, 0xb2, 0x94, 0x5f, 0x57, 0xa0, 0x2e, 0xf4, 0x98, 0xc4, 0x18, 0xa0, 0x67, - 0xa9, 0x9a, 0x0d, 0xd3, 0x7d, 0xa7, 0x7c, 0xba, 0xb5, 0xd5, 0x68, 0x32, 0x4e, 0xa8, 0xf1, 0x1e, - 0xd4, 0x75, 0xdb, 0xf2, 0x98, 0x4b, 0x0c, 0x4b, 0x34, 0x44, 0x7d, 0xf3, 0x5e, 0xb9, 0xda, 0x16, - 0x5c, 0xda, 0x75, 0x21, 0xbf, 0x9e, 0xc0, 0x3c, 0x9c, 0x16, 0x8b, 0xde, 0x8d, 0xcb, 0x48, 0xe6, - 0x0a, 0xbe, 0x56, 0x46, 0x41, 0xe0, 0x79, 0xb9, 0x0a, 0xfa, 0xa3, 0x04, 0x6b, 0x45, 0x4c, 0x99, - 0x7e, 0x97, 0xfe, 0x97, 0x7e, 0xaf, 0x5c, 0x59, 0xbf, 0xff, 0x4e, 0x4a, 0xa5, 0xdd, 0xf3, 0xd0, - 0xf7, 0x61, 0x3e, 0x38, 0x7e, 0x7a, 0x84, 0x11, 0x51, 0x5e, 0xf7, 0xa7, 0x95, 0x97, 0xa7, 0x06, - 0xd4, 0xc1, 0x45, 0xf0, 0xb4, 0xfb, 0x03, 0xaa, 0xb3, 0x3d, 0xca, 0x48, 0x32, 0xe9, 0x13, 0x18, - 0x8e, 0xa5, 0xa2, 0x7d, 0x98, 0xf5, 0x1c, 0xaa, 0x5f, 0x62, 0xc3, 0x71, 0xcb, 0x0e, 0x1d, 0xaa, - 0x27, 0xbb, 0x20, 0x78, 0xc2, 0x5c, 0x8e, 0xf2, 0xf3, 0x74, 0x26, 0x3c, 0x2f, 0x9b, 0x89, 0x82, - 0xf8, 0x4a, 0x57, 0x16, 0xdf, 0xdf, 0xc6, 0x93, 0x86, 0x5b, 0xf7, 0xc4, 0xf0, 0x18, 0x7a, 0x67, - 0x2c, 0xc6, 0x6a, 0xb9, 0x18, 0x07, 0xdc, 0x3c, 0xc2, 0x71, 0x7b, 0x45, 0x90, 0x54, 0x7c, 0xf7, - 0xa0, 0x6a, 0x30, 0x3a, 0x88, 0x1a, 0xab, 0x55, 0x36, 0xc0, 0xc9, 0x5c, 0xd8, 0x0d, 0xd8, 0x71, - 0x28, 0x45, 0xf9, 0x73, 0xd6, 0x81, 0x20, 0xf0, 0xe8, 0x1d, 0x58, 0xf0, 0xc4, 0xaa, 0x8f, 0x86, - 0x43, 0x99, 0xf3, 0x21, 0x3e, 0x18, 0xaf, 0x09, 0x4d, 0x0b, 0x11, 0xc4, 0xc3, 0x89, 0xc0, 0x54, - 0xe7, 0x56, 0x2e, 0xd3, 0xb9, 0xb9, 0xd4, 0x17, 0x76, 0xee, 0x73, 0x98, 0x94, 0x3d, 0xf4, 0x36, - 0xd4, 0x6c, 0x87, 0x3c, 0x8f, 0xa7, 0xea, 0xf4, 0x9b, 0xf0, 0x29, 0x27, 0x9d, 0x54, 0x22, 0x10, - 0xa8, 0x0c, 0xd1, 0x58, 0x48, 0x54, 0x7e, 0x2a, 0xc1, 0x6a, 0x7e, 0x84, 0x5d, 0x62, 0x48, 0x1c, - 0xc0, 0xf2, 0x80, 0x30, 0xfd, 0x24, 0xde, 0x55, 0xbc, 0x77, 0x16, 0xb4, 0xd6, 0x68, 0xd8, 0x5c, - 0xde, 0xcb, 0x60, 0x2e, 0x86, 0x4d, 0xf4, 0x86, 0x6f, 0x9a, 0xe7, 0xd9, 0x2b, 0x34, 0xc7, 0xaf, - 0xbc, 0x2f, 0xc3, 0x52, 0x66, 0x60, 0x97, 0xb8, 0xb9, 0x3a, 0xb0, 0xd2, 0x4b, 0x62, 0x1d, 0x20, - 0x84, 0x19, 0x5f, 0x10, 0xc4, 0xe9, 0x32, 0xe1, 0x7c, 0x79, 0xfa, 0x6c, 0xdd, 0xc8, 0x9f, 0x74, - 0xdd, 0x1c, 0xc1, 0x32, 0x89, 0xef, 0x80, 0x3d, 0xbb, 0x47, 0xc5, 0x16, 0x56, 0x05, 0xd7, 0x72, - 0x27, 0x83, 0xbd, 0x18, 0x36, 0x3f, 0x97, 0xbf, 0x1e, 0x02, 0x38, 0xce, 0x49, 0x41, 0xb7, 0xa1, - 0xaa, 0xdb, 0xbe, 0xc5, 0xf8, 0xaa, 0x96, 0x93, 0x36, 0xd9, 0x0a, 0x80, 0x38, 0xc4, 0xa1, 0x0d, - 0xa8, 0x93, 0xde, 0xc0, 0xb0, 0x3a, 0xba, 0x4e, 0x3d, 0x6f, 0xad, 0xc6, 0x8f, 0x04, 0xbe, 0xff, - 0x3b, 0x09, 0x18, 0xa7, 0x69, 0x94, 0x7f, 0x4b, 0xd1, 0xe5, 0x59, 0x70, 0x24, 0xa1, 0xd7, 0x82, - 0x8b, 0x8b, 0xa3, 0x44, 0x5e, 0x52, 0x57, 0x13, 0x07, 0xe3, 0x08, 0x8f, 0xbe, 0x04, 0xb5, 0x9e, - 0x6b, 0x9c, 0x51, 0x57, 0x24, 0x25, 0xae, 0xfe, 0x6d, 0x0e, 0xc5, 0x02, 0x1b, 0xe4, 0xd9, 0x89, - 0xae, 0x98, 0x54, 0x9e, 0x0f, 0x6c, 0xdb, 0xc4, 0x1c, 0xc3, 0x25, 0x71, 0xab, 0x44, 0xf8, 0x12, - 0x49, 0xa1, 0xad, 0x02, 0x9b, 0xf7, 0xb8, 0x5a, 0xc2, 0xe3, 0xef, 0x46, 0xa7, 0x4c, 0xfc, 0xa2, - 0xb0, 0x0b, 0xb2, 0x4e, 0xcd, 0x09, 0x53, 0x70, 0xbc, 0x16, 0xc6, 0xde, 0x32, 0xb4, 0xb9, 0xd1, - 0xb0, 0x29, 0x6f, 0xed, 0x3c, 0xc1, 0x81, 0x0c, 0xe5, 0x97, 0x12, 0xbc, 0x5a, 0xd8, 0x96, 0xa9, - 0xf8, 0x48, 0x53, 0xe3, 0x43, 0x00, 0x1c, 0xe2, 0x92, 0x01, 0x65, 0xd4, 0xf5, 0xc4, 0x8e, 0xba, - 0x57, 0x38, 0x9d, 0xc5, 0x5b, 0xbc, 0x8a, 0xc9, 0x0f, 0x77, 0xde, 0x63, 0xd4, 0x0a, 0x0e, 0xb6, - 0x64, 0xfd, 0x1d, 0xc4, 0x82, 0x70, 0x4a, 0xa8, 0xf2, 0x8b, 0x0a, 0x2c, 0x61, 0xe1, 0x5d, 0x78, - 0x6b, 0xfd, 0xff, 0x97, 0xee, 0x41, 0x66, 0xe9, 0x4e, 0x0f, 0x74, 0xc6, 0xb6, 0xa2, 0xb5, 0x8b, - 0x9e, 0x05, 0xb7, 0x2e, 0x61, 0xbe, 0x57, 0xea, 0xe5, 0x24, 0x2b, 0x93, 0xf3, 0x25, 0x29, 0x08, - 0x9f, 0xb1, 0x90, 0xa7, 0x8c, 0x24, 0x68, 0x64, 0xe8, 0x83, 0xa1, 0xe9, 0x0f, 0xa8, 0x8b, 0xe9, - 0x31, 0x75, 0xa9, 0xa5, 0x53, 0x74, 0x17, 0xe6, 0x89, 0x63, 0x3c, 0x76, 0x6d, 0xdf, 0x11, 0xf9, - 0x8c, 0x37, 0x62, 0xe7, 0x60, 0x97, 0xc3, 0x71, 0x4c, 0x11, 0x50, 0x47, 0x06, 0x89, 0xba, 0x4f, - 0x9d, 0xa7, 0x21, 0x1c, 0xc7, 0x14, 0xf1, 0x24, 0x9c, 0x2d, 0x9c, 0x84, 0x1a, 0xc8, 0xbe, 0xd1, - 0x13, 0x97, 0xfb, 0x7d, 0x41, 0x20, 0xbf, 0xb5, 0xbb, 0x7d, 0x31, 0x6c, 0xde, 0x2a, 0xfa, 0xe0, - 0xc3, 0xce, 0x1d, 0xea, 0xa9, 0x6f, 0xed, 0x6e, 0xe3, 0x80, 0x59, 0xf9, 0xbd, 0x04, 0xd7, 0x32, - 0x4e, 0x5e, 0xc1, 0x65, 0xf0, 0x34, 0x7b, 0x19, 0xdc, 0x29, 0x9f, 0xb1, 0x82, 0xdb, 0xe0, 0x24, - 0xe7, 0x03, 0x3f, 0x0e, 0x0e, 0xf3, 0x5f, 0xa9, 0x5a, 0x65, 0x2f, 0xef, 0xe2, 0x4f, 0x53, 0xca, - 0xbf, 0x24, 0xb8, 0x3e, 0xa1, 0x86, 0xd0, 0xbb, 0x00, 0xc9, 0xb4, 0x16, 0xfa, 0xa6, 0xbf, 0x4a, - 0x8c, 0xbd, 0x89, 0x2e, 0xf3, 0x6f, 0x47, 0x09, 0x34, 0x25, 0x10, 0xb9, 0x50, 0x77, 0xa9, 0x47, - 0xdd, 0x33, 0xda, 0x7b, 0xc3, 0x76, 0x45, 0xdc, 0xbe, 0x5e, 0x3e, 0x6e, 0x63, 0x95, 0x9b, 0xbc, - 0xb8, 0xe0, 0x44, 0x2e, 0x4e, 0x2b, 0x51, 0xfe, 0x26, 0xc1, 0xe7, 0x33, 0x42, 0xbe, 0x4d, 0x07, - 0x8e, 0x49, 0x18, 0xbd, 0x82, 0x31, 0xf1, 0x2c, 0x33, 0x26, 0x1e, 0x94, 0x77, 0x34, 0xb2, 0xb1, - 0xf0, 0x4a, 0xff, 0xab, 0x04, 0xaf, 0x4e, 0xe4, 0xb8, 0x82, 0xba, 0xff, 0x4e, 0xb6, 0xee, 0x37, - 0x2f, 0xef, 0x56, 0x41, 0xfd, 0xff, 0xa5, 0xc8, 0x29, 0xde, 0x08, 0x9f, 0xc1, 0xa9, 0xae, 0xfc, - 0x46, 0x82, 0xc5, 0x88, 0x32, 0xb8, 0x09, 0x4a, 0xdc, 0x85, 0x9b, 0x00, 0xe2, 0xeb, 0x75, 0xf4, - 0xe6, 0x2a, 0x27, 0x66, 0x3f, 0x8e, 0x31, 0x38, 0x45, 0x85, 0xbe, 0x09, 0x28, 0x32, 0xf0, 0xd0, - 0xe4, 0xbb, 0x3a, 0xb8, 0xaf, 0x64, 0xce, 0xbb, 0x2e, 0x78, 0x11, 0x1e, 0xa3, 0xc0, 0x13, 0xb8, - 0x94, 0x3f, 0x48, 0xc9, 0x3a, 0xe5, 0xe0, 0x4f, 0x69, 0xe0, 0xb9, 0x6d, 0x85, 0x81, 0x4f, 0xef, - 0x03, 0x4e, 0xf9, 0x69, 0xdd, 0x07, 0xdc, 0xb8, 0x82, 0x7e, 0xf8, 0x40, 0xce, 0x39, 0xc1, 0xfb, - 0xa0, 0xec, 0xe9, 0xf5, 0x2d, 0x71, 0x9a, 0x86, 0x41, 0x7d, 0xad, 0x94, 0x35, 0x41, 0x8d, 0x4e, - 0xbc, 0x62, 0xef, 0xc2, 0xbc, 0x65, 0xf7, 0x28, 0x7f, 0x4d, 0xc9, 0xed, 0xfc, 0x7d, 0x01, 0xc7, - 0x31, 0xc5, 0xd8, 0x3f, 0x1f, 0xb3, 0x9f, 0xcc, 0x3f, 0x1f, 0xfc, 0x4e, 0x31, 0xcd, 0x80, 0x20, - 0x3a, 0x90, 0x93, 0x3b, 0x45, 0xc0, 0x71, 0x4c, 0x81, 0xf6, 0x93, 0xcd, 0x59, 0xe3, 0x19, 0xb9, - 0x5d, 0x62, 0x73, 0x16, 0x2f, 0x4d, 0xad, 0xf3, 0xe2, 0x65, 0x63, 0xe6, 0xc3, 0x97, 0x8d, 0x99, - 0x8f, 0x5e, 0x36, 0x66, 0x7e, 0x32, 0x6a, 0x48, 0x2f, 0x46, 0x0d, 0xe9, 0xc3, 0x51, 0x43, 0xfa, - 0x68, 0xd4, 0x90, 0xfe, 0x39, 0x6a, 0x48, 0x3f, 0xfb, 0xb8, 0x31, 0xf3, 0xf6, 0x8d, 0x29, 0x7f, - 0xee, 0xfd, 0x27, 0x00, 0x00, 0xff, 0xff, 0x71, 0xc4, 0xd3, 0x93, 0xfa, 0x1b, 0x00, 0x00, + // 2051 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x19, 0x4b, 0x8f, 0x1b, 0x49, + 0x79, 0xda, 0xed, 0x79, 0x7d, 0x9e, 0x57, 0x2a, 0x64, 0x71, 0x26, 0xc2, 0x9e, 0x74, 0x24, 0xf0, + 0x66, 0xb3, 0xed, 0x8d, 0x81, 0x28, 0xca, 0x5e, 0x70, 0xcf, 0xcc, 0x06, 0x43, 0x32, 0x99, 0xad, + 0x61, 0x43, 0xb4, 0x6c, 0x10, 0x35, 0xed, 0x9a, 0x99, 0x66, 0xec, 0x6e, 0xa7, 0xbb, 0x7a, 0xb2, + 0x73, 0x40, 0xa0, 0x3d, 0xaf, 0x10, 0x77, 0xc4, 0x85, 0x03, 0x12, 0x12, 0x42, 0xfc, 0x02, 0x90, + 0x40, 0x88, 0x88, 0x03, 0xac, 0xe0, 0xb2, 0xe2, 0x60, 0x88, 0xf7, 0x07, 0x70, 0xcf, 0x09, 0x55, + 0x75, 0xf5, 0xd3, 0x6e, 0xd3, 0x83, 0x96, 0x51, 0xf6, 0xe6, 0xfe, 0xde, 0xf5, 0xbd, 0xab, 0x0c, + 0xaf, 0x1d, 0xdf, 0xf6, 0x74, 0xcb, 0x69, 0x92, 0x81, 0xd5, 0x74, 0xa9, 0xe7, 0xf8, 0xae, 0x49, + 0x9b, 0x27, 0x37, 0xf7, 0x29, 0x23, 0x37, 0x9b, 0x87, 0xd4, 0xa6, 0x2e, 0x61, 0xb4, 0xab, 0x0f, + 0x5c, 0x87, 0x39, 0xe8, 0x4a, 0x40, 0xac, 0x93, 0x81, 0xa5, 0x87, 0xc4, 0xba, 0x24, 0x5e, 0x7f, + 0xfd, 0xd0, 0x62, 0x47, 0xfe, 0xbe, 0x6e, 0x3a, 0xfd, 0xe6, 0xa1, 0x73, 0xe8, 0x34, 0x05, 0xcf, + 0xbe, 0x7f, 0x20, 0xbe, 0xc4, 0x87, 0xf8, 0x15, 0xc8, 0x5a, 0xd7, 0x12, 0x8a, 0x4d, 0xc7, 0xe5, + 0x4a, 0xb3, 0xfa, 0xd6, 0xbf, 0x12, 0xd3, 0xf4, 0x89, 0x79, 0x64, 0xd9, 0xd4, 0x3d, 0x6d, 0x0e, + 0x8e, 0x0f, 0xd3, 0xd6, 0x9e, 0x85, 0xcb, 0x6b, 0xf6, 0x29, 0x23, 0x93, 0x74, 0x35, 0xf3, 0xb8, + 0x5c, 0xdf, 0x66, 0x56, 0x7f, 0x5c, 0xcd, 0xad, 0xff, 0xc6, 0xe0, 0x99, 0x47, 0xb4, 0x4f, 0xb2, + 0x7c, 0xda, 0xcf, 0x55, 0xb8, 0xd4, 0xee, 0xf5, 0x1c, 0x93, 0xc3, 0xb6, 0xe8, 0x89, 0x65, 0xd2, + 0x3d, 0x46, 0x98, 0xef, 0xa1, 0x2f, 0xc2, 0x5c, 0xd7, 0xb5, 0x4e, 0xa8, 0x5b, 0x55, 0x36, 0x94, + 0xc6, 0xa2, 0xb1, 0xf2, 0x6c, 0x58, 0x9f, 0x19, 0x0d, 0xeb, 0x73, 0x5b, 0x02, 0x8a, 0x25, 0x16, + 0x6d, 0x40, 0x79, 0xe0, 0x38, 0xbd, 0x6a, 0x49, 0x50, 0x2d, 0x49, 0xaa, 0xf2, 0xae, 0xe3, 0xf4, + 0xb0, 0xc0, 0x08, 0x49, 0x42, 0x72, 0x55, 0xcd, 0x48, 0x12, 0x50, 0x2c, 0xb1, 0xc8, 0x04, 0x30, + 0x1d, 0xbb, 0x6b, 0x31, 0xcb, 0xb1, 0xbd, 0x6a, 0x79, 0x43, 0x6d, 0x54, 0x5a, 0x4d, 0x3d, 0x8e, + 0x72, 0x74, 0x30, 0x7d, 0x70, 0x7c, 0xc8, 0x01, 0x9e, 0xce, 0xfd, 0xa7, 0x9f, 0xdc, 0xd4, 0x37, + 0x43, 0x3e, 0x03, 0x49, 0xe1, 0x10, 0x81, 0x3c, 0x9c, 0x10, 0x8b, 0x1e, 0x40, 0xb9, 0x4b, 0x18, + 0xa9, 0xce, 0x6e, 0x28, 0x8d, 0x4a, 0xeb, 0xf5, 0x5c, 0xf1, 0xd2, 0x6f, 0x3a, 0x26, 0x4f, 0xb7, + 0xdf, 0x67, 0xd4, 0xf6, 0xb8, 0xf0, 0xe8, 0x74, 0x5b, 0x84, 0x11, 0x2c, 0x04, 0x21, 0x02, 0x15, + 0x9b, 0xb2, 0xa7, 0x8e, 0x7b, 0xcc, 0x81, 0xd5, 0x39, 0x21, 0x57, 0xd7, 0xa7, 0x24, 0xa7, 0xbe, + 0x23, 0xe9, 0xc5, 0xb1, 0x39, 0x97, 0xb1, 0x3a, 0x1a, 0xd6, 0x2b, 0x3b, 0xb1, 0x18, 0x9c, 0x94, + 0xa9, 0xfd, 0x59, 0x81, 0x35, 0x19, 0x24, 0xcb, 0xb1, 0x31, 0xf5, 0xfc, 0x1e, 0x43, 0xdf, 0x85, + 0xf9, 0xc0, 0x6f, 0x9e, 0x08, 0x50, 0xa5, 0xf5, 0xe5, 0xa9, 0x3a, 0x03, 0x65, 0x59, 0x29, 0xc6, + 0xaa, 0x3c, 0xd1, 0x7c, 0x80, 0xf7, 0x70, 0x28, 0x14, 0x3d, 0x84, 0x25, 0xdb, 0xe9, 0xd2, 0x3d, + 0xda, 0xa3, 0x26, 0x73, 0x5c, 0x11, 0xbb, 0x4a, 0x6b, 0x23, 0xa9, 0x84, 0x57, 0x0a, 0xf7, 0xfe, + 0x4e, 0x82, 0xce, 0x58, 0x1b, 0x0d, 0xeb, 0x4b, 0x49, 0x08, 0x4e, 0xc9, 0xd1, 0xfe, 0xa1, 0x42, + 0xc5, 0x20, 0x9e, 0x65, 0x06, 0x1a, 0xd1, 0x0f, 0x00, 0x08, 0x63, 0xae, 0xb5, 0xef, 0x33, 0x71, + 0x14, 0x1e, 0xf5, 0xdb, 0x53, 0x8f, 0x92, 0xe0, 0xd6, 0xdb, 0x11, 0xeb, 0xb6, 0xcd, 0xdc, 0x53, + 0xe3, 0x5a, 0x18, 0xfe, 0x18, 0xf1, 0xc1, 0x3f, 0xeb, 0xcb, 0x6f, 0xfb, 0xa4, 0x67, 0x1d, 0x58, + 0xb4, 0xbb, 0x43, 0xfa, 0x14, 0x27, 0x14, 0x22, 0x1f, 0x16, 0x4c, 0x32, 0x20, 0xa6, 0xc5, 0x4e, + 0xab, 0x25, 0xa1, 0xfc, 0x56, 0x61, 0xe5, 0x9b, 0x92, 0x31, 0x50, 0x7d, 0x55, 0xaa, 0x5e, 0x08, + 0xc1, 0xe3, 0x8a, 0x23, 0x55, 0xeb, 0xc7, 0xb0, 0x9a, 0x31, 0x1d, 0xad, 0x81, 0x7a, 0x4c, 0x4f, + 0x83, 0x6a, 0xc3, 0xfc, 0x27, 0x32, 0x60, 0xf6, 0x84, 0xf4, 0x7c, 0x2a, 0x6a, 0xab, 0xd2, 0xba, + 0x51, 0x24, 0xc0, 0xa1, 0x50, 0x1c, 0xb0, 0xde, 0x29, 0xdd, 0x56, 0xd6, 0x8f, 0x60, 0x39, 0x65, + 0xea, 0x04, 0x55, 0xed, 0xb4, 0xaa, 0xd7, 0x0a, 0xa8, 0x0a, 0x45, 0x26, 0x34, 0x69, 0x77, 0xe1, + 0xc2, 0xe6, 0xf6, 0x3d, 0xd9, 0x47, 0x64, 0xc4, 0x51, 0x0b, 0x80, 0xbe, 0x3f, 0x70, 0xa9, 0xc7, + 0x6b, 0x48, 0x76, 0x93, 0xa8, 0x4c, 0xb7, 0x23, 0x0c, 0x4e, 0x50, 0x69, 0x3e, 0xc8, 0xee, 0xc0, + 0xfb, 0x8b, 0x4d, 0xfa, 0x54, 0xf2, 0x45, 0x15, 0x28, 0xfc, 0x29, 0x30, 0xa8, 0x03, 0xb3, 0xfb, + 0x3c, 0x2a, 0xd2, 0xf6, 0x46, 0xd1, 0xf8, 0x19, 0x8b, 0xa3, 0x61, 0x7d, 0x56, 0x00, 0x70, 0x20, + 0x41, 0xfb, 0xb0, 0x04, 0x5f, 0xc8, 0x56, 0xca, 0xa6, 0x63, 0x1f, 0x58, 0x87, 0xbe, 0x2b, 0x3e, + 0xd0, 0xd7, 0x60, 0x2e, 0x90, 0x28, 0x0d, 0x6a, 0x84, 0xcd, 0x6c, 0x4f, 0x40, 0x5f, 0x0c, 0xeb, + 0xaf, 0x64, 0x59, 0x03, 0x0c, 0x96, 0x7c, 0xa8, 0x01, 0x0b, 0x2e, 0x7d, 0xe2, 0x53, 0x8f, 0x79, + 0x22, 0xe3, 0x16, 0x8d, 0x25, 0x9e, 0x35, 0x58, 0xc2, 0x70, 0x84, 0x45, 0x3f, 0x84, 0x8b, 0x41, + 0x35, 0xa6, 0x4c, 0x90, 0x95, 0xf8, 0x46, 0x91, 0x10, 0x25, 0xf9, 0x8c, 0x2b, 0xd2, 0xd4, 0x8b, + 0x13, 0x90, 0x78, 0x92, 0x26, 0xed, 0x13, 0x05, 0x5e, 0x99, 0xdc, 0x38, 0x10, 0x85, 0x79, 0x57, + 0xfc, 0x0a, 0x6b, 0xf6, 0x4e, 0x01, 0x7b, 0xe4, 0x19, 0xf3, 0xbb, 0x50, 0xf0, 0xed, 0xe1, 0x50, + 0x36, 0xda, 0x87, 0x39, 0x53, 0x98, 0x24, 0x8b, 0xf3, 0xce, 0x99, 0x9a, 0x5c, 0xfa, 0xfc, 0xd1, + 0xdc, 0x09, 0xc0, 0x58, 0x4a, 0xd6, 0x7e, 0xa9, 0xc0, 0x6a, 0xa6, 0x7a, 0x50, 0x0d, 0x54, 0xcb, + 0x66, 0x22, 0xa3, 0xd4, 0x20, 0x3e, 0x1d, 0x9b, 0x3d, 0xe4, 0x79, 0x8e, 0x39, 0x02, 0x5d, 0x85, + 0xf2, 0x3e, 0x9f, 0x7a, 0x3c, 0x16, 0x0b, 0xc6, 0xf2, 0x68, 0x58, 0x5f, 0x34, 0x1c, 0xa7, 0x17, + 0x50, 0x08, 0x14, 0xfa, 0x12, 0xcc, 0x79, 0xcc, 0xb5, 0xec, 0xc3, 0x6a, 0x59, 0x64, 0x8a, 0xe8, + 0xf1, 0x7b, 0x02, 0x12, 0x90, 0x49, 0x34, 0xba, 0x0e, 0xf3, 0x27, 0xd4, 0x15, 0xc5, 0x31, 0x2b, + 0x28, 0x45, 0x0b, 0x7d, 0x18, 0x80, 0x02, 0xd2, 0x90, 0x40, 0xa3, 0xb0, 0x92, 0xae, 0x3e, 0xb4, + 0x17, 0x56, 0xae, 0x32, 0x36, 0x79, 0xc6, 0x06, 0x66, 0xec, 0xb1, 0xb7, 0x7d, 0x62, 0x33, 0x8b, + 0x9d, 0x1a, 0xcb, 0xd2, 0x29, 0xb3, 0x81, 0xa2, 0x40, 0x96, 0xf6, 0xab, 0x12, 0x54, 0xa4, 0x9e, + 0x1e, 0xb1, 0xfa, 0xe8, 0x51, 0x22, 0x67, 0x83, 0x70, 0x5f, 0x2f, 0x1e, 0x6e, 0x63, 0x2d, 0xec, + 0x8c, 0x13, 0x72, 0xbc, 0x0b, 0x15, 0xd3, 0xb1, 0x3d, 0xe6, 0x12, 0xcb, 0x96, 0x05, 0x91, 0x1e, + 0xcb, 0x53, 0x72, 0x5b, 0x72, 0x19, 0x17, 0xa5, 0xfc, 0x4a, 0x0c, 0xf3, 0x70, 0x52, 0x2c, 0x7a, + 0x1c, 0xa5, 0x91, 0x2a, 0x14, 0x7c, 0xb5, 0x88, 0x02, 0x7e, 0xf2, 0x62, 0x19, 0xf4, 0x47, 0x05, + 0xaa, 0x79, 0x4c, 0xa9, 0x7a, 0x57, 0xfe, 0x97, 0x7a, 0x2f, 0x9d, 0x5b, 0xbd, 0xff, 0x4e, 0x49, + 0x84, 0xdd, 0xf3, 0xd0, 0xf7, 0x60, 0x81, 0x6f, 0x58, 0x62, 0x61, 0x52, 0xc6, 0xac, 0x98, 0xb2, + 0x8f, 0x3d, 0xd8, 0xff, 0x3e, 0x35, 0xd9, 0x7d, 0xca, 0x48, 0xdc, 0xe9, 0x63, 0x18, 0x8e, 0xa4, + 0xa2, 0x1d, 0x28, 0x7b, 0x03, 0x6a, 0x9e, 0x61, 0xc2, 0x09, 0xcb, 0xf6, 0x06, 0xd4, 0x8c, 0x67, + 0x01, 0xff, 0xc2, 0x42, 0x8e, 0xf6, 0xd3, 0x64, 0x24, 0x3c, 0x2f, 0x1d, 0x89, 0x1c, 0xff, 0x2a, + 0xe7, 0xe6, 0xdf, 0xdf, 0x46, 0x9d, 0x46, 0x58, 0x77, 0xcf, 0xf2, 0x18, 0x7a, 0x6f, 0xcc, 0xc7, + 0x7a, 0x31, 0x1f, 0x73, 0x6e, 0xe1, 0xe1, 0xa8, 0xbc, 0x42, 0x48, 0xc2, 0xbf, 0xf7, 0x61, 0xd6, + 0x62, 0xb4, 0x1f, 0x16, 0x56, 0xa3, 0xa8, 0x83, 0xe3, 0xbe, 0xd0, 0xe1, 0xec, 0x38, 0x90, 0xa2, + 0xfd, 0x25, 0x7d, 0x00, 0xee, 0x78, 0xf4, 0x1e, 0x2c, 0x7a, 0x72, 0xd4, 0x87, 0xcd, 0xa1, 0xc8, + 0xfa, 0x10, 0x2d, 0x8c, 0x17, 0xa4, 0xa6, 0xc5, 0x10, 0xe2, 0xe1, 0x58, 0x60, 0xa2, 0x72, 0x4b, + 0x67, 0xa9, 0xdc, 0x4c, 0xe8, 0x73, 0x2b, 0xf7, 0x09, 0x4c, 0x8a, 0x1e, 0x7a, 0x17, 0xe6, 0x9c, + 0x01, 0x79, 0x12, 0x75, 0xd5, 0xe9, 0x3b, 0xe1, 0x03, 0x41, 0x3a, 0x29, 0x45, 0x80, 0xab, 0x0c, + 0xd0, 0x58, 0x4a, 0xd4, 0x7e, 0xac, 0xc0, 0x5a, 0xb6, 0x85, 0x9d, 0xa1, 0x49, 0xec, 0xc2, 0x4a, + 0x9f, 0x30, 0xf3, 0x28, 0x9a, 0x55, 0xf2, 0xe6, 0xd5, 0x18, 0x0d, 0xeb, 0x2b, 0xf7, 0x53, 0x98, + 0x17, 0xc3, 0x3a, 0x7a, 0xcb, 0xef, 0xf5, 0x4e, 0xd3, 0x5b, 0x68, 0x86, 0x5f, 0xfb, 0x40, 0x85, + 0xe5, 0x54, 0xc3, 0x2e, 0xb0, 0x73, 0xb5, 0x61, 0xb5, 0x1b, 0xfb, 0x9a, 0x23, 0xa4, 0x19, 0x9f, + 0x97, 0xc4, 0xc9, 0x34, 0x11, 0x7c, 0x59, 0xfa, 0x74, 0xde, 0xa8, 0x9f, 0x76, 0xde, 0x3c, 0x84, + 0x15, 0x12, 0xed, 0x01, 0xf7, 0x9d, 0x2e, 0x95, 0x53, 0x58, 0x97, 0x5c, 0x2b, 0xed, 0x14, 0xf6, + 0xc5, 0xb0, 0xfe, 0xb9, 0xec, 0xf6, 0xc0, 0xe1, 0x38, 0x23, 0x05, 0x5d, 0x83, 0x59, 0xd3, 0xf1, + 0x6d, 0x26, 0x46, 0xb5, 0x1a, 0x97, 0xc9, 0x26, 0x07, 0xe2, 0x00, 0x87, 0x6e, 0x42, 0x85, 0x74, + 0xfb, 0x96, 0xdd, 0x36, 0x4d, 0xea, 0x79, 0xe2, 0x4e, 0xb8, 0x10, 0xcc, 0xff, 0x76, 0x0c, 0xc6, + 0x49, 0x1a, 0xed, 0xdf, 0x4a, 0xb8, 0x79, 0xe6, 0x2c, 0x49, 0xe8, 0x55, 0xbe, 0x71, 0x09, 0x94, + 0x8c, 0x4b, 0x62, 0x6b, 0x12, 0x60, 0x1c, 0xe2, 0x13, 0x77, 0xf7, 0x52, 0xa1, 0xbb, 0xbb, 0x5a, + 0xe0, 0xee, 0x5e, 0x9e, 0x7a, 0x77, 0xcf, 0x9c, 0x78, 0xb6, 0xc0, 0x89, 0xbf, 0x13, 0xae, 0x32, + 0xd1, 0x45, 0xa1, 0x03, 0xaa, 0x49, 0x7b, 0x13, 0xba, 0xe0, 0x78, 0x2e, 0x8c, 0xdd, 0x32, 0x8c, + 0xf9, 0xd1, 0xb0, 0xae, 0x6e, 0x6e, 0xdf, 0xc3, 0x5c, 0x86, 0xf6, 0x6b, 0x05, 0x2e, 0x8c, 0x5d, + 0xb3, 0xd1, 0x9b, 0xb0, 0x6c, 0xd9, 0x8c, 0xba, 0x07, 0xc4, 0xa4, 0x3b, 0x71, 0x82, 0x5f, 0x92, + 0x87, 0x5a, 0xee, 0x24, 0x91, 0x38, 0x4d, 0x8b, 0x2e, 0x83, 0x6a, 0x0d, 0xc2, 0x95, 0x5d, 0x68, + 0xeb, 0xec, 0x7a, 0x98, 0xc3, 0x78, 0x35, 0x1c, 0x11, 0xb7, 0xfb, 0x94, 0xb8, 0xb4, 0xdd, 0xed, + 0xf2, 0x3b, 0x8c, 0x74, 0x69, 0x54, 0x0d, 0x5f, 0x4f, 0xa3, 0x71, 0x96, 0x5e, 0xfb, 0x85, 0x02, + 0x97, 0x73, 0xfb, 0x48, 0xe1, 0xc7, 0x18, 0x02, 0x30, 0x20, 0x2e, 0xe9, 0x53, 0x46, 0x5d, 0x4f, + 0x0e, 0xd5, 0x33, 0xbe, 0x71, 0x44, 0xf3, 0x7a, 0x37, 0x12, 0x84, 0x13, 0x42, 0xb5, 0x9f, 0x95, + 0x60, 0x19, 0xcb, 0x70, 0x04, 0xcb, 0xe1, 0xff, 0x7f, 0x4b, 0xd8, 0x4d, 0x6d, 0x09, 0xd3, 0x33, + 0x23, 0x65, 0x5b, 0xde, 0x9e, 0x80, 0x1e, 0xf1, 0xe5, 0x9c, 0x30, 0xdf, 0x2b, 0x74, 0x9b, 0x4a, + 0xcb, 0x14, 0x7c, 0x71, 0x08, 0x82, 0x6f, 0x2c, 0xe5, 0x69, 0x23, 0x05, 0x6a, 0x29, 0x7a, 0xde, + 0xe5, 0xfd, 0x3e, 0x75, 0x31, 0x3d, 0xa0, 0x2e, 0xb5, 0x4d, 0x8a, 0x6e, 0xc0, 0x02, 0x19, 0x58, + 0x77, 0x5d, 0xc7, 0x1f, 0xc8, 0x78, 0x46, 0x23, 0xbc, 0xbd, 0xdb, 0x11, 0x70, 0x1c, 0x51, 0x70, + 0xea, 0xd0, 0x20, 0x99, 0x55, 0x89, 0x7d, 0x3a, 0x80, 0xe3, 0x88, 0x22, 0x6a, 0xdd, 0xe5, 0xdc, + 0xd6, 0x6d, 0x80, 0xea, 0x5b, 0x5d, 0x79, 0xd5, 0x78, 0x43, 0x12, 0xa8, 0xef, 0x74, 0xb6, 0x5e, + 0x0c, 0xeb, 0x57, 0xf3, 0x9e, 0x11, 0xd9, 0xe9, 0x80, 0x7a, 0xfa, 0x3b, 0x9d, 0x2d, 0xcc, 0x99, + 0xb5, 0xdf, 0x2b, 0x70, 0x21, 0x75, 0xc8, 0x73, 0x58, 0x65, 0x1e, 0xa4, 0x57, 0x99, 0xeb, 0xc5, + 0x23, 0x96, 0xb3, 0xcc, 0x1c, 0x65, 0xce, 0x20, 0xb6, 0x99, 0xbd, 0xec, 0xb3, 0x5a, 0xa3, 0xe8, + 0x55, 0x21, 0xff, 0x2d, 0x4d, 0xfb, 0x53, 0x09, 0x2e, 0x4e, 0xc8, 0x21, 0xf4, 0x18, 0x20, 0x1e, + 0x2f, 0x52, 0xdf, 0xf4, 0xbb, 0xcf, 0xd8, 0xd5, 0x79, 0x45, 0x3c, 0x76, 0xc5, 0xd0, 0x84, 0x40, + 0xe4, 0x42, 0xc5, 0xa5, 0x1e, 0x75, 0x4f, 0x68, 0xf7, 0x2d, 0xc7, 0x95, 0x7e, 0x7b, 0xb3, 0xb8, + 0xdf, 0xc6, 0x32, 0x37, 0xbe, 0x69, 0xe1, 0x58, 0x2e, 0x4e, 0x2a, 0x41, 0x8f, 0x63, 0xff, 0x05, + 0x2f, 0xb8, 0xad, 0x22, 0xe7, 0x49, 0xbf, 0x3d, 0x4f, 0xf1, 0xe4, 0xdf, 0x15, 0xb8, 0x94, 0xb2, + 0xf1, 0x5b, 0xb4, 0x3f, 0xe8, 0x11, 0x46, 0xcf, 0xa1, 0x0b, 0x3d, 0x4a, 0x75, 0xa1, 0x5b, 0xc5, + 0xfd, 0x18, 0xda, 0x98, 0x7b, 0x6b, 0xf9, 0x9b, 0x02, 0x97, 0x27, 0x72, 0x9c, 0x43, 0x59, 0x7d, + 0x3b, 0x5d, 0x56, 0xad, 0xb3, 0x1f, 0x2b, 0xa7, 0xbc, 0xfe, 0x9a, 0x77, 0x28, 0x51, 0x67, 0x9f, + 0xc1, 0xa1, 0xa1, 0xfd, 0x46, 0x81, 0xa5, 0x90, 0x92, 0xef, 0x48, 0x05, 0xf6, 0xe4, 0x16, 0x80, + 0xfc, 0xcb, 0x25, 0xbc, 0xc9, 0xab, 0xb1, 0xd9, 0x77, 0x23, 0x0c, 0x4e, 0x50, 0xa1, 0x6f, 0x00, + 0x0a, 0x0d, 0xdc, 0xeb, 0x89, 0x55, 0x80, 0xef, 0x9b, 0xaa, 0xe0, 0x5d, 0x97, 0xbc, 0x08, 0x8f, + 0x51, 0xe0, 0x09, 0x5c, 0xda, 0x1f, 0x94, 0x78, 0x5a, 0x0b, 0xf0, 0x4b, 0xea, 0x78, 0x61, 0x5b, + 0xae, 0xe3, 0x93, 0xe3, 0x46, 0x50, 0xbe, 0xac, 0xe3, 0x46, 0x18, 0x97, 0x53, 0x0f, 0x1f, 0xaa, + 0x99, 0x43, 0x88, 0x3a, 0x28, 0xba, 0xd9, 0x7d, 0x33, 0xf1, 0x37, 0x5b, 0xa5, 0xf5, 0x6a, 0x21, + 0x6b, 0x78, 0x8e, 0x4e, 0xdc, 0xea, 0x6f, 0xc0, 0x82, 0xed, 0x74, 0x83, 0x15, 0x38, 0xb3, 0x52, + 0xec, 0x48, 0x38, 0x8e, 0x28, 0xc6, 0xfe, 0x09, 0x2a, 0x7f, 0x3a, 0xff, 0x04, 0x89, 0x35, 0xa8, + 0xd7, 0xe3, 0x04, 0xe1, 0x85, 0x21, 0x5e, 0x83, 0x24, 0x1c, 0x47, 0x14, 0x68, 0x27, 0x1e, 0x2c, + 0x73, 0x22, 0x22, 0xd7, 0x0a, 0x0c, 0xe6, 0xfc, 0x49, 0x62, 0xb4, 0x9f, 0x3d, 0xaf, 0xcd, 0x7c, + 0xf4, 0xbc, 0x36, 0xf3, 0xf1, 0xf3, 0xda, 0xcc, 0x8f, 0x46, 0x35, 0xe5, 0xd9, 0xa8, 0xa6, 0x7c, + 0x34, 0xaa, 0x29, 0x1f, 0x8f, 0x6a, 0xca, 0xbf, 0x46, 0x35, 0xe5, 0x27, 0x9f, 0xd4, 0x66, 0xde, + 0xbd, 0x32, 0xe5, 0x1f, 0xe9, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x26, 0xe2, 0x5c, 0xf8, 0xaf, + 0x1e, 0x00, 0x00, +} + +func (m *AllocatedDeviceStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AllocatedDeviceStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AllocatedDeviceStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.NetworkData != nil { + { + size, err := m.NetworkData.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + { + size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + i -= len(m.Device) + copy(dAtA[i:], m.Device) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Device))) + i-- + dAtA[i] = 0x1a + i -= len(m.Pool) + copy(dAtA[i:], m.Pool) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Pool))) + i-- + dAtA[i] = 0x12 + i -= len(m.Driver) + copy(dAtA[i:], m.Driver) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } func (m *AllocationResult) Marshal() (dAtA []byte, err error) { @@ -1989,6 +2135,48 @@ func (m *DeviceSelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *NetworkDeviceData) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NetworkDeviceData) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NetworkDeviceData) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.HardwareAddress) + copy(dAtA[i:], m.HardwareAddress) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.HardwareAddress))) + i-- + dAtA[i] = 0x1a + if len(m.IPs) > 0 { + for iNdEx := len(m.IPs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.IPs[iNdEx]) + copy(dAtA[i:], m.IPs[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.IPs[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.InterfaceName) + copy(dAtA[i:], m.InterfaceName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.InterfaceName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *OpaqueDeviceConfiguration) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2223,6 +2411,20 @@ func (m *ResourceClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Devices) > 0 { + for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } if len(m.ReservedFor) > 0 { for iNdEx := len(m.ReservedFor) - 1; iNdEx >= 0; iNdEx-- { { @@ -2597,6 +2799,33 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *AllocatedDeviceStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Pool) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Device) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.Data.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.NetworkData != nil { + l = m.NetworkData.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *AllocationResult) Size() (n int) { if m == nil { return 0 @@ -2935,6 +3164,25 @@ func (m *DeviceSelector) Size() (n int) { return n } +func (m *NetworkDeviceData) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.InterfaceName) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.IPs) > 0 { + for _, s := range m.IPs { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.HardwareAddress) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *OpaqueDeviceConfiguration) Size() (n int) { if m == nil { return 0 @@ -3024,6 +3272,12 @@ func (m *ResourceClaimStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if len(m.Devices) > 0 { + for _, e := range m.Devices { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -3145,13 +3399,33 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *AllocatedDeviceStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForConditions := "[]Condition{" + for _, f := range this.Conditions { + repeatedStringForConditions += fmt.Sprintf("%v", f) + "," + } + repeatedStringForConditions += "}" + s := strings.Join([]string{`&AllocatedDeviceStatus{`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Pool:` + fmt.Sprintf("%v", this.Pool) + `,`, + `Device:` + fmt.Sprintf("%v", this.Device) + `,`, + `Conditions:` + repeatedStringForConditions + `,`, + `Data:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Data), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, + `NetworkData:` + strings.Replace(this.NetworkData.String(), "NetworkDeviceData", "NetworkDeviceData", 1) + `,`, + `}`, + }, "") + return s +} func (this *AllocationResult) String() string { if this == nil { return "nil" } s := strings.Join([]string{`&AllocationResult{`, `Devices:` + strings.Replace(strings.Replace(this.Devices.String(), "DeviceAllocationResult", "DeviceAllocationResult", 1), `&`, ``, 1) + `,`, - `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v1.NodeSelector", 1) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v11.NodeSelector", 1) + `,`, `}`, }, "") return s @@ -3307,7 +3581,7 @@ func (this *DeviceClass) String() string { return "nil" } s := strings.Join([]string{`&DeviceClass{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "DeviceClassSpec", "DeviceClassSpec", 1), `&`, ``, 1) + `,`, `}`, }, "") @@ -3333,7 +3607,7 @@ func (this *DeviceClassList) String() string { } repeatedStringForItems += "}" s := strings.Join([]string{`&DeviceClassList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, `Items:` + repeatedStringForItems + `,`, `}`, }, "") @@ -3425,6 +3699,18 @@ func (this *DeviceSelector) String() string { }, "") return s } +func (this *NetworkDeviceData) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NetworkDeviceData{`, + `InterfaceName:` + fmt.Sprintf("%v", this.InterfaceName) + `,`, + `IPs:` + fmt.Sprintf("%v", this.IPs) + `,`, + `HardwareAddress:` + fmt.Sprintf("%v", this.HardwareAddress) + `,`, + `}`, + }, "") + return s +} func (this *OpaqueDeviceConfiguration) String() string { if this == nil { return "nil" @@ -3441,7 +3727,7 @@ func (this *ResourceClaim) String() string { return "nil" } s := strings.Join([]string{`&ResourceClaim{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimSpec", "ResourceClaimSpec", 1), `&`, ``, 1) + `,`, `Status:` + strings.Replace(strings.Replace(this.Status.String(), "ResourceClaimStatus", "ResourceClaimStatus", 1), `&`, ``, 1) + `,`, `}`, @@ -3471,7 +3757,7 @@ func (this *ResourceClaimList) String() string { } repeatedStringForItems += "}" s := strings.Join([]string{`&ResourceClaimList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, `Items:` + repeatedStringForItems + `,`, `}`, }, "") @@ -3496,9 +3782,15 @@ func (this *ResourceClaimStatus) String() string { repeatedStringForReservedFor += strings.Replace(strings.Replace(f.String(), "ResourceClaimConsumerReference", "ResourceClaimConsumerReference", 1), `&`, ``, 1) + "," } repeatedStringForReservedFor += "}" + repeatedStringForDevices := "[]AllocatedDeviceStatus{" + for _, f := range this.Devices { + repeatedStringForDevices += strings.Replace(strings.Replace(f.String(), "AllocatedDeviceStatus", "AllocatedDeviceStatus", 1), `&`, ``, 1) + "," + } + repeatedStringForDevices += "}" s := strings.Join([]string{`&ResourceClaimStatus{`, `Allocation:` + strings.Replace(this.Allocation.String(), "AllocationResult", "AllocationResult", 1) + `,`, `ReservedFor:` + repeatedStringForReservedFor + `,`, + `Devices:` + repeatedStringForDevices + `,`, `}`, }, "") return s @@ -3508,7 +3800,7 @@ func (this *ResourceClaimTemplate) String() string { return "nil" } s := strings.Join([]string{`&ResourceClaimTemplate{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimTemplateSpec", "ResourceClaimTemplateSpec", 1), `&`, ``, 1) + `,`, `}`, }, "") @@ -3524,7 +3816,7 @@ func (this *ResourceClaimTemplateList) String() string { } repeatedStringForItems += "}" s := strings.Join([]string{`&ResourceClaimTemplateList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, `Items:` + repeatedStringForItems + `,`, `}`, }, "") @@ -3535,7 +3827,7 @@ func (this *ResourceClaimTemplateSpec) String() string { return "nil" } s := strings.Join([]string{`&ResourceClaimTemplateSpec{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimSpec", "ResourceClaimSpec", 1), `&`, ``, 1) + `,`, `}`, }, "") @@ -3558,7 +3850,7 @@ func (this *ResourceSlice) String() string { return "nil" } s := strings.Join([]string{`&ResourceSlice{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceSliceSpec", "ResourceSliceSpec", 1), `&`, ``, 1) + `,`, `}`, }, "") @@ -3574,7 +3866,7 @@ func (this *ResourceSliceList) String() string { } repeatedStringForItems += "}" s := strings.Join([]string{`&ResourceSliceList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, `Items:` + repeatedStringForItems + `,`, `}`, }, "") @@ -3593,7 +3885,7 @@ func (this *ResourceSliceSpec) String() string { `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, `Pool:` + strings.Replace(strings.Replace(this.Pool.String(), "ResourcePool", "ResourcePool", 1), `&`, ``, 1) + `,`, `NodeName:` + fmt.Sprintf("%v", this.NodeName) + `,`, - `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v1.NodeSelector", 1) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v11.NodeSelector", 1) + `,`, `AllNodes:` + fmt.Sprintf("%v", this.AllNodes) + `,`, `Devices:` + repeatedStringForDevices + `,`, `}`, @@ -3608,6 +3900,255 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *AllocatedDeviceStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AllocatedDeviceStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AllocatedDeviceStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Driver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pool = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Device", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Device = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, v1.Condition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NetworkData", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NetworkData == nil { + m.NetworkData = &NetworkDeviceData{} + } + if err := m.NetworkData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *AllocationResult) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3700,7 +4241,7 @@ func (m *AllocationResult) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.NodeSelector == nil { - m.NodeSelector = &v1.NodeSelector{} + m.NodeSelector = &v11.NodeSelector{} } if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -6147,6 +6688,152 @@ func (m *DeviceSelector) Unmarshal(dAtA []byte) error { } return nil } +func (m *NetworkDeviceData) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NetworkDeviceData: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NetworkDeviceData: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InterfaceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InterfaceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IPs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IPs = append(m.IPs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HardwareAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.HardwareAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *OpaqueDeviceConfiguration) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -6888,6 +7575,40 @@ func (m *ResourceClaimStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Devices = append(m.Devices, AllocatedDeviceStatus{}) + if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -7767,7 +8488,7 @@ func (m *ResourceSliceSpec) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.NodeSelector == nil { - m.NodeSelector = &v1.NodeSelector{} + m.NodeSelector = &v11.NodeSelector{} } if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/staging/src/k8s.io/api/resource/v1beta1/generated.proto b/staging/src/k8s.io/api/resource/v1beta1/generated.proto index af1ed4f144d..869af6a03cb 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/resource/v1beta1/generated.proto @@ -30,6 +30,53 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "k8s.io/api/resource/v1beta1"; +// AllocatedDeviceStatus contains the status of an allocated device, if the +// driver chooses to report it. This may include driver-specific information. +message AllocatedDeviceStatus { + // Driver specifies the name of the DRA driver whose kubelet + // plugin should be invoked to process the allocation once the claim is + // needed on a node. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + optional string driver = 1; + + // This name together with the driver name and the device name field + // identify which device was allocated (`//`). + // + // Must not be longer than 253 characters and may contain one or more + // DNS sub-domains separated by slashes. + // + // +required + optional string pool = 2; + + // Device references one device instance via its name in the driver's + // resource pool. It must be a DNS label. + // + // +required + optional string device = 3; + + // Conditions contains the latest observation of the device's state. + // If the device has been configured according to the class and claim + // config references, the `Ready` condition should be True. + // + // +optional + // +listType=atomic + repeated .k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 4; + + // Data contains arbitrary driver-specific data. + // + // +optional + optional .k8s.io.apimachinery.pkg.runtime.RawExtension data = 5; + + // NetworkData contains network-related information specific to the device. + // + // +optional + optional NetworkDeviceData networkData = 6; +} + // AllocationResult contains attributes of an allocated resource. message AllocationResult { // Devices is the result of allocating devices. @@ -488,6 +535,33 @@ message DeviceSelector { optional CELDeviceSelector cel = 1; } +// NetworkDeviceData provides network-related details for the allocated device. +// This information may be filled by drivers or other components to configure +// or identify the device within a network context. +message NetworkDeviceData { + // InterfaceName specifies the name of the network interface associated with + // the allocated device. This might be the name of a physical or virtual + // network interface. + // + // +optional + optional string interfaceName = 1; + + // IPs lists the network addresses assigned to the device's network interface. + // This can include both IPv4 and IPv6 addresses. + // The IPs are in the CIDR notation, which includes both the address and the + // associated subnet mask. + // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. + // + // +optional + // +listType=atomic + repeated string ips = 2; + + // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. + // + // +optional + optional string hardwareAddress = 3; +} + // OpaqueDeviceConfiguration contains configuration parameters for a driver // in a format defined by the driver vendor. message OpaqueDeviceConfiguration { @@ -611,6 +685,18 @@ message ResourceClaimStatus { // +patchStrategy=merge // +patchMergeKey=uid repeated ResourceClaimConsumerReference reservedFor = 2; + + // Devices contains the status of each device allocated for this + // claim, as reported by the driver. This can include driver-specific + // information. Entries are owned by their respective drivers. + // + // +optional + // +listType=map + // +listMapKey=driver + // +listMapKey=device + // +listMapKey=pool + // +featureGate=DRAResourceClaimDeviceStatus + repeated AllocatedDeviceStatus devices = 4; } // ResourceClaimTemplate is used to produce ResourceClaim objects. diff --git a/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go index 72c40609612..20aebf75740 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go @@ -27,6 +27,20 @@ package v1beta1 // Those methods can be generated by using hack/update-codegen.sh // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_AllocatedDeviceStatus = map[string]string{ + "": "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", + "driver": "Driver specifies the name of the DRA driver whose kubelet plugin should be invoked to process the allocation once the claim is needed on a node.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", + "pool": "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", + "device": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", + "conditions": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "data": "Data contains arbitrary driver-specific data.", + "networkData": "NetworkData contains network-related information specific to the device.", +} + +func (AllocatedDeviceStatus) SwaggerDoc() map[string]string { + return map_AllocatedDeviceStatus +} + var map_AllocationResult = map[string]string{ "": "AllocationResult contains attributes of an allocated resource.", "devices": "Devices is the result of allocating devices.", @@ -220,6 +234,17 @@ func (DeviceSelector) SwaggerDoc() map[string]string { return map_DeviceSelector } +var map_NetworkDeviceData = map[string]string{ + "": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", + "interfaceName": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "ips": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "hardwareAddress": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", +} + +func (NetworkDeviceData) SwaggerDoc() map[string]string { + return map_NetworkDeviceData +} + var map_OpaqueDeviceConfiguration = map[string]string{ "": "OpaqueDeviceConfiguration contains configuration parameters for a driver in a format defined by the driver vendor.", "driver": "Driver is used to determine which kubelet plugin needs to be passed these configuration parameters.\n\nAn admission policy provided by the driver developer could use this to decide whether it needs to validate them.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", @@ -276,6 +301,7 @@ var map_ResourceClaimStatus = map[string]string{ "": "ResourceClaimStatus tracks whether the resource has been allocated and what the result of that was.", "allocation": "Allocation is set once the claim has been allocated successfully.", "reservedFor": "ReservedFor indicates which entities are currently allowed to use the claim. A Pod which references a ResourceClaim which is not reserved for that Pod will not be started. A claim that is in use or might be in use because it has been reserved must not get deallocated.\n\nIn a cluster with multiple scheduler instances, two pods might get scheduled concurrently by different schedulers. When they reference the same ResourceClaim which already has reached its maximum number of consumers, only one pod can be scheduled.\n\nBoth schedulers try to add their pod to the claim.status.reservedFor field, but only the update that reaches the API server first gets stored. The other one fails with an error and the scheduler which issued it knows that it must put the pod back into the queue, waiting for the ResourceClaim to become usable again.\n\nThere can be at most 32 such reservations. This may get increased in the future, but not reduced.", + "devices": "Devices contains the status of each device allocated for this claim, as reported by the driver. This can include driver-specific information. Entries are owned by their respective drivers.", } func (ResourceClaimStatus) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/resource/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/resource/v1beta1/zz_generated.deepcopy.go index 85b020d0faf..3be61333fff 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/resource/v1beta1/zz_generated.deepcopy.go @@ -22,17 +22,47 @@ limitations under the License. package v1beta1 import ( - v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AllocatedDeviceStatus) DeepCopyInto(out *AllocatedDeviceStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.Data.DeepCopyInto(&out.Data) + if in.NetworkData != nil { + in, out := &in.NetworkData, &out.NetworkData + *out = new(NetworkDeviceData) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AllocatedDeviceStatus. +func (in *AllocatedDeviceStatus) DeepCopy() *AllocatedDeviceStatus { + if in == nil { + return nil + } + out := new(AllocatedDeviceStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AllocationResult) DeepCopyInto(out *AllocationResult) { *out = *in in.Devices.DeepCopyInto(&out.Devices) if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector - *out = new(v1.NodeSelector) + *out = new(corev1.NodeSelector) (*in).DeepCopyInto(*out) } return @@ -503,6 +533,27 @@ func (in *DeviceSelector) DeepCopy() *DeviceSelector { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkDeviceData) DeepCopyInto(out *NetworkDeviceData) { + *out = *in + if in.IPs != nil { + in, out := &in.IPs, &out.IPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkDeviceData. +func (in *NetworkDeviceData) DeepCopy() *NetworkDeviceData { + if in == nil { + return nil + } + out := new(NetworkDeviceData) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *OpaqueDeviceConfiguration) DeepCopyInto(out *OpaqueDeviceConfiguration) { *out = *in @@ -627,6 +678,13 @@ func (in *ResourceClaimStatus) DeepCopyInto(out *ResourceClaimStatus) { *out = make([]ResourceClaimConsumerReference, len(*in)) copy(*out, *in) } + if in.Devices != nil { + in, out := &in.Devices, &out.Devices + *out = make([]AllocatedDeviceStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -800,7 +858,7 @@ func (in *ResourceSliceSpec) DeepCopyInto(out *ResourceSliceSpec) { out.Pool = in.Pool if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector - *out = new(v1.NodeSelector) + *out = new(corev1.NodeSelector) (*in).DeepCopyInto(*out) } if in.Devices != nil { diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaim.json b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaim.json index d64766cc66c..f61f244ae7e 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaim.json +++ b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaim.json @@ -157,6 +157,40 @@ "name": "nameValue", "uid": "uidValue" } + ], + "devices": [ + { + "driver": "driverValue", + "pool": "poolValue", + "device": "deviceValue", + "conditions": [ + { + "type": "typeValue", + "status": "statusValue", + "observedGeneration": 3, + "lastTransitionTime": "2004-01-01T01:01:01Z", + "reason": "reasonValue", + "message": "messageValue" + } + ], + "data": { + "apiVersion": "example.com/v1", + "kind": "CustomType", + "spec": { + "replicas": 1 + }, + "status": { + "available": 1 + } + }, + "networkData": { + "interfaceName": "interfaceNameValue", + "ips": [ + "ipsValue" + ], + "hardwareAddress": "hardwareAddressValue" + } + } ] } } \ No newline at end of file diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaim.pb b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaim.pb index 6518cf124801cc0cd7e3d3953df93b23e234fa9a..30923fd8e35ce6ea16dc57aab805e4d7cc7adc7f 100644 GIT binary patch delta 191 zcmeyz-pn<@faxsfMx!hyriUz>=P|`FW+^o>adD>crV4Qu1RKLVrsCgWj1rWoeL^2YKQpyvHQXNxLih$Z7 JE@4n&002i?K*In4 delta 26 icmZqX`o})OfawJLMx!hyraMfV=P|`FvPdx~F#rH|ItN1l diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaim.yaml b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaim.yaml index 640f9427b90..bc7855856b1 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaim.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaim.yaml @@ -93,6 +93,29 @@ status: operator: operatorValue values: - valuesValue + devices: + - conditions: + - lastTransitionTime: "2004-01-01T01:01:01Z" + message: messageValue + observedGeneration: 3 + reason: reasonValue + status: statusValue + type: typeValue + data: + apiVersion: example.com/v1 + kind: CustomType + spec: + replicas: 1 + status: + available: 1 + device: deviceValue + driver: driverValue + networkData: + hardwareAddress: hardwareAddressValue + interfaceName: interfaceNameValue + ips: + - ipsValue + pool: poolValue reservedFor: - apiGroup: apiGroupValue name: nameValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1beta1.ResourceClaim.json b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1beta1.ResourceClaim.json index 0dd513ddb2b..f0f993218bc 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1beta1.ResourceClaim.json +++ b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1beta1.ResourceClaim.json @@ -157,6 +157,40 @@ "name": "nameValue", "uid": "uidValue" } + ], + "devices": [ + { + "driver": "driverValue", + "pool": "poolValue", + "device": "deviceValue", + "conditions": [ + { + "type": "typeValue", + "status": "statusValue", + "observedGeneration": 3, + "lastTransitionTime": "2004-01-01T01:01:01Z", + "reason": "reasonValue", + "message": "messageValue" + } + ], + "data": { + "apiVersion": "example.com/v1", + "kind": "CustomType", + "spec": { + "replicas": 1 + }, + "status": { + "available": 1 + } + }, + "networkData": { + "interfaceName": "interfaceNameValue", + "ips": [ + "ipsValue" + ], + "hardwareAddress": "hardwareAddressValue" + } + } ] } } \ No newline at end of file diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1beta1.ResourceClaim.pb b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1beta1.ResourceClaim.pb index f5c4fb5d3d6d70edc80fceb674669d2593ff7aef..9265e325d91c28aaa6a8fa641a6778c363b7fa43 100644 GIT binary patch delta 212 zcmey%-o!OQpXn^;M#C&7riUz>=Q71G)+;qJadD>crV4Qu Date: Thu, 7 Nov 2024 11:32:24 +0100 Subject: [PATCH 15/17] [KEP-4817] UPDATE_API_KNOWN_VIOLATIONS=true ./hack/update-codegen.sh Signed-off-by: Lionel Jouin --- api/api-rules/violation_exceptions.list | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/api-rules/violation_exceptions.list b/api/api-rules/violation_exceptions.list index 8a8c2644425..9e654d47e43 100644 --- a/api/api-rules/violation_exceptions.list +++ b/api/api-rules/violation_exceptions.list @@ -56,10 +56,12 @@ API rule violation: names_match,k8s.io/api/resource/v1alpha3,DeviceAttribute,Boo API rule violation: names_match,k8s.io/api/resource/v1alpha3,DeviceAttribute,IntValue API rule violation: names_match,k8s.io/api/resource/v1alpha3,DeviceAttribute,StringValue API rule violation: names_match,k8s.io/api/resource/v1alpha3,DeviceAttribute,VersionValue +API rule violation: names_match,k8s.io/api/resource/v1alpha3,NetworkDeviceData,IPs API rule violation: names_match,k8s.io/api/resource/v1beta1,DeviceAttribute,BoolValue API rule violation: names_match,k8s.io/api/resource/v1beta1,DeviceAttribute,IntValue API rule violation: names_match,k8s.io/api/resource/v1beta1,DeviceAttribute,StringValue API rule violation: names_match,k8s.io/api/resource/v1beta1,DeviceAttribute,VersionValue +API rule violation: names_match,k8s.io/api/resource/v1beta1,NetworkDeviceData,IPs API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,Ref API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,Schema API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,XEmbeddedResource From 118356175d234d65efe28368cc896cef4f23d238 Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Thu, 7 Nov 2024 22:18:04 +0100 Subject: [PATCH 16/17] [KEP-4817] Add limits on conditions and IPs + fix documentation Signed-off-by: Lionel Jouin --- pkg/apis/resource/types.go | 15 ++++- pkg/apis/resource/validation/validation.go | 7 +- .../validation_resourceclaim_test.go | 64 ++++++++++++++++--- .../src/k8s.io/api/resource/v1alpha3/types.go | 11 +++- .../src/k8s.io/api/resource/v1beta1/types.go | 11 +++- 5 files changed, 92 insertions(+), 16 deletions(-) diff --git a/pkg/apis/resource/types.go b/pkg/apis/resource/types.go index b09691a10c5..65fb34f9a14 100644 --- a/pkg/apis/resource/types.go +++ b/pkg/apis/resource/types.go @@ -1020,12 +1020,17 @@ type AllocatedDeviceStatus struct { // If the device has been configured according to the class and claim // config references, the `Ready` condition should be True. // + // Must not contain more than 8 entries. + // // +optional - // +listType=atomic + // +listType=map + // +listMapKey=type Conditions []metav1.Condition // Data contains arbitrary driver-specific data. // + // The length of the raw data must be smaller or equal to 10 Ki. + // // +optional Data runtime.RawExtension @@ -1041,7 +1046,9 @@ type AllocatedDeviceStatus struct { type NetworkDeviceData struct { // InterfaceName specifies the name of the network interface associated with // the allocated device. This might be the name of a physical or virtual - // network interface. + // network interface being configured in the pod. + // + // Must not be longer than 256 characters. // // +optional InterfaceName string @@ -1052,12 +1059,16 @@ type NetworkDeviceData struct { // associated subnet mask. // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. // + // Must not contain more than 16 entries. + // // +optional // +listType=atomic IPs []string // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. // + // Must not be longer than 128 characters. + // // +optional HardwareAddress string } diff --git a/pkg/apis/resource/validation/validation.go b/pkg/apis/resource/validation/validation.go index ca7611cc66c..4f06c114d85 100644 --- a/pkg/apis/resource/validation/validation.go +++ b/pkg/apis/resource/validation/validation.go @@ -748,6 +748,9 @@ func validateDeviceStatus(device resource.AllocatedDeviceStatus, fldPath *field. if !allocatedDevices.Has(deviceID) { allErrs = append(allErrs, field.Invalid(fldPath, deviceID, "must be an allocated device in the claim")) } + if len(device.Conditions) > maxConditions { + allErrs = append(allErrs, field.TooMany(fldPath.Child("conditions"), len(device.Conditions), maxConditions)) + } allErrs = append(allErrs, metav1validation.ValidateConditions(device.Conditions, fldPath.Child("conditions"))...) if len(device.Data.Raw) > 0 { // Data is an optional field. allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"), false)...) @@ -778,6 +781,8 @@ func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path return allErrs } +const maxConditions int = 8 +const maxIPs int = 16 const interfaceNameMaxLength int = 256 const hardwareAddressMaxLength int = 128 @@ -795,7 +800,7 @@ func validateNetworkDeviceData(networkDeviceData *resource.NetworkDeviceData, fl allErrs = append(allErrs, field.TooLong(fldPath.Child("hardwareAddress"), "" /* unused */, hardwareAddressMaxLength)) } - allErrs = append(allErrs, validateSet(networkDeviceData.IPs, -1, + allErrs = append(allErrs, validateSet(networkDeviceData.IPs, maxIPs, func(address string, fldPath *field.Path) field.ErrorList { return validation.IsValidCIDR(fldPath, address) }, diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index 50b32312677..ac202caf6b2 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -994,13 +994,14 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Pool: goodName, Device: goodName, Conditions: []metav1.Condition{ - { - Type: "test", - Status: metav1.ConditionTrue, - Reason: "test_reason", - LastTransitionTime: metav1.Now(), - ObservedGeneration: 0, - }, + {Type: "test-0", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-1", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-2", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-3", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-4", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-5", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-6", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-7", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, }, Data: runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), @@ -1013,6 +1014,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) { "2001:db8::/64", "10.9.8.1/24", "2001:db8::1/64", + "10.9.8.2/24", "10.9.8.3/24", "10.9.8.4/24", "10.9.8.5/24", "10.9.8.6/24", "10.9.8.7/24", + "10.9.8.8/24", "10.9.8.9/24", "10.9.8.10/24", "10.9.8.11/24", "10.9.8.12/24", "10.9.8.13/24", }, }, }, @@ -1096,9 +1099,11 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, deviceStatusFeatureGate: true, }, - "invalid-data-device-status-too-long": { + "invalid-data-device-status-limits": { wantFailures: field.ErrorList{ + field.TooMany(field.NewPath("status", "devices").Index(0).Child("conditions"), maxConditions+1, maxConditions), field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.OpaqueParametersMaxLength), + field.TooMany(field.NewPath("status", "devices").Index(0).Child("networkData", "ips"), maxIPs+1, maxIPs), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { @@ -1108,6 +1113,23 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Pool: goodName, Device: goodName, Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.OpaqueParametersMaxLength-9-2+1 /* too large by one */) + `"}`)}, + Conditions: []metav1.Condition{ + {Type: "test-0", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-1", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-2", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-3", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-4", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-5", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-6", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-7", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-8", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + }, + NetworkData: &resource.NetworkDeviceData{ + IPs: []string{ + "10.9.8.0/24", "10.9.8.1/24", "10.9.8.2/24", "10.9.8.3/24", "10.9.8.4/24", "10.9.8.5/24", "10.9.8.6/24", "10.9.8.7/24", "10.9.8.8/24", + "10.9.8.9/24", "10.9.8.10/24", "10.9.8.11/24", "10.9.8.12/24", "10.9.8.13/24", "10.9.8.14/24", "10.9.8.15/24", "10.9.8.16/24", + }, + }, }, } return claim @@ -1206,9 +1228,11 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, deviceStatusFeatureGate: false, }, - "invalid-data-device-status-too-long-feature-gate": { + "invalid-data-device-status-limits-feature-gate": { wantFailures: field.ErrorList{ + field.TooMany(field.NewPath("status", "devices").Index(0).Child("conditions"), maxConditions+1, maxConditions), field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.OpaqueParametersMaxLength), + field.TooMany(field.NewPath("status", "devices").Index(0).Child("networkData", "ips"), maxIPs+1, maxIPs), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { @@ -1218,6 +1242,23 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Pool: goodName, Device: goodName, Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.OpaqueParametersMaxLength-9-2+1 /* too large by one */) + `"}`)}, + Conditions: []metav1.Condition{ + {Type: "test-0", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-1", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-2", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-3", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-4", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-5", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-6", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-7", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + {Type: "test-8", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, + }, + NetworkData: &resource.NetworkDeviceData{ + IPs: []string{ + "10.9.8.0/24", "10.9.8.1/24", "10.9.8.2/24", "10.9.8.3/24", "10.9.8.4/24", "10.9.8.5/24", "10.9.8.6/24", "10.9.8.7/24", "10.9.8.8/24", + "10.9.8.9/24", "10.9.8.10/24", "10.9.8.11/24", "10.9.8.12/24", "10.9.8.13/24", "10.9.8.14/24", "10.9.8.15/24", "10.9.8.16/24", + }, + }, }, } return claim @@ -1250,6 +1291,11 @@ func TestValidateClaimStatusUpdate(t *testing.T) { scenario.oldClaim.ResourceVersion = "1" errs := ValidateResourceClaimStatusUpdate(scenario.update(scenario.oldClaim.DeepCopy()), scenario.oldClaim) + + if name == "invalid-data-device-status-limits-feature-gate" { + fmt.Println(errs) + fmt.Println(scenario.wantFailures) + } assertFailures(t, scenario.wantFailures, errs) }) } diff --git a/staging/src/k8s.io/api/resource/v1alpha3/types.go b/staging/src/k8s.io/api/resource/v1alpha3/types.go index 65bdd55f2cc..e3d7fd8945b 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/types.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/types.go @@ -1032,11 +1032,14 @@ type AllocatedDeviceStatus struct { // config references, the `Ready` condition should be True. // // +optional - // +listType=atomic + // +listType=map + // +listMapKey=type Conditions []metav1.Condition `json:"conditions" protobuf:"bytes,4,opt,name=conditions"` // Data contains arbitrary driver-specific data. // + // The length of the raw data must be smaller or equal to 10 Ki. + // // +optional Data runtime.RawExtension `json:"data,omitempty" protobuf:"bytes,5,opt,name=data"` @@ -1052,7 +1055,9 @@ type AllocatedDeviceStatus struct { type NetworkDeviceData struct { // InterfaceName specifies the name of the network interface associated with // the allocated device. This might be the name of a physical or virtual - // network interface. + // network interface being configured in the pod. + // + // Must not be longer than 256 characters. // // +optional InterfaceName string `json:"interfaceName,omitempty" protobuf:"bytes,1,opt,name=interfaceName"` @@ -1069,6 +1074,8 @@ type NetworkDeviceData struct { // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. // + // Must not be longer than 128 characters. + // // +optional HardwareAddress string `json:"hardwareAddress,omitempty" protobuf:"bytes,3,opt,name=hardwareAddress"` } diff --git a/staging/src/k8s.io/api/resource/v1beta1/types.go b/staging/src/k8s.io/api/resource/v1beta1/types.go index 1f1b7dcb746..a7f1ee7b54f 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/types.go +++ b/staging/src/k8s.io/api/resource/v1beta1/types.go @@ -1035,11 +1035,14 @@ type AllocatedDeviceStatus struct { // config references, the `Ready` condition should be True. // // +optional - // +listType=atomic + // +listType=map + // +listMapKey=type Conditions []metav1.Condition `json:"conditions" protobuf:"bytes,4,opt,name=conditions"` // Data contains arbitrary driver-specific data. // + // The length of the raw data must be smaller or equal to 10 Ki. + // // +optional Data runtime.RawExtension `json:"data,omitempty" protobuf:"bytes,5,opt,name=data"` @@ -1055,7 +1058,9 @@ type AllocatedDeviceStatus struct { type NetworkDeviceData struct { // InterfaceName specifies the name of the network interface associated with // the allocated device. This might be the name of a physical or virtual - // network interface. + // network interface being configured in the pod. + // + // Must not be longer than 256 characters. // // +optional InterfaceName string `json:"interfaceName,omitempty" protobuf:"bytes,1,opt,name=interfaceName"` @@ -1072,6 +1077,8 @@ type NetworkDeviceData struct { // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. // + // Must not be longer than 128 characters. + // // +optional HardwareAddress string `json:"hardwareAddress,omitempty" protobuf:"bytes,3,opt,name=hardwareAddress"` } From d84c8d2a647aee3a7b0ac499a55e5f630c71d2a9 Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Thu, 7 Nov 2024 22:19:09 +0100 Subject: [PATCH 17/17] [KEP-4817] make update --- api/openapi-spec/swagger.json | 22 ++++++++++++------- ...is__resource.k8s.io__v1alpha3_openapi.json | 11 ++++++---- ...pis__resource.k8s.io__v1beta1_openapi.json | 11 ++++++---- pkg/generated/openapi/zz_generated.openapi.go | 22 ++++++++++++------- .../api/resource/v1alpha3/generated.proto | 11 ++++++++-- .../v1alpha3/types_swagger_doc_generated.go | 6 ++--- .../api/resource/v1beta1/generated.proto | 11 ++++++++-- .../v1beta1/types_swagger_doc_generated.go | 6 ++--- .../applyconfigurations/internal/internal.go | 8 +++++-- 9 files changed, 72 insertions(+), 36 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index d62316f8a08..03a615f356d 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -14446,11 +14446,14 @@ "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Condition" }, "type": "array", - "x-kubernetes-list-type": "atomic" + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map" }, "data": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", - "description": "Data contains arbitrary driver-specific data." + "description": "Data contains arbitrary driver-specific data.\n\nThe length of the raw data must be smaller or equal to 10 Ki." }, "device": { "description": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", @@ -14860,11 +14863,11 @@ "description": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", "properties": { "hardwareAddress": { - "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.\n\nMust not be longer than 128 characters.", "type": "string" }, "interfaceName": { - "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface being configured in the pod.\n\nMust not be longer than 256 characters.", "type": "string" }, "ips": { @@ -15263,11 +15266,14 @@ "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Condition" }, "type": "array", - "x-kubernetes-list-type": "atomic" + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map" }, "data": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", - "description": "Data contains arbitrary driver-specific data." + "description": "Data contains arbitrary driver-specific data.\n\nThe length of the raw data must be smaller or equal to 10 Ki." }, "device": { "description": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", @@ -15690,11 +15696,11 @@ "description": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", "properties": { "hardwareAddress": { - "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.\n\nMust not be longer than 128 characters.", "type": "string" }, "interfaceName": { - "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface being configured in the pod.\n\nMust not be longer than 256 characters.", "type": "string" }, "ips": { diff --git a/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json b/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json index 2ba1ece886f..f13c36e793d 100644 --- a/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json +++ b/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json @@ -100,7 +100,10 @@ "default": {} }, "type": "array", - "x-kubernetes-list-type": "atomic" + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map" }, "data": { "allOf": [ @@ -108,7 +111,7 @@ "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" } ], - "description": "Data contains arbitrary driver-specific data." + "description": "Data contains arbitrary driver-specific data.\n\nThe length of the raw data must be smaller or equal to 10 Ki." }, "device": { "default": "", @@ -631,11 +634,11 @@ "description": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", "properties": { "hardwareAddress": { - "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.\n\nMust not be longer than 128 characters.", "type": "string" }, "interfaceName": { - "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface being configured in the pod.\n\nMust not be longer than 256 characters.", "type": "string" }, "ips": { diff --git a/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json b/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json index 5c056541230..0d3e2f1f5d3 100644 --- a/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json +++ b/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json @@ -100,7 +100,10 @@ "default": {} }, "type": "array", - "x-kubernetes-list-type": "atomic" + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map" }, "data": { "allOf": [ @@ -108,7 +111,7 @@ "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" } ], - "description": "Data contains arbitrary driver-specific data." + "description": "Data contains arbitrary driver-specific data.\n\nThe length of the raw data must be smaller or equal to 10 Ki." }, "device": { "default": "", @@ -653,11 +656,11 @@ "description": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", "properties": { "hardwareAddress": { - "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + "description": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.\n\nMust not be longer than 128 characters.", "type": "string" }, "interfaceName": { - "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "description": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface being configured in the pod.\n\nMust not be longer than 256 characters.", "type": "string" }, "ips": { diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index ce4ca0fd321..7c31cb58fc2 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -46325,7 +46325,10 @@ func schema_k8sio_api_resource_v1alpha3_AllocatedDeviceStatus(ref common.Referen "conditions": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", + "x-kubernetes-list-map-keys": []interface{}{ + "type", + }, + "x-kubernetes-list-type": "map", }, }, SchemaProps: spec.SchemaProps{ @@ -46343,7 +46346,7 @@ func schema_k8sio_api_resource_v1alpha3_AllocatedDeviceStatus(ref common.Referen }, "data": { SchemaProps: spec.SchemaProps{ - Description: "Data contains arbitrary driver-specific data.", + Description: "Data contains arbitrary driver-specific data.\n\nThe length of the raw data must be smaller or equal to 10 Ki.", Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), }, }, @@ -47128,7 +47131,7 @@ func schema_k8sio_api_resource_v1alpha3_NetworkDeviceData(ref common.ReferenceCa Properties: map[string]spec.Schema{ "interfaceName": { SchemaProps: spec.SchemaProps{ - Description: "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + Description: "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface being configured in the pod.\n\nMust not be longer than 256 characters.", Type: []string{"string"}, Format: "", }, @@ -47155,7 +47158,7 @@ func schema_k8sio_api_resource_v1alpha3_NetworkDeviceData(ref common.ReferenceCa }, "hardwareAddress": { SchemaProps: spec.SchemaProps{ - Description: "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + Description: "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.\n\nMust not be longer than 128 characters.", Type: []string{"string"}, Format: "", }, @@ -47796,7 +47799,10 @@ func schema_k8sio_api_resource_v1beta1_AllocatedDeviceStatus(ref common.Referenc "conditions": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", + "x-kubernetes-list-map-keys": []interface{}{ + "type", + }, + "x-kubernetes-list-type": "map", }, }, SchemaProps: spec.SchemaProps{ @@ -47814,7 +47820,7 @@ func schema_k8sio_api_resource_v1beta1_AllocatedDeviceStatus(ref common.Referenc }, "data": { SchemaProps: spec.SchemaProps{ - Description: "Data contains arbitrary driver-specific data.", + Description: "Data contains arbitrary driver-specific data.\n\nThe length of the raw data must be smaller or equal to 10 Ki.", Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), }, }, @@ -48622,7 +48628,7 @@ func schema_k8sio_api_resource_v1beta1_NetworkDeviceData(ref common.ReferenceCal Properties: map[string]spec.Schema{ "interfaceName": { SchemaProps: spec.SchemaProps{ - Description: "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + Description: "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface being configured in the pod.\n\nMust not be longer than 256 characters.", Type: []string{"string"}, Format: "", }, @@ -48649,7 +48655,7 @@ func schema_k8sio_api_resource_v1beta1_NetworkDeviceData(ref common.ReferenceCal }, "hardwareAddress": { SchemaProps: spec.SchemaProps{ - Description: "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + Description: "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.\n\nMust not be longer than 128 characters.", Type: []string{"string"}, Format: "", }, diff --git a/staging/src/k8s.io/api/resource/v1alpha3/generated.proto b/staging/src/k8s.io/api/resource/v1alpha3/generated.proto index 26ef30f604d..13be7cbd8ea 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/generated.proto +++ b/staging/src/k8s.io/api/resource/v1alpha3/generated.proto @@ -63,11 +63,14 @@ message AllocatedDeviceStatus { // config references, the `Ready` condition should be True. // // +optional - // +listType=atomic + // +listType=map + // +listMapKey=type repeated .k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 4; // Data contains arbitrary driver-specific data. // + // The length of the raw data must be smaller or equal to 10 Ki. + // // +optional optional .k8s.io.apimachinery.pkg.runtime.RawExtension data = 5; @@ -533,7 +536,9 @@ message DeviceSelector { message NetworkDeviceData { // InterfaceName specifies the name of the network interface associated with // the allocated device. This might be the name of a physical or virtual - // network interface. + // network interface being configured in the pod. + // + // Must not be longer than 256 characters. // // +optional optional string interfaceName = 1; @@ -550,6 +555,8 @@ message NetworkDeviceData { // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. // + // Must not be longer than 128 characters. + // // +optional optional string hardwareAddress = 3; } diff --git a/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go b/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go index ac517b69810..1a71d64c10d 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go @@ -33,7 +33,7 @@ var map_AllocatedDeviceStatus = map[string]string{ "pool": "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", "device": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", "conditions": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", - "data": "Data contains arbitrary driver-specific data.", + "data": "Data contains arbitrary driver-specific data.\n\nThe length of the raw data must be smaller or equal to 10 Ki.", "networkData": "NetworkData contains network-related information specific to the device.", } @@ -227,9 +227,9 @@ func (DeviceSelector) SwaggerDoc() map[string]string { var map_NetworkDeviceData = map[string]string{ "": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", - "interfaceName": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "interfaceName": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface being configured in the pod.\n\nMust not be longer than 256 characters.", "ips": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", - "hardwareAddress": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + "hardwareAddress": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.\n\nMust not be longer than 128 characters.", } func (NetworkDeviceData) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/resource/v1beta1/generated.proto b/staging/src/k8s.io/api/resource/v1beta1/generated.proto index 869af6a03cb..6d525d5b856 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/resource/v1beta1/generated.proto @@ -63,11 +63,14 @@ message AllocatedDeviceStatus { // config references, the `Ready` condition should be True. // // +optional - // +listType=atomic + // +listType=map + // +listMapKey=type repeated .k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 4; // Data contains arbitrary driver-specific data. // + // The length of the raw data must be smaller or equal to 10 Ki. + // // +optional optional .k8s.io.apimachinery.pkg.runtime.RawExtension data = 5; @@ -541,7 +544,9 @@ message DeviceSelector { message NetworkDeviceData { // InterfaceName specifies the name of the network interface associated with // the allocated device. This might be the name of a physical or virtual - // network interface. + // network interface being configured in the pod. + // + // Must not be longer than 256 characters. // // +optional optional string interfaceName = 1; @@ -558,6 +563,8 @@ message NetworkDeviceData { // HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface. // + // Must not be longer than 128 characters. + // // +optional optional string hardwareAddress = 3; } diff --git a/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go index 20aebf75740..1d0176cbcae 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go @@ -33,7 +33,7 @@ var map_AllocatedDeviceStatus = map[string]string{ "pool": "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", "device": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", "conditions": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", - "data": "Data contains arbitrary driver-specific data.", + "data": "Data contains arbitrary driver-specific data.\n\nThe length of the raw data must be smaller or equal to 10 Ki.", "networkData": "NetworkData contains network-related information specific to the device.", } @@ -236,9 +236,9 @@ func (DeviceSelector) SwaggerDoc() map[string]string { var map_NetworkDeviceData = map[string]string{ "": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", - "interfaceName": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface.", + "interfaceName": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface being configured in the pod.\n\nMust not be longer than 256 characters.", "ips": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", - "hardwareAddress": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.", + "hardwareAddress": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.\n\nMust not be longer than 128 characters.", } func (NetworkDeviceData) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go b/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go index 488a3ae1306..a9c0e1598d8 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go @@ -12361,7 +12361,9 @@ var schemaYAML = typed.YAMLObject(`types: list: elementType: namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition - elementRelationship: atomic + elementRelationship: associative + keys: + - type - name: data type: namedType: __untyped_atomic_ @@ -12792,7 +12794,9 @@ var schemaYAML = typed.YAMLObject(`types: list: elementType: namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition - elementRelationship: atomic + elementRelationship: associative + keys: + - type - name: data type: namedType: __untyped_atomic_