From 91d7882e867da25ae8014f679db32b20e35e89b4 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Tue, 18 Jun 2024 17:47:29 +0200 Subject: [PATCH] DRA: new API for 1.31 This is a complete revamp of the original API. Some of the key differences: - refocused on structured parameters and allocating devices - support for constraints across devices - support for allocating "all" or a fixed amount of similar devices in a single request - no class for ResourceClaims, instead individual device requests are associated with a mandatory DeviceClass For the sake of simplicity, optional basic types (ints, strings) where the null value is the default are represented as values in the API types. This makes Go code simpler because it doesn't have to check for nil (consumers) and values can be set directly (producers). The effect is that in protobuf, these fields always get encoded because `opt` only has an effect for pointers. The roundtrip test data for v1.29.0 and v1.30.0 changes because of the new "request" field. This is considered acceptable because the entire `claims` field in the pod spec is still alpha. The implementation is complete enough to bring up the apiserver. Adapting other components follows. --- api/api-rules/violation_exceptions.list | 11 +- api/discovery/aggregated_v2.json | 80 +- api/discovery/aggregated_v2beta1.json | 80 +- .../apis__resource.k8s.io__v1alpha3.json | 68 +- api/openapi-spec/swagger.json | 3809 ++----- api/openapi-spec/v3/api__v1_openapi.json | 9 +- ...issionregistration.k8s.io__v1_openapi.json | 5 - ...registration.k8s.io__v1alpha1_openapi.json | 5 - ...nregistration.k8s.io__v1beta1_openapi.json | 5 - ...pis__apiextensions.k8s.io__v1_openapi.json | 5 - ...s__apiregistration.k8s.io__v1_openapi.json | 5 - .../v3/apis__apps__v1_openapi.json | 9 +- .../v3/apis__autoscaling__v1_openapi.json | 5 - .../v3/apis__autoscaling__v2_openapi.json | 5 - .../v3/apis__batch__v1_openapi.json | 9 +- ...apis__certificates.k8s.io__v1_openapi.json | 5 - ...certificates.k8s.io__v1alpha1_openapi.json | 5 - ...apis__coordination.k8s.io__v1_openapi.json | 5 - .../apis__discovery.k8s.io__v1_openapi.json | 5 - .../v3/apis__events.k8s.io__v1_openapi.json | 5 - ...wcontrol.apiserver.k8s.io__v1_openapi.json | 5 - ...rol.apiserver.k8s.io__v1beta3_openapi.json | 5 - ...al.apiserver.k8s.io__v1alpha1_openapi.json | 5 - .../apis__networking.k8s.io__v1_openapi.json | 5 - ...s__networking.k8s.io__v1beta1_openapi.json | 5 - .../v3/apis__node.k8s.io__v1_openapi.json | 5 - .../v3/apis__policy__v1_openapi.json | 5 - ...rbac.authorization.k8s.io__v1_openapi.json | 5 - ...is__resource.k8s.io__v1alpha3_openapi.json | 6364 +++-------- .../apis__scheduling.k8s.io__v1_openapi.json | 5 - .../v3/apis__storage.k8s.io__v1_openapi.json | 5 - ...pis__storage.k8s.io__v1alpha1_openapi.json | 5 - ...agemigration.k8s.io__v1alpha1_openapi.json | 5 - hack/update-codegen.sh | 2 +- pkg/api/testing/defaulting_test.go | 4 + pkg/apis/core/types.go | 7 + pkg/apis/core/v1/zz_generated.conversion.go | 2 + pkg/apis/core/validation/validation.go | 28 +- pkg/apis/core/validation/validation_test.go | 50 + pkg/apis/resource/fuzzer/fuzzer.go | 36 +- pkg/apis/resource/namedresources.go | 112 - pkg/apis/resource/register.go | 8 +- .../namedresources/validation/validation.go | 178 - .../validation/validation_test.go | 188 - pkg/apis/resource/types.go | 1117 +- pkg/apis/resource/v1alpha3/conversion.go | 3 +- pkg/apis/resource/v1alpha3/defaults.go | 11 + pkg/apis/resource/v1alpha3/defaults_test.go | 86 + .../v1alpha3/zz_generated.conversion.go | 1416 +-- .../v1alpha3/zz_generated.defaults.go | 35 + pkg/apis/resource/validation/validation.go | 960 +- .../validation/validation_deviceclass_test.go | 247 + .../validation_resourceclaim_test.go | 477 +- ...validation_resourceclaimparameters_test.go | 306 - .../validation_resourceclaimtemplate_test.go | 133 +- .../validation_resourceclass_test.go | 301 - ...validation_resourceclassparameters_test.go | 313 - .../validation_resourceslice_test.go | 53 +- pkg/apis/resource/zz_generated.deepcopy.go | 943 +- pkg/generated/openapi/zz_generated.openapi.go | 1957 ++-- pkg/kubelet/cm/dra/state/state_checkpoint.go | 4 - .../cm/dra/state/zz_generated.deepcopy.go | 8 - pkg/printers/internalversion/printers.go | 100 +- .../storage/storage.go | 20 +- .../storage/storage_test.go | 35 +- pkg/registry/resource/deviceclass/strategy.go | 85 + .../strategy_test.go | 31 +- .../resourceclaim/storage/storage_test.go | 11 +- .../resource/resourceclaim/strategy.go | 8 +- .../resource/resourceclaim/strategy_test.go | 3 - .../storage/storage.go | 57 - .../storage/storage_test.go | 145 - .../resourceclaimparameters/strategy.go | 103 - .../resourceclaimparameters/strategy_test.go | 81 - .../storage/storage_test.go | 7 +- .../resourceclaimtemplate/strategy.go | 6 +- .../resourceclaimtemplate/strategy_test.go | 5 - .../resource/resourceclass/strategy.go | 75 - .../storage/storage.go | 57 - .../storage/storage_test.go | 145 - .../resourceclassparameters/strategy.go | 103 - .../resourceclassparameters/strategy_test.go | 81 - .../resourceslice/storage/storage_test.go | 13 +- .../resource/resourceslice/strategy.go | 24 +- .../resource/resourceslice/strategy_test.go | 35 +- .../resource/rest/storage_resource.go | 26 +- .../dynamicresources/dynamicresources_test.go | 19 - .../dynamicresources/structuredparameters.go | 49 +- .../admission/noderestriction/admission.go | 4 +- .../noderestriction/admission_test.go | 51 +- .../auth/authorizer/node/graph_populator.go | 2 +- .../auth/authorizer/node/node_authorizer.go | 2 +- .../authorizer/node/node_authorizer_test.go | 16 +- .../authorizer/rbac/bootstrappolicy/policy.go | 4 +- .../src/k8s.io/api/core/v1/generated.pb.go | 2031 ++-- .../src/k8s.io/api/core/v1/generated.proto | 7 + staging/src/k8s.io/api/core/v1/types.go | 7 + .../core/v1/types_swagger_doc_generated.go | 5 +- .../api/resource/v1alpha3/generated.pb.go | 9405 +++++++---------- .../api/resource/v1alpha3/generated.proto | 1058 +- .../api/resource/v1alpha3/namedresources.go | 127 - .../k8s.io/api/resource/v1alpha3/register.go | 11 +- .../src/k8s.io/api/resource/v1alpha3/types.go | 1179 ++- .../v1alpha3/types_swagger_doc_generated.go | 408 +- .../v1alpha3/zz_generated.deepcopy.go | 935 +- .../api/testdata/HEAD/apps.v1.DaemonSet.json | 9 +- .../api/testdata/HEAD/apps.v1.DaemonSet.pb | Bin 10870 -> 10912 bytes .../api/testdata/HEAD/apps.v1.DaemonSet.yaml | 3 + .../api/testdata/HEAD/apps.v1.Deployment.json | 9 +- .../api/testdata/HEAD/apps.v1.Deployment.pb | Bin 10883 -> 10925 bytes .../api/testdata/HEAD/apps.v1.Deployment.yaml | 3 + .../api/testdata/HEAD/apps.v1.ReplicaSet.json | 9 +- .../api/testdata/HEAD/apps.v1.ReplicaSet.pb | Bin 10800 -> 10842 bytes .../api/testdata/HEAD/apps.v1.ReplicaSet.yaml | 3 + .../testdata/HEAD/apps.v1.StatefulSet.json | 9 +- .../api/testdata/HEAD/apps.v1.StatefulSet.pb | Bin 11971 -> 12013 bytes .../testdata/HEAD/apps.v1.StatefulSet.yaml | 3 + .../HEAD/apps.v1beta1.Deployment.json | 9 +- .../testdata/HEAD/apps.v1beta1.Deployment.pb | Bin 10892 -> 10934 bytes .../HEAD/apps.v1beta1.Deployment.yaml | 3 + .../HEAD/apps.v1beta1.StatefulSet.json | 9 +- .../testdata/HEAD/apps.v1beta1.StatefulSet.pb | Bin 11976 -> 12018 bytes .../HEAD/apps.v1beta1.StatefulSet.yaml | 3 + .../testdata/HEAD/apps.v1beta2.DaemonSet.json | 9 +- .../testdata/HEAD/apps.v1beta2.DaemonSet.pb | Bin 10875 -> 10917 bytes .../testdata/HEAD/apps.v1beta2.DaemonSet.yaml | 3 + .../HEAD/apps.v1beta2.Deployment.json | 9 +- .../testdata/HEAD/apps.v1beta2.Deployment.pb | Bin 10888 -> 10930 bytes .../HEAD/apps.v1beta2.Deployment.yaml | 3 + .../HEAD/apps.v1beta2.ReplicaSet.json | 9 +- .../testdata/HEAD/apps.v1beta2.ReplicaSet.pb | Bin 10805 -> 10847 bytes .../HEAD/apps.v1beta2.ReplicaSet.yaml | 3 + .../HEAD/apps.v1beta2.StatefulSet.json | 9 +- .../testdata/HEAD/apps.v1beta2.StatefulSet.pb | Bin 11976 -> 12018 bytes .../HEAD/apps.v1beta2.StatefulSet.yaml | 3 + .../api/testdata/HEAD/batch.v1.CronJob.json | 9 +- .../api/testdata/HEAD/batch.v1.CronJob.pb | Bin 11463 -> 11505 bytes .../api/testdata/HEAD/batch.v1.CronJob.yaml | 3 + .../api/testdata/HEAD/batch.v1.Job.json | 9 +- .../k8s.io/api/testdata/HEAD/batch.v1.Job.pb | Bin 11089 -> 11131 bytes .../api/testdata/HEAD/batch.v1.Job.yaml | 3 + .../testdata/HEAD/batch.v1beta1.CronJob.json | 9 +- .../testdata/HEAD/batch.v1beta1.CronJob.pb | Bin 11468 -> 11510 bytes .../testdata/HEAD/batch.v1beta1.CronJob.yaml | 3 + .../k8s.io/api/testdata/HEAD/core.v1.Pod.json | 18 +- .../k8s.io/api/testdata/HEAD/core.v1.Pod.pb | Bin 11852 -> 11936 bytes .../k8s.io/api/testdata/HEAD/core.v1.Pod.yaml | 6 + .../HEAD/core.v1.PodStatusResult.json | 9 +- .../testdata/HEAD/core.v1.PodStatusResult.pb | Bin 1971 -> 2013 bytes .../HEAD/core.v1.PodStatusResult.yaml | 3 + .../testdata/HEAD/core.v1.PodTemplate.json | 9 +- .../api/testdata/HEAD/core.v1.PodTemplate.pb | Bin 10636 -> 10678 bytes .../testdata/HEAD/core.v1.PodTemplate.yaml | 3 + .../HEAD/core.v1.ReplicationController.json | 9 +- .../HEAD/core.v1.ReplicationController.pb | Bin 10758 -> 10800 bytes .../HEAD/core.v1.ReplicationController.yaml | 3 + .../HEAD/extensions.v1beta1.DaemonSet.json | 9 +- .../HEAD/extensions.v1beta1.DaemonSet.pb | Bin 10883 -> 10925 bytes .../HEAD/extensions.v1beta1.DaemonSet.yaml | 3 + .../HEAD/extensions.v1beta1.Deployment.json | 9 +- .../HEAD/extensions.v1beta1.Deployment.pb | Bin 10898 -> 10940 bytes .../HEAD/extensions.v1beta1.Deployment.yaml | 3 + .../HEAD/extensions.v1beta1.ReplicaSet.json | 9 +- .../HEAD/extensions.v1beta1.ReplicaSet.pb | Bin 10811 -> 10853 bytes .../HEAD/extensions.v1beta1.ReplicaSet.yaml | 3 + ...resource.k8s.io.v1alpha3.DeviceClass.json} | 63 +- ...> resource.k8s.io.v1alpha3.DeviceClass.pb} | Bin 633 -> 636 bytes ...resource.k8s.io.v1alpha3.DeviceClass.yaml} | 51 +- ...esource.k8s.io.v1alpha3.ResourceClaim.json | 134 +- .../resource.k8s.io.v1alpha3.ResourceClaim.pb | Bin 1008 -> 1056 bytes ...esource.k8s.io.v1alpha3.ResourceClaim.yaml | 84 +- ...k8s.io.v1alpha3.ResourceClaimParameters.pb | Bin 703 -> 0 bytes ...k8s.io.v1alpha3.ResourceClaimTemplate.json | 53 +- ...e.k8s.io.v1alpha3.ResourceClaimTemplate.pb | Bin 840 -> 1054 bytes ...k8s.io.v1alpha3.ResourceClaimTemplate.yaml | 32 +- ...esource.k8s.io.v1alpha3.ResourceClass.json | 78 - .../resource.k8s.io.v1alpha3.ResourceClass.pb | Bin 567 -> 0 bytes ...esource.k8s.io.v1alpha3.ResourceClass.yaml | 53 - ...s.io.v1alpha3.ResourceClassParameters.json | 75 - ...s.io.v1alpha3.ResourceClassParameters.yaml | 52 - ...esource.k8s.io.v1alpha3.ResourceSlice.json | 69 +- .../resource.k8s.io.v1alpha3.ResourceSlice.pb | Bin 529 -> 628 bytes ...esource.k8s.io.v1alpha3.ResourceSlice.yaml | 47 +- .../HEAD/resource.k8s.io.v1alpha3.Status.json | 28 - .../HEAD/resource.k8s.io.v1alpha3.Status.pb | Bin 234 -> 0 bytes .../HEAD/resource.k8s.io.v1alpha3.Status.yaml | 21 - .../apps.v1.DaemonSet.after_roundtrip.pb | Bin 10531 -> 10537 bytes .../apps.v1.Deployment.after_roundtrip.pb | Bin 10544 -> 10550 bytes .../apps.v1.ReplicaSet.after_roundtrip.pb | Bin 10461 -> 10467 bytes .../apps.v1.StatefulSet.after_roundtrip.pb | Bin 11632 -> 11638 bytes ...apps.v1beta1.Deployment.after_roundtrip.pb | Bin 10553 -> 10559 bytes ...pps.v1beta1.StatefulSet.after_roundtrip.pb | Bin 11637 -> 11643 bytes .../apps.v1beta2.DaemonSet.after_roundtrip.pb | Bin 10536 -> 10542 bytes ...apps.v1beta2.Deployment.after_roundtrip.pb | Bin 10549 -> 10555 bytes ...apps.v1beta2.ReplicaSet.after_roundtrip.pb | Bin 10466 -> 10472 bytes ...pps.v1beta2.StatefulSet.after_roundtrip.pb | Bin 11637 -> 11643 bytes .../batch.v1.CronJob.after_roundtrip.pb | Bin 11078 -> 11084 bytes .../v1.29.0/batch.v1.Job.after_roundtrip.pb | Bin 10704 -> 10710 bytes .../batch.v1beta1.CronJob.after_roundtrip.pb | Bin 11083 -> 11089 bytes .../v1.29.0/core.v1.Pod.after_roundtrip.pb | Bin 11318 -> 11330 bytes ...core.v1.PodStatusResult.after_roundtrip.pb | Bin 0 -> 1782 bytes .../core.v1.PodTemplate.after_roundtrip.pb | Bin 10297 -> 10303 bytes ...1.ReplicationController.after_roundtrip.pb | Bin 10419 -> 10425 bytes ...sions.v1beta1.DaemonSet.after_roundtrip.pb | Bin 10544 -> 10550 bytes ...ions.v1beta1.Deployment.after_roundtrip.pb | Bin 10559 -> 10565 bytes ...ions.v1beta1.ReplicaSet.after_roundtrip.pb | Bin 10472 -> 10478 bytes .../apps.v1.DaemonSet.after_roundtrip.pb | Bin 10747 -> 10753 bytes .../apps.v1.Deployment.after_roundtrip.pb | Bin 10760 -> 10766 bytes .../apps.v1.ReplicaSet.after_roundtrip.pb | Bin 10677 -> 10683 bytes .../apps.v1.StatefulSet.after_roundtrip.pb | Bin 11848 -> 11854 bytes ...apps.v1beta1.Deployment.after_roundtrip.pb | Bin 10769 -> 10775 bytes ...pps.v1beta1.StatefulSet.after_roundtrip.pb | Bin 11853 -> 11859 bytes .../apps.v1beta2.DaemonSet.after_roundtrip.pb | Bin 10752 -> 10758 bytes ...apps.v1beta2.Deployment.after_roundtrip.pb | Bin 10765 -> 10771 bytes ...apps.v1beta2.ReplicaSet.after_roundtrip.pb | Bin 10682 -> 10688 bytes ...pps.v1beta2.StatefulSet.after_roundtrip.pb | Bin 11853 -> 11859 bytes .../batch.v1.CronJob.after_roundtrip.pb | Bin 11340 -> 11346 bytes .../v1.30.0/batch.v1.Job.after_roundtrip.pb | Bin 10966 -> 10972 bytes .../batch.v1beta1.CronJob.after_roundtrip.pb | Bin 11345 -> 11351 bytes .../v1.30.0/core.v1.Pod.after_roundtrip.pb | Bin 11699 -> 11711 bytes ...core.v1.PodStatusResult.after_roundtrip.pb | Bin 0 -> 1947 bytes .../core.v1.PodTemplate.after_roundtrip.pb | Bin 10513 -> 10519 bytes ...1.ReplicationController.after_roundtrip.pb | Bin 10635 -> 10641 bytes ...sions.v1beta1.DaemonSet.after_roundtrip.pb | Bin 10760 -> 10766 bytes ...ions.v1beta1.Deployment.after_roundtrip.pb | Bin 10775 -> 10781 bytes ...ions.v1beta1.ReplicaSet.after_roundtrip.pb | Bin 10688 -> 10694 bytes .../core/v1/resourceclaim.go | 11 +- .../applyconfigurations/internal/internal.go | 465 +- .../resource/v1alpha3/allocationresult.go | 36 +- .../v1alpha3/allocationresultmodel.go | 39 - .../resource/v1alpha3/basicdevice.go | 65 + ...esourcesfilter.go => celdeviceselector.go} | 20 +- ...resourcesallocationresult.go => device.go} | 23 +- .../v1alpha3/deviceallocationconfiguration.go | 63 + .../v1alpha3/deviceallocationresult.go | 58 + .../resource/v1alpha3/deviceattribute.go | 66 + .../resource/v1alpha3/deviceclaim.go | 72 + .../v1alpha3/deviceclaimconfiguration.go | 50 + ...ourceclaimparameters.go => deviceclass.go} | 102 +- .../v1alpha3/deviceclassconfiguration.go | 39 + .../resource/v1alpha3/deviceclassspec.go | 71 + .../resource/v1alpha3/deviceconfiguration.go | 39 + .../resource/v1alpha3/deviceconstraint.go | 54 + .../resource/v1alpha3/devicerequest.go | 93 + .../v1alpha3/devicerequestallocationresult.go | 66 + .../resource/v1alpha3/deviceselector.go | 39 + .../v1alpha3/driverallocationresult.go | 52 - .../resource/v1alpha3/driverrequests.go | 66 - .../v1alpha3/namedresourcesattribute.go | 100 - .../v1alpha3/namedresourcesattributevalue.go | 97 - .../v1alpha3/namedresourcesinstance.go | 53 - .../v1alpha3/namedresourcesintslice.go | 41 - .../v1alpha3/namedresourcesrequest.go | 39 - .../v1alpha3/namedresourcesresources.go | 44 - .../v1alpha3/namedresourcesstringslice.go | 41 - ...meters.go => opaquedeviceconfiguration.go} | 22 +- .../resourceclaimparametersreference.go | 57 - .../resource/v1alpha3/resourceclaimspec.go | 20 +- .../resource/v1alpha3/resourceclaimstatus.go | 9 - .../resource/v1alpha3/resourceclass.go | 281 - .../v1alpha3/resourceclassparameters.go | 283 - .../resourceclassparametersreference.go | 66 - .../resource/v1alpha3/resourcefilter.go | 48 - .../resource/v1alpha3/resourcefiltermodel.go | 39 - .../resource/v1alpha3/resourcehandle.go | 57 - .../resource/v1alpha3/resourcemodel.go | 39 - .../resource/v1alpha3/resourcepool.go | 57 + .../resource/v1alpha3/resourcerequest.go | 52 - .../resource/v1alpha3/resourcerequestmodel.go | 39 - .../resource/v1alpha3/resourceslice.go | 28 +- .../resource/v1alpha3/resourceslicespec.go | 93 + .../v1alpha3/structuredresourcehandle.go | 75 - .../client-go/applyconfigurations/utils.go | 88 +- .../src/k8s.io/client-go/informers/generic.go | 8 +- .../{resourceclass.go => deviceclass.go} | 38 +- .../informers/resource/v1alpha3/interface.go | 28 +- .../v1alpha3/resourceclaimparameters.go | 90 - .../v1alpha3/resourceclassparameters.go | 90 - .../typed/resource/v1alpha3/deviceclass.go | 69 + .../v1alpha3/fake/fake_deviceclass.go | 151 + .../v1alpha3/fake/fake_resource_client.go | 16 +- .../fake/fake_resourceclaimparameters.go | 160 - .../v1alpha3/fake/fake_resourceclass.go | 151 - .../fake/fake_resourceclassparameters.go | 160 - .../resource/v1alpha3/generated_expansion.go | 8 +- .../resource/v1alpha3/resource_client.go | 20 +- .../v1alpha3/resourceclaimparameters.go | 69 - .../typed/resource/v1alpha3/resourceclass.go | 69 - .../v1alpha3/resourceclassparameters.go | 69 - .../{resourceclass.go => deviceclass.go} | 26 +- .../resource/v1alpha3/expansion_generated.go | 24 +- .../v1alpha3/resourceclaimparameters.go | 70 - .../v1alpha3/resourceclassparameters.go | 70 - .../cel/compile.go | 295 + .../cel/compile_test.go | 212 + .../namedresources => }/cel/semver.go | 0 .../namedresources => }/cel/semver_test.go | 2 +- .../namedresources => }/cel/semverlib.go | 0 .../resourceclaim/resourceclaim.go | 10 +- .../structured/namedresources/cel/compile.go | 243 - .../namedresources/cel/compile_test.go | 155 - .../apiserver/apply/reset_fields_test.go | 6 +- .../apiserver/apply/status_test.go | 2 +- .../cel/authorizerselector/helper.go | 33 +- test/integration/auth/node_test.go | 13 +- test/integration/etcd/data.go | 20 +- 306 files changed, 16480 insertions(+), 26466 deletions(-) delete mode 100644 pkg/apis/resource/namedresources.go delete mode 100644 pkg/apis/resource/structured/namedresources/validation/validation.go delete mode 100644 pkg/apis/resource/structured/namedresources/validation/validation_test.go create mode 100644 pkg/apis/resource/v1alpha3/defaults_test.go create mode 100644 pkg/apis/resource/validation/validation_deviceclass_test.go delete mode 100644 pkg/apis/resource/validation/validation_resourceclaimparameters_test.go delete mode 100644 pkg/apis/resource/validation/validation_resourceclass_test.go delete mode 100644 pkg/apis/resource/validation/validation_resourceclassparameters_test.go rename pkg/registry/resource/{resourceclass => deviceclass}/storage/storage.go (75%) rename pkg/registry/resource/{resourceclass => deviceclass}/storage/storage_test.go (83%) create mode 100644 pkg/registry/resource/deviceclass/strategy.go rename pkg/registry/resource/{resourceclass => deviceclass}/strategy_test.go (67%) delete mode 100644 pkg/registry/resource/resourceclaimparameters/storage/storage.go delete mode 100644 pkg/registry/resource/resourceclaimparameters/storage/storage_test.go delete mode 100644 pkg/registry/resource/resourceclaimparameters/strategy.go delete mode 100644 pkg/registry/resource/resourceclaimparameters/strategy_test.go delete mode 100644 pkg/registry/resource/resourceclass/strategy.go delete mode 100644 pkg/registry/resource/resourceclassparameters/storage/storage.go delete mode 100644 pkg/registry/resource/resourceclassparameters/storage/storage_test.go delete mode 100644 pkg/registry/resource/resourceclassparameters/strategy.go delete mode 100644 pkg/registry/resource/resourceclassparameters/strategy_test.go delete mode 100644 staging/src/k8s.io/api/resource/v1alpha3/namedresources.go rename staging/src/k8s.io/api/testdata/HEAD/{resource.k8s.io.v1alpha3.ResourceClaimParameters.json => resource.k8s.io.v1alpha3.DeviceClass.json} (65%) rename staging/src/k8s.io/api/testdata/HEAD/{resource.k8s.io.v1alpha3.ResourceClassParameters.pb => resource.k8s.io.v1alpha3.DeviceClass.pb} (63%) rename staging/src/k8s.io/api/testdata/HEAD/{resource.k8s.io.v1alpha3.ResourceClaimParameters.yaml => resource.k8s.io.v1alpha3.DeviceClass.yaml} (60%) delete mode 100644 staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaimParameters.pb delete mode 100644 staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClass.json delete mode 100644 staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClass.pb delete mode 100644 staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClass.yaml delete mode 100644 staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClassParameters.json delete mode 100644 staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClassParameters.yaml delete mode 100644 staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.Status.json delete mode 100644 staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.Status.pb delete mode 100644 staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.Status.yaml create mode 100644 staging/src/k8s.io/api/testdata/v1.29.0/core.v1.PodStatusResult.after_roundtrip.pb create mode 100644 staging/src/k8s.io/api/testdata/v1.30.0/core.v1.PodStatusResult.after_roundtrip.pb delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/allocationresultmodel.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/basicdevice.go rename staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/{namedresourcesfilter.go => celdeviceselector.go} (50%) rename staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/{namedresourcesallocationresult.go => device.go} (51%) create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceallocationconfiguration.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceallocationresult.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceattribute.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclaim.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclaimconfiguration.go rename staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/{resourceclaimparameters.go => deviceclass.go} (59%) create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclassconfiguration.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclassspec.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceconfiguration.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceconstraint.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/devicerequest.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/devicerequestallocationresult.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceselector.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/driverallocationresult.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/driverrequests.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesattribute.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesattributevalue.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesinstance.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesintslice.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesrequest.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesresources.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesstringslice.go rename staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/{vendorparameters.go => opaquedeviceconfiguration.go} (55%) delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimparametersreference.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclass.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclassparameters.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclassparametersreference.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcefilter.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcefiltermodel.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcehandle.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcemodel.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcepool.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcerequest.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcerequestmodel.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceslicespec.go delete mode 100644 staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/structuredresourcehandle.go rename staging/src/k8s.io/client-go/informers/resource/v1alpha3/{resourceclass.go => deviceclass.go} (55%) delete mode 100644 staging/src/k8s.io/client-go/informers/resource/v1alpha3/resourceclaimparameters.go delete mode 100644 staging/src/k8s.io/client-go/informers/resource/v1alpha3/resourceclassparameters.go create mode 100644 staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/deviceclass.go create mode 100644 staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_deviceclass.go delete mode 100644 staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclaimparameters.go delete mode 100644 staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclass.go delete mode 100644 staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclassparameters.go delete mode 100644 staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclaimparameters.go delete mode 100644 staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclass.go delete mode 100644 staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclassparameters.go rename staging/src/k8s.io/client-go/listers/resource/v1alpha3/{resourceclass.go => deviceclass.go} (55%) delete mode 100644 staging/src/k8s.io/client-go/listers/resource/v1alpha3/resourceclaimparameters.go delete mode 100644 staging/src/k8s.io/client-go/listers/resource/v1alpha3/resourceclassparameters.go create mode 100644 staging/src/k8s.io/dynamic-resource-allocation/cel/compile.go create mode 100644 staging/src/k8s.io/dynamic-resource-allocation/cel/compile_test.go rename staging/src/k8s.io/dynamic-resource-allocation/{structured/namedresources => }/cel/semver.go (100%) rename staging/src/k8s.io/dynamic-resource-allocation/{structured/namedresources => }/cel/semver_test.go (98%) rename staging/src/k8s.io/dynamic-resource-allocation/{structured/namedresources => }/cel/semverlib.go (100%) delete mode 100644 staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/compile.go delete mode 100644 staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/compile_test.go diff --git a/api/api-rules/violation_exceptions.list b/api/api-rules/violation_exceptions.list index 4940563397f..fc4997fad70 100644 --- a/api/api-rules/violation_exceptions.list +++ b/api/api-rules/violation_exceptions.list @@ -52,13 +52,10 @@ API rule violation: names_match,k8s.io/api/core/v1,VolumeSource,CephFS API rule violation: names_match,k8s.io/api/core/v1,VolumeSource,StorageOS API rule violation: names_match,k8s.io/api/networking/v1alpha1,ServiceCIDRSpec,CIDRs API rule violation: names_match,k8s.io/api/networking/v1beta1,ServiceCIDRSpec,CIDRs -API rule violation: names_match,k8s.io/api/resource/v1alpha3,NamedResourcesAttributeValue,BoolValue -API rule violation: names_match,k8s.io/api/resource/v1alpha3,NamedResourcesAttributeValue,IntSliceValue -API rule violation: names_match,k8s.io/api/resource/v1alpha3,NamedResourcesAttributeValue,IntValue -API rule violation: names_match,k8s.io/api/resource/v1alpha3,NamedResourcesAttributeValue,QuantityValue -API rule violation: names_match,k8s.io/api/resource/v1alpha3,NamedResourcesAttributeValue,StringSliceValue -API rule violation: names_match,k8s.io/api/resource/v1alpha3,NamedResourcesAttributeValue,StringValue -API rule violation: names_match,k8s.io/api/resource/v1alpha3,NamedResourcesAttributeValue,VersionValue +API rule violation: names_match,k8s.io/api/resource/v1alpha3,DeviceAttribute,BoolValue +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/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 diff --git a/api/discovery/aggregated_v2.json b/api/discovery/aggregated_v2.json index a142fb394c1..33ada3450e4 100644 --- a/api/discovery/aggregated_v2.json +++ b/api/discovery/aggregated_v2.json @@ -1891,6 +1891,26 @@ { "freshness": "Current", "resources": [ + { + "resource": "deviceclasses", + "responseKind": { + "group": "", + "kind": "DeviceClass", + "version": "" + }, + "scope": "Cluster", + "singularResource": "deviceclass", + "verbs": [ + "create", + "delete", + "deletecollection", + "get", + "list", + "patch", + "update", + "watch" + ] + }, { "resource": "podschedulingcontexts", "responseKind": { @@ -1926,26 +1946,6 @@ "watch" ] }, - { - "resource": "resourceclaimparameters", - "responseKind": { - "group": "", - "kind": "ResourceClaimParameters", - "version": "" - }, - "scope": "Namespaced", - "singularResource": "resourceclaimparameters", - "verbs": [ - "create", - "delete", - "deletecollection", - "get", - "list", - "patch", - "update", - "watch" - ] - }, { "resource": "resourceclaims", "responseKind": { @@ -2001,46 +2001,6 @@ "watch" ] }, - { - "resource": "resourceclasses", - "responseKind": { - "group": "", - "kind": "ResourceClass", - "version": "" - }, - "scope": "Cluster", - "singularResource": "resourceclass", - "verbs": [ - "create", - "delete", - "deletecollection", - "get", - "list", - "patch", - "update", - "watch" - ] - }, - { - "resource": "resourceclassparameters", - "responseKind": { - "group": "", - "kind": "ResourceClassParameters", - "version": "" - }, - "scope": "Namespaced", - "singularResource": "resourceclassparameters", - "verbs": [ - "create", - "delete", - "deletecollection", - "get", - "list", - "patch", - "update", - "watch" - ] - }, { "resource": "resourceslices", "responseKind": { diff --git a/api/discovery/aggregated_v2beta1.json b/api/discovery/aggregated_v2beta1.json index 2f703476bcc..f9fed0bd40b 100644 --- a/api/discovery/aggregated_v2beta1.json +++ b/api/discovery/aggregated_v2beta1.json @@ -1891,6 +1891,26 @@ { "freshness": "Current", "resources": [ + { + "resource": "deviceclasses", + "responseKind": { + "group": "", + "kind": "DeviceClass", + "version": "" + }, + "scope": "Cluster", + "singularResource": "deviceclass", + "verbs": [ + "create", + "delete", + "deletecollection", + "get", + "list", + "patch", + "update", + "watch" + ] + }, { "resource": "podschedulingcontexts", "responseKind": { @@ -1926,26 +1946,6 @@ "watch" ] }, - { - "resource": "resourceclaimparameters", - "responseKind": { - "group": "", - "kind": "ResourceClaimParameters", - "version": "" - }, - "scope": "Namespaced", - "singularResource": "resourceclaimparameters", - "verbs": [ - "create", - "delete", - "deletecollection", - "get", - "list", - "patch", - "update", - "watch" - ] - }, { "resource": "resourceclaims", "responseKind": { @@ -2001,46 +2001,6 @@ "watch" ] }, - { - "resource": "resourceclasses", - "responseKind": { - "group": "", - "kind": "ResourceClass", - "version": "" - }, - "scope": "Cluster", - "singularResource": "resourceclass", - "verbs": [ - "create", - "delete", - "deletecollection", - "get", - "list", - "patch", - "update", - "watch" - ] - }, - { - "resource": "resourceclassparameters", - "responseKind": { - "group": "", - "kind": "ResourceClassParameters", - "version": "" - }, - "scope": "Namespaced", - "singularResource": "resourceclassparameters", - "verbs": [ - "create", - "delete", - "deletecollection", - "get", - "list", - "patch", - "update", - "watch" - ] - }, { "resource": "resourceslices", "responseKind": { diff --git a/api/discovery/apis__resource.k8s.io__v1alpha3.json b/api/discovery/apis__resource.k8s.io__v1alpha3.json index cbb3d46e8d9..535ae34c33f 100644 --- a/api/discovery/apis__resource.k8s.io__v1alpha3.json +++ b/api/discovery/apis__resource.k8s.io__v1alpha3.json @@ -3,6 +3,23 @@ "groupVersion": "resource.k8s.io/v1alpha3", "kind": "APIResourceList", "resources": [ + { + "kind": "DeviceClass", + "name": "deviceclasses", + "namespaced": false, + "singularName": "deviceclass", + "storageVersionHash": "12soGlw2WzE=", + "verbs": [ + "create", + "delete", + "deletecollection", + "get", + "list", + "patch", + "update", + "watch" + ] + }, { "kind": "PodSchedulingContext", "name": "podschedulingcontexts", @@ -31,23 +48,6 @@ "update" ] }, - { - "kind": "ResourceClaimParameters", - "name": "resourceclaimparameters", - "namespaced": true, - "singularName": "resourceclaimparameters", - "storageVersionHash": "42WVd9cucrU=", - "verbs": [ - "create", - "delete", - "deletecollection", - "get", - "list", - "patch", - "update", - "watch" - ] - }, { "kind": "ResourceClaim", "name": "resourceclaims", @@ -93,40 +93,6 @@ "watch" ] }, - { - "kind": "ResourceClass", - "name": "resourceclasses", - "namespaced": false, - "singularName": "resourceclass", - "storageVersionHash": "gv35DluSP3c=", - "verbs": [ - "create", - "delete", - "deletecollection", - "get", - "list", - "patch", - "update", - "watch" - ] - }, - { - "kind": "ResourceClassParameters", - "name": "resourceclassparameters", - "namespaced": true, - "singularName": "resourceclassparameters", - "storageVersionHash": "369PrU9Yi/E=", - "verbs": [ - "create", - "delete", - "deletecollection", - "get", - "list", - "patch", - "update", - "watch" - ] - }, { "kind": "ResourceSlice", "name": "resourceslices", diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 7e19e384cbd..e3e0cd72228 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -10469,6 +10469,10 @@ "name": { "description": "Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.", "type": "string" + }, + "request": { + "description": "Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request.", + "type": "string" } }, "required": [ @@ -15057,62 +15061,63 @@ "io.k8s.api.resource.v1alpha3.AllocationResult": { "description": "AllocationResult contains attributes of an allocated resource.", "properties": { - "availableOnNodes": { - "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelector", - "description": "This field will get set by the resource driver after it has allocated the resource to inform the scheduler where it can schedule Pods using the ResourceClaim.\n\nSetting this field is optional. If null, the resource is available everywhere." - }, - "resourceHandles": { - "description": "ResourceHandles contain the state associated with an allocation that should be maintained throughout the lifetime of a claim. Each ResourceHandle contains data that should be passed to a specific kubelet plugin once it lands on a node. This data is returned by the driver after a successful allocation and is opaque to Kubernetes. Driver documentation may explain to users how to interpret this data if needed.\n\nSetting this field is optional. It has a maximum size of 32 entries. If null (or empty), it is assumed this allocation will be processed by a single kubelet plugin with no ResourceHandle data attached. The name of the kubelet plugin invoked will match the DriverName set in the ResourceClaimStatus this AllocationResult is embedded in.", - "items": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceHandle" - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - } - }, - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.DriverAllocationResult": { - "description": "DriverAllocationResult contains vendor parameters and the allocation result for one request.", - "properties": { - "namedResources": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.NamedResourcesAllocationResult", - "description": "NamedResources describes the allocation result when using the named resources model." - }, - "vendorRequestParameters": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", - "description": "VendorRequestParameters are the per-request configuration parameters from the time that the claim was allocated." - } - }, - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.DriverRequests": { - "description": "DriverRequests describes all resources that are needed from one particular driver.", - "properties": { - "driverName": { - "description": "DriverName is the name used by the DRA driver kubelet plugin.", + "controller": { + "description": "Controller is the name of the DRA driver which handled the allocation. That driver is also responsible for deallocating the claim. It is empty when the claim can be deallocated without involving a driver.\n\nA driver may allocate devices provided by other drivers, so this driver name here can be different from the driver names listed for the results.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", "type": "string" }, - "requests": { - "description": "Requests describes all resources that are needed from the driver.", - "items": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceRequest" - }, - "type": "array", - "x-kubernetes-list-type": "atomic" + "devices": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceAllocationResult", + "description": "Devices is the result of allocating devices." }, - "vendorParameters": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", - "description": "VendorParameters are arbitrary setup parameters for all requests of the claim. They are ignored while allocating the claim." + "nodeSelector": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelector", + "description": "NodeSelector defines where the allocated resources are available. If unset, they are available everywhere." } }, "type": "object" }, - "io.k8s.api.resource.v1alpha3.NamedResourcesAllocationResult": { - "description": "NamedResourcesAllocationResult is used in AllocationResultModel.", + "io.k8s.api.resource.v1alpha3.BasicDevice": { + "description": "BasicDevice defines one device instance.", "properties": { + "attributes": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceAttribute" + }, + "description": "Attributes defines the set of attributes for this device. The name of each attribute must be unique in that set.\n\nThe maximum number of attributes and capacities combined is 32.", + "type": "object" + }, + "capacity": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Capacity defines the set of capacities for this device. The name of each capacity must be unique in that set.\n\nThe maximum number of attributes and capacities combined is 32.", + "type": "object" + } + }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.CELDeviceSelector": { + "description": "CELDeviceSelector contains a CEL expression for selecting a device.", + "properties": { + "expression": { + "description": "Expression is a CEL expression which evaluates a single device. It must evaluate to true when the device under consideration satisfies the desired criteria, and false when it does not. Any other result is an error and causes allocation of devices to abort.\n\nThe expression's input is an object named \"device\", which carries the following properties:\n - driver (string): the name of the driver which defines this device.\n - attributes (map[string]object): the device's attributes, grouped by prefix\n (e.g. device.attributes[\"dra.example.com\"] evaluates to an object with all\n of the attributes which were prefixed by \"dra.example.com\".\n - capacity (map[string]object): the device's capacities, grouped by prefix.\n\nExample: Consider a device with driver=\"dra.example.com\", which exposes two attributes named \"model\" and \"ext.example.com/family\" and which exposes one capacity named \"modules\". This input to this expression would have the following fields:\n\n device.driver\n device.attributes[\"dra.example.com\"].model\n device.attributes[\"ext.example.com\"].family\n device.capacity[\"dra.example.com\"].modules\n\nThe device.driver field can be used to check for a specific driver, either as a high-level precondition (i.e. you only want to consider devices from this driver) or as part of a multi-clause expression that is meant to consider devices from different drivers.\n\nThe value type of each attribute is defined by the device definition, and users who write these expressions must consult the documentation for their specific drivers. The value type of each capacity is Quantity.\n\nIf an unknown prefix is used as a lookup in either device.attributes or device.capacity, an empty map will be returned. Any reference to an unknown field will cause an evaluation error and allocation to abort.\n\nA robust expression should check for the existence of attributes before referencing them.\n\nFor ease of use, the cel.bind() function is enabled, and can be used to simplify expressions that access multiple attributes with the same domain. For example:\n\n cel.bind(dra, device.attributes[\"dra.example.com\"], dra.someBool && dra.anotherBool)", + "type": "string" + } + }, + "required": [ + "expression" + ], + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.Device": { + "description": "Device represents one individual hardware instance that can be selected based on its attributes. Besides the name, exactly one field must be set.", + "properties": { + "basic": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.BasicDevice", + "description": "Basic defines one device instance." + }, "name": { - "description": "Name is the name of the selected resource instance.", + "description": "Name is unique identifier among all devices managed by the driver in the pool. It must be a DNS label.", "type": "string" } }, @@ -15121,135 +15126,115 @@ ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.NamedResourcesAttribute": { - "description": "NamedResourcesAttribute is a combination of an attribute name and its value.", + "io.k8s.api.resource.v1alpha3.DeviceAllocationConfiguration": { + "description": "DeviceAllocationConfiguration gets embedded in an AllocationResult.", + "properties": { + "opaque": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration", + "description": "Opaque provides driver-specific configuration parameters." + }, + "requests": { + "description": "Requests lists the names of requests where the configuration applies. If empty, its applies to all requests.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "source": { + "description": "Source records whether the configuration comes from a class and thus is not something that a normal user would have been able to set or from a claim.", + "type": "string" + } + }, + "required": [ + "source" + ], + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceAllocationResult": { + "description": "DeviceAllocationResult is the result of allocating devices.", + "properties": { + "config": { + "description": "This field is a combination of all the claim and class configuration parameters. Drivers can distinguish between those based on a flag.\n\nThis includes configuration parameters for drivers which have no allocated devices in the result because it is up to the drivers which configuration parameters they support. They can silently ignore unknown configuration parameters.", + "items": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceAllocationConfiguration" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "results": { + "description": "Results lists all allocated devices.", + "items": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceRequestAllocationResult" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceAttribute": { + "description": "DeviceAttribute must have exactly one field set.", "properties": { "bool": { "description": "BoolValue is a true/false value.", "type": "boolean" }, "int": { - "description": "IntValue is a 64-bit integer.", + "description": "IntValue is a number.", "format": "int64", "type": "integer" }, - "intSlice": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.NamedResourcesIntSlice", - "description": "IntSliceValue is an array of 64-bit integers." - }, - "name": { - "description": "Name is unique identifier among all resource instances managed by the driver on the node. It must be a DNS subdomain.", - "type": "string" - }, - "quantity": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", - "description": "QuantityValue is a quantity." - }, "string": { - "description": "StringValue is a string.", + "description": "StringValue is a string. Must not be longer than 64 characters.", "type": "string" }, - "stringSlice": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.NamedResourcesStringSlice", - "description": "StringSliceValue is an array of strings." - }, "version": { - "description": "VersionValue is a semantic version according to semver.org spec 2.0.0.", + "description": "VersionValue is a semantic version according to semver.org spec 2.0.0. Must not be longer than 64 characters.", "type": "string" } }, - "required": [ - "name" - ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.NamedResourcesFilter": { - "description": "NamedResourcesFilter is used in ResourceFilterModel.", + "io.k8s.api.resource.v1alpha3.DeviceClaim": { + "description": "DeviceClaim defines how to request devices with a ResourceClaim.", "properties": { - "selector": { - "description": "Selector is a CEL expression which must evaluate to true if a resource instance is suitable. The language is as defined in https://kubernetes.io/docs/reference/using-api/cel/\n\nIn addition, for each type in NamedResourcesAttributeValue there is a map that resolves to the corresponding value of the instance under evaluation. For example:\n\n attributes.quantity[\"a\"].isGreaterThan(quantity(\"0\")) &&\n attributes.stringslice[\"b\"].isSorted()", - "type": "string" - } - }, - "required": [ - "selector" - ], - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.NamedResourcesInstance": { - "description": "NamedResourcesInstance represents one individual hardware instance that can be selected based on its attributes.", - "properties": { - "attributes": { - "description": "Attributes defines the attributes of this resource instance. The name of each attribute must be unique.", + "config": { + "description": "This field holds configuration for multiple potential drivers which could satisfy requests in this claim. It is ignored while allocating the claim.", "items": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.NamedResourcesAttribute" + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClaimConfiguration" }, "type": "array", "x-kubernetes-list-type": "atomic" }, - "name": { - "description": "Name is unique identifier among all resource instances managed by the driver on the node. It must be a DNS subdomain.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.NamedResourcesIntSlice": { - "description": "NamedResourcesIntSlice contains a slice of 64-bit integers.", - "properties": { - "ints": { - "description": "Ints is the slice of 64-bit integers.", + "constraints": { + "description": "These constraints must be satisfied by the set of devices that get allocated for the claim.", "items": { - "format": "int64", - "type": "integer" + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceConstraint" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "requests": { + "description": "Requests represent individual requests for distinct devices which must all be satisfied. If empty, nothing needs to be allocated.", + "items": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceRequest" }, "type": "array", "x-kubernetes-list-type": "atomic" } }, - "required": [ - "ints" - ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.NamedResourcesRequest": { - "description": "NamedResourcesRequest is used in ResourceRequestModel.", + "io.k8s.api.resource.v1alpha3.DeviceClaimConfiguration": { + "description": "DeviceClaimConfiguration is used for configuration parameters in DeviceClaim.", "properties": { - "selector": { - "description": "Selector is a CEL expression which must evaluate to true if a resource instance is suitable. The language is as defined in https://kubernetes.io/docs/reference/using-api/cel/\n\nIn addition, for each type NamedResourcesin AttributeValue there is a map that resolves to the corresponding value of the instance under evaluation. For example:\n\n attributes.quantity[\"a\"].isGreaterThan(quantity(\"0\")) &&\n attributes.stringslice[\"b\"].isSorted()", - "type": "string" - } - }, - "required": [ - "selector" - ], - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.NamedResourcesResources": { - "description": "NamedResourcesResources is used in ResourceModel.", - "properties": { - "instances": { - "description": "The list of all individual resources instances currently available.", - "items": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.NamedResourcesInstance" - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - } - }, - "required": [ - "instances" - ], - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.NamedResourcesStringSlice": { - "description": "NamedResourcesStringSlice contains a slice of strings.", - "properties": { - "strings": { - "description": "Strings is the slice of strings.", + "opaque": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration", + "description": "Opaque provides driver-specific configuration parameters." + }, + "requests": { + "description": "Requests lists the names of requests where the configuration applies. If empty, it applies to all requests.", "items": { "type": "string" }, @@ -15257,13 +15242,226 @@ "x-kubernetes-list-type": "atomic" } }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceClass": { + "description": "DeviceClass is a vendor- or admin-provided resource that contains device configuration and selectors. It can be referenced in the device requests of a claim to apply these presets. Cluster scoped.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClassSpec", + "description": "Spec defines what can be allocated and how to configure it.\n\nThis is mutable. Consumers have to be prepared for classes changing at any time, either because they get updated or replaced. Claim allocations are done once based on whatever was set in classes at the time of allocation.\n\nChanging the spec automatically increments the metadata.generation number." + } + }, "required": [ - "strings" + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + ] + }, + "io.k8s.api.resource.v1alpha3.DeviceClassConfiguration": { + "description": "DeviceClassConfiguration is used in DeviceClass.", + "properties": { + "opaque": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration", + "description": "Opaque provides driver-specific configuration parameters." + } + }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceClassList": { + "description": "DeviceClassList is a collection of classes.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of resource classes.", + "items": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "resource.k8s.io", + "kind": "DeviceClassList", + "version": "v1alpha3" + } + ] + }, + "io.k8s.api.resource.v1alpha3.DeviceClassSpec": { + "description": "DeviceClassSpec is used in a [DeviceClass] to define what can be allocated and how to configure it.", + "properties": { + "config": { + "description": "Config defines configuration parameters that apply to each device that is claimed via this class. Some classses may potentially be satisfied by multiple drivers, so each instance of a vendor configuration applies to exactly one driver.\n\nThey are passed to the driver, but are not considered while allocating the claim.", + "items": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClassConfiguration" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "selectors": { + "description": "Each selector must be satisfied by a device which is claimed via this class.", + "items": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceSelector" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "suitableNodes": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelector", + "description": "Only nodes matching the selector will be considered by the scheduler when trying to find a Node that fits a Pod when that Pod uses a claim that has not been allocated yet *and* that claim gets allocated through a control plane controller. It is ignored when the claim does not use a control plane controller for allocation.\n\nSetting this field is optional. If unset, all Nodes are candidates.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate." + } + }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceConstraint": { + "description": "DeviceConstraint must have exactly one field set besides Requests.", + "properties": { + "matchAttribute": { + "description": "MatchAttribute requires that all devices in question have this attribute and that its type and value are the same across those devices.\n\nFor example, if you specified \"dra.example.com/numa\" (a hypothetical example!), then only devices in the same NUMA node will be chosen. A device which does not have that attribute will not be chosen. All devices should use a value of the same type for this attribute because that is part of its specification, but if one device doesn't, then it also will not be chosen.\n\nMust include the domain qualifier.", + "type": "string" + }, + "requests": { + "description": "Requests is a list of the one or more requests in this claim which must co-satisfy this constraint. If a request is fulfilled by multiple devices, then all of the devices must satisfy the constraint. If this is not specified, this constraint applies to all requests in this claim.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceRequest": { + "description": "DeviceRequest is a request for devices required for a claim. This is typically a request for a single resource like a device, but can also ask for several identical devices.\n\nA DeviceClassName is currently required. Clients must check that it is indeed set. It's absence indicates that something changed in a way that is not supported by the client yet, in which case it must refuse to handle the request.", + "properties": { + "adminAccess": { + "description": "AdminAccess indicates that this is a claim for administrative access to the device(s). Claims with AdminAccess are expected to be used for monitoring or other management services for a device. They ignore all ordinary claims to the device with respect to access modes and any resource allocations.", + "type": "boolean" + }, + "allocationMode": { + "description": "AllocationMode and its related fields define how devices are allocated to satisfy this request. Supported values are:\n\n- ExactCount: This request is for a specific number of devices.\n This is the default. The exact number is provided in the\n count field.\n\n- All: This request is for all of the matching devices in a pool.\n Allocation will fail if some devices are already allocated,\n unless adminAccess is requested.\n\nIf AlloctionMode is not specified, the default mode is ExactCount. If the mode is ExactCount and count is not specified, the default count is one. Any other requests must specify this field.\n\nMore modes may get added in the future. Clients must refuse to handle requests with unknown modes.", + "type": "string" + }, + "count": { + "description": "Count is used only when the count mode is \"ExactCount\". Must be greater than zero. If AllocationMode is ExactCount and this field is not specified, the default is one.", + "format": "int64", + "type": "integer" + }, + "deviceClassName": { + "description": "DeviceClassName references a specific DeviceClass, which can define additional configuration and selectors to be inherited by this request.\n\nA class is required. Which classes are available depends on the cluster.\n\nAdministrators may use this to restrict which devices may get requested by only installing classes with selectors for permitted devices. If users are free to request anything without restrictions, then administrators can create an empty DeviceClass for users to reference.", + "type": "string" + }, + "name": { + "description": "Name can be used to reference this request in a pod.spec.containers[].resources.claims entry and in a constraint of the claim.\n\nMust be a DNS label.", + "type": "string" + }, + "selectors": { + "description": "Selectors define criteria which must be satisfied by a specific device in order for that device to be considered for this request. All selectors must be satisfied for a device to be considered.", + "items": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceSelector" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "name", + "deviceClassName" + ], + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceRequestAllocationResult": { + "description": "DeviceRequestAllocationResult contains the allocation result for one request.", + "properties": { + "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" + }, + "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" + }, + "request": { + "description": "Request is the name of the request in the claim which caused this device to be allocated. Multiple devices may have been allocated per request.", + "type": "string" + } + }, + "required": [ + "request", + "driver", + "pool", + "device" + ], + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceSelector": { + "description": "DeviceSelector must have exactly one field set.", + "properties": { + "cel": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.CELDeviceSelector", + "description": "CEL contains a CEL expression for selecting a device." + } + }, + "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": { + "driver": { + "description": "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.", + "type": "string" + }, + "parameters": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", + "description": "Parameters can contain arbitrary data. It is the responsibility of the driver developer to handle validation and versioning. Typically this includes self-identification and a version (\"kind\" + \"apiVersion\" for Kubernetes types), with conversion between different versions." + } + }, + "required": [ + "driver", + "parameters" ], "type": "object" }, "io.k8s.api.resource.v1alpha3.PodSchedulingContext": { - "description": "PodSchedulingContext objects hold information that is needed to schedule a Pod with ResourceClaims that use \"WaitForFirstConsumer\" allocation mode.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "description": "PodSchedulingContext objects hold information that is needed to schedule a Pod with ResourceClaims that use \"WaitForFirstConsumer\" allocation mode.\n\nThis is an alpha type and requires enabling the DRAControlPlaneController feature gate.", "properties": { "apiVersion": { "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", @@ -15369,7 +15567,7 @@ "type": "object" }, "io.k8s.api.resource.v1alpha3.ResourceClaim": { - "description": "ResourceClaim describes which resources are needed by a resource consumer. Its status tracks whether the resource has been allocated and what the resulting attributes are.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "description": "ResourceClaim describes a request for access to resources in the cluster, for use by workloads. For example, if a workload needs an accelerator device with specific properties, this is how that request is expressed. The status stanza tracks whether this claim has been satisfied and what specific resources have been allocated.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", "properties": { "apiVersion": { "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", @@ -15385,11 +15583,11 @@ }, "spec": { "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimSpec", - "description": "Spec describes the desired attributes of a resource that then needs to be allocated. It can only be set once when creating the ResourceClaim." + "description": "Spec describes what is being requested and how to configure it. The spec is immutable." }, "status": { "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimStatus", - "description": "Status describes whether the resource is available and with which attributes." + "description": "Status describes whether the claim is ready to use and what has been allocated." } }, "required": [ @@ -15466,100 +15664,6 @@ } ] }, - "io.k8s.api.resource.v1alpha3.ResourceClaimParameters": { - "description": "ResourceClaimParameters defines resource requests for a ResourceClaim in an in-tree format understood by Kubernetes.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "driverRequests": { - "description": "DriverRequests describes all resources that are needed for the allocated claim. A single claim may use resources coming from different drivers. For each driver, this array has at most one entry which then may have one or more per-driver requests.\n\nMay be empty, in which case the claim can always be allocated.", - "items": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DriverRequests" - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - }, - "generatedFrom": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParametersReference", - "description": "If this object was created from some other resource, then this links back to that resource. This field is used to find the in-tree representation of the claim parameters when the parameter reference of the claim refers to some unknown type." - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", - "description": "Standard object metadata" - } - }, - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClaimParametersList": { - "description": "ResourceClaimParametersList is a collection of ResourceClaimParameters.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "items": { - "description": "Items is the list of node resource capacity objects.", - "items": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - }, - "type": "array" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", - "description": "Standard list metadata" - } - }, - "required": [ - "items" - ], - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClaimParametersList", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClaimParametersReference": { - "description": "ResourceClaimParametersReference contains enough information to let you locate the parameters for a ResourceClaim. The object must be in the same namespace as the ResourceClaim.", - "properties": { - "apiGroup": { - "description": "APIGroup is the group for the resource being referenced. It is empty for the core API. This matches the group in the APIVersion that is used when creating the resources.", - "type": "string" - }, - "kind": { - "description": "Kind is the type of resource being referenced. This is the same value as in the parameter object's metadata, for example \"ConfigMap\".", - "type": "string" - }, - "name": { - "description": "Name is the name of resource being referenced.", - "type": "string" - } - }, - "required": [ - "kind", - "name" - ], - "type": "object" - }, "io.k8s.api.resource.v1alpha3.ResourceClaimSchedulingStatus": { "description": "ResourceClaimSchedulingStatus contains information about one particular ResourceClaim with \"WaitForFirstConsumer\" allocation mode.", "properties": { @@ -15576,42 +15680,38 @@ "x-kubernetes-list-type": "atomic" } }, - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.ResourceClaimSpec": { - "description": "ResourceClaimSpec defines how a resource is to be allocated.", - "properties": { - "parametersRef": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParametersReference", - "description": "ParametersRef references a separate object with arbitrary parameters that will be used by the driver when allocating a resource for the claim.\n\nThe object must be in the same namespace as the ResourceClaim." - }, - "resourceClassName": { - "description": "ResourceClassName references the driver and additional parameters via the name of a ResourceClass that was created as part of the driver deployment.", - "type": "string" - } - }, "required": [ - "resourceClassName" + "name" ], "type": "object" }, + "io.k8s.api.resource.v1alpha3.ResourceClaimSpec": { + "description": "ResourceClaimSpec defines what is being requested in a ResourceClaim and how to configure it.", + "properties": { + "controller": { + "description": "Controller is the name of the DRA driver that is meant to handle allocation of this claim. If empty, allocation is handled by the scheduler while scheduling a pod.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", + "type": "string" + }, + "devices": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClaim", + "description": "Devices defines how to request devices." + } + }, + "type": "object" + }, "io.k8s.api.resource.v1alpha3.ResourceClaimStatus": { - "description": "ResourceClaimStatus tracks whether the resource has been allocated and what the resulting attributes are.", + "description": "ResourceClaimStatus tracks whether the resource has been allocated and what the result of that was.", "properties": { "allocation": { "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.AllocationResult", - "description": "Allocation is set by the resource driver once a resource or set of resources has been allocated successfully. If this is not specified, the resources have not been allocated yet." + "description": "Allocation is set once the claim has been allocated successfully." }, "deallocationRequested": { - "description": "DeallocationRequested indicates that a ResourceClaim is to be deallocated.\n\nThe driver then must deallocate this claim and reset the field together with clearing the Allocation field.\n\nWhile DeallocationRequested is set, no new consumers may be added to ReservedFor.", + "description": "Indicates that a claim is to be deallocated. While this is set, no new consumers may be added to ReservedFor.\n\nThis is only used if the claim needs to be deallocated by a DRA driver. That driver then must deallocate this claim and reset the field together with clearing the Allocation field.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", "type": "boolean" }, - "driverName": { - "description": "DriverName is a copy of the driver name from the ResourceClass at the time when allocation started.", - "type": "string" - }, "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.\n\nThere can be at most 32 such reservations. This may get increased in the future, but not reduced.", + "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": { "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimConsumerReference" }, @@ -15627,7 +15727,7 @@ "type": "object" }, "io.k8s.api.resource.v1alpha3.ResourceClaimTemplate": { - "description": "ResourceClaimTemplate is used to produce ResourceClaim objects.", + "description": "ResourceClaimTemplate is used to produce ResourceClaim objects.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", "properties": { "apiVersion": { "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", @@ -15710,251 +15810,38 @@ ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.ResourceClass": { - "description": "ResourceClass is used by administrators to influence how resources are allocated.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "io.k8s.api.resource.v1alpha3.ResourcePool": { + "description": "ResourcePool describes the pool that ResourceSlices belong to.", "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "driverName": { - "description": "DriverName defines the name of the dynamic resource driver that is used for allocation of a ResourceClaim that uses this class.\n\nResource drivers have a unique name in forward domain order (acme.example.com).", - "type": "string" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", - "description": "Standard object metadata" - }, - "parametersRef": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParametersReference", - "description": "ParametersRef references an arbitrary separate object that may hold parameters that will be used by the driver when allocating a resource that uses this class. A dynamic resource driver can distinguish between parameters stored here and and those stored in ResourceClaimSpec." - }, - "structuredParameters": { - "description": "If and only if allocation of claims using this class is handled via structured parameters, then StructuredParameters must be set to true.", - "type": "boolean" - }, - "suitableNodes": { - "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelector", - "description": "Only nodes matching the selector will be considered by the scheduler when trying to find a Node that fits a Pod when that Pod uses a ResourceClaim that has not been allocated yet.\n\nSetting this field is optional. If null, all nodes are candidates." - } - }, - "required": [ - "driverName" - ], - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClassList": { - "description": "ResourceClassList is a collection of classes.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "items": { - "description": "Items is the list of resource classes.", - "items": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - }, - "type": "array" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", - "description": "Standard list metadata" - } - }, - "required": [ - "items" - ], - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClassList", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClassParameters": { - "description": "ResourceClassParameters defines resource requests for a ResourceClass in an in-tree format understood by Kubernetes.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "filters": { - "description": "Filters describes additional contraints that must be met when using the class.", - "items": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceFilter" - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - }, - "generatedFrom": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParametersReference", - "description": "If this object was created from some other resource, then this links back to that resource. This field is used to find the in-tree representation of the class parameters when the parameter reference of the class refers to some unknown type." - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", - "description": "Standard object metadata" - }, - "vendorParameters": { - "description": "VendorParameters are arbitrary setup parameters for all claims using this class. They are ignored while allocating the claim. There must not be more than one entry per driver.", - "items": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.VendorParameters" - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - } - }, - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClassParametersList": { - "description": "ResourceClassParametersList is a collection of ResourceClassParameters.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "items": { - "description": "Items is the list of node resource capacity objects.", - "items": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - }, - "type": "array" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", - "description": "Standard list metadata" - } - }, - "required": [ - "items" - ], - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClassParametersList", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClassParametersReference": { - "description": "ResourceClassParametersReference contains enough information to let you locate the parameters for a ResourceClass.", - "properties": { - "apiGroup": { - "description": "APIGroup is the group for the resource being referenced. It is empty for the core API. This matches the group in the APIVersion that is used when creating the resources.", - "type": "string" - }, - "kind": { - "description": "Kind is the type of resource being referenced. This is the same value as in the parameter object's metadata.", - "type": "string" + "generation": { + "description": "Generation tracks the change in a pool over time. Whenever a driver changes something about one or more of the resources in a pool, it must change the generation in all ResourceSlices which are part of that pool. Consumers of ResourceSlices should only consider resources from the pool with the highest generation number. The generation may be reset by drivers, which should be fine for consumers, assuming that all ResourceSlices in a pool are updated to match or deleted.\n\nCombined with ResourceSliceCount, this mechanism enables consumers to detect pools which are comprised of multiple ResourceSlices and are in an incomplete state.", + "format": "int64", + "type": "integer" }, "name": { - "description": "Name is the name of resource being referenced.", + "description": "Name is used to identify the pool. For node-local devices, this is often the node name, but this is not required.\n\nIt must not be longer than 253 characters and must consist of one or more DNS sub-domains separated by slashes. This field is immutable.", "type": "string" }, - "namespace": { - "description": "Namespace that contains the referenced resource. Must be empty for cluster-scoped resources and non-empty for namespaced resources.", - "type": "string" + "resourceSliceCount": { + "description": "ResourceSliceCount is the total number of ResourceSlices in the pool at this generation number. Must be greater than zero.\n\nConsumers can use this to check whether they have seen all ResourceSlices belonging to the same pool.", + "format": "int64", + "type": "integer" } }, "required": [ - "kind", - "name" + "name", + "generation", + "resourceSliceCount" ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.ResourceFilter": { - "description": "ResourceFilter is a filter for resources from one particular driver.", - "properties": { - "driverName": { - "description": "DriverName is the name used by the DRA driver kubelet plugin.", - "type": "string" - }, - "namedResources": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.NamedResourcesFilter", - "description": "NamedResources describes a resource filter using the named resources model." - } - }, - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.ResourceHandle": { - "description": "ResourceHandle holds opaque resource data for processing by a specific kubelet plugin.", - "properties": { - "data": { - "description": "Data contains the opaque data associated with this ResourceHandle. It is set by the controller component of the resource driver whose name matches the DriverName set in the ResourceClaimStatus this ResourceHandle is embedded in. It is set at allocation time and is intended for processing by the kubelet plugin whose name matches the DriverName set in this ResourceHandle.\n\nThe maximum size of this field is 16KiB. This may get increased in the future, but not reduced.", - "type": "string" - }, - "driverName": { - "description": "DriverName specifies the name of the resource driver whose kubelet plugin should be invoked to process this ResourceHandle's data once it lands on a node. This may differ from the DriverName set in ResourceClaimStatus this ResourceHandle is embedded in.", - "type": "string" - }, - "structuredData": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.StructuredResourceHandle", - "description": "If StructuredData is set, then it needs to be used instead of Data." - } - }, - "required": [ - "driverName" - ], - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.ResourceRequest": { - "description": "ResourceRequest is a request for resources from one particular driver.", - "properties": { - "namedResources": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.NamedResourcesRequest", - "description": "NamedResources describes a request for resources with the named resources model." - }, - "vendorParameters": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", - "description": "VendorParameters are arbitrary setup parameters for the requested resource. They are ignored while allocating a claim." - } - }, - "type": "object" - }, "io.k8s.api.resource.v1alpha3.ResourceSlice": { - "description": "ResourceSlice provides information about available resources on individual nodes.", + "description": "ResourceSlice represents one or more resources in a pool of similar resources, managed by a common driver. A pool may span more than one ResourceSlice, and exactly how many ResourceSlices comprise a pool is determined by the driver.\n\nAt the moment, the only supported resources are devices with attributes and capacities. Each device in a given pool, regardless of how many ResourceSlices, must have a unique name. The ResourceSlice in which a device gets published may change over time. The unique identifier for a device is the tuple , , .\n\nWhenever a driver needs to update a pool, it increments the pool.Spec.Pool.Generation number and updates all ResourceSlices with that new number and new resource definitions. A consumer must only use ResourceSlices with the highest generation number and ignore all others.\n\nWhen allocating all resources in a pool matching certain criteria or when looking for the best solution among several different alternatives, a consumer should check the number of ResourceSlices in a pool (included in each ResourceSlice) to determine whether its view of a pool is complete and if not, should wait until the driver has completed updating the pool.\n\nFor resources that are not local to a node, the node name is not set. Instead, the driver may use a node selector to specify where the devices are available.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", "properties": { "apiVersion": { "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", "type": "string" }, - "driverName": { - "description": "DriverName identifies the DRA driver providing the capacity information. A field selector can be used to list only ResourceSlice objects with a certain driver name.", - "type": "string" - }, "kind": { "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", "type": "string" @@ -15963,17 +15850,13 @@ "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", "description": "Standard object metadata" }, - "namedResources": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.NamedResourcesResources", - "description": "NamedResources describes available resources using the named resources model." - }, - "nodeName": { - "description": "NodeName identifies the node which provides the resources if they are local to a node.\n\nA field selector can be used to list only ResourceSlice objects with a certain node name.", - "type": "string" + "spec": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceSliceSpec", + "description": "Contains the information published by the driver.\n\nChanging the spec automatically increments the metadata.generation number." } }, "required": [ - "driverName" + "spec" ], "type": "object", "x-kubernetes-group-version-kind": [ @@ -15992,7 +15875,7 @@ "type": "string" }, "items": { - "description": "Items is the list of node resource capacity objects.", + "description": "Items is the list of resource ResourceSlices.", "items": { "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceSlice" }, @@ -16002,7 +15885,7 @@ "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", "type": "string" }, - "metadata": { + "listMeta": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", "description": "Standard list metadata" } @@ -16019,49 +15902,44 @@ } ] }, - "io.k8s.api.resource.v1alpha3.StructuredResourceHandle": { - "description": "StructuredResourceHandle is the in-tree representation of the allocation result.", + "io.k8s.api.resource.v1alpha3.ResourceSliceSpec": { + "description": "ResourceSliceSpec contains the information published by the driver in one ResourceSlice.", "properties": { - "nodeName": { - "description": "NodeName is the name of the node providing the necessary resources if the resources are local to a node.", - "type": "string" + "allNodes": { + "description": "AllNodes indicates that all nodes have access to the resources in the pool.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set.", + "type": "boolean" }, - "results": { - "description": "Results lists all allocated driver resources.", + "devices": { + "description": "Devices lists some or all of the devices in this pool.\n\nMust not have more than 128 entries.", "items": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DriverAllocationResult" + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.Device" }, "type": "array", "x-kubernetes-list-type": "atomic" }, - "vendorClaimParameters": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", - "description": "VendorClaimParameters are the per-claim configuration parameters from the resource claim parameters at the time that the claim was allocated." + "driver": { + "description": "Driver identifies the DRA driver providing the capacity information. A field selector can be used to list only ResourceSlice objects with a certain driver name.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver. This field is immutable.", + "type": "string" }, - "vendorClassParameters": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", - "description": "VendorClassParameters are the per-claim configuration parameters from the resource class at the time that the claim was allocated." + "nodeName": { + "description": "NodeName identifies the node which provides the resources in this pool. A field selector can be used to list only ResourceSlice objects belonging to a certain node.\n\nThis field can be used to limit access from nodes to ResourceSlices with the same node name. It also indicates to autoscalers that adding new nodes of the same type as some old node might also make new resources available.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set. This field is immutable.", + "type": "string" + }, + "nodeSelector": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelector", + "description": "NodeSelector defines which nodes have access to the resources in the pool, when that pool is not limited to a single node.\n\nMust use exactly one term.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set." + }, + "pool": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourcePool", + "description": "Pool describes the pool that this ResourceSlice belongs to." } }, "required": [ - "results" + "driver", + "pool" ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.VendorParameters": { - "description": "VendorParameters are opaque parameters for one particular driver.", - "properties": { - "driverName": { - "description": "DriverName is the name used by the DRA driver kubelet plugin.", - "type": "string" - }, - "parameters": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", - "description": "Parameters can be arbitrary setup parameters. They are ignored while allocating a claim." - } - }, - "type": "object" - }, "io.k8s.api.scheduling.v1.PriorityClass": { "description": "PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.", "properties": { @@ -18646,11 +18524,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, @@ -70576,6 +70449,485 @@ ] } }, + "/apis/resource.k8s.io/v1alpha3/deviceclasses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of DeviceClass", + "operationId": "deleteResourceV1alpha3CollectionDeviceClass", + "parameters": [ + { + "$ref": "#/parameters/body-2Y1dVQaQ" + }, + { + "$ref": "#/parameters/continue-QfD61s0i" + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/fieldSelector-xIcQKXFG" + }, + { + "$ref": "#/parameters/gracePeriodSeconds--K5HaBOS" + }, + { + "$ref": "#/parameters/labelSelector-5Zw57w4C" + }, + { + "$ref": "#/parameters/limit-1NfNmdNH" + }, + { + "$ref": "#/parameters/orphanDependents-uRB25kX5" + }, + { + "$ref": "#/parameters/propagationPolicy-6jk3prlO" + }, + { + "$ref": "#/parameters/resourceVersion-5WAnf1kx" + }, + { + "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" + }, + { + "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" + }, + { + "$ref": "#/parameters/timeoutSeconds-yvYezaOC" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind DeviceClass", + "operationId": "listResourceV1alpha3DeviceClass", + "parameters": [ + { + "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" + }, + { + "$ref": "#/parameters/continue-QfD61s0i" + }, + { + "$ref": "#/parameters/fieldSelector-xIcQKXFG" + }, + { + "$ref": "#/parameters/labelSelector-5Zw57w4C" + }, + { + "$ref": "#/parameters/limit-1NfNmdNH" + }, + { + "$ref": "#/parameters/resourceVersion-5WAnf1kx" + }, + { + "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" + }, + { + "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" + }, + { + "$ref": "#/parameters/timeoutSeconds-yvYezaOC" + }, + { + "$ref": "#/parameters/watch-XNNPZGbK" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClassList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "parameters": [ + { + "$ref": "#/parameters/pretty-tJGM1-ng" + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a DeviceClass", + "operationId": "createResourceV1alpha3DeviceClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/fieldManager-Qy4HdaTW" + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + } + }, + "/apis/resource.k8s.io/v1alpha3/deviceclasses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a DeviceClass", + "operationId": "deleteResourceV1alpha3DeviceClass", + "parameters": [ + { + "$ref": "#/parameters/body-2Y1dVQaQ" + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/gracePeriodSeconds--K5HaBOS" + }, + { + "$ref": "#/parameters/orphanDependents-uRB25kX5" + }, + { + "$ref": "#/parameters/propagationPolicy-6jk3prlO" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified DeviceClass", + "operationId": "readResourceV1alpha3DeviceClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "parameters": [ + { + "description": "name of the DeviceClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/pretty-tJGM1-ng" + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified DeviceClass", + "operationId": "patchResourceV1alpha3DeviceClass", + "parameters": [ + { + "$ref": "#/parameters/body-78PwaGsr" + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/fieldManager-7c6nTn1T" + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/force-tOGGb0Yi" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified DeviceClass", + "operationId": "replaceResourceV1alpha3DeviceClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/fieldManager-Qy4HdaTW" + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + } + }, "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/podschedulingcontexts": { "delete": { "consumes": [ @@ -71251,491 +71603,6 @@ } } }, - "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/resourceclaimparameters": { - "delete": { - "consumes": [ - "*/*" - ], - "description": "delete collection of ResourceClaimParameters", - "operationId": "deleteResourceV1alpha3CollectionNamespacedResourceClaimParameters", - "parameters": [ - { - "$ref": "#/parameters/body-2Y1dVQaQ" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/gracePeriodSeconds--K5HaBOS" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/orphanDependents-uRB25kX5" - }, - { - "$ref": "#/parameters/propagationPolicy-6jk3prlO" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "deletecollection", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "get": { - "consumes": [ - "*/*" - ], - "description": "list or watch objects of kind ResourceClaimParameters", - "operationId": "listResourceV1alpha3NamespacedResourceClaimParameters", - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/namespace-vgWSWtn3" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - } - ], - "post": { - "consumes": [ - "*/*" - ], - "description": "create ResourceClaimParameters", - "operationId": "createResourceV1alpha3NamespacedResourceClaimParameters", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldManager-Qy4HdaTW" - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "202": { - "description": "Accepted", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "post", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - } - }, - "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/resourceclaimparameters/{name}": { - "delete": { - "consumes": [ - "*/*" - ], - "description": "delete ResourceClaimParameters", - "operationId": "deleteResourceV1alpha3NamespacedResourceClaimParameters", - "parameters": [ - { - "$ref": "#/parameters/body-2Y1dVQaQ" - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/gracePeriodSeconds--K5HaBOS" - }, - { - "$ref": "#/parameters/orphanDependents-uRB25kX5" - }, - { - "$ref": "#/parameters/propagationPolicy-6jk3prlO" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "202": { - "description": "Accepted", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "delete", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "get": { - "consumes": [ - "*/*" - ], - "description": "read the specified ResourceClaimParameters", - "operationId": "readResourceV1alpha3NamespacedResourceClaimParameters", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "name of the ResourceClaimParameters", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/namespace-vgWSWtn3" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - } - ], - "patch": { - "consumes": [ - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json", - "application/apply-patch+yaml" - ], - "description": "partially update the specified ResourceClaimParameters", - "operationId": "patchResourceV1alpha3NamespacedResourceClaimParameters", - "parameters": [ - { - "$ref": "#/parameters/body-78PwaGsr" - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldManager-7c6nTn1T" - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/force-tOGGb0Yi" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "put": { - "consumes": [ - "*/*" - ], - "description": "replace the specified ResourceClaimParameters", - "operationId": "replaceResourceV1alpha3NamespacedResourceClaimParameters", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldManager-Qy4HdaTW" - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - } - }, "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/resourceclaims": { "delete": { "consumes": [ @@ -72896,491 +72763,6 @@ } } }, - "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/resourceclassparameters": { - "delete": { - "consumes": [ - "*/*" - ], - "description": "delete collection of ResourceClassParameters", - "operationId": "deleteResourceV1alpha3CollectionNamespacedResourceClassParameters", - "parameters": [ - { - "$ref": "#/parameters/body-2Y1dVQaQ" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/gracePeriodSeconds--K5HaBOS" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/orphanDependents-uRB25kX5" - }, - { - "$ref": "#/parameters/propagationPolicy-6jk3prlO" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "deletecollection", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "get": { - "consumes": [ - "*/*" - ], - "description": "list or watch objects of kind ResourceClassParameters", - "operationId": "listResourceV1alpha3NamespacedResourceClassParameters", - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/namespace-vgWSWtn3" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - } - ], - "post": { - "consumes": [ - "*/*" - ], - "description": "create ResourceClassParameters", - "operationId": "createResourceV1alpha3NamespacedResourceClassParameters", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldManager-Qy4HdaTW" - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "202": { - "description": "Accepted", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "post", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - } - }, - "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/resourceclassparameters/{name}": { - "delete": { - "consumes": [ - "*/*" - ], - "description": "delete ResourceClassParameters", - "operationId": "deleteResourceV1alpha3NamespacedResourceClassParameters", - "parameters": [ - { - "$ref": "#/parameters/body-2Y1dVQaQ" - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/gracePeriodSeconds--K5HaBOS" - }, - { - "$ref": "#/parameters/orphanDependents-uRB25kX5" - }, - { - "$ref": "#/parameters/propagationPolicy-6jk3prlO" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "202": { - "description": "Accepted", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "delete", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "get": { - "consumes": [ - "*/*" - ], - "description": "read the specified ResourceClassParameters", - "operationId": "readResourceV1alpha3NamespacedResourceClassParameters", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "name of the ResourceClassParameters", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/namespace-vgWSWtn3" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - } - ], - "patch": { - "consumes": [ - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json", - "application/apply-patch+yaml" - ], - "description": "partially update the specified ResourceClassParameters", - "operationId": "patchResourceV1alpha3NamespacedResourceClassParameters", - "parameters": [ - { - "$ref": "#/parameters/body-78PwaGsr" - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldManager-7c6nTn1T" - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/force-tOGGb0Yi" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "put": { - "consumes": [ - "*/*" - ], - "description": "replace the specified ResourceClassParameters", - "operationId": "replaceResourceV1alpha3NamespacedResourceClassParameters", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldManager-Qy4HdaTW" - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - } - }, "/apis/resource.k8s.io/v1alpha3/podschedulingcontexts": { "get": { "consumes": [ @@ -73455,80 +72837,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/resourceclaimparameters": { - "get": { - "consumes": [ - "*/*" - ], - "description": "list or watch objects of kind ResourceClaimParameters", - "operationId": "listResourceV1alpha3ResourceClaimParametersForAllNamespaces", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ] - }, "/apis/resource.k8s.io/v1alpha3/resourceclaims": { "get": { "consumes": [ @@ -73677,559 +72985,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/resourceclasses": { - "delete": { - "consumes": [ - "*/*" - ], - "description": "delete collection of ResourceClass", - "operationId": "deleteResourceV1alpha3CollectionResourceClass", - "parameters": [ - { - "$ref": "#/parameters/body-2Y1dVQaQ" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/gracePeriodSeconds--K5HaBOS" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/orphanDependents-uRB25kX5" - }, - { - "$ref": "#/parameters/propagationPolicy-6jk3prlO" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "deletecollection", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "get": { - "consumes": [ - "*/*" - ], - "description": "list or watch objects of kind ResourceClass", - "operationId": "listResourceV1alpha3ResourceClass", - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassList" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/pretty-tJGM1-ng" - } - ], - "post": { - "consumes": [ - "*/*" - ], - "description": "create a ResourceClass", - "operationId": "createResourceV1alpha3ResourceClass", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldManager-Qy4HdaTW" - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "202": { - "description": "Accepted", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "post", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - } - }, - "/apis/resource.k8s.io/v1alpha3/resourceclasses/{name}": { - "delete": { - "consumes": [ - "*/*" - ], - "description": "delete a ResourceClass", - "operationId": "deleteResourceV1alpha3ResourceClass", - "parameters": [ - { - "$ref": "#/parameters/body-2Y1dVQaQ" - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/gracePeriodSeconds--K5HaBOS" - }, - { - "$ref": "#/parameters/orphanDependents-uRB25kX5" - }, - { - "$ref": "#/parameters/propagationPolicy-6jk3prlO" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "202": { - "description": "Accepted", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "delete", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "get": { - "consumes": [ - "*/*" - ], - "description": "read the specified ResourceClass", - "operationId": "readResourceV1alpha3ResourceClass", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "name of the ResourceClass", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - } - ], - "patch": { - "consumes": [ - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json", - "application/apply-patch+yaml" - ], - "description": "partially update the specified ResourceClass", - "operationId": "patchResourceV1alpha3ResourceClass", - "parameters": [ - { - "$ref": "#/parameters/body-78PwaGsr" - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldManager-7c6nTn1T" - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/force-tOGGb0Yi" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "put": { - "consumes": [ - "*/*" - ], - "description": "replace the specified ResourceClass", - "operationId": "replaceResourceV1alpha3ResourceClass", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/fieldManager-Qy4HdaTW" - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - } - }, - "/apis/resource.k8s.io/v1alpha3/resourceclassparameters": { - "get": { - "consumes": [ - "*/*" - ], - "description": "list or watch objects of kind ResourceClassParameters", - "operationId": "listResourceV1alpha3ResourceClassParametersForAllNamespaces", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ] - }, "/apis/resource.k8s.io/v1alpha3/resourceslices": { "delete": { "consumes": [ @@ -74709,6 +73464,162 @@ } } }, + "/apis/resource.k8s.io/v1alpha3/watch/deviceclasses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of DeviceClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchResourceV1alpha3DeviceClassList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "parameters": [ + { + "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" + }, + { + "$ref": "#/parameters/continue-QfD61s0i" + }, + { + "$ref": "#/parameters/fieldSelector-xIcQKXFG" + }, + { + "$ref": "#/parameters/labelSelector-5Zw57w4C" + }, + { + "$ref": "#/parameters/limit-1NfNmdNH" + }, + { + "$ref": "#/parameters/pretty-tJGM1-ng" + }, + { + "$ref": "#/parameters/resourceVersion-5WAnf1kx" + }, + { + "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" + }, + { + "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" + }, + { + "$ref": "#/parameters/timeoutSeconds-yvYezaOC" + }, + { + "$ref": "#/parameters/watch-XNNPZGbK" + } + ] + }, + "/apis/resource.k8s.io/v1alpha3/watch/deviceclasses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind DeviceClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchResourceV1alpha3DeviceClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "parameters": [ + { + "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" + }, + { + "$ref": "#/parameters/continue-QfD61s0i" + }, + { + "$ref": "#/parameters/fieldSelector-xIcQKXFG" + }, + { + "$ref": "#/parameters/labelSelector-5Zw57w4C" + }, + { + "$ref": "#/parameters/limit-1NfNmdNH" + }, + { + "description": "name of the DeviceClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/pretty-tJGM1-ng" + }, + { + "$ref": "#/parameters/resourceVersion-5WAnf1kx" + }, + { + "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" + }, + { + "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" + }, + { + "$ref": "#/parameters/timeoutSeconds-yvYezaOC" + }, + { + "$ref": "#/parameters/watch-XNNPZGbK" + } + ] + }, "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/podschedulingcontexts": { "get": { "consumes": [ @@ -74871,168 +73782,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/resourceclaimparameters": { - "get": { - "consumes": [ - "*/*" - ], - "description": "watch individual changes to a list of ResourceClaimParameters. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchResourceV1alpha3NamespacedResourceClaimParametersList", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/namespace-vgWSWtn3" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ] - }, - "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/resourceclaimparameters/{name}": { - "get": { - "consumes": [ - "*/*" - ], - "description": "watch changes to an object of kind ResourceClaimParameters. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", - "operationId": "watchResourceV1alpha3NamespacedResourceClaimParameters", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "description": "name of the ResourceClaimParameters", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/namespace-vgWSWtn3" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ] - }, "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/resourceclaims": { "get": { "consumes": [ @@ -75357,168 +74106,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/resourceclassparameters": { - "get": { - "consumes": [ - "*/*" - ], - "description": "watch individual changes to a list of ResourceClassParameters. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchResourceV1alpha3NamespacedResourceClassParametersList", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/namespace-vgWSWtn3" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ] - }, - "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/resourceclassparameters/{name}": { - "get": { - "consumes": [ - "*/*" - ], - "description": "watch changes to an object of kind ResourceClassParameters. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", - "operationId": "watchResourceV1alpha3NamespacedResourceClassParameters", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "description": "name of the ResourceClassParameters", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/namespace-vgWSWtn3" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ] - }, "/apis/resource.k8s.io/v1alpha3/watch/podschedulingcontexts": { "get": { "consumes": [ @@ -75593,80 +74180,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/watch/resourceclaimparameters": { - "get": { - "consumes": [ - "*/*" - ], - "description": "watch individual changes to a list of ResourceClaimParameters. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchResourceV1alpha3ResourceClaimParametersListForAllNamespaces", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ] - }, "/apis/resource.k8s.io/v1alpha3/watch/resourceclaims": { "get": { "consumes": [ @@ -75815,236 +74328,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/watch/resourceclasses": { - "get": { - "consumes": [ - "*/*" - ], - "description": "watch individual changes to a list of ResourceClass. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchResourceV1alpha3ResourceClassList", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ] - }, - "/apis/resource.k8s.io/v1alpha3/watch/resourceclasses/{name}": { - "get": { - "consumes": [ - "*/*" - ], - "description": "watch changes to an object of kind ResourceClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", - "operationId": "watchResourceV1alpha3ResourceClass", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "description": "name of the ResourceClass", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ] - }, - "/apis/resource.k8s.io/v1alpha3/watch/resourceclassparameters": { - "get": { - "consumes": [ - "*/*" - ], - "description": "watch individual changes to a list of ResourceClassParameters. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchResourceV1alpha3ResourceClassParametersListForAllNamespaces", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" - }, - { - "$ref": "#/parameters/continue-QfD61s0i" - }, - { - "$ref": "#/parameters/fieldSelector-xIcQKXFG" - }, - { - "$ref": "#/parameters/labelSelector-5Zw57w4C" - }, - { - "$ref": "#/parameters/limit-1NfNmdNH" - }, - { - "$ref": "#/parameters/pretty-tJGM1-ng" - }, - { - "$ref": "#/parameters/resourceVersion-5WAnf1kx" - }, - { - "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" - }, - { - "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" - }, - { - "$ref": "#/parameters/timeoutSeconds-yvYezaOC" - }, - { - "$ref": "#/parameters/watch-XNNPZGbK" - } - ] - }, "/apis/resource.k8s.io/v1alpha3/watch/resourceslices": { "get": { "consumes": [ diff --git a/api/openapi-spec/v3/api__v1_openapi.json b/api/openapi-spec/v3/api__v1_openapi.json index 2e87aa9b589..c78a516f1f1 100644 --- a/api/openapi-spec/v3/api__v1_openapi.json +++ b/api/openapi-spec/v3/api__v1_openapi.json @@ -6560,6 +6560,10 @@ "default": "", "description": "Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.", "type": "string" + }, + "request": { + "description": "Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request.", + "type": "string" } }, "required": [ @@ -9407,11 +9411,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1_openapi.json index f825d369249..ddc25589c22 100644 --- a/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1_openapi.json @@ -1951,11 +1951,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1alpha1_openapi.json b/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1alpha1_openapi.json index 8025c3d8808..74561228b90 100644 --- a/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1alpha1_openapi.json +++ b/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1alpha1_openapi.json @@ -1463,11 +1463,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json b/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json index 48cb25ba08f..aeea8fdd44e 100644 --- a/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json +++ b/api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json @@ -1465,11 +1465,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__apiextensions.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__apiextensions.k8s.io__v1_openapi.json index 9cfd3bffabf..06f66e966d1 100644 --- a/api/openapi-spec/v3/apis__apiextensions.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__apiextensions.k8s.io__v1_openapi.json @@ -1617,11 +1617,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__apiregistration.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__apiregistration.k8s.io__v1_openapi.json index bac6e665929..c15e1d6b2d3 100644 --- a/api/openapi-spec/v3/apis__apiregistration.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__apiregistration.k8s.io__v1_openapi.json @@ -750,11 +750,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__apps__v1_openapi.json b/api/openapi-spec/v3/apis__apps__v1_openapi.json index 223c34fd0ce..0659cf90c8a 100644 --- a/api/openapi-spec/v3/apis__apps__v1_openapi.json +++ b/api/openapi-spec/v3/apis__apps__v1_openapi.json @@ -4300,6 +4300,10 @@ "default": "", "description": "Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.", "type": "string" + }, + "request": { + "description": "Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request.", + "type": "string" } }, "required": [ @@ -6167,11 +6171,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__autoscaling__v1_openapi.json b/api/openapi-spec/v3/apis__autoscaling__v1_openapi.json index c4c5de1371a..6972c240d9a 100644 --- a/api/openapi-spec/v3/apis__autoscaling__v1_openapi.json +++ b/api/openapi-spec/v3/apis__autoscaling__v1_openapi.json @@ -943,11 +943,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__autoscaling__v2_openapi.json b/api/openapi-spec/v3/apis__autoscaling__v2_openapi.json index 54a03a41c4c..29d2aaba29d 100644 --- a/api/openapi-spec/v3/apis__autoscaling__v2_openapi.json +++ b/api/openapi-spec/v3/apis__autoscaling__v2_openapi.json @@ -1652,11 +1652,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__batch__v1_openapi.json b/api/openapi-spec/v3/apis__batch__v1_openapi.json index fdf4e902bff..18a36d44c12 100644 --- a/api/openapi-spec/v3/apis__batch__v1_openapi.json +++ b/api/openapi-spec/v3/apis__batch__v1_openapi.json @@ -3504,6 +3504,10 @@ "default": "", "description": "Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.", "type": "string" + }, + "request": { + "description": "Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request.", + "type": "string" } }, "required": [ @@ -5371,11 +5375,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__certificates.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__certificates.k8s.io__v1_openapi.json index 67c90503e0e..d73fbd9227d 100644 --- a/api/openapi-spec/v3/apis__certificates.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__certificates.k8s.io__v1_openapi.json @@ -979,11 +979,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__certificates.k8s.io__v1alpha1_openapi.json b/api/openapi-spec/v3/apis__certificates.k8s.io__v1alpha1_openapi.json index 2d26fcf3be3..382b6b03309 100644 --- a/api/openapi-spec/v3/apis__certificates.k8s.io__v1alpha1_openapi.json +++ b/api/openapi-spec/v3/apis__certificates.k8s.io__v1alpha1_openapi.json @@ -855,11 +855,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__coordination.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__coordination.k8s.io__v1_openapi.json index 3938d6e619c..721704d27a5 100644 --- a/api/openapi-spec/v3/apis__coordination.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__coordination.k8s.io__v1_openapi.json @@ -875,11 +875,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__discovery.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__discovery.k8s.io__v1_openapi.json index 6f41f5fd326..63f0063612f 100644 --- a/api/openapi-spec/v3/apis__discovery.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__discovery.k8s.io__v1_openapi.json @@ -1033,11 +1033,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__events.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__events.k8s.io__v1_openapi.json index c0df343418d..d41811b7427 100644 --- a/api/openapi-spec/v3/apis__events.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__events.k8s.io__v1_openapi.json @@ -993,11 +993,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__flowcontrol.apiserver.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__flowcontrol.apiserver.k8s.io__v1_openapi.json index 34c70daea9b..dc07b313e70 100644 --- a/api/openapi-spec/v3/apis__flowcontrol.apiserver.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__flowcontrol.apiserver.k8s.io__v1_openapi.json @@ -1479,11 +1479,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__flowcontrol.apiserver.k8s.io__v1beta3_openapi.json b/api/openapi-spec/v3/apis__flowcontrol.apiserver.k8s.io__v1beta3_openapi.json index 6c69e0c92b8..d9e4d432159 100644 --- a/api/openapi-spec/v3/apis__flowcontrol.apiserver.k8s.io__v1beta3_openapi.json +++ b/api/openapi-spec/v3/apis__flowcontrol.apiserver.k8s.io__v1beta3_openapi.json @@ -1480,11 +1480,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__internal.apiserver.k8s.io__v1alpha1_openapi.json b/api/openapi-spec/v3/apis__internal.apiserver.k8s.io__v1alpha1_openapi.json index 6d0959b0d42..9ecf271785e 100644 --- a/api/openapi-spec/v3/apis__internal.apiserver.k8s.io__v1alpha1_openapi.json +++ b/api/openapi-spec/v3/apis__internal.apiserver.k8s.io__v1alpha1_openapi.json @@ -969,11 +969,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__networking.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__networking.k8s.io__v1_openapi.json index 66617819163..7c5803f9c2c 100644 --- a/api/openapi-spec/v3/apis__networking.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__networking.k8s.io__v1_openapi.json @@ -1608,11 +1608,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__networking.k8s.io__v1beta1_openapi.json b/api/openapi-spec/v3/apis__networking.k8s.io__v1beta1_openapi.json index c6e357f24d4..72de4d51ca2 100644 --- a/api/openapi-spec/v3/apis__networking.k8s.io__v1beta1_openapi.json +++ b/api/openapi-spec/v3/apis__networking.k8s.io__v1beta1_openapi.json @@ -1055,11 +1055,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__node.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__node.k8s.io__v1_openapi.json index 9862438545b..4e4690c4d01 100644 --- a/api/openapi-spec/v3/apis__node.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__node.k8s.io__v1_openapi.json @@ -928,11 +928,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__policy__v1_openapi.json b/api/openapi-spec/v3/apis__policy__v1_openapi.json index 789cf20ab65..3e09215d5eb 100644 --- a/api/openapi-spec/v3/apis__policy__v1_openapi.json +++ b/api/openapi-spec/v3/apis__policy__v1_openapi.json @@ -1047,11 +1047,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__rbac.authorization.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__rbac.authorization.k8s.io__v1_openapi.json index 35ee1cfd3ab..b7882133be4 100644 --- a/api/openapi-spec/v3/apis__rbac.authorization.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__rbac.authorization.k8s.io__v1_openapi.json @@ -1320,11 +1320,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, 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 6ee5610bdce..a31844788f6 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 @@ -89,89 +89,83 @@ "io.k8s.api.resource.v1alpha3.AllocationResult": { "description": "AllocationResult contains attributes of an allocated resource.", "properties": { - "availableOnNodes": { + "controller": { + "description": "Controller is the name of the DRA driver which handled the allocation. That driver is also responsible for deallocating the claim. It is empty when the claim can be deallocated without involving a driver.\n\nA driver may allocate devices provided by other drivers, so this driver name here can be different from the driver names listed for the results.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", + "type": "string" + }, + "devices": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceAllocationResult" + } + ], + "default": {}, + "description": "Devices is the result of allocating devices." + }, + "nodeSelector": { "allOf": [ { "$ref": "#/components/schemas/io.k8s.api.core.v1.NodeSelector" } ], - "description": "This field will get set by the resource driver after it has allocated the resource to inform the scheduler where it can schedule Pods using the ResourceClaim.\n\nSetting this field is optional. If null, the resource is available everywhere." - }, - "resourceHandles": { - "description": "ResourceHandles contain the state associated with an allocation that should be maintained throughout the lifetime of a claim. Each ResourceHandle contains data that should be passed to a specific kubelet plugin once it lands on a node. This data is returned by the driver after a successful allocation and is opaque to Kubernetes. Driver documentation may explain to users how to interpret this data if needed.\n\nSetting this field is optional. It has a maximum size of 32 entries. If null (or empty), it is assumed this allocation will be processed by a single kubelet plugin with no ResourceHandle data attached. The name of the kubelet plugin invoked will match the DriverName set in the ResourceClaimStatus this AllocationResult is embedded in.", - "items": { + "description": "NodeSelector defines where the allocated resources are available. If unset, they are available everywhere." + } + }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.BasicDevice": { + "description": "BasicDevice defines one device instance.", + "properties": { + "attributes": { + "additionalProperties": { "allOf": [ { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceHandle" + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceAttribute" } ], "default": {} }, - "type": "array", - "x-kubernetes-list-type": "atomic" - } - }, - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.DriverAllocationResult": { - "description": "DriverAllocationResult contains vendor parameters and the allocation result for one request.", - "properties": { - "namedResources": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.NamedResourcesAllocationResult" - } - ], - "description": "NamedResources describes the allocation result when using the named resources model." + "description": "Attributes defines the set of attributes for this device. The name of each attribute must be unique in that set.\n\nThe maximum number of attributes and capacities combined is 32.", + "type": "object" }, - "vendorRequestParameters": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" - } - ], - "description": "VendorRequestParameters are the per-request configuration parameters from the time that the claim was allocated." + "capacity": { + "additionalProperties": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Capacity defines the set of capacities for this device. The name of each capacity must be unique in that set.\n\nThe maximum number of attributes and capacities combined is 32.", + "type": "object" } }, "type": "object" }, - "io.k8s.api.resource.v1alpha3.DriverRequests": { - "description": "DriverRequests describes all resources that are needed from one particular driver.", + "io.k8s.api.resource.v1alpha3.CELDeviceSelector": { + "description": "CELDeviceSelector contains a CEL expression for selecting a device.", "properties": { - "driverName": { - "description": "DriverName is the name used by the DRA driver kubelet plugin.", + "expression": { + "default": "", + "description": "Expression is a CEL expression which evaluates a single device. It must evaluate to true when the device under consideration satisfies the desired criteria, and false when it does not. Any other result is an error and causes allocation of devices to abort.\n\nThe expression's input is an object named \"device\", which carries the following properties:\n - driver (string): the name of the driver which defines this device.\n - attributes (map[string]object): the device's attributes, grouped by prefix\n (e.g. device.attributes[\"dra.example.com\"] evaluates to an object with all\n of the attributes which were prefixed by \"dra.example.com\".\n - capacity (map[string]object): the device's capacities, grouped by prefix.\n\nExample: Consider a device with driver=\"dra.example.com\", which exposes two attributes named \"model\" and \"ext.example.com/family\" and which exposes one capacity named \"modules\". This input to this expression would have the following fields:\n\n device.driver\n device.attributes[\"dra.example.com\"].model\n device.attributes[\"ext.example.com\"].family\n device.capacity[\"dra.example.com\"].modules\n\nThe device.driver field can be used to check for a specific driver, either as a high-level precondition (i.e. you only want to consider devices from this driver) or as part of a multi-clause expression that is meant to consider devices from different drivers.\n\nThe value type of each attribute is defined by the device definition, and users who write these expressions must consult the documentation for their specific drivers. The value type of each capacity is Quantity.\n\nIf an unknown prefix is used as a lookup in either device.attributes or device.capacity, an empty map will be returned. Any reference to an unknown field will cause an evaluation error and allocation to abort.\n\nA robust expression should check for the existence of attributes before referencing them.\n\nFor ease of use, the cel.bind() function is enabled, and can be used to simplify expressions that access multiple attributes with the same domain. For example:\n\n cel.bind(dra, device.attributes[\"dra.example.com\"], dra.someBool && dra.anotherBool)", "type": "string" - }, - "requests": { - "description": "Requests describes all resources that are needed from the driver.", - "items": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceRequest" - } - ], - "default": {} - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - }, - "vendorParameters": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" - } - ], - "description": "VendorParameters are arbitrary setup parameters for all requests of the claim. They are ignored while allocating the claim." } }, + "required": [ + "expression" + ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.NamedResourcesAllocationResult": { - "description": "NamedResourcesAllocationResult is used in AllocationResultModel.", + "io.k8s.api.resource.v1alpha3.Device": { + "description": "Device represents one individual hardware instance that can be selected based on its attributes. Besides the name, exactly one field must be set.", "properties": { + "basic": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.BasicDevice" + } + ], + "description": "Basic defines one device instance." + }, "name": { "default": "", - "description": "Name is the name of the selected resource instance.", + "description": "Name is unique identifier among all devices managed by the driver in the pool. It must be a DNS label.", "type": "string" } }, @@ -180,84 +174,101 @@ ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.NamedResourcesAttribute": { - "description": "NamedResourcesAttribute is a combination of an attribute name and its value.", + "io.k8s.api.resource.v1alpha3.DeviceAllocationConfiguration": { + "description": "DeviceAllocationConfiguration gets embedded in an AllocationResult.", + "properties": { + "opaque": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration" + } + ], + "description": "Opaque provides driver-specific configuration parameters." + }, + "requests": { + "description": "Requests lists the names of requests where the configuration applies. If empty, its applies to all requests.", + "items": { + "default": "", + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "source": { + "default": "", + "description": "Source records whether the configuration comes from a class and thus is not something that a normal user would have been able to set or from a claim.", + "type": "string" + } + }, + "required": [ + "source" + ], + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceAllocationResult": { + "description": "DeviceAllocationResult is the result of allocating devices.", + "properties": { + "config": { + "description": "This field is a combination of all the claim and class configuration parameters. Drivers can distinguish between those based on a flag.\n\nThis includes configuration parameters for drivers which have no allocated devices in the result because it is up to the drivers which configuration parameters they support. They can silently ignore unknown configuration parameters.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceAllocationConfiguration" + } + ], + "default": {} + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "results": { + "description": "Results lists all allocated devices.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceRequestAllocationResult" + } + ], + "default": {} + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceAttribute": { + "description": "DeviceAttribute must have exactly one field set.", "properties": { "bool": { "description": "BoolValue is a true/false value.", "type": "boolean" }, "int": { - "description": "IntValue is a 64-bit integer.", + "description": "IntValue is a number.", "format": "int64", "type": "integer" }, - "intSlice": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.NamedResourcesIntSlice" - } - ], - "description": "IntSliceValue is an array of 64-bit integers." - }, - "name": { - "default": "", - "description": "Name is unique identifier among all resource instances managed by the driver on the node. It must be a DNS subdomain.", - "type": "string" - }, - "quantity": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.api.resource.Quantity" - } - ], - "description": "QuantityValue is a quantity." - }, "string": { - "description": "StringValue is a string.", + "description": "StringValue is a string. Must not be longer than 64 characters.", "type": "string" }, - "stringSlice": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.NamedResourcesStringSlice" - } - ], - "description": "StringSliceValue is an array of strings." - }, "version": { - "description": "VersionValue is a semantic version according to semver.org spec 2.0.0.", + "description": "VersionValue is a semantic version according to semver.org spec 2.0.0. Must not be longer than 64 characters.", "type": "string" } }, - "required": [ - "name" - ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.NamedResourcesFilter": { - "description": "NamedResourcesFilter is used in ResourceFilterModel.", + "io.k8s.api.resource.v1alpha3.DeviceClaim": { + "description": "DeviceClaim defines how to request devices with a ResourceClaim.", "properties": { - "selector": { - "default": "", - "description": "Selector is a CEL expression which must evaluate to true if a resource instance is suitable. The language is as defined in https://kubernetes.io/docs/reference/using-api/cel/\n\nIn addition, for each type in NamedResourcesAttributeValue there is a map that resolves to the corresponding value of the instance under evaluation. For example:\n\n attributes.quantity[\"a\"].isGreaterThan(quantity(\"0\")) &&\n attributes.stringslice[\"b\"].isSorted()", - "type": "string" - } - }, - "required": [ - "selector" - ], - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.NamedResourcesInstance": { - "description": "NamedResourcesInstance represents one individual hardware instance that can be selected based on its attributes.", - "properties": { - "attributes": { - "description": "Attributes defines the attributes of this resource instance. The name of each attribute must be unique.", + "config": { + "description": "This field holds configuration for multiple potential drivers which could satisfy requests in this claim. It is ignored while allocating the claim.", "items": { "allOf": [ { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.NamedResourcesAttribute" + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClaimConfiguration" } ], "default": {} @@ -265,59 +276,25 @@ "type": "array", "x-kubernetes-list-type": "atomic" }, - "name": { - "default": "", - "description": "Name is unique identifier among all resource instances managed by the driver on the node. It must be a DNS subdomain.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.NamedResourcesIntSlice": { - "description": "NamedResourcesIntSlice contains a slice of 64-bit integers.", - "properties": { - "ints": { - "description": "Ints is the slice of 64-bit integers.", - "items": { - "default": 0, - "format": "int64", - "type": "integer" - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - } - }, - "required": [ - "ints" - ], - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.NamedResourcesRequest": { - "description": "NamedResourcesRequest is used in ResourceRequestModel.", - "properties": { - "selector": { - "default": "", - "description": "Selector is a CEL expression which must evaluate to true if a resource instance is suitable. The language is as defined in https://kubernetes.io/docs/reference/using-api/cel/\n\nIn addition, for each type NamedResourcesin AttributeValue there is a map that resolves to the corresponding value of the instance under evaluation. For example:\n\n attributes.quantity[\"a\"].isGreaterThan(quantity(\"0\")) &&\n attributes.stringslice[\"b\"].isSorted()", - "type": "string" - } - }, - "required": [ - "selector" - ], - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.NamedResourcesResources": { - "description": "NamedResourcesResources is used in ResourceModel.", - "properties": { - "instances": { - "description": "The list of all individual resources instances currently available.", + "constraints": { + "description": "These constraints must be satisfied by the set of devices that get allocated for the claim.", "items": { "allOf": [ { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.NamedResourcesInstance" + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceConstraint" + } + ], + "default": {} + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "requests": { + "description": "Requests represent individual requests for distinct devices which must all be satisfied. If empty, nothing needs to be allocated.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceRequest" } ], "default": {} @@ -326,16 +303,21 @@ "x-kubernetes-list-type": "atomic" } }, - "required": [ - "instances" - ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.NamedResourcesStringSlice": { - "description": "NamedResourcesStringSlice contains a slice of strings.", + "io.k8s.api.resource.v1alpha3.DeviceClaimConfiguration": { + "description": "DeviceClaimConfiguration is used for configuration parameters in DeviceClaim.", "properties": { - "strings": { - "description": "Strings is the slice of strings.", + "opaque": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration" + } + ], + "description": "Opaque provides driver-specific configuration parameters." + }, + "requests": { + "description": "Requests lists the names of requests where the configuration applies. If empty, it applies to all requests.", "items": { "default": "", "type": "string" @@ -344,13 +326,286 @@ "x-kubernetes-list-type": "atomic" } }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceClass": { + "description": "DeviceClass is a vendor- or admin-provided resource that contains device configuration and selectors. It can be referenced in the device requests of a claim to apply these presets. Cluster scoped.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + } + ], + "default": {}, + "description": "Standard object metadata" + }, + "spec": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClassSpec" + } + ], + "default": {}, + "description": "Spec defines what can be allocated and how to configure it.\n\nThis is mutable. Consumers have to be prepared for classes changing at any time, either because they get updated or replaced. Claim allocations are done once based on whatever was set in classes at the time of allocation.\n\nChanging the spec automatically increments the metadata.generation number." + } + }, "required": [ - "strings" + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + ] + }, + "io.k8s.api.resource.v1alpha3.DeviceClassConfiguration": { + "description": "DeviceClassConfiguration is used in DeviceClass.", + "properties": { + "opaque": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration" + } + ], + "description": "Opaque provides driver-specific configuration parameters." + } + }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceClassList": { + "description": "DeviceClassList is a collection of classes.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of resource classes.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + ], + "default": {} + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + ], + "default": {}, + "description": "Standard list metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "resource.k8s.io", + "kind": "DeviceClassList", + "version": "v1alpha3" + } + ] + }, + "io.k8s.api.resource.v1alpha3.DeviceClassSpec": { + "description": "DeviceClassSpec is used in a [DeviceClass] to define what can be allocated and how to configure it.", + "properties": { + "config": { + "description": "Config defines configuration parameters that apply to each device that is claimed via this class. Some classses may potentially be satisfied by multiple drivers, so each instance of a vendor configuration applies to exactly one driver.\n\nThey are passed to the driver, but are not considered while allocating the claim.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClassConfiguration" + } + ], + "default": {} + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "selectors": { + "description": "Each selector must be satisfied by a device which is claimed via this class.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceSelector" + } + ], + "default": {} + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "suitableNodes": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.core.v1.NodeSelector" + } + ], + "description": "Only nodes matching the selector will be considered by the scheduler when trying to find a Node that fits a Pod when that Pod uses a claim that has not been allocated yet *and* that claim gets allocated through a control plane controller. It is ignored when the claim does not use a control plane controller for allocation.\n\nSetting this field is optional. If unset, all Nodes are candidates.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate." + } + }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceConstraint": { + "description": "DeviceConstraint must have exactly one field set besides Requests.", + "properties": { + "matchAttribute": { + "description": "MatchAttribute requires that all devices in question have this attribute and that its type and value are the same across those devices.\n\nFor example, if you specified \"dra.example.com/numa\" (a hypothetical example!), then only devices in the same NUMA node will be chosen. A device which does not have that attribute will not be chosen. All devices should use a value of the same type for this attribute because that is part of its specification, but if one device doesn't, then it also will not be chosen.\n\nMust include the domain qualifier.", + "type": "string" + }, + "requests": { + "description": "Requests is a list of the one or more requests in this claim which must co-satisfy this constraint. If a request is fulfilled by multiple devices, then all of the devices must satisfy the constraint. If this is not specified, this constraint applies to all requests in this claim.", + "items": { + "default": "", + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceRequest": { + "description": "DeviceRequest is a request for devices required for a claim. This is typically a request for a single resource like a device, but can also ask for several identical devices.\n\nA DeviceClassName is currently required. Clients must check that it is indeed set. It's absence indicates that something changed in a way that is not supported by the client yet, in which case it must refuse to handle the request.", + "properties": { + "adminAccess": { + "default": false, + "description": "AdminAccess indicates that this is a claim for administrative access to the device(s). Claims with AdminAccess are expected to be used for monitoring or other management services for a device. They ignore all ordinary claims to the device with respect to access modes and any resource allocations.", + "type": "boolean" + }, + "allocationMode": { + "description": "AllocationMode and its related fields define how devices are allocated to satisfy this request. Supported values are:\n\n- ExactCount: This request is for a specific number of devices.\n This is the default. The exact number is provided in the\n count field.\n\n- All: This request is for all of the matching devices in a pool.\n Allocation will fail if some devices are already allocated,\n unless adminAccess is requested.\n\nIf AlloctionMode is not specified, the default mode is ExactCount. If the mode is ExactCount and count is not specified, the default count is one. Any other requests must specify this field.\n\nMore modes may get added in the future. Clients must refuse to handle requests with unknown modes.", + "type": "string" + }, + "count": { + "description": "Count is used only when the count mode is \"ExactCount\". Must be greater than zero. If AllocationMode is ExactCount and this field is not specified, the default is one.", + "format": "int64", + "type": "integer" + }, + "deviceClassName": { + "default": "", + "description": "DeviceClassName references a specific DeviceClass, which can define additional configuration and selectors to be inherited by this request.\n\nA class is required. Which classes are available depends on the cluster.\n\nAdministrators may use this to restrict which devices may get requested by only installing classes with selectors for permitted devices. If users are free to request anything without restrictions, then administrators can create an empty DeviceClass for users to reference.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name can be used to reference this request in a pod.spec.containers[].resources.claims entry and in a constraint of the claim.\n\nMust be a DNS label.", + "type": "string" + }, + "selectors": { + "description": "Selectors define criteria which must be satisfied by a specific device in order for that device to be considered for this request. All selectors must be satisfied for a device to be considered.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceSelector" + } + ], + "default": {} + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "name", + "deviceClassName" + ], + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceRequestAllocationResult": { + "description": "DeviceRequestAllocationResult contains the allocation result for one request.", + "properties": { + "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" + }, + "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" + }, + "request": { + "default": "", + "description": "Request is the name of the request in the claim which caused this device to be allocated. Multiple devices may have been allocated per request.", + "type": "string" + } + }, + "required": [ + "request", + "driver", + "pool", + "device" + ], + "type": "object" + }, + "io.k8s.api.resource.v1alpha3.DeviceSelector": { + "description": "DeviceSelector must have exactly one field set.", + "properties": { + "cel": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.CELDeviceSelector" + } + ], + "description": "CEL contains a CEL expression for selecting a device." + } + }, + "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": { + "driver": { + "default": "", + "description": "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.", + "type": "string" + }, + "parameters": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" + } + ], + "description": "Parameters can contain arbitrary data. It is the responsibility of the driver developer to handle validation and versioning. Typically this includes self-identification and a version (\"kind\" + \"apiVersion\" for Kubernetes types), with conversion between different versions." + } + }, + "required": [ + "driver", + "parameters" ], "type": "object" }, "io.k8s.api.resource.v1alpha3.PodSchedulingContext": { - "description": "PodSchedulingContext objects hold information that is needed to schedule a Pod with ResourceClaims that use \"WaitForFirstConsumer\" allocation mode.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "description": "PodSchedulingContext objects hold information that is needed to schedule a Pod with ResourceClaims that use \"WaitForFirstConsumer\" allocation mode.\n\nThis is an alpha type and requires enabling the DRAControlPlaneController feature gate.", "properties": { "apiVersion": { "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", @@ -487,7 +742,7 @@ "type": "object" }, "io.k8s.api.resource.v1alpha3.ResourceClaim": { - "description": "ResourceClaim describes which resources are needed by a resource consumer. Its status tracks whether the resource has been allocated and what the resulting attributes are.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "description": "ResourceClaim describes a request for access to resources in the cluster, for use by workloads. For example, if a workload needs an accelerator device with specific properties, this is how that request is expressed. The status stanza tracks whether this claim has been satisfied and what specific resources have been allocated.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", "properties": { "apiVersion": { "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", @@ -513,7 +768,7 @@ } ], "default": {}, - "description": "Spec describes the desired attributes of a resource that then needs to be allocated. It can only be set once when creating the ResourceClaim." + "description": "Spec describes what is being requested and how to configure it. The spec is immutable." }, "status": { "allOf": [ @@ -522,7 +777,7 @@ } ], "default": {}, - "description": "Status describes whether the resource is available and with which attributes." + "description": "Status describes whether the claim is ready to use and what has been allocated." } }, "required": [ @@ -612,130 +867,11 @@ } ] }, - "io.k8s.api.resource.v1alpha3.ResourceClaimParameters": { - "description": "ResourceClaimParameters defines resource requests for a ResourceClaim in an in-tree format understood by Kubernetes.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "driverRequests": { - "description": "DriverRequests describes all resources that are needed for the allocated claim. A single claim may use resources coming from different drivers. For each driver, this array has at most one entry which then may have one or more per-driver requests.\n\nMay be empty, in which case the claim can always be allocated.", - "items": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DriverRequests" - } - ], - "default": {} - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - }, - "generatedFrom": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersReference" - } - ], - "description": "If this object was created from some other resource, then this links back to that resource. This field is used to find the in-tree representation of the claim parameters when the parameter reference of the claim refers to some unknown type." - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" - } - ], - "default": {}, - "description": "Standard object metadata" - } - }, - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClaimParametersList": { - "description": "ResourceClaimParametersList is a collection of ResourceClaimParameters.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "items": { - "description": "Items is the list of node resource capacity objects.", - "items": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - ], - "default": {} - }, - "type": "array" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" - } - ], - "default": {}, - "description": "Standard list metadata" - } - }, - "required": [ - "items" - ], - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClaimParametersList", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClaimParametersReference": { - "description": "ResourceClaimParametersReference contains enough information to let you locate the parameters for a ResourceClaim. The object must be in the same namespace as the ResourceClaim.", - "properties": { - "apiGroup": { - "description": "APIGroup is the group for the resource being referenced. It is empty for the core API. This matches the group in the APIVersion that is used when creating the resources.", - "type": "string" - }, - "kind": { - "default": "", - "description": "Kind is the type of resource being referenced. This is the same value as in the parameter object's metadata, for example \"ConfigMap\".", - "type": "string" - }, - "name": { - "default": "", - "description": "Name is the name of resource being referenced.", - "type": "string" - } - }, - "required": [ - "kind", - "name" - ], - "type": "object" - }, "io.k8s.api.resource.v1alpha3.ResourceClaimSchedulingStatus": { "description": "ResourceClaimSchedulingStatus contains information about one particular ResourceClaim with \"WaitForFirstConsumer\" allocation mode.", "properties": { "name": { + "default": "", "description": "Name matches the pod.spec.resourceClaims[*].Name field.", "type": "string" }, @@ -749,32 +885,32 @@ "x-kubernetes-list-type": "atomic" } }, - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.ResourceClaimSpec": { - "description": "ResourceClaimSpec defines how a resource is to be allocated.", - "properties": { - "parametersRef": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersReference" - } - ], - "description": "ParametersRef references a separate object with arbitrary parameters that will be used by the driver when allocating a resource for the claim.\n\nThe object must be in the same namespace as the ResourceClaim." - }, - "resourceClassName": { - "default": "", - "description": "ResourceClassName references the driver and additional parameters via the name of a ResourceClass that was created as part of the driver deployment.", - "type": "string" - } - }, "required": [ - "resourceClassName" + "name" ], "type": "object" }, + "io.k8s.api.resource.v1alpha3.ResourceClaimSpec": { + "description": "ResourceClaimSpec defines what is being requested in a ResourceClaim and how to configure it.", + "properties": { + "controller": { + "description": "Controller is the name of the DRA driver that is meant to handle allocation of this claim. If empty, allocation is handled by the scheduler while scheduling a pod.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", + "type": "string" + }, + "devices": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClaim" + } + ], + "default": {}, + "description": "Devices defines how to request devices." + } + }, + "type": "object" + }, "io.k8s.api.resource.v1alpha3.ResourceClaimStatus": { - "description": "ResourceClaimStatus tracks whether the resource has been allocated and what the resulting attributes are.", + "description": "ResourceClaimStatus tracks whether the resource has been allocated and what the result of that was.", "properties": { "allocation": { "allOf": [ @@ -782,18 +918,14 @@ "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.AllocationResult" } ], - "description": "Allocation is set by the resource driver once a resource or set of resources has been allocated successfully. If this is not specified, the resources have not been allocated yet." + "description": "Allocation is set once the claim has been allocated successfully." }, "deallocationRequested": { - "description": "DeallocationRequested indicates that a ResourceClaim is to be deallocated.\n\nThe driver then must deallocate this claim and reset the field together with clearing the Allocation field.\n\nWhile DeallocationRequested is set, no new consumers may be added to ReservedFor.", + "description": "Indicates that a claim is to be deallocated. While this is set, no new consumers may be added to ReservedFor.\n\nThis is only used if the claim needs to be deallocated by a DRA driver. That driver then must deallocate this claim and reset the field together with clearing the Allocation field.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", "type": "boolean" }, - "driverName": { - "description": "DriverName is a copy of the driver name from the ResourceClass at the time when allocation started.", - "type": "string" - }, "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.\n\nThere can be at most 32 such reservations. This may get increased in the future, but not reduced.", + "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": { "allOf": [ { @@ -814,7 +946,7 @@ "type": "object" }, "io.k8s.api.resource.v1alpha3.ResourceClaimTemplate": { - "description": "ResourceClaimTemplate is used to produce ResourceClaim objects.", + "description": "ResourceClaimTemplate is used to produce ResourceClaim objects.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", "properties": { "apiVersion": { "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", @@ -927,324 +1059,41 @@ ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.ResourceClass": { - "description": "ResourceClass is used by administrators to influence how resources are allocated.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "io.k8s.api.resource.v1alpha3.ResourcePool": { + "description": "ResourcePool describes the pool that ResourceSlices belong to.", "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "driverName": { - "default": "", - "description": "DriverName defines the name of the dynamic resource driver that is used for allocation of a ResourceClaim that uses this class.\n\nResource drivers have a unique name in forward domain order (acme.example.com).", - "type": "string" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" - } - ], - "default": {}, - "description": "Standard object metadata" - }, - "parametersRef": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersReference" - } - ], - "description": "ParametersRef references an arbitrary separate object that may hold parameters that will be used by the driver when allocating a resource that uses this class. A dynamic resource driver can distinguish between parameters stored here and and those stored in ResourceClaimSpec." - }, - "structuredParameters": { - "description": "If and only if allocation of claims using this class is handled via structured parameters, then StructuredParameters must be set to true.", - "type": "boolean" - }, - "suitableNodes": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.core.v1.NodeSelector" - } - ], - "description": "Only nodes matching the selector will be considered by the scheduler when trying to find a Node that fits a Pod when that Pod uses a ResourceClaim that has not been allocated yet.\n\nSetting this field is optional. If null, all nodes are candidates." - } - }, - "required": [ - "driverName" - ], - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClassList": { - "description": "ResourceClassList is a collection of classes.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "items": { - "description": "Items is the list of resource classes.", - "items": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - ], - "default": {} - }, - "type": "array" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" - } - ], - "default": {}, - "description": "Standard list metadata" - } - }, - "required": [ - "items" - ], - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClassList", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClassParameters": { - "description": "ResourceClassParameters defines resource requests for a ResourceClass in an in-tree format understood by Kubernetes.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "filters": { - "description": "Filters describes additional contraints that must be met when using the class.", - "items": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceFilter" - } - ], - "default": {} - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - }, - "generatedFrom": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersReference" - } - ], - "description": "If this object was created from some other resource, then this links back to that resource. This field is used to find the in-tree representation of the class parameters when the parameter reference of the class refers to some unknown type." - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" - } - ], - "default": {}, - "description": "Standard object metadata" - }, - "vendorParameters": { - "description": "VendorParameters are arbitrary setup parameters for all claims using this class. They are ignored while allocating the claim. There must not be more than one entry per driver.", - "items": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.VendorParameters" - } - ], - "default": {} - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - } - }, - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClassParametersList": { - "description": "ResourceClassParametersList is a collection of ResourceClassParameters.", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "items": { - "description": "Items is the list of node resource capacity objects.", - "items": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - ], - "default": {} - }, - "type": "array" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" - } - ], - "default": {}, - "description": "Standard list metadata" - } - }, - "required": [ - "items" - ], - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "resource.k8s.io", - "kind": "ResourceClassParametersList", - "version": "v1alpha3" - } - ] - }, - "io.k8s.api.resource.v1alpha3.ResourceClassParametersReference": { - "description": "ResourceClassParametersReference contains enough information to let you locate the parameters for a ResourceClass.", - "properties": { - "apiGroup": { - "description": "APIGroup is the group for the resource being referenced. It is empty for the core API. This matches the group in the APIVersion that is used when creating the resources.", - "type": "string" - }, - "kind": { - "default": "", - "description": "Kind is the type of resource being referenced. This is the same value as in the parameter object's metadata.", - "type": "string" + "generation": { + "default": 0, + "description": "Generation tracks the change in a pool over time. Whenever a driver changes something about one or more of the resources in a pool, it must change the generation in all ResourceSlices which are part of that pool. Consumers of ResourceSlices should only consider resources from the pool with the highest generation number. The generation may be reset by drivers, which should be fine for consumers, assuming that all ResourceSlices in a pool are updated to match or deleted.\n\nCombined with ResourceSliceCount, this mechanism enables consumers to detect pools which are comprised of multiple ResourceSlices and are in an incomplete state.", + "format": "int64", + "type": "integer" }, "name": { "default": "", - "description": "Name is the name of resource being referenced.", + "description": "Name is used to identify the pool. For node-local devices, this is often the node name, but this is not required.\n\nIt must not be longer than 253 characters and must consist of one or more DNS sub-domains separated by slashes. This field is immutable.", "type": "string" }, - "namespace": { - "description": "Namespace that contains the referenced resource. Must be empty for cluster-scoped resources and non-empty for namespaced resources.", - "type": "string" + "resourceSliceCount": { + "default": 0, + "description": "ResourceSliceCount is the total number of ResourceSlices in the pool at this generation number. Must be greater than zero.\n\nConsumers can use this to check whether they have seen all ResourceSlices belonging to the same pool.", + "format": "int64", + "type": "integer" } }, "required": [ - "kind", - "name" + "name", + "generation", + "resourceSliceCount" ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.ResourceFilter": { - "description": "ResourceFilter is a filter for resources from one particular driver.", - "properties": { - "driverName": { - "description": "DriverName is the name used by the DRA driver kubelet plugin.", - "type": "string" - }, - "namedResources": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.NamedResourcesFilter" - } - ], - "description": "NamedResources describes a resource filter using the named resources model." - } - }, - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.ResourceHandle": { - "description": "ResourceHandle holds opaque resource data for processing by a specific kubelet plugin.", - "properties": { - "data": { - "description": "Data contains the opaque data associated with this ResourceHandle. It is set by the controller component of the resource driver whose name matches the DriverName set in the ResourceClaimStatus this ResourceHandle is embedded in. It is set at allocation time and is intended for processing by the kubelet plugin whose name matches the DriverName set in this ResourceHandle.\n\nThe maximum size of this field is 16KiB. This may get increased in the future, but not reduced.", - "type": "string" - }, - "driverName": { - "default": "", - "description": "DriverName specifies the name of the resource driver whose kubelet plugin should be invoked to process this ResourceHandle's data once it lands on a node. This may differ from the DriverName set in ResourceClaimStatus this ResourceHandle is embedded in.", - "type": "string" - }, - "structuredData": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.StructuredResourceHandle" - } - ], - "description": "If StructuredData is set, then it needs to be used instead of Data." - } - }, - "required": [ - "driverName" - ], - "type": "object" - }, - "io.k8s.api.resource.v1alpha3.ResourceRequest": { - "description": "ResourceRequest is a request for resources from one particular driver.", - "properties": { - "namedResources": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.NamedResourcesRequest" - } - ], - "description": "NamedResources describes a request for resources with the named resources model." - }, - "vendorParameters": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" - } - ], - "description": "VendorParameters are arbitrary setup parameters for the requested resource. They are ignored while allocating a claim." - } - }, - "type": "object" - }, "io.k8s.api.resource.v1alpha3.ResourceSlice": { - "description": "ResourceSlice provides information about available resources on individual nodes.", + "description": "ResourceSlice represents one or more resources in a pool of similar resources, managed by a common driver. A pool may span more than one ResourceSlice, and exactly how many ResourceSlices comprise a pool is determined by the driver.\n\nAt the moment, the only supported resources are devices with attributes and capacities. Each device in a given pool, regardless of how many ResourceSlices, must have a unique name. The ResourceSlice in which a device gets published may change over time. The unique identifier for a device is the tuple , , .\n\nWhenever a driver needs to update a pool, it increments the pool.Spec.Pool.Generation number and updates all ResourceSlices with that new number and new resource definitions. A consumer must only use ResourceSlices with the highest generation number and ignore all others.\n\nWhen allocating all resources in a pool matching certain criteria or when looking for the best solution among several different alternatives, a consumer should check the number of ResourceSlices in a pool (included in each ResourceSlice) to determine whether its view of a pool is complete and if not, should wait until the driver has completed updating the pool.\n\nFor resources that are not local to a node, the node name is not set. Instead, the driver may use a node selector to specify where the devices are available.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", "properties": { "apiVersion": { "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", "type": "string" }, - "driverName": { - "default": "", - "description": "DriverName identifies the DRA driver providing the capacity information. A field selector can be used to list only ResourceSlice objects with a certain driver name.", - "type": "string" - }, "kind": { "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", "type": "string" @@ -1258,21 +1107,18 @@ "default": {}, "description": "Standard object metadata" }, - "namedResources": { + "spec": { "allOf": [ { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.NamedResourcesResources" + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceSliceSpec" } ], - "description": "NamedResources describes available resources using the named resources model." - }, - "nodeName": { - "description": "NodeName identifies the node which provides the resources if they are local to a node.\n\nA field selector can be used to list only ResourceSlice objects with a certain node name.", - "type": "string" + "default": {}, + "description": "Contains the information published by the driver.\n\nChanging the spec automatically increments the metadata.generation number." } }, "required": [ - "driverName" + "spec" ], "type": "object", "x-kubernetes-group-version-kind": [ @@ -1291,7 +1137,7 @@ "type": "string" }, "items": { - "description": "Items is the list of node resource capacity objects.", + "description": "Items is the list of resource ResourceSlices.", "items": { "allOf": [ { @@ -1306,7 +1152,7 @@ "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", "type": "string" }, - "metadata": { + "listMeta": { "allOf": [ { "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" @@ -1328,19 +1174,19 @@ } ] }, - "io.k8s.api.resource.v1alpha3.StructuredResourceHandle": { - "description": "StructuredResourceHandle is the in-tree representation of the allocation result.", + "io.k8s.api.resource.v1alpha3.ResourceSliceSpec": { + "description": "ResourceSliceSpec contains the information published by the driver in one ResourceSlice.", "properties": { - "nodeName": { - "description": "NodeName is the name of the node providing the necessary resources if the resources are local to a node.", - "type": "string" + "allNodes": { + "description": "AllNodes indicates that all nodes have access to the resources in the pool.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set.", + "type": "boolean" }, - "results": { - "description": "Results lists all allocated driver resources.", + "devices": { + "description": "Devices lists some or all of the devices in this pool.\n\nMust not have more than 128 entries.", "items": { "allOf": [ { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DriverAllocationResult" + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.Device" } ], "default": {} @@ -1348,46 +1194,39 @@ "type": "array", "x-kubernetes-list-type": "atomic" }, - "vendorClaimParameters": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" - } - ], - "description": "VendorClaimParameters are the per-claim configuration parameters from the resource claim parameters at the time that the claim was allocated." + "driver": { + "default": "", + "description": "Driver identifies the DRA driver providing the capacity information. A field selector can be used to list only ResourceSlice objects with a certain driver name.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver. This field is immutable.", + "type": "string" }, - "vendorClassParameters": { + "nodeName": { + "description": "NodeName identifies the node which provides the resources in this pool. A field selector can be used to list only ResourceSlice objects belonging to a certain node.\n\nThis field can be used to limit access from nodes to ResourceSlices with the same node name. It also indicates to autoscalers that adding new nodes of the same type as some old node might also make new resources available.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set. This field is immutable.", + "type": "string" + }, + "nodeSelector": { "allOf": [ { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" + "$ref": "#/components/schemas/io.k8s.api.core.v1.NodeSelector" } ], - "description": "VendorClassParameters are the per-claim configuration parameters from the resource class at the time that the claim was allocated." + "description": "NodeSelector defines which nodes have access to the resources in the pool, when that pool is not limited to a single node.\n\nMust use exactly one term.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set." + }, + "pool": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourcePool" + } + ], + "default": {}, + "description": "Pool describes the pool that this ResourceSlice belongs to." } }, "required": [ - "results" + "driver", + "pool" ], "type": "object" }, - "io.k8s.api.resource.v1alpha3.VendorParameters": { - "description": "VendorParameters are opaque parameters for one particular driver.", - "properties": { - "driverName": { - "description": "DriverName is the name used by the DRA driver kubelet plugin.", - "type": "string" - }, - "parameters": { - "allOf": [ - { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" - } - ], - "description": "Parameters can be arbitrary setup parameters. They are ignored while allocating a claim." - } - }, - "type": "object" - }, "io.k8s.apimachinery.pkg.api.resource.Quantity": { "description": "Quantity is a fixed-point representation of a number. It provides convenient marshaling/unmarshaling in JSON and YAML, in addition to String() and AsInt64() accessors.\n\nThe serialization format is:\n\n``` ::= \n\n\t(Note that may be empty, from the \"\" case in .)\n\n ::= 0 | 1 | ... | 9 ::= | ::= | . | . | . ::= \"+\" | \"-\" ::= | ::= | | ::= Ki | Mi | Gi | Ti | Pi | Ei\n\n\t(International System of units; See: http://physics.nist.gov/cuu/Units/binary.html)\n\n ::= m | \"\" | k | M | G | T | P | E\n\n\t(Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.)\n\n ::= \"e\" | \"E\" ```\n\nNo matter which of the three exponent forms is used, no quantity may represent a number greater than 2^63-1 in magnitude, nor may it have more than 3 decimal places. Numbers larger or more precise will be capped or rounded up. (E.g.: 0.1m will rounded up to 1m.) This may be extended in the future if we require larger or smaller quantities.\n\nWhen a Quantity is parsed from a string, it will remember the type of suffix it had, and will use the same type again when it is serialized.\n\nBefore serializing, Quantity will be put in \"canonical form\". This means that Exponent/suffix will be adjusted up or down (with a corresponding increase or decrease in Mantissa) such that:\n\n- No precision is lost - No fractional digits will be emitted - The exponent (or suffix) is as large as possible.\n\nThe sign will be omitted unless the number is negative.\n\nExamples:\n\n- 1.5 will be serialized as \"1500m\" - 1.5Gi will be serialized as \"1536Mi\"\n\nNote that the quantity will NEVER be internally represented by a floating point number. That is the whole point of this exercise.\n\nNon-canonical values will still parse as long as they are well formed, but will be re-emitted in their canonical form. (So always use canonical form, or don't diff.)\n\nThis format is intended to make it difficult to use these numbers without writing some sort of special handling code in the hopes that that will cause implementors to also use a fixed point implementation.", "oneOf": [ @@ -2148,11 +1987,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, @@ -2592,6 +2426,817 @@ ] } }, + "/apis/resource.k8s.io/v1alpha3/deviceclasses": { + "delete": { + "description": "delete collection of DeviceClass", + "operationId": "deleteResourceV1alpha3CollectionDeviceClass", + "parameters": [ + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", + "in": "query", + "name": "sendInitialEvents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + } + ], + "requestBody": { + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + } + }, + "description": "OK" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "get": { + "description": "list or watch objects of kind DeviceClass", + "operationId": "listResourceV1alpha3DeviceClass", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", + "in": "query", + "name": "sendInitialEvents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "schema": { + "type": "boolean", + "uniqueItems": true + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClassList" + } + }, + "application/json;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClassList" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClassList" + } + }, + "application/vnd.kubernetes.protobuf;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClassList" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClassList" + } + } + }, + "description": "OK" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", + "in": "query", + "name": "pretty", + "schema": { + "type": "string", + "uniqueItems": true + } + } + ], + "post": { + "description": "create a DeviceClass", + "operationId": "createResourceV1alpha3DeviceClass", + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "schema": { + "type": "string", + "uniqueItems": true + } + } + ], + "requestBody": { + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "description": "OK" + }, + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "description": "Created" + }, + "202": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "description": "Accepted" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + } + }, + "/apis/resource.k8s.io/v1alpha3/deviceclasses/{name}": { + "delete": { + "description": "delete a DeviceClass", + "operationId": "deleteResourceV1alpha3DeviceClass", + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "schema": { + "type": "string", + "uniqueItems": true + } + } + ], + "requestBody": { + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "description": "OK" + }, + "202": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "description": "Accepted" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "get": { + "description": "read the specified DeviceClass", + "operationId": "readResourceV1alpha3DeviceClass", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "description": "OK" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "parameters": [ + { + "description": "name of the DeviceClass", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", + "in": "query", + "name": "pretty", + "schema": { + "type": "string", + "uniqueItems": true + } + } + ], + "patch": { + "description": "partially update the specified DeviceClass", + "operationId": "patchResourceV1alpha3DeviceClass", + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "schema": { + "type": "boolean", + "uniqueItems": true + } + } + ], + "requestBody": { + "content": { + "application/apply-patch+yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + "application/json-patch+json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + "application/merge-patch+json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + "application/strategic-merge-patch+json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "description": "OK" + }, + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "description": "Created" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "put": { + "description": "replace the specified DeviceClass", + "operationId": "replaceResourceV1alpha3DeviceClass", + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "schema": { + "type": "string", + "uniqueItems": true + } + } + ], + "requestBody": { + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "description": "OK" + }, + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.DeviceClass" + } + } + }, + "description": "Created" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + } + }, "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/podschedulingcontexts": { "delete": { "description": "delete collection of PodSchedulingContext", @@ -3712,837 +4357,6 @@ } } }, - "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/resourceclaimparameters": { - "delete": { - "description": "delete collection of ResourceClaimParameters", - "operationId": "deleteResourceV1alpha3CollectionNamespacedResourceClaimParameters", - "parameters": [ - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "in": "query", - "name": "gracePeriodSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "in": "query", - "name": "orphanDependents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", - "in": "query", - "name": "propagationPolicy", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" - } - } - } - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "deletecollection", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "get": { - "description": "list or watch objects of kind ResourceClaimParameters", - "operationId": "listResourceV1alpha3NamespacedResourceClaimParameters", - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "post": { - "description": "create ResourceClaimParameters", - "operationId": "createResourceV1alpha3NamespacedResourceClaimParameters", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "description": "OK" - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "description": "Created" - }, - "202": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "description": "Accepted" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "post", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - } - }, - "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/resourceclaimparameters/{name}": { - "delete": { - "description": "delete ResourceClaimParameters", - "operationId": "deleteResourceV1alpha3NamespacedResourceClaimParameters", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "in": "query", - "name": "gracePeriodSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "in": "query", - "name": "orphanDependents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", - "in": "query", - "name": "propagationPolicy", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" - } - } - } - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "description": "OK" - }, - "202": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "description": "Accepted" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "delete", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "get": { - "description": "read the specified ResourceClaimParameters", - "operationId": "readResourceV1alpha3NamespacedResourceClaimParameters", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "name of the ResourceClaimParameters", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "patch": { - "description": "partially update the specified ResourceClaimParameters", - "operationId": "patchResourceV1alpha3NamespacedResourceClaimParameters", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", - "in": "query", - "name": "fieldManager", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", - "in": "query", - "name": "force", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "application/apply-patch+yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - "application/json-patch+json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - "application/merge-patch+json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - "application/strategic-merge-patch+json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "description": "OK" - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "description": "Created" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "put": { - "description": "replace the specified ResourceClaimParameters", - "operationId": "replaceResourceV1alpha3NamespacedResourceClaimParameters", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "description": "OK" - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParameters" - } - } - }, - "description": "Created" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - } - }, "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/resourceclaims": { "delete": { "description": "delete collection of ResourceClaim", @@ -6494,837 +6308,6 @@ } } }, - "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/resourceclassparameters": { - "delete": { - "description": "delete collection of ResourceClassParameters", - "operationId": "deleteResourceV1alpha3CollectionNamespacedResourceClassParameters", - "parameters": [ - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "in": "query", - "name": "gracePeriodSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "in": "query", - "name": "orphanDependents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", - "in": "query", - "name": "propagationPolicy", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" - } - } - } - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "deletecollection", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "get": { - "description": "list or watch objects of kind ResourceClassParameters", - "operationId": "listResourceV1alpha3NamespacedResourceClassParameters", - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "post": { - "description": "create ResourceClassParameters", - "operationId": "createResourceV1alpha3NamespacedResourceClassParameters", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "description": "OK" - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "description": "Created" - }, - "202": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "description": "Accepted" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "post", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - } - }, - "/apis/resource.k8s.io/v1alpha3/namespaces/{namespace}/resourceclassparameters/{name}": { - "delete": { - "description": "delete ResourceClassParameters", - "operationId": "deleteResourceV1alpha3NamespacedResourceClassParameters", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "in": "query", - "name": "gracePeriodSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "in": "query", - "name": "orphanDependents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", - "in": "query", - "name": "propagationPolicy", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" - } - } - } - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "description": "OK" - }, - "202": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "description": "Accepted" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "delete", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "get": { - "description": "read the specified ResourceClassParameters", - "operationId": "readResourceV1alpha3NamespacedResourceClassParameters", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "name of the ResourceClassParameters", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "patch": { - "description": "partially update the specified ResourceClassParameters", - "operationId": "patchResourceV1alpha3NamespacedResourceClassParameters", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", - "in": "query", - "name": "fieldManager", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", - "in": "query", - "name": "force", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "application/apply-patch+yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - "application/json-patch+json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - "application/merge-patch+json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - "application/strategic-merge-patch+json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "description": "OK" - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "description": "Created" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "put": { - "description": "replace the specified ResourceClassParameters", - "operationId": "replaceResourceV1alpha3NamespacedResourceClassParameters", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "description": "OK" - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParameters" - } - } - }, - "description": "Created" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - } - }, "/apis/resource.k8s.io/v1alpha3/podschedulingcontexts": { "get": { "description": "list or watch objects of kind PodSchedulingContext", @@ -7476,157 +6459,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/resourceclaimparameters": { - "get": { - "description": "list or watch objects of kind ResourceClaimParameters", - "operationId": "listResourceV1alpha3ResourceClaimParametersForAllNamespaces", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClaimParametersList" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ] - }, "/apis/resource.k8s.io/v1alpha3/resourceclaims": { "get": { "description": "list or watch objects of kind ResourceClaim", @@ -7929,968 +6761,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/resourceclasses": { - "delete": { - "description": "delete collection of ResourceClass", - "operationId": "deleteResourceV1alpha3CollectionResourceClass", - "parameters": [ - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "in": "query", - "name": "gracePeriodSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "in": "query", - "name": "orphanDependents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", - "in": "query", - "name": "propagationPolicy", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" - } - } - } - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "deletecollection", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "get": { - "description": "list or watch objects of kind ResourceClass", - "operationId": "listResourceV1alpha3ResourceClass", - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassList" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassList" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassList" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassList" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassList" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "post": { - "description": "create a ResourceClass", - "operationId": "createResourceV1alpha3ResourceClass", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "description": "OK" - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "description": "Created" - }, - "202": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "description": "Accepted" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "post", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - } - }, - "/apis/resource.k8s.io/v1alpha3/resourceclasses/{name}": { - "delete": { - "description": "delete a ResourceClass", - "operationId": "deleteResourceV1alpha3ResourceClass", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "in": "query", - "name": "gracePeriodSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "in": "query", - "name": "orphanDependents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", - "in": "query", - "name": "propagationPolicy", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" - } - } - } - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "description": "OK" - }, - "202": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "description": "Accepted" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "delete", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "get": { - "description": "read the specified ResourceClass", - "operationId": "readResourceV1alpha3ResourceClass", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "name of the ResourceClass", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "patch": { - "description": "partially update the specified ResourceClass", - "operationId": "patchResourceV1alpha3ResourceClass", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", - "in": "query", - "name": "fieldManager", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", - "in": "query", - "name": "force", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "application/apply-patch+yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - "application/json-patch+json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - "application/merge-patch+json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - "application/strategic-merge-patch+json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "description": "OK" - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "description": "Created" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "put": { - "description": "replace the specified ResourceClass", - "operationId": "replaceResourceV1alpha3ResourceClass", - "parameters": [ - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", - "in": "query", - "name": "fieldValidation", - "schema": { - "type": "string", - "uniqueItems": true - } - } - ], - "requestBody": { - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "description": "OK" - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClass" - } - } - }, - "description": "Created" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - } - }, - "/apis/resource.k8s.io/v1alpha3/resourceclassparameters": { - "get": { - "description": "list or watch objects of kind ResourceClassParameters", - "operationId": "listResourceV1alpha3ResourceClassParametersForAllNamespaces", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.api.resource.v1alpha3.ResourceClassParametersList" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ] - }, "/apis/resource.k8s.io/v1alpha3/resourceslices": { "delete": { "description": "delete collection of ResourceSlice", @@ -9702,6 +7572,318 @@ } } }, + "/apis/resource.k8s.io/v1alpha3/watch/deviceclasses": { + "get": { + "description": "watch individual changes to a list of DeviceClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchResourceV1alpha3DeviceClassList", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/json;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/vnd.kubernetes.protobuf;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + } + }, + "description": "OK" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", + "in": "query", + "name": "pretty", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", + "in": "query", + "name": "sendInitialEvents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "schema": { + "type": "boolean", + "uniqueItems": true + } + } + ] + }, + "/apis/resource.k8s.io/v1alpha3/watch/deviceclasses/{name}": { + "get": { + "description": "watch changes to an object of kind DeviceClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchResourceV1alpha3DeviceClass", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/json;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/vnd.kubernetes.protobuf;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + } + }, + "description": "OK" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "resource_v1alpha3" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "resource.k8s.io", + "kind": "DeviceClass", + "version": "v1alpha3" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "name of the DeviceClass", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", + "in": "query", + "name": "pretty", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", + "in": "query", + "name": "sendInitialEvents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "schema": { + "type": "boolean", + "uniqueItems": true + } + } + ] + }, "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/podschedulingcontexts": { "get": { "description": "watch individual changes to a list of PodSchedulingContext. deprecated: use the 'watch' parameter with a list operation instead.", @@ -10034,338 +8216,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/resourceclaimparameters": { - "get": { - "description": "watch individual changes to a list of ResourceClaimParameters. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchResourceV1alpha3NamespacedResourceClaimParametersList", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ] - }, - "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/resourceclaimparameters/{name}": { - "get": { - "description": "watch changes to an object of kind ResourceClaimParameters. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", - "operationId": "watchResourceV1alpha3NamespacedResourceClaimParameters", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "name of the ResourceClaimParameters", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ] - }, "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/resourceclaims": { "get": { "description": "watch individual changes to a list of ResourceClaim. deprecated: use the 'watch' parameter with a list operation instead.", @@ -11030,338 +8880,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/resourceclassparameters": { - "get": { - "description": "watch individual changes to a list of ResourceClassParameters. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchResourceV1alpha3NamespacedResourceClassParametersList", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ] - }, - "/apis/resource.k8s.io/v1alpha3/watch/namespaces/{namespace}/resourceclassparameters/{name}": { - "get": { - "description": "watch changes to an object of kind ResourceClassParameters. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", - "operationId": "watchResourceV1alpha3NamespacedResourceClassParameters", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "name of the ResourceClassParameters", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ] - }, "/apis/resource.k8s.io/v1alpha3/watch/podschedulingcontexts": { "get": { "description": "watch individual changes to a list of PodSchedulingContext. deprecated: use the 'watch' parameter with a list operation instead.", @@ -11513,157 +9031,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/watch/resourceclaimparameters": { - "get": { - "description": "watch individual changes to a list of ResourceClaimParameters. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchResourceV1alpha3ResourceClaimParametersListForAllNamespaces", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClaimParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ] - }, "/apis/resource.k8s.io/v1alpha3/watch/resourceclaims": { "get": { "description": "watch individual changes to a list of ResourceClaim. deprecated: use the 'watch' parameter with a list operation instead.", @@ -11966,469 +9333,6 @@ } ] }, - "/apis/resource.k8s.io/v1alpha3/watch/resourceclasses": { - "get": { - "description": "watch individual changes to a list of ResourceClass. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchResourceV1alpha3ResourceClassList", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ] - }, - "/apis/resource.k8s.io/v1alpha3/watch/resourceclasses/{name}": { - "get": { - "description": "watch changes to an object of kind ResourceClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", - "operationId": "watchResourceV1alpha3ResourceClass", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watch", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClass", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "name of the ResourceClass", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ] - }, - "/apis/resource.k8s.io/v1alpha3/watch/resourceclassparameters": { - "get": { - "description": "watch individual changes to a list of ResourceClassParameters. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchResourceV1alpha3ResourceClassParametersListForAllNamespaces", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/json;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/vnd.kubernetes.protobuf;stream=watch": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "application/yaml": { - "schema": { - "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - } - }, - "description": "OK" - }, - "401": { - "description": "Unauthorized" - } - }, - "tags": [ - "resource_v1alpha3" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "resource.k8s.io", - "kind": "ResourceClassParameters", - "version": "v1alpha3" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", - "in": "query", - "name": "pretty", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "schema": { - "type": "string", - "uniqueItems": true - } - }, - { - "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", - "in": "query", - "name": "sendInitialEvents", - "schema": { - "type": "boolean", - "uniqueItems": true - } - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "schema": { - "type": "integer", - "uniqueItems": true - } - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "schema": { - "type": "boolean", - "uniqueItems": true - } - } - ] - }, "/apis/resource.k8s.io/v1alpha3/watch/resourceslices": { "get": { "description": "watch individual changes to a list of ResourceSlice. deprecated: use the 'watch' parameter with a list operation instead.", diff --git a/api/openapi-spec/v3/apis__scheduling.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__scheduling.k8s.io__v1_openapi.json index 511c4adc1bc..77ef873583d 100644 --- a/api/openapi-spec/v3/apis__scheduling.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__scheduling.k8s.io__v1_openapi.json @@ -846,11 +846,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__storage.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__storage.k8s.io__v1_openapi.json index 5d519c93c3a..f5b4e7acbe5 100644 --- a/api/openapi-spec/v3/apis__storage.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__storage.k8s.io__v1_openapi.json @@ -2765,11 +2765,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__storage.k8s.io__v1alpha1_openapi.json b/api/openapi-spec/v3/apis__storage.k8s.io__v1alpha1_openapi.json index 5704af3b2a4..531e720b7f7 100644 --- a/api/openapi-spec/v3/apis__storage.k8s.io__v1alpha1_openapi.json +++ b/api/openapi-spec/v3/apis__storage.k8s.io__v1alpha1_openapi.json @@ -841,11 +841,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/api/openapi-spec/v3/apis__storagemigration.k8s.io__v1alpha1_openapi.json b/api/openapi-spec/v3/apis__storagemigration.k8s.io__v1alpha1_openapi.json index e04a7c7ce7a..5284f6f7c69 100644 --- a/api/openapi-spec/v3/apis__storagemigration.k8s.io__v1alpha1_openapi.json +++ b/api/openapi-spec/v3/apis__storagemigration.k8s.io__v1alpha1_openapi.json @@ -953,11 +953,6 @@ "group": "", "kind": "Status", "version": "v1" - }, - { - "group": "resource.k8s.io", - "kind": "Status", - "version": "v1alpha3" } ] }, diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 88246510868..7b65a50807e 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -37,7 +37,7 @@ API_KNOWN_VIOLATIONS_DIR="${API_KNOWN_VIOLATIONS_DIR:-"${KUBE_ROOT}/api/api-rule OUT_DIR="_output" BOILERPLATE_FILENAME="hack/boilerplate/boilerplate.generatego.txt" APPLYCONFIG_PKG="k8s.io/client-go/applyconfigurations" -PLURAL_EXCEPTIONS="Endpoints:Endpoints,ResourceClaimParameters:ResourceClaimParameters,ResourceClassParameters:ResourceClassParameters" +PLURAL_EXCEPTIONS="Endpoints:Endpoints" # Any time we call sort, we want it in the same locale. export LC_ALL="C" diff --git a/pkg/api/testing/defaulting_test.go b/pkg/api/testing/defaulting_test.go index 2a08f788e29..75a5e0b1cfd 100644 --- a/pkg/api/testing/defaulting_test.go +++ b/pkg/api/testing/defaulting_test.go @@ -135,6 +135,10 @@ func TestDefaulting(t *testing.T) { {Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "ClusterRoleBindingList"}: {}, {Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "RoleBinding"}: {}, {Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "RoleBindingList"}: {}, + {Group: "resource.k8s.io", Version: "v1alpha3", Kind: "ResourceClaim"}: {}, + {Group: "resource.k8s.io", Version: "v1alpha3", Kind: "ResourceClaimList"}: {}, + {Group: "resource.k8s.io", Version: "v1alpha3", Kind: "ResourceClaimTemplate"}: {}, + {Group: "resource.k8s.io", Version: "v1alpha3", Kind: "ResourceClaimTemplateList"}: {}, {Group: "admissionregistration.k8s.io", Version: "v1alpha1", Kind: "ValidatingAdmissionPolicy"}: {}, {Group: "admissionregistration.k8s.io", Version: "v1alpha1", Kind: "ValidatingAdmissionPolicyList"}: {}, {Group: "admissionregistration.k8s.io", Version: "v1alpha1", Kind: "ValidatingAdmissionPolicyBinding"}: {}, diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index 546cee1cd2c..720213b5d43 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -2455,6 +2455,13 @@ type ResourceClaim struct { // the Pod where this field is used. It makes that resource available // inside a container. Name string + + // Request is the name chosen for a request in the referenced claim. + // If empty, everything from the claim is made available, otherwise + // only the result of this request. + // + // +optional + Request string } // Container represents a single container that is expected to be run on the host. diff --git a/pkg/apis/core/v1/zz_generated.conversion.go b/pkg/apis/core/v1/zz_generated.conversion.go index e13a75b6b5f..6a250a2fa78 100644 --- a/pkg/apis/core/v1/zz_generated.conversion.go +++ b/pkg/apis/core/v1/zz_generated.conversion.go @@ -7439,6 +7439,7 @@ func Convert_core_ReplicationControllerStatus_To_v1_ReplicationControllerStatus( func autoConvert_v1_ResourceClaim_To_core_ResourceClaim(in *v1.ResourceClaim, out *core.ResourceClaim, s conversion.Scope) error { out.Name = in.Name + out.Request = in.Request return nil } @@ -7449,6 +7450,7 @@ func Convert_v1_ResourceClaim_To_core_ResourceClaim(in *v1.ResourceClaim, out *c func autoConvert_core_ResourceClaim_To_v1_ResourceClaim(in *core.ResourceClaim, out *v1.ResourceClaim, s conversion.Scope) error { out.Name = in.Name + out.Request = in.Request return nil } diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index 05cf5ecb370..79ebaf2efeb 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -6757,9 +6757,35 @@ func validateResourceClaimNames(claims []core.ResourceClaim, podClaimNames sets. allErrs = append(allErrs, field.Required(fldPath.Index(i), "")) } else { if names.Has(name) { + // All requests of that claim already referenced. allErrs = append(allErrs, field.Duplicate(fldPath.Index(i), name)) } else { - names.Insert(name) + key := name + if claim.Request != "" { + allErrs = append(allErrs, ValidateDNS1123Label(claim.Request, fldPath.Index(i).Child("request"))...) + key += "/" + claim.Request + } + if names.Has(key) { + // The exact same entry was already referenced. + allErrs = append(allErrs, field.Duplicate(fldPath.Index(i), key)) + } else if claim.Request == "" { + // When referencing a claim, there's an + // overlap when previously some request + // in the claim was referenced. This + // cannot be checked with a map lookup, + // we need to iterate. + for key := range names { + index := strings.Index(key, "/") + if index < 0 { + continue + } + if key[0:index] == name { + allErrs = append(allErrs, field.Duplicate(fldPath.Index(i), name)) + } + } + } + + names.Insert(key) } if !podClaimNames.Has(name) { // field.NotFound doesn't accept an diff --git a/pkg/apis/core/validation/validation_test.go b/pkg/apis/core/validation/validation_test.go index dbec8026ced..32833656be3 100644 --- a/pkg/apis/core/validation/validation_test.go +++ b/pkg/apis/core/validation/validation_test.go @@ -23816,6 +23816,8 @@ func TestValidateDynamicResourceAllocation(t *testing.T) { shortPodName := &metav1.ObjectMeta{ Name: "some-pod", } + requestName := "req-0" + anotherRequestName := "req-1" goodClaimTemplate := podtest.MakePod("", podtest.SetContainers(podtest.MakeContainer("ctr", podtest.SetContainerResources(core.ResourceRequirements{Claims: []core.ResourceClaim{{Name: "my-claim-template"}}}))), podtest.SetRestartPolicy(core.RestartPolicyAlways), @@ -23848,6 +23850,26 @@ func TestValidateDynamicResourceAllocation(t *testing.T) { ResourceClaimName: &externalClaimName, }), ), + "multiple claims with requests": podtest.MakePod("", + podtest.SetContainers(podtest.MakeContainer("ctr", podtest.SetContainerResources(core.ResourceRequirements{Claims: []core.ResourceClaim{{Name: "my-claim", Request: requestName}, {Name: "another-claim", Request: requestName}}}))), + podtest.SetResourceClaims( + core.PodResourceClaim{ + Name: "my-claim", + ResourceClaimName: &externalClaimName, + }, + core.PodResourceClaim{ + Name: "another-claim", + ResourceClaimName: &externalClaimName, + }), + ), + "single claim with requests": podtest.MakePod("", + podtest.SetContainers(podtest.MakeContainer("ctr", podtest.SetContainerResources(core.ResourceRequirements{Claims: []core.ResourceClaim{{Name: "my-claim", Request: requestName}, {Name: "my-claim", Request: anotherRequestName}}}))), + podtest.SetResourceClaims( + core.PodResourceClaim{ + Name: "my-claim", + ResourceClaimName: &externalClaimName, + }), + ), "init container": podtest.MakePod("", podtest.SetInitContainers(podtest.MakeContainer("ctr-init", podtest.SetContainerResources(core.ResourceRequirements{Claims: []core.ResourceClaim{{Name: "my-claim"}}}))), podtest.SetResourceClaims(core.PodResourceClaim{ @@ -23928,6 +23950,34 @@ func TestValidateDynamicResourceAllocation(t *testing.T) { ResourceClaimName: &externalClaimName, }), ), + "pod claim name duplicates without and with request": podtest.MakePod("", + podtest.SetContainers(podtest.MakeContainer("ctr", podtest.SetContainerResources(core.ResourceRequirements{Claims: []core.ResourceClaim{{Name: "my-claim"}, {Name: "my-claim", Request: "req-0"}}}))), + podtest.SetResourceClaims(core.PodResourceClaim{ + Name: "my-claim", + ResourceClaimName: &externalClaimName, + }), + ), + "pod claim name duplicates with and without request": podtest.MakePod("", + podtest.SetContainers(podtest.MakeContainer("ctr", podtest.SetContainerResources(core.ResourceRequirements{Claims: []core.ResourceClaim{{Name: "my-claim", Request: "req-0"}, {Name: "my-claim"}}}))), + podtest.SetResourceClaims(core.PodResourceClaim{ + Name: "my-claim", + ResourceClaimName: &externalClaimName, + }), + ), + "pod claim name duplicates with requests": podtest.MakePod("", + podtest.SetContainers(podtest.MakeContainer("ctr", podtest.SetContainerResources(core.ResourceRequirements{Claims: []core.ResourceClaim{{Name: "my-claim", Request: "req-0"}, {Name: "my-claim", Request: "req-0"}}}))), + podtest.SetResourceClaims(core.PodResourceClaim{ + Name: "my-claim", + ResourceClaimName: &externalClaimName, + }), + ), + "bad request name": podtest.MakePod("", + podtest.SetContainers(podtest.MakeContainer("ctr", podtest.SetContainerResources(core.ResourceRequirements{Claims: []core.ResourceClaim{{Name: "my-claim", Request: "*$@%^"}}}))), + podtest.SetResourceClaims(core.PodResourceClaim{ + Name: "my-claim", + ResourceClaimName: &externalClaimName, + }), + ), "no claims defined": podtest.MakePod("", podtest.SetContainers(podtest.MakeContainer("ctr", podtest.SetContainerResources(core.ResourceRequirements{Claims: []core.ResourceClaim{{Name: "my-claim"}}}))), podtest.SetRestartPolicy(core.RestartPolicyAlways), diff --git a/pkg/apis/resource/fuzzer/fuzzer.go b/pkg/apis/resource/fuzzer/fuzzer.go index 5f9b5273900..9ad8ad32fcf 100644 --- a/pkg/apis/resource/fuzzer/fuzzer.go +++ b/pkg/apis/resource/fuzzer/fuzzer.go @@ -17,10 +17,44 @@ limitations under the License. package fuzzer import ( + fuzz "github.com/google/gofuzz" + "k8s.io/apimachinery/pkg/runtime" runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/kubernetes/pkg/apis/resource" ) // Funcs contains the fuzzer functions for the resource group. +// +// Leaving fields empty which then get replaced by the default +// leads to errors during roundtrip tests. var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { - return nil + return []interface{}{ + func(r *resource.DeviceRequest, c fuzz.Continue) { + c.FuzzNoCustom(r) // fuzz self without calling this function again + + if r.AllocationMode == "" { + r.AllocationMode = []resource.DeviceAllocationMode{ + resource.DeviceAllocationModeAll, + resource.DeviceAllocationModeExactCount, + }[c.Int31n(2)] + } + }, + func(r *resource.DeviceAllocationConfiguration, c fuzz.Continue) { + c.FuzzNoCustom(r) + if r.Source == "" { + r.Source = []resource.AllocationConfigSource{ + resource.AllocationConfigSourceClass, + resource.AllocationConfigSourceClaim, + }[c.Int31n(2)] + } + }, + func(r *resource.OpaqueDeviceConfiguration, 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.Parameters = runtime.RawExtension{Raw: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`)} + }, + } } diff --git a/pkg/apis/resource/namedresources.go b/pkg/apis/resource/namedresources.go deleted file mode 100644 index 4e96d9b0a41..00000000000 --- a/pkg/apis/resource/namedresources.go +++ /dev/null @@ -1,112 +0,0 @@ -/* -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 resource - -import "k8s.io/apimachinery/pkg/api/resource" - -// NamedResourcesResources is used in ResourceModel. -type NamedResourcesResources struct { - // The list of all individual resources instances currently available. - Instances []NamedResourcesInstance -} - -// NamedResourcesInstance represents one individual hardware instance that can be selected based -// on its attributes. -type NamedResourcesInstance struct { - // Name is unique identifier among all resource instances managed by - // the driver on the node. It must be a DNS subdomain. - Name string - - // Attributes defines the attributes of this resource instance. - // The name of each attribute must be unique. - Attributes []NamedResourcesAttribute -} - -// NamedResourcesAttribute is a combination of an attribute name and its value. -type NamedResourcesAttribute struct { - // Name is unique identifier among all resource instances managed by - // the driver on the node. It must be a DNS subdomain. - Name string - - NamedResourcesAttributeValue -} - -// NamedResourcesAttributeValue must have one and only one field set. -type NamedResourcesAttributeValue struct { - // QuantityValue is a quantity. - QuantityValue *resource.Quantity - // BoolValue is a true/false value. - BoolValue *bool - // IntValue is a 64-bit integer. - IntValue *int64 - // IntSliceValue is an array of 64-bit integers. - IntSliceValue *NamedResourcesIntSlice - // StringValue is a string. - StringValue *string - // StringSliceValue is an array of strings. - StringSliceValue *NamedResourcesStringSlice - // VersionValue is a semantic version according to semver.org spec 2.0.0. - VersionValue *string -} - -// NamedResourcesIntSlice contains a slice of 64-bit integers. -type NamedResourcesIntSlice struct { - // Ints is the slice of 64-bit integers. - Ints []int64 -} - -// NamedResourcesStringSlice contains a slice of strings. -type NamedResourcesStringSlice struct { - // Strings is the slice of strings. - Strings []string -} - -// NamedResourcesRequest is used in ResourceRequestModel. -type NamedResourcesRequest struct { - // Selector is a CEL expression which must evaluate to true if a - // resource instance is suitable. The language is as defined in - // https://kubernetes.io/docs/reference/using-api/cel/ - // - // In addition, for each type NamedResourcesin AttributeValue there is a map that - // resolves to the corresponding value of the instance under evaluation. - // For example: - // - // attributes.quantity["a"].isGreaterThan(quantity("0")) && - // attributes.stringslice["b"].isSorted() - Selector string -} - -// NamedResourcesFilter is used in ResourceFilterModel. -type NamedResourcesFilter struct { - // Selector is a CEL expression which must evaluate to true if a - // resource instance is suitable. The language is as defined in - // https://kubernetes.io/docs/reference/using-api/cel/ - // - // In addition, for each type in NamedResourcesAttributeValue there is a map that - // resolves to the corresponding value of the instance under evaluation. - // For example: - // - // attributes.quantity["a"].isGreaterThan(quantity("0")) && - // attributes.stringslice["b"].isSorted() - Selector string -} - -// NamedResourcesAllocationResult is used in AllocationResultModel. -type NamedResourcesAllocationResult struct { - // Name is the name of the selected resource instance. - Name string -} diff --git a/pkg/apis/resource/register.go b/pkg/apis/resource/register.go index 1d7b718abef..37136ac1f9e 100644 --- a/pkg/apis/resource/register.go +++ b/pkg/apis/resource/register.go @@ -52,8 +52,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { return err } scheme.AddKnownTypes(SchemeGroupVersion, - &ResourceClass{}, - &ResourceClassList{}, + &DeviceClass{}, + &DeviceClassList{}, &ResourceClaim{}, &ResourceClaimList{}, &ResourceClaimTemplate{}, @@ -62,10 +62,6 @@ func addKnownTypes(scheme *runtime.Scheme) error { &PodSchedulingContextList{}, &ResourceSlice{}, &ResourceSliceList{}, - &ResourceClaimParameters{}, - &ResourceClaimParametersList{}, - &ResourceClassParameters{}, - &ResourceClassParametersList{}, ) return nil diff --git a/pkg/apis/resource/structured/namedresources/validation/validation.go b/pkg/apis/resource/structured/namedresources/validation/validation.go deleted file mode 100644 index 88ea0e434f3..00000000000 --- a/pkg/apis/resource/structured/namedresources/validation/validation.go +++ /dev/null @@ -1,178 +0,0 @@ -/* -Copyright 2022 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 validation - -import ( - "fmt" - "regexp" - - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/validation/field" - "k8s.io/apiserver/pkg/cel" - "k8s.io/apiserver/pkg/cel/environment" - namedresourcescel "k8s.io/dynamic-resource-allocation/structured/namedresources/cel" - corevalidation "k8s.io/kubernetes/pkg/apis/core/validation" - "k8s.io/kubernetes/pkg/apis/resource" -) - -var ( - validateInstanceName = corevalidation.ValidateDNS1123Subdomain - validateAttributeName = corevalidation.ValidateDNS1123Subdomain -) - -type Options struct { - // StoredExpressions must be true if and only if validating CEL - // expressions that were already stored persistently. This makes - // validation more permissive by enabling CEL definitions that are not - // valid yet for new expressions. - StoredExpressions bool -} - -func ValidateResources(resources *resource.NamedResourcesResources, fldPath *field.Path) field.ErrorList { - allErrs := validateInstances(resources.Instances, fldPath.Child("instances")) - return allErrs -} - -func validateInstances(instances []resource.NamedResourcesInstance, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - instanceNames := sets.New[string]() - for i, instance := range instances { - idxPath := fldPath.Index(i) - instanceName := instance.Name - allErrs = append(allErrs, validateInstanceName(instanceName, idxPath.Child("name"))...) - if instanceNames.Has(instanceName) { - allErrs = append(allErrs, field.Duplicate(idxPath.Child("name"), instanceName)) - } else { - instanceNames.Insert(instanceName) - } - allErrs = append(allErrs, validateAttributes(instance.Attributes, idxPath.Child("attributes"))...) - } - return allErrs -} - -var ( - numericIdentifier = `(0|[1-9]\d*)` - - preReleaseIdentifier = `(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)` - - buildIdentifier = `[0-9a-zA-Z-]+` - - semverRe = regexp.MustCompile(`^` + - - // dot-separated version segments (e.g. 1.2.3) - numericIdentifier + `\.` + numericIdentifier + `\.` + numericIdentifier + - - // optional dot-separated prerelease segments (e.g. -alpha.PRERELEASE.1) - `(-` + preReleaseIdentifier + `(\.` + preReleaseIdentifier + `)*)?` + - - // optional dot-separated build identifier segments (e.g. +build.id.20240305) - `(\+` + buildIdentifier + `(\.` + buildIdentifier + `)*)?` + - - `$`) -) - -func validateAttributes(attributes []resource.NamedResourcesAttribute, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - attributeNames := sets.New[string]() - for i, attribute := range attributes { - idxPath := fldPath.Index(i) - attributeName := attribute.Name - allErrs = append(allErrs, validateAttributeName(attributeName, idxPath.Child("name"))...) - if attributeNames.Has(attributeName) { - allErrs = append(allErrs, field.Duplicate(idxPath.Child("name"), attributeName)) - } else { - attributeNames.Insert(attributeName) - } - - entries := sets.New[string]() - if attribute.QuantityValue != nil { - entries.Insert("quantity") - } - if attribute.BoolValue != nil { - entries.Insert("bool") - } - if attribute.IntValue != nil { - entries.Insert("int") - } - if attribute.IntSliceValue != nil { - entries.Insert("intSlice") - } - if attribute.StringValue != nil { - entries.Insert("string") - } - if attribute.StringSliceValue != nil { - entries.Insert("stringSlice") - } - if attribute.VersionValue != nil { - entries.Insert("version") - if !semverRe.MatchString(*attribute.VersionValue) { - allErrs = append(allErrs, field.Invalid(idxPath.Child("version"), *attribute.VersionValue, "must be a string compatible with semver.org spec 2.0.0")) - } - } - - switch len(entries) { - case 0: - allErrs = append(allErrs, field.Required(idxPath, "exactly one value must be set")) - case 1: - // Okay. - default: - allErrs = append(allErrs, field.Invalid(idxPath, sets.List(entries), "exactly one field must be set, not several")) - } - } - return allErrs -} - -func ValidateRequest(opts Options, request *resource.NamedResourcesRequest, fldPath *field.Path) field.ErrorList { - return validateSelector(opts, request.Selector, fldPath.Child("selector")) -} - -func ValidateFilter(opts Options, filter *resource.NamedResourcesFilter, fldPath *field.Path) field.ErrorList { - return validateSelector(opts, filter.Selector, fldPath.Child("selector")) -} - -func validateSelector(opts Options, selector string, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - if selector == "" { - allErrs = append(allErrs, field.Required(fldPath, "")) - } else { - envType := environment.NewExpressions - if opts.StoredExpressions { - envType = environment.StoredExpressions - } - result := namedresourcescel.GetCompiler().CompileCELExpression(selector, envType) - if result.Error != nil { - allErrs = append(allErrs, convertCELErrorToValidationError(fldPath, selector, result.Error)) - } - } - return allErrs -} - -func convertCELErrorToValidationError(fldPath *field.Path, expression string, err *cel.Error) *field.Error { - switch err.Type { - case cel.ErrorTypeRequired: - return field.Required(fldPath, err.Detail) - case cel.ErrorTypeInvalid: - return field.Invalid(fldPath, expression, err.Detail) - case cel.ErrorTypeInternal: - return field.InternalError(fldPath, err) - } - return field.InternalError(fldPath, fmt.Errorf("unsupported error type: %w", err)) -} - -func ValidateAllocationResult(result *resource.NamedResourcesAllocationResult, fldPath *field.Path) field.ErrorList { - return validateInstanceName(result.Name, fldPath.Child("name")) -} diff --git a/pkg/apis/resource/structured/namedresources/validation/validation_test.go b/pkg/apis/resource/structured/namedresources/validation/validation_test.go deleted file mode 100644 index 7fedfcae556..00000000000 --- a/pkg/apis/resource/structured/namedresources/validation/validation_test.go +++ /dev/null @@ -1,188 +0,0 @@ -/* -Copyright 2022 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 validation - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - "k8s.io/apimachinery/pkg/api/resource" - "k8s.io/apimachinery/pkg/util/validation/field" - resourceapi "k8s.io/kubernetes/pkg/apis/resource" - "k8s.io/utils/ptr" -) - -func testResources(instances []resourceapi.NamedResourcesInstance) *resourceapi.NamedResourcesResources { - resources := &resourceapi.NamedResourcesResources{ - Instances: instances, - } - return resources -} - -func TestValidateResources(t *testing.T) { - goodName := "foo" - badName := "!@#$%^" - quantity := resource.MustParse("1") - - scenarios := map[string]struct { - resources *resourceapi.NamedResourcesResources - wantFailures field.ErrorList - }{ - "empty": { - resources: testResources(nil), - }, - "good": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName}}), - }, - "bad-name": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("instances").Index(0).Child("name"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: badName}}), - }, - "duplicate-name": { - wantFailures: field.ErrorList{field.Duplicate(field.NewPath("instances").Index(1).Child("name"), goodName)}, - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName}, {Name: goodName}}), - }, - "quantity": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{QuantityValue: &quantity}}}}}), - }, - "bool": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{BoolValue: ptr.To(true)}}}}}), - }, - "int": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{IntValue: ptr.To(int64(1))}}}}}), - }, - "int-slice": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{IntSliceValue: &resourceapi.NamedResourcesIntSlice{Ints: []int64{1, 2, 3}}}}}}}), - }, - "string": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{StringValue: ptr.To("hello")}}}}}), - }, - "string-slice": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{StringSliceValue: &resourceapi.NamedResourcesStringSlice{Strings: []string{"hello"}}}}}}}), - }, - "version-okay": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{VersionValue: ptr.To("1.0.0")}}}}}), - }, - "version-beta": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{VersionValue: ptr.To("1.0.0-beta")}}}}}), - }, - "version-beta-1": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{VersionValue: ptr.To("1.0.0-beta.1")}}}}}), - }, - "version-build": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{VersionValue: ptr.To("1.0.0+build")}}}}}), - }, - "version-build-1": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{VersionValue: ptr.To("1.0.0+build.1")}}}}}), - }, - "version-beta-1-build-1": { - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{VersionValue: ptr.To("1.0.0-beta.1+build.1")}}}}}), - }, - "version-bad": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("instances").Index(0).Child("attributes").Index(0).Child("version"), "1.0", "must be a string compatible with semver.org spec 2.0.0")}, - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{VersionValue: ptr.To("1.0")}}}}}), - }, - "version-bad-leading-zeros": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("instances").Index(0).Child("attributes").Index(0).Child("version"), "01.0.0", "must be a string compatible with semver.org spec 2.0.0")}, - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{VersionValue: ptr.To("01.0.0")}}}}}), - }, - "version-bad-leading-zeros-middle": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("instances").Index(0).Child("attributes").Index(0).Child("version"), "1.00.0", "must be a string compatible with semver.org spec 2.0.0")}, - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{VersionValue: ptr.To("1.00.0")}}}}}), - }, - "version-bad-leading-zeros-end": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("instances").Index(0).Child("attributes").Index(0).Child("version"), "1.0.00", "must be a string compatible with semver.org spec 2.0.0")}, - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{VersionValue: ptr.To("1.0.00")}}}}}), - }, - "version-bad-spaces": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("instances").Index(0).Child("attributes").Index(0).Child("version"), " 1.0.0 ", "must be a string compatible with semver.org spec 2.0.0")}, - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{VersionValue: ptr.To(" 1.0.0 ")}}}}}), - }, - "empty-attribute": { - wantFailures: field.ErrorList{field.Required(field.NewPath("instances").Index(0).Child("attributes").Index(0), "exactly one value must be set")}, - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName}}}}), - }, - "duplicate-value": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("instances").Index(0).Child("attributes").Index(0), []string{"bool", "int"}, "exactly one field must be set, not several")}, - resources: testResources([]resourceapi.NamedResourcesInstance{{Name: goodName, Attributes: []resourceapi.NamedResourcesAttribute{{Name: goodName, NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{BoolValue: ptr.To(true), IntValue: ptr.To(int64(1))}}}}}), - }, - } - - for name, scenario := range scenarios { - t.Run(name, func(t *testing.T) { - errs := ValidateResources(scenario.resources, nil) - assert.Equal(t, scenario.wantFailures, errs) - }) - } -} - -func TestValidateSelector(t *testing.T) { - scenarios := map[string]struct { - selector string - wantFailures field.ErrorList - }{ - "okay": { - selector: "true", - }, - "empty": { - selector: "", - wantFailures: field.ErrorList{field.Required(nil, "")}, - }, - "undefined": { - selector: "nosuchvar", - wantFailures: field.ErrorList{field.Invalid(nil, "nosuchvar", "compilation failed: ERROR: :1:1: undeclared reference to 'nosuchvar' (in container '')\n | nosuchvar\n | ^")}, - }, - "wrong-type": { - selector: "1", - wantFailures: field.ErrorList{field.Invalid(nil, "1", "must evaluate to bool")}, - }, - "quantity": { - selector: `attributes.quantity["name"].isGreaterThan(quantity("0"))`, - }, - "bool": { - selector: `attributes.bool["name"]`, - }, - "int": { - selector: `attributes.int["name"] > 0`, - }, - "intslice": { - selector: `attributes.intslice["name"].isSorted()`, - }, - "string": { - selector: `attributes.string["name"] == "fish"`, - }, - "stringslice": { - selector: `attributes.stringslice["name"].isSorted()`, - }, - "version": { - selector: `attributes.version["name"].isGreaterThan(semver("1.0.0"))`, - }, - } - - for name, scenario := range scenarios { - t.Run(name, func(t *testing.T) { - // At the moment, there's no difference between stored and new expressions. - // This uses the stricter validation. - opts := Options{ - StoredExpressions: false, - } - errs := validateSelector(opts, scenario.selector, nil) - assert.Equal(t, scenario.wantFailures, errs) - }) - } -} diff --git a/pkg/apis/resource/types.go b/pkg/apis/resource/types.go index b5091b1b366..e08d7f4a341 100644 --- a/pkg/apis/resource/types.go +++ b/pkg/apis/resource/types.go @@ -17,17 +17,288 @@ limitations under the License. package resource import ( + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/validation" "k8s.io/kubernetes/pkg/apis/core" ) +const ( + // Finalizer is the finalizer that gets set for claims + // which were allocated through a builtin controller. + // Reserved for use by Kubernetes, DRA driver controllers must + // use their own finalizer. + Finalizer = "resource.kubernetes.io/delete-protection" +) + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// ResourceClaim describes which resources are needed by a resource consumer. -// Its status tracks whether the resource has been allocated and what the -// resulting attributes are. +// ResourceSlice represents one or more resources in a pool of similar resources, +// managed by a common driver. A pool may span more than one ResourceSlice, and exactly how many +// ResourceSlices comprise a pool is determined by the driver. +// +// At the moment, the only supported resources are devices with attributes and capacities. +// Each device in a given pool, regardless of how many ResourceSlices, must have a unique name. +// The ResourceSlice in which a device gets published may change over time. The unique identifier +// for a device is the tuple , , . +// +// Whenever a driver needs to update a pool, it increments the pool.Spec.Pool.Generation number +// and updates all ResourceSlices with that new number and new resource definitions. A consumer +// must only use ResourceSlices with the highest generation number and ignore all others. +// +// When allocating all resources in a pool matching certain criteria or when +// looking for the best solution among several different alternatives, a +// consumer should check the number of ResourceSlices in a pool (included in +// each ResourceSlice) to determine whether its view of a pool is complete and +// if not, should wait until the driver has completed updating the pool. +// +// For resources that are not local to a node, the node name is not set. Instead, +// the driver may use a node selector to specify where the devices are available. +// +// This is an alpha type and requires enabling the DynamicResourceAllocation +// feature gate. +type ResourceSlice struct { + metav1.TypeMeta + // Standard object metadata + // +optional + metav1.ObjectMeta + + // Contains the information published by the driver. + // + // Changing the spec automatically increments the metadata.generation number. + Spec ResourceSliceSpec +} + +const ( + // ResourceSliceSelectorNodeName can be used in a [metav1.ListOptions] + // field selector to filter based on [ResourceSliceSpec.NodeName]. + ResourceSliceSelectorNodeName = "spec.nodeName" + // ResourceSliceSelectorDriver can be used in a [metav1.ListOptions] + // field selector to filter based on [ResourceSliceSpec.Driver]. + ResourceSliceSelectorDriver = "spec.driver" +) + +// ResourceSliceSpec contains the information published by the driver in one ResourceSlice. +type ResourceSliceSpec struct { + // Driver identifies the DRA driver providing the capacity information. + // A field selector can be used to list only ResourceSlice + // objects with a certain driver name. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. This field is immutable. + // + // +required + Driver string + + // Pool describes the pool that this ResourceSlice belongs to. + // + // +required + Pool ResourcePool + + // NodeName identifies the node which provides the resources in this pool. + // A field selector can be used to list only ResourceSlice + // objects belonging to a certain node. + // + // This field can be used to limit access from nodes to ResourceSlices with + // the same node name. It also indicates to autoscalers that adding + // new nodes of the same type as some old node might also make new + // resources available. + // + // Exactly one of NodeName, NodeSelector and AllNodes must be set. + // This field is immutable. + // + // +optional + // +oneOf=NodeSelection + NodeName string + + // NodeSelector defines which nodes have access to the resources in the pool, + // when that pool is not limited to a single node. + // + // Must use exactly one term. + // + // Exactly one of NodeName, NodeSelector and AllNodes must be set. + // + // +optional + // +oneOf=NodeSelection + NodeSelector *core.NodeSelector + + // AllNodes indicates that all nodes have access to the resources in the pool. + // + // Exactly one of NodeName, NodeSelector and AllNodes must be set. + // + // +optional + // +oneOf=NodeSelection + AllNodes bool + + // Devices lists some or all of the devices in this pool. + // + // Must not have more than 128 entries. + // + // +optional + // +listType=atomic + Devices []Device +} + +// ResourcePool describes the pool that ResourceSlices belong to. +type ResourcePool struct { + // Name is used to identify the pool. For node-local devices, this + // is often the node name, but this is not required. + // + // It must not be longer than 253 characters and must consist of one or more DNS sub-domains + // separated by slashes. This field is immutable. + // + // +required + Name string + + // Generation tracks the change in a pool over time. Whenever a driver + // changes something about one or more of the resources in a pool, it + // must change the generation in all ResourceSlices which are part of + // that pool. Consumers of ResourceSlices should only consider + // resources from the pool with the highest generation number. The + // generation may be reset by drivers, which should be fine for + // consumers, assuming that all ResourceSlices in a pool are updated to + // match or deleted. + // + // Combined with ResourceSliceCount, this mechanism enables consumers to + // detect pools which are comprised of multiple ResourceSlices and are + // in an incomplete state. + // + // +required + Generation int64 + + // ResourceSliceCount is the total number of ResourceSlices in the pool at this + // generation number. Must be greater than zero. + // + // Consumers can use this to check whether they have seen all ResourceSlices + // belonging to the same pool. + // + // +required + ResourceSliceCount int64 +} + +const ResourceSliceMaxSharedCapacity = 128 +const ResourceSliceMaxDevices = 128 +const PoolNameMaxLength = validation.DNS1123SubdomainMaxLength // Same as for a single node name. + +// Device represents one individual hardware instance that can be selected based +// on its attributes. Besides the name, exactly one field must be set. +type Device struct { + // Name is unique identifier among all devices managed by + // the driver in the pool. It must be a DNS label. + // + // +required + Name string + + // Basic defines one device instance. + // + // +optional + // +oneOf=deviceType + Basic *BasicDevice +} + +// BasicDevice defines one device instance. +type BasicDevice struct { + // Attributes defines the set of attributes for this device. + // The name of each attribute must be unique in that set. + // + // The maximum number of attributes and capacities combined is 32. + // + // +optional + Attributes map[QualifiedName]DeviceAttribute + + // Capacity defines the set of capacities for this device. + // The name of each capacity must be unique in that set. + // + // The maximum number of attributes and capacities combined is 32. + // + // +optional + Capacity map[QualifiedName]resource.Quantity +} + +// Limit for the sum of the number of entries in both ResourceSlices. +const ResourceSliceMaxAttributesAndCapacitiesPerDevice = 32 + +// QualifiedName is the name of a device attribute or capacity. +// +// Attributes and capacities are defined either by the owner of the specific +// driver (usually the vendor) or by some 3rd party (e.g. the Kubernetes +// project). Because they are sometimes compared across devices, a given name +// is expected to mean the same thing and have the same type on all devices. +// +// Names must be either a C identifier (e.g. "theName") or a DNS subdomain +// followed by a slash ("/") followed by a C identifier +// (e.g. "dra.example.com/theName"). Names which do not include the +// domain prefix are assumed to be part of the driver's domain. Attributes +// or capacities defined by 3rd parties must include the domain prefix. +// +// The maximum length for the DNS subdomain is 63 characters (same as +// for driver names) and the maximum length of the C identifier +// is 32. +type QualifiedName string + +// FullyQualifiedName is a QualifiedName where the domain is set. +type FullyQualifiedName string + +// DeviceMaxIDLength is the maximum length of the identifier in a device attribute or capacity name (`/`). +const DeviceMaxIDLength = 32 + +// DeviceAttribute must have exactly one field set. +type DeviceAttribute struct { + // The Go field names below have a Value suffix to avoid a conflict between the + // field "String" and the corresponding method. That method is required. + // The Kubernetes API is defined without that suffix to keep it more natural. + + // IntValue is a number. + // + // +optional + // +oneOf=ValueType + IntValue *int64 + + // BoolValue is a true/false value. + // + // +optional + // +oneOf=ValueType + BoolValue *bool + + // StringValue is a string. Must not be longer than 64 characters. + // + // +optional + // +oneOf=ValueType + StringValue *string + + // VersionValue is a semantic version according to semver.org spec 2.0.0. + // Must not be longer than 64 characters. + // + // +optional + // +oneOf=ValueType + VersionValue *string +} + +// DeviceAttributeMaxValueLength is the maximum length of a string or version attribute value. +const DeviceAttributeMaxValueLength = 64 + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ResourceSliceList is a collection of ResourceSlices. +type ResourceSliceList struct { + metav1.TypeMeta + // Standard list metadata + // +optional + metav1.ListMeta + + // Items is the list of resource ResourceSlices. + Items []ResourceSlice +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ResourceClaim describes a request for access to resources in the cluster, +// for use by workloads. For example, if a workload needs an accelerator device +// with specific properties, this is how that request is expressed. The status +// stanza tracks whether this claim has been satisfied and what specific +// resources have been allocated. // // This is an alpha type and requires enabling the DynamicResourceAllocation // feature gate. @@ -37,65 +308,346 @@ type ResourceClaim struct { // +optional metav1.ObjectMeta - // Spec describes the desired attributes of a resource that then needs - // to be allocated. It can only be set once when creating the - // ResourceClaim. + // Spec describes what is being requested and how to configure it. + // The spec is immutable. Spec ResourceClaimSpec - // Status describes whether the resource is available and with which - // attributes. + // Status describes whether the claim is ready to use and what has been allocated. // +optional Status ResourceClaimStatus } -// ResourceClaimSpec defines how a resource is to be allocated. +// ResourceClaimSpec defines what is being requested in a ResourceClaim and how to configure it. type ResourceClaimSpec struct { - // ResourceClassName references the driver and additional parameters - // via the name of a ResourceClass that was created as part of the - // driver deployment. - ResourceClassName string - - // ParametersRef references a separate object with arbitrary parameters - // that will be used by the driver when allocating a resource for the - // claim. + // Devices defines how to request devices. // - // The object must be in the same namespace as the ResourceClaim. // +optional - ParametersRef *ResourceClaimParametersReference + Devices DeviceClaim + + // Controller is the name of the DRA driver that is meant + // to handle allocation of this claim. If empty, allocation is handled + // by the scheduler while scheduling a pod. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. + // + // +optional + // +featureGate=DRAControlPlaneController + Controller string +} + +// DeviceClaim defines how to request devices with a ResourceClaim. +type DeviceClaim struct { + // Requests represent individual requests for distinct devices which + // must all be satisfied. If empty, nothing needs to be allocated. + // + // +optional + // +listType=atomic + Requests []DeviceRequest + + // These constraints must be satisfied by the set of devices that get + // allocated for the claim. + // + // +optional + // +listType=atomic + Constraints []DeviceConstraint + + // This field holds configuration for multiple potential drivers which + // could satisfy requests in this claim. It is ignored while allocating + // the claim. + // + // +optional + // +listType=atomic + Config []DeviceClaimConfiguration +} + +const ( + DeviceRequestsMaxSize = AllocationResultsMaxSize + DeviceConstraintsMaxSize = 32 + DeviceConfigMaxSize = 32 +) + +// DeviceRequest is a request for devices required for a claim. +// This is typically a request for a single resource like a device, but can +// also ask for several identical devices. +// +// A DeviceClassName is currently required. Clients must check that it is +// indeed set. It's absence indicates that something changed in a way that +// is not supported by the client yet, in which case it must refuse to +// handle the request. +type DeviceRequest struct { + // Name can be used to reference this request in a pod.spec.containers[].resources.claims + // entry and in a constraint of the claim. + // + // Must be a DNS label. + // + // +required + Name string + + // DeviceClassName references a specific DeviceClass, which can define + // additional configuration and selectors to be inherited by this + // request. + // + // A class is required. Which classes are available depends on the cluster. + // + // Administrators may use this to restrict which devices may get + // requested by only installing classes with selectors for permitted + // devices. If users are free to request anything without restrictions, + // then administrators can create an empty DeviceClass for users + // to reference. + // + // +required + DeviceClassName string + + // Selectors define criteria which must be satisfied by a specific + // device in order for that device to be considered for this + // request. All selectors must be satisfied for a device to be + // considered. + // + // +optional + // +listType=atomic + Selectors []DeviceSelector + + // AllocationMode and its related fields define how devices are allocated + // to satisfy this request. Supported values are: + // + // - ExactCount: This request is for a specific number of devices. + // This is the default. The exact number is provided in the + // count field. + // + // - All: This request is for all of the matching devices in a pool. + // Allocation will fail if some devices are already allocated, + // unless adminAccess is requested. + // + // If AlloctionMode is not specified, the default mode is ExactCount. If + // the mode is ExactCount and count is not specified, the default count is + // one. Any other requests must specify this field. + // + // More modes may get added in the future. Clients must refuse to handle + // requests with unknown modes. + // + // +optional + AllocationMode DeviceAllocationMode + + // Count is used only when the count mode is "ExactCount". Must be greater than zero. + // If AllocationMode is ExactCount and this field is not specified, the default is one. + // + // +optional + // +oneOf=AllocationMode + Count int64 + + // AdminAccess indicates that this is a claim for administrative access + // to the device(s). Claims with AdminAccess are expected to be used for + // monitoring or other management services for a device. They ignore + // all ordinary claims to the device with respect to access modes and + // any resource allocations. + // + // +optional + // +default=false + AdminAccess bool +} + +const ( + DeviceSelectorsMaxSize = 32 +) + +type DeviceAllocationMode string + +// Valid [DeviceRequest.CountMode] values. +const ( + DeviceAllocationModeExactCount = DeviceAllocationMode("ExactCount") + DeviceAllocationModeAll = DeviceAllocationMode("All") +) + +// DeviceSelector must have exactly one field set. +type DeviceSelector struct { + // CEL contains a CEL expression for selecting a device. + // + // +optional + // +oneOf=SelectorType + CEL *CELDeviceSelector +} + +// CELDeviceSelector contains a CEL expression for selecting a device. +type CELDeviceSelector struct { + // Expression is a CEL expression which evaluates a single device. It + // must evaluate to true when the device under consideration satisfies + // the desired criteria, and false when it does not. Any other result + // is an error and causes allocation of devices to abort. + // + // The expression's input is an object named "device", which carries + // the following properties: + // - driver (string): the name of the driver which defines this device. + // - attributes (map[string]object): the device's attributes, grouped by prefix + // (e.g. device.attributes["dra.example.com"] evaluates to an object with all + // of the attributes which were prefixed by "dra.example.com". + // - capacity (map[string]object): the device's capacities, grouped by prefix. + // + // Example: Consider a device with driver="dra.example.com", which exposes + // two attributes named "model" and "ext.example.com/family" and which + // exposes one capacity named "modules". This input to this expression + // would have the following fields: + // + // device.driver + // device.attributes["dra.example.com"].model + // device.attributes["ext.example.com"].family + // device.capacity["dra.example.com"].modules + // + // The device.driver field can be used to check for a specific driver, + // either as a high-level precondition (i.e. you only want to consider + // devices from this driver) or as part of a multi-clause expression + // that is meant to consider devices from different drivers. + // + // The value type of each attribute is defined by the device + // definition, and users who write these expressions must consult the + // documentation for their specific drivers. The value type of each + // capacity is Quantity. + // + // If an unknown prefix is used as a lookup in either device.attributes + // or device.capacity, an empty map will be returned. Any reference to + // an unknown field will cause an evaluation error and allocation to + // abort. + // + // A robust expression should check for the existence of attributes + // before referencing them. + // + // For ease of use, the cel.bind() function is enabled, and can be used + // to simplify expressions that access multiple attributes with the + // same domain. For example: + // + // cel.bind(dra, device.attributes["dra.example.com"], dra.someBool && dra.anotherBool) + // + // +required + Expression string +} + +// DeviceConstraint must have exactly one field set besides Requests. +type DeviceConstraint struct { + // Requests is a list of the one or more requests in this claim which + // must co-satisfy this constraint. If a request is fulfilled by + // multiple devices, then all of the devices must satisfy the + // constraint. If this is not specified, this constraint applies to all + // requests in this claim. + // + // +optional + // +listType=atomic + Requests []string + + // MatchAttribute requires that all devices in question have this + // attribute and that its type and value are the same across those + // devices. + // + // For example, if you specified "dra.example.com/numa" (a hypothetical example!), + // then only devices in the same NUMA node will be chosen. A device which + // does not have that attribute will not be chosen. All devices should + // use a value of the same type for this attribute because that is part of + // its specification, but if one device doesn't, then it also will not be + // chosen. + // + // Must include the domain qualifier. + // + // +optional + // +oneOf=ConstraintType + MatchAttribute *FullyQualifiedName +} + +// DeviceClaimConfiguration is used for configuration parameters in DeviceClaim. +type DeviceClaimConfiguration struct { + // Requests lists the names of requests where the configuration applies. + // If empty, it applies to all requests. + // + // +optional + // +listType=atomic + Requests []string + + DeviceConfiguration // inline +} + +// DeviceConfiguration must have exactly one field set. It gets embedded +// inline in some other structs which have other fields, so field names must +// not conflict with those. +type DeviceConfiguration struct { + // Opaque provides driver-specific configuration parameters. + // + // +optional + // +oneOf=ConfigurationType + Opaque *OpaqueDeviceConfiguration +} + +// OpaqueDeviceConfiguration contains configuration parameters for a driver +// in a format defined by the driver vendor. +type OpaqueDeviceConfiguration struct { + // Driver is used to determine which kubelet plugin needs + // to be passed these configuration parameters. + // + // An admission policy provided by the driver developer could use this + // to decide whether it needs to validate them. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + Driver string + + // Parameters can contain arbitrary data. It is the responsibility of + // the driver developer to handle validation and versioning. Typically this + // includes self-identification and a version ("kind" + "apiVersion" for + // Kubernetes types), with conversion between different versions. + // + // +required + Parameters runtime.RawExtension } // ResourceClaimStatus tracks whether the resource has been allocated and what -// the resulting attributes are. +// the result of that was. type ResourceClaimStatus struct { - // DriverName is a copy of the driver name from the ResourceClass at - // the time when allocation started. - // +optional - DriverName string - - // Allocation is set by the resource driver once a resource or set of - // resources has been allocated successfully. If this is not specified, the - // resources have not been allocated yet. + // Allocation is set once the claim has been allocated successfully. + // // +optional Allocation *AllocationResult // 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. + // 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. + // + // In 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. + // + // Both 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. // // There can be at most 32 such reservations. This may get increased in // the future, but not reduced. + // // +optional + // +listType=map + // +listMapKey=uid + // +patchStrategy=merge + // +patchMergeKey=uid ReservedFor []ResourceClaimConsumerReference - // DeallocationRequested indicates that a ResourceClaim is to be - // deallocated. + // Indicates that a claim is to be deallocated. While this is set, + // no new consumers may be added to ReservedFor. // - // The driver then must deallocate this claim and reset the field + // This is only used if the claim needs to be deallocated by a DRA driver. + // That driver then must deallocate this claim and reset the field // together with clearing the Allocation field. // - // While DeallocationRequested is set, no new consumers may be added to - // ReservedFor. + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. + // // +optional + // +featureGate=DRAControlPlaneController DeallocationRequested bool } @@ -103,100 +655,142 @@ type ResourceClaimStatus struct { // claim.status.reservedFor. const ResourceClaimReservedForMaxSize = 32 +// ResourceClaimConsumerReference contains enough information to let you +// locate the consumer of a ResourceClaim. The user must be a resource in the same +// namespace as the ResourceClaim. +type ResourceClaimConsumerReference struct { + // APIGroup is the group for the resource being referenced. It is + // empty for the core API. This matches the group in the APIVersion + // that is used when creating the resources. + // +optional + APIGroup string + // Resource is the type of resource being referenced, for example "pods". + // +required + Resource string + // Name is the name of resource being referenced. + // +required + Name string + // UID identifies exactly one incarnation of the resource. + // +required + UID types.UID +} + // AllocationResult contains attributes of an allocated resource. type AllocationResult struct { - // ResourceHandles contain the state associated with an allocation that - // should be maintained throughout the lifetime of a claim. Each - // ResourceHandle contains data that should be passed to a specific kubelet - // plugin once it lands on a node. This data is returned by the driver - // after a successful allocation and is opaque to Kubernetes. Driver - // documentation may explain to users how to interpret this data if needed. + // Devices is the result of allocating devices. // - // Setting this field is optional. It has a maximum size of 32 entries. - // If null (or empty), it is assumed this allocation will be processed by a - // single kubelet plugin with no ResourceHandle data attached. The name of - // the kubelet plugin invoked will match the DriverName set in the - // ResourceClaimStatus this AllocationResult is embedded in. + // +optional + Devices DeviceAllocationResult + + // NodeSelector defines where the allocated resources are available. If + // unset, they are available everywhere. // + // +optional + NodeSelector *core.NodeSelector + + // Controller is the name of the DRA driver which handled the + // allocation. That driver is also responsible for deallocating the + // claim. It is empty when the claim can be deallocated without + // involving a driver. + // + // A driver may allocate devices provided by other drivers, so this + // driver name here can be different from the driver names listed for + // the results. + // + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. + // + // +optional + // +featureGate=DRAControlPlaneController + Controller string +} + +// DeviceAllocationResult is the result of allocating devices. +type DeviceAllocationResult struct { + // Results lists all allocated devices. + // + // +optional // +listType=atomic - // +optional - ResourceHandles []ResourceHandle + Results []DeviceRequestAllocationResult - // This field will get set by the resource driver after it has allocated - // the resource to inform the scheduler where it can schedule Pods using - // the ResourceClaim. + // This field is a combination of all the claim and class configuration parameters. + // Drivers can distinguish between those based on a flag. // - // Setting this field is optional. If null, the resource is available - // everywhere. - // +optional - AvailableOnNodes *core.NodeSelector -} - -// AllocationResultResourceHandlesMaxSize represents the maximum number of -// entries in allocation.resourceHandles. -const AllocationResultResourceHandlesMaxSize = 32 - -// ResourceHandle holds opaque resource data for processing by a specific kubelet plugin. -type ResourceHandle struct { - // DriverName specifies the name of the resource driver whose kubelet - // plugin should be invoked to process this ResourceHandle's data once it - // lands on a node. This may differ from the DriverName set in - // ResourceClaimStatus this ResourceHandle is embedded in. - DriverName string - - // Data contains the opaque data associated with this ResourceHandle. It is - // set by the controller component of the resource driver whose name - // matches the DriverName set in the ResourceClaimStatus this - // ResourceHandle is embedded in. It is set at allocation time and is - // intended for processing by the kubelet plugin whose name matches - // the DriverName set in this ResourceHandle. + // This includes configuration parameters for drivers which have no allocated + // devices in the result because it is up to the drivers which configuration + // parameters they support. They can silently ignore unknown configuration + // parameters. // - // The maximum size of this field is 16KiB. This may get increased in the - // future, but not reduced. // +optional - Data string - - // If StructuredData is set, then it needs to be used instead of Data. - StructuredData *StructuredResourceHandle + // +listType=atomic + Config []DeviceAllocationConfiguration } -// ResourceHandleDataMaxSize represents the maximum size of resourceHandle.data. -const ResourceHandleDataMaxSize = 16 * 1024 +// AllocationResultsMaxSize represents the maximum number of +// entries in allocation.devices.results. +const AllocationResultsMaxSize = 32 -// StructuredResourceHandle is the in-tree representation of the allocation result. -type StructuredResourceHandle struct { - // VendorClassParameters are the per-claim configuration parameters - // from the resource class at the time that the claim was allocated. - VendorClassParameters runtime.Object +// DeviceRequestAllocationResult contains the allocation result for one request. +type DeviceRequestAllocationResult struct { + // Request is the name of the request in the claim which caused this + // device to be allocated. Multiple devices may have been allocated + // per request. + // + // +required + Request string - // VendorClaimParameters are the per-claim configuration parameters - // from the resource claim parameters at the time that the claim was - // allocated. - VendorClaimParameters runtime.Object + // 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 - // NodeName is the name of the node providing the necessary resources - // if the resources are local to a node. - NodeName 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 - // Results lists all allocated driver resources. - Results []DriverAllocationResult + // Device references one device instance via its name in the driver's + // resource pool. It must be a DNS label. + // + // +required + Device string } -// DriverAllocationResult contains vendor parameters and the allocation result for -// one request. -type DriverAllocationResult struct { - // VendorRequestParameters are the per-request configuration parameters - // from the time that the claim was allocated. - VendorRequestParameters runtime.Object +// DeviceAllocationConfiguration gets embedded in an AllocationResult. +type DeviceAllocationConfiguration struct { + // Source records whether the configuration comes from a class and thus + // is not something that a normal user would have been able to set + // or from a claim. + // + // +required + Source AllocationConfigSource - AllocationResultModel + // Requests lists the names of requests where the configuration applies. + // If empty, its applies to all requests. + // + // +optional + // +listType=atomic + Requests []string + + DeviceConfiguration // inline } -// AllocationResultModel must have one and only one field set. -type AllocationResultModel struct { - // NamedResources describes the allocation result when using the named resources model. - NamedResources *NamedResourcesAllocationResult -} +type AllocationConfigSource string + +// Valid [DeviceAllocationConfiguration.Source] values. +const ( + AllocationConfigSourceClass = "FromClass" + AllocationConfigSourceClaim = "FromClaim" +) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -217,7 +811,7 @@ type ResourceClaimList struct { // a Pod with ResourceClaims that use "WaitForFirstConsumer" allocation // mode. // -// This is an alpha type and requires enabling the DynamicResourceAllocation +// This is an alpha type and requires enabling the DRAControlPlaneController // feature gate. type PodSchedulingContext struct { metav1.TypeMeta @@ -229,6 +823,8 @@ type PodSchedulingContext struct { Spec PodSchedulingContextSpec // Status describes where resources for the Pod can be allocated. + // + // +optional Status PodSchedulingContextStatus } @@ -237,6 +833,8 @@ type PodSchedulingContextSpec struct { // SelectedNode is the node for which allocation of ResourceClaims that // are referenced by the Pod and that use "WaitForFirstConsumer" // allocation is to be attempted. + // + // +optional SelectedNode string // PotentialNodes lists nodes where the Pod might be able to run. @@ -245,7 +843,9 @@ type PodSchedulingContextSpec struct { // many clusters. Larger clusters may need more attempts to find a node // that suits all pending resources. This may get increased in the // future, but not reduced. + // // +optional + // +listType=atomic PotentialNodes []string } @@ -254,6 +854,9 @@ type PodSchedulingContextStatus struct { // ResourceClaims describes resource availability for each // pod.spec.resourceClaim entry where the corresponding ResourceClaim // uses "WaitForFirstConsumer" allocation mode. + // + // +listType=map + // +listMapKey=name // +optional ResourceClaims []ResourceClaimSchedulingStatus @@ -266,6 +869,8 @@ type PodSchedulingContextStatus struct { // ResourceClaim with "WaitForFirstConsumer" allocation mode. type ResourceClaimSchedulingStatus struct { // Name matches the pod.spec.resourceClaims[*].Name field. + // + // +required Name string // UnsuitableNodes lists nodes that the ResourceClaim cannot be @@ -274,7 +879,9 @@ type ResourceClaimSchedulingStatus struct { // The size of this field is limited to 128, the same as for // PodSchedulingSpec.PotentialNodes. This may get increased in the // future, but not reduced. + // // +optional + // +listType=atomic UnsuitableNodes []string } @@ -298,114 +905,90 @@ type PodSchedulingContextList struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// ResourceClass is used by administrators to influence how resources -// are allocated. +// DeviceClass is a vendor- or admin-provided resource that contains +// device configuration and selectors. It can be referenced in +// the device requests of a claim to apply these presets. +// Cluster scoped. // // This is an alpha type and requires enabling the DynamicResourceAllocation // feature gate. -type ResourceClass struct { +type DeviceClass struct { metav1.TypeMeta // Standard object metadata // +optional metav1.ObjectMeta - // DriverName defines the name of the dynamic resource driver that is - // used for allocation of a ResourceClaim that uses this class. + // Spec defines what can be allocated and how to configure it. // - // Resource drivers have a unique name in forward domain order - // (acme.example.com). - DriverName string + // This is mutable. Consumers have to be prepared for classes changing + // at any time, either because they get updated or replaced. Claim + // allocations are done once based on whatever was set in classes at + // the time of allocation. + // + // Changing the spec automatically increments the metadata.generation number. + Spec DeviceClassSpec +} - // ParametersRef references an arbitrary separate object that may hold - // parameters that will be used by the driver when allocating a - // resource that uses this class. A dynamic resource driver can - // distinguish between parameters stored here and and those stored in - // ResourceClaimSpec. +// DeviceClassSpec is used in a [DeviceClass] to define what can be allocated +// and how to configure it. +type DeviceClassSpec struct { + // Each selector must be satisfied by a device which is claimed via this class. + // // +optional - ParametersRef *ResourceClassParametersReference + // +listType=atomic + Selectors []DeviceSelector + + // Config defines configuration parameters that apply to each device that is claimed via this class. + // Some classses may potentially be satisfied by multiple drivers, so each instance of a vendor + // configuration applies to exactly one driver. + // + // They are passed to the driver, but are not considered while allocating the claim. + // + // +optional + // +listType=atomic + Config []DeviceClassConfiguration // Only nodes matching the selector will be considered by the scheduler // when trying to find a Node that fits a Pod when that Pod uses - // a ResourceClaim that has not been allocated yet. + // a claim that has not been allocated yet *and* that claim + // gets allocated through a control plane controller. It is ignored + // when the claim does not use a control plane controller + // for allocation. + // + // Setting this field is optional. If unset, all Nodes are candidates. + // + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. // - // Setting this field is optional. If null, all nodes are candidates. // +optional + // +featureGate=DRAControlPlaneController SuitableNodes *core.NodeSelector +} - // If and only if allocation of claims using this class is handled - // via structured parameters, then StructuredParameters must be set to true. - StructuredParameters *bool +// DeviceClassConfiguration is used in DeviceClass. +type DeviceClassConfiguration struct { + DeviceConfiguration // inline } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// ResourceClassList is a collection of classes. -type ResourceClassList struct { +// DeviceClassList is a collection of classes. +type DeviceClassList struct { metav1.TypeMeta // Standard list metadata // +optional metav1.ListMeta // Items is the list of resource classes. - Items []ResourceClass -} - -// ResourceClassParametersReference contains enough information to let you -// locate the parameters for a ResourceClass. -type ResourceClassParametersReference struct { - // APIGroup is the group for the resource being referenced. It is - // empty for the core API. This matches the group in the APIVersion - // that is used when creating the resources. - // +optional - APIGroup string - // Kind is the type of resource being referenced. This is the same - // value as in the parameter object's metadata. - Kind string - // Name is the name of resource being referenced. - Name string - // Namespace that contains the referenced resource. Must be empty - // for cluster-scoped resources and non-empty for namespaced - // resources. - // +optional - Namespace string -} - -// ResourceClaimParametersReference contains enough information to let you -// locate the parameters for a ResourceClaim. The object must be in the same -// namespace as the ResourceClaim. -type ResourceClaimParametersReference struct { - // APIGroup is the group for the resource being referenced. It is - // empty for the core API. This matches the group in the APIVersion - // that is used when creating the resources. - // +optional - APIGroup string - // Kind is the type of resource being referenced. This is the same - // value as in the parameter object's metadata, for example "ConfigMap". - Kind string - // Name is the name of resource being referenced. - Name string -} - -// ResourceClaimConsumerReference contains enough information to let you -// locate the consumer of a ResourceClaim. The user must be a resource in the same -// namespace as the ResourceClaim. -type ResourceClaimConsumerReference struct { - // APIGroup is the group for the resource being referenced. It is - // empty for the core API. This matches the group in the APIVersion - // that is used when creating the resources. - // +optional - APIGroup string - // Resource is the type of resource being referenced, for example "pods". - Resource string - // Name is the name of resource being referenced. - Name string - // UID identifies exactly one incarnation of the resource. - UID types.UID + Items []DeviceClass } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // ResourceClaimTemplate is used to produce ResourceClaim objects. +// +// This is an alpha type and requires enabling the DynamicResourceAllocation +// feature gate. type ResourceClaimTemplate struct { metav1.TypeMeta // Standard object metadata @@ -446,169 +1029,3 @@ type ResourceClaimTemplateList struct { // Items is the list of resource claim templates. Items []ResourceClaimTemplate } - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// ResourceSlice provides information about available -// resources on individual nodes. -type ResourceSlice struct { - metav1.TypeMeta - // Standard object metadata - metav1.ObjectMeta - - // NodeName identifies the node which provides the resources - // if they are local to a node. - // - // A field selector can be used to list only ResourceSlice - // objects with a certain node name. - NodeName string - - // DriverName identifies the DRA driver providing the capacity information. - // A field selector can be used to list only ResourceSlice - // objects with a certain driver name. - DriverName string - - ResourceModel -} - -// ResourceModel must have one and only one field set. -type ResourceModel struct { - // NamedResources describes available resources using the named resources model. - NamedResources *NamedResourcesResources -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// ResourceSliceList is a collection of ResourceSlices. -type ResourceSliceList struct { - metav1.TypeMeta - // Standard list metadata - metav1.ListMeta - - // Items is the list of node resource capacity objects. - Items []ResourceSlice -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// ResourceClaimParameters defines resource requests for a ResourceClaim in an -// in-tree format understood by Kubernetes. -type ResourceClaimParameters struct { - metav1.TypeMeta - // Standard object metadata - metav1.ObjectMeta - - // If this object was created from some other resource, then this links - // back to that resource. This field is used to find the in-tree representation - // of the claim parameters when the parameter reference of the claim refers - // to some unknown type. - GeneratedFrom *ResourceClaimParametersReference - - // DriverRequests describes all resources that are needed for the - // allocated claim. A single claim may use resources coming from - // different drivers. For each driver, this array has at most one - // entry which then may have one or more per-driver requests. - // - // May be empty, in which case the claim can always be allocated. - DriverRequests []DriverRequests -} - -// DriverRequests describes all resources that are needed from one particular driver. -type DriverRequests struct { - // DriverName is the name used by the DRA driver kubelet plugin. - DriverName string - - // VendorParameters are arbitrary setup parameters for all requests of the - // claim. They are ignored while allocating the claim. - VendorParameters runtime.Object - - // Requests describes all resources that are needed from the driver. - Requests []ResourceRequest -} - -// ResourceRequest is a request for resources from one particular driver. -type ResourceRequest struct { - // VendorParameters are arbitrary setup parameters for the requested - // resource. They are ignored while allocating a claim. - VendorParameters runtime.Object - - ResourceRequestModel -} - -// ResourceRequestModel must have one and only one field set. -type ResourceRequestModel struct { - // NamedResources describes a request for resources with the named resources model. - NamedResources *NamedResourcesRequest -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// ResourceClaimParametersList is a collection of ResourceClaimParameters. -type ResourceClaimParametersList struct { - metav1.TypeMeta - // Standard list metadata - metav1.ListMeta - - // Items is the list of node resource capacity objects. - Items []ResourceClaimParameters -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// ResourceClassParameters defines resource requests for a ResourceClass in an -// in-tree format understood by Kubernetes. -type ResourceClassParameters struct { - metav1.TypeMeta - // Standard object metadata - metav1.ObjectMeta - - // If this object was created from some other resource, then this links - // back to that resource. This field is used to find the in-tree representation - // of the class parameters when the parameter reference of the class refers - // to some unknown type. - GeneratedFrom *ResourceClassParametersReference - - // VendorParameters are arbitrary setup parameters for all claims using - // this class. They are ignored while allocating the claim. There must - // not be more than one entry per driver. - VendorParameters []VendorParameters - - // Filters describes additional contraints that must be met when using the class. - Filters []ResourceFilter -} - -// ResourceFilter is a filter for resources from one particular driver. -type ResourceFilter struct { - // DriverName is the name used by the DRA driver kubelet plugin. - DriverName string - - ResourceFilterModel -} - -// ResourceFilterModel must have one and only one field set. -type ResourceFilterModel struct { - // NamedResources describes a resource filter using the named resources model. - NamedResources *NamedResourcesFilter -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// ResourceClassParametersList is a collection of ResourceClassParameters. -type ResourceClassParametersList struct { - metav1.TypeMeta - // Standard list metadata - metav1.ListMeta - - // Items is the list of node resource capacity objects. - Items []ResourceClassParameters -} - -// VendorParameters are opaque parameters for one particular driver. -type VendorParameters struct { - // DriverName is the name used by the DRA driver kubelet plugin. - DriverName string - - // Parameters can be arbitrary setup parameters. They are ignored while - // allocating a claim. - Parameters runtime.Object -} diff --git a/pkg/apis/resource/v1alpha3/conversion.go b/pkg/apis/resource/v1alpha3/conversion.go index 0ca264a883a..237ea367130 100644 --- a/pkg/apis/resource/v1alpha3/conversion.go +++ b/pkg/apis/resource/v1alpha3/conversion.go @@ -19,6 +19,7 @@ package v1alpha3 import ( "fmt" + resourceapi "k8s.io/api/resource/v1alpha3" "k8s.io/apimachinery/pkg/runtime" ) @@ -26,7 +27,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error { if err := scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("ResourceSlice"), func(label, value string) (string, string, error) { switch label { - case "metadata.name", "nodeName", "driverName": + case "metadata.name", resourceapi.ResourceSliceSelectorNodeName, resourceapi.ResourceSliceSelectorDriver: return label, value, nil default: return "", "", fmt.Errorf("field label not supported for %s: %s", SchemeGroupVersion.WithKind("ResourceSlice"), label) diff --git a/pkg/apis/resource/v1alpha3/defaults.go b/pkg/apis/resource/v1alpha3/defaults.go index 84851c3dbb2..848cc065ba6 100644 --- a/pkg/apis/resource/v1alpha3/defaults.go +++ b/pkg/apis/resource/v1alpha3/defaults.go @@ -17,9 +17,20 @@ limitations under the License. package v1alpha3 import ( + resourceapi "k8s.io/api/resource/v1alpha3" "k8s.io/apimachinery/pkg/runtime" ) func addDefaultingFuncs(scheme *runtime.Scheme) error { return RegisterDefaults(scheme) } + +func SetDefaults_DeviceRequest(obj *resourceapi.DeviceRequest) { + if obj.AllocationMode == "" { + obj.AllocationMode = resourceapi.DeviceAllocationModeExactCount + } + + if obj.AllocationMode == resourceapi.DeviceAllocationModeExactCount && obj.Count == 0 { + obj.Count = 1 + } +} diff --git a/pkg/apis/resource/v1alpha3/defaults_test.go b/pkg/apis/resource/v1alpha3/defaults_test.go new file mode 100644 index 00000000000..5af5760e147 --- /dev/null +++ b/pkg/apis/resource/v1alpha3/defaults_test.go @@ -0,0 +1,86 @@ +/* +Copyright 2022 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 v1alpha3_test + +import ( + "reflect" + "testing" + + "github.com/stretchr/testify/assert" + + v1alpha3 "k8s.io/api/resource/v1alpha3" + "k8s.io/apimachinery/pkg/runtime" + + // ensure types are installed + "k8s.io/kubernetes/pkg/api/legacyscheme" + _ "k8s.io/kubernetes/pkg/apis/resource/install" +) + +func TestSetDefaultAllocationMode(t *testing.T) { + claim := &v1alpha3.ResourceClaim{ + Spec: v1alpha3.ResourceClaimSpec{ + Devices: v1alpha3.DeviceClaim{ + Requests: []v1alpha3.DeviceRequest{{}}, + }, + }, + } + + // fields should be defaulted + defaultMode := v1alpha3.DeviceAllocationModeExactCount + defaultCount := int64(1) + output := roundTrip(t, runtime.Object(claim)).(*v1alpha3.ResourceClaim) + assert.Equal(t, defaultMode, output.Spec.Devices.Requests[0].AllocationMode) + assert.Equal(t, defaultCount, output.Spec.Devices.Requests[0].Count) + + // field should not change + nonDefaultMode := v1alpha3.DeviceAllocationModeExactCount + nonDefaultCount := int64(10) + claim = &v1alpha3.ResourceClaim{ + Spec: v1alpha3.ResourceClaimSpec{ + Devices: v1alpha3.DeviceClaim{ + Requests: []v1alpha3.DeviceRequest{{ + AllocationMode: nonDefaultMode, + Count: nonDefaultCount, + }}, + }, + }, + } + output = roundTrip(t, runtime.Object(claim)).(*v1alpha3.ResourceClaim) + assert.Equal(t, nonDefaultMode, output.Spec.Devices.Requests[0].AllocationMode) + assert.Equal(t, nonDefaultCount, output.Spec.Devices.Requests[0].Count) +} + +func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { + codec := legacyscheme.Codecs.LegacyCodec(v1alpha3.SchemeGroupVersion) + data, err := runtime.Encode(codec, obj) + if err != nil { + t.Errorf("%v\n %#v", err, obj) + return nil + } + obj2, err := runtime.Decode(codec, data) + if err != nil { + t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj) + return nil + } + obj3 := reflect.New(reflect.TypeOf(obj).Elem()).Interface().(runtime.Object) + err = legacyscheme.Scheme.Convert(obj2, obj3, nil) + if err != nil { + t.Errorf("%v\nSource: %#v", err, obj2) + return nil + } + return obj3 +} diff --git a/pkg/apis/resource/v1alpha3/zz_generated.conversion.go b/pkg/apis/resource/v1alpha3/zz_generated.conversion.go index bf7b5af9c59..e7861f16714 100644 --- a/pkg/apis/resource/v1alpha3/zz_generated.conversion.go +++ b/pkg/apis/resource/v1alpha3/zz_generated.conversion.go @@ -51,123 +51,183 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.AllocationResultModel)(nil), (*resource.AllocationResultModel)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_AllocationResultModel_To_resource_AllocationResultModel(a.(*v1alpha3.AllocationResultModel), b.(*resource.AllocationResultModel), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.BasicDevice)(nil), (*resource.BasicDevice)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_BasicDevice_To_resource_BasicDevice(a.(*v1alpha3.BasicDevice), b.(*resource.BasicDevice), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.AllocationResultModel)(nil), (*v1alpha3.AllocationResultModel)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_AllocationResultModel_To_v1alpha3_AllocationResultModel(a.(*resource.AllocationResultModel), b.(*v1alpha3.AllocationResultModel), scope) + if err := s.AddGeneratedConversionFunc((*resource.BasicDevice)(nil), (*v1alpha3.BasicDevice)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_BasicDevice_To_v1alpha3_BasicDevice(a.(*resource.BasicDevice), b.(*v1alpha3.BasicDevice), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.DriverAllocationResult)(nil), (*resource.DriverAllocationResult)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_DriverAllocationResult_To_resource_DriverAllocationResult(a.(*v1alpha3.DriverAllocationResult), b.(*resource.DriverAllocationResult), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.CELDeviceSelector)(nil), (*resource.CELDeviceSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_CELDeviceSelector_To_resource_CELDeviceSelector(a.(*v1alpha3.CELDeviceSelector), b.(*resource.CELDeviceSelector), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.DriverAllocationResult)(nil), (*v1alpha3.DriverAllocationResult)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_DriverAllocationResult_To_v1alpha3_DriverAllocationResult(a.(*resource.DriverAllocationResult), b.(*v1alpha3.DriverAllocationResult), scope) + if err := s.AddGeneratedConversionFunc((*resource.CELDeviceSelector)(nil), (*v1alpha3.CELDeviceSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_CELDeviceSelector_To_v1alpha3_CELDeviceSelector(a.(*resource.CELDeviceSelector), b.(*v1alpha3.CELDeviceSelector), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.DriverRequests)(nil), (*resource.DriverRequests)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_DriverRequests_To_resource_DriverRequests(a.(*v1alpha3.DriverRequests), b.(*resource.DriverRequests), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.Device)(nil), (*resource.Device)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_Device_To_resource_Device(a.(*v1alpha3.Device), b.(*resource.Device), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.DriverRequests)(nil), (*v1alpha3.DriverRequests)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_DriverRequests_To_v1alpha3_DriverRequests(a.(*resource.DriverRequests), b.(*v1alpha3.DriverRequests), scope) + if err := s.AddGeneratedConversionFunc((*resource.Device)(nil), (*v1alpha3.Device)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_Device_To_v1alpha3_Device(a.(*resource.Device), b.(*v1alpha3.Device), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.NamedResourcesAllocationResult)(nil), (*resource.NamedResourcesAllocationResult)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_NamedResourcesAllocationResult_To_resource_NamedResourcesAllocationResult(a.(*v1alpha3.NamedResourcesAllocationResult), b.(*resource.NamedResourcesAllocationResult), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceAllocationConfiguration)(nil), (*resource.DeviceAllocationConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceAllocationConfiguration_To_resource_DeviceAllocationConfiguration(a.(*v1alpha3.DeviceAllocationConfiguration), b.(*resource.DeviceAllocationConfiguration), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.NamedResourcesAllocationResult)(nil), (*v1alpha3.NamedResourcesAllocationResult)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_NamedResourcesAllocationResult_To_v1alpha3_NamedResourcesAllocationResult(a.(*resource.NamedResourcesAllocationResult), b.(*v1alpha3.NamedResourcesAllocationResult), scope) + if err := s.AddGeneratedConversionFunc((*resource.DeviceAllocationConfiguration)(nil), (*v1alpha3.DeviceAllocationConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceAllocationConfiguration_To_v1alpha3_DeviceAllocationConfiguration(a.(*resource.DeviceAllocationConfiguration), b.(*v1alpha3.DeviceAllocationConfiguration), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.NamedResourcesAttribute)(nil), (*resource.NamedResourcesAttribute)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_NamedResourcesAttribute_To_resource_NamedResourcesAttribute(a.(*v1alpha3.NamedResourcesAttribute), b.(*resource.NamedResourcesAttribute), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceAllocationResult)(nil), (*resource.DeviceAllocationResult)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceAllocationResult_To_resource_DeviceAllocationResult(a.(*v1alpha3.DeviceAllocationResult), b.(*resource.DeviceAllocationResult), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.NamedResourcesAttribute)(nil), (*v1alpha3.NamedResourcesAttribute)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_NamedResourcesAttribute_To_v1alpha3_NamedResourcesAttribute(a.(*resource.NamedResourcesAttribute), b.(*v1alpha3.NamedResourcesAttribute), scope) + if err := s.AddGeneratedConversionFunc((*resource.DeviceAllocationResult)(nil), (*v1alpha3.DeviceAllocationResult)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceAllocationResult_To_v1alpha3_DeviceAllocationResult(a.(*resource.DeviceAllocationResult), b.(*v1alpha3.DeviceAllocationResult), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.NamedResourcesAttributeValue)(nil), (*resource.NamedResourcesAttributeValue)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_NamedResourcesAttributeValue_To_resource_NamedResourcesAttributeValue(a.(*v1alpha3.NamedResourcesAttributeValue), b.(*resource.NamedResourcesAttributeValue), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceAttribute)(nil), (*resource.DeviceAttribute)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceAttribute_To_resource_DeviceAttribute(a.(*v1alpha3.DeviceAttribute), b.(*resource.DeviceAttribute), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.NamedResourcesAttributeValue)(nil), (*v1alpha3.NamedResourcesAttributeValue)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_NamedResourcesAttributeValue_To_v1alpha3_NamedResourcesAttributeValue(a.(*resource.NamedResourcesAttributeValue), b.(*v1alpha3.NamedResourcesAttributeValue), scope) + if err := s.AddGeneratedConversionFunc((*resource.DeviceAttribute)(nil), (*v1alpha3.DeviceAttribute)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceAttribute_To_v1alpha3_DeviceAttribute(a.(*resource.DeviceAttribute), b.(*v1alpha3.DeviceAttribute), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.NamedResourcesFilter)(nil), (*resource.NamedResourcesFilter)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_NamedResourcesFilter_To_resource_NamedResourcesFilter(a.(*v1alpha3.NamedResourcesFilter), b.(*resource.NamedResourcesFilter), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceClaim)(nil), (*resource.DeviceClaim)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceClaim_To_resource_DeviceClaim(a.(*v1alpha3.DeviceClaim), b.(*resource.DeviceClaim), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.NamedResourcesFilter)(nil), (*v1alpha3.NamedResourcesFilter)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_NamedResourcesFilter_To_v1alpha3_NamedResourcesFilter(a.(*resource.NamedResourcesFilter), b.(*v1alpha3.NamedResourcesFilter), scope) + if err := s.AddGeneratedConversionFunc((*resource.DeviceClaim)(nil), (*v1alpha3.DeviceClaim)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceClaim_To_v1alpha3_DeviceClaim(a.(*resource.DeviceClaim), b.(*v1alpha3.DeviceClaim), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.NamedResourcesInstance)(nil), (*resource.NamedResourcesInstance)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_NamedResourcesInstance_To_resource_NamedResourcesInstance(a.(*v1alpha3.NamedResourcesInstance), b.(*resource.NamedResourcesInstance), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceClaimConfiguration)(nil), (*resource.DeviceClaimConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceClaimConfiguration_To_resource_DeviceClaimConfiguration(a.(*v1alpha3.DeviceClaimConfiguration), b.(*resource.DeviceClaimConfiguration), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.NamedResourcesInstance)(nil), (*v1alpha3.NamedResourcesInstance)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_NamedResourcesInstance_To_v1alpha3_NamedResourcesInstance(a.(*resource.NamedResourcesInstance), b.(*v1alpha3.NamedResourcesInstance), scope) + if err := s.AddGeneratedConversionFunc((*resource.DeviceClaimConfiguration)(nil), (*v1alpha3.DeviceClaimConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceClaimConfiguration_To_v1alpha3_DeviceClaimConfiguration(a.(*resource.DeviceClaimConfiguration), b.(*v1alpha3.DeviceClaimConfiguration), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.NamedResourcesIntSlice)(nil), (*resource.NamedResourcesIntSlice)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_NamedResourcesIntSlice_To_resource_NamedResourcesIntSlice(a.(*v1alpha3.NamedResourcesIntSlice), b.(*resource.NamedResourcesIntSlice), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceClass)(nil), (*resource.DeviceClass)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceClass_To_resource_DeviceClass(a.(*v1alpha3.DeviceClass), b.(*resource.DeviceClass), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.NamedResourcesIntSlice)(nil), (*v1alpha3.NamedResourcesIntSlice)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_NamedResourcesIntSlice_To_v1alpha3_NamedResourcesIntSlice(a.(*resource.NamedResourcesIntSlice), b.(*v1alpha3.NamedResourcesIntSlice), scope) + if err := s.AddGeneratedConversionFunc((*resource.DeviceClass)(nil), (*v1alpha3.DeviceClass)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceClass_To_v1alpha3_DeviceClass(a.(*resource.DeviceClass), b.(*v1alpha3.DeviceClass), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.NamedResourcesRequest)(nil), (*resource.NamedResourcesRequest)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_NamedResourcesRequest_To_resource_NamedResourcesRequest(a.(*v1alpha3.NamedResourcesRequest), b.(*resource.NamedResourcesRequest), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceClassConfiguration)(nil), (*resource.DeviceClassConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceClassConfiguration_To_resource_DeviceClassConfiguration(a.(*v1alpha3.DeviceClassConfiguration), b.(*resource.DeviceClassConfiguration), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.NamedResourcesRequest)(nil), (*v1alpha3.NamedResourcesRequest)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_NamedResourcesRequest_To_v1alpha3_NamedResourcesRequest(a.(*resource.NamedResourcesRequest), b.(*v1alpha3.NamedResourcesRequest), scope) + if err := s.AddGeneratedConversionFunc((*resource.DeviceClassConfiguration)(nil), (*v1alpha3.DeviceClassConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceClassConfiguration_To_v1alpha3_DeviceClassConfiguration(a.(*resource.DeviceClassConfiguration), b.(*v1alpha3.DeviceClassConfiguration), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.NamedResourcesResources)(nil), (*resource.NamedResourcesResources)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_NamedResourcesResources_To_resource_NamedResourcesResources(a.(*v1alpha3.NamedResourcesResources), b.(*resource.NamedResourcesResources), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceClassList)(nil), (*resource.DeviceClassList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceClassList_To_resource_DeviceClassList(a.(*v1alpha3.DeviceClassList), b.(*resource.DeviceClassList), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.NamedResourcesResources)(nil), (*v1alpha3.NamedResourcesResources)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_NamedResourcesResources_To_v1alpha3_NamedResourcesResources(a.(*resource.NamedResourcesResources), b.(*v1alpha3.NamedResourcesResources), scope) + if err := s.AddGeneratedConversionFunc((*resource.DeviceClassList)(nil), (*v1alpha3.DeviceClassList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceClassList_To_v1alpha3_DeviceClassList(a.(*resource.DeviceClassList), b.(*v1alpha3.DeviceClassList), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.NamedResourcesStringSlice)(nil), (*resource.NamedResourcesStringSlice)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_NamedResourcesStringSlice_To_resource_NamedResourcesStringSlice(a.(*v1alpha3.NamedResourcesStringSlice), b.(*resource.NamedResourcesStringSlice), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceClassSpec)(nil), (*resource.DeviceClassSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceClassSpec_To_resource_DeviceClassSpec(a.(*v1alpha3.DeviceClassSpec), b.(*resource.DeviceClassSpec), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.NamedResourcesStringSlice)(nil), (*v1alpha3.NamedResourcesStringSlice)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_NamedResourcesStringSlice_To_v1alpha3_NamedResourcesStringSlice(a.(*resource.NamedResourcesStringSlice), b.(*v1alpha3.NamedResourcesStringSlice), scope) + if err := s.AddGeneratedConversionFunc((*resource.DeviceClassSpec)(nil), (*v1alpha3.DeviceClassSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceClassSpec_To_v1alpha3_DeviceClassSpec(a.(*resource.DeviceClassSpec), b.(*v1alpha3.DeviceClassSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceConfiguration)(nil), (*resource.DeviceConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceConfiguration_To_resource_DeviceConfiguration(a.(*v1alpha3.DeviceConfiguration), b.(*resource.DeviceConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*resource.DeviceConfiguration)(nil), (*v1alpha3.DeviceConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceConfiguration_To_v1alpha3_DeviceConfiguration(a.(*resource.DeviceConfiguration), b.(*v1alpha3.DeviceConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceConstraint)(nil), (*resource.DeviceConstraint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceConstraint_To_resource_DeviceConstraint(a.(*v1alpha3.DeviceConstraint), b.(*resource.DeviceConstraint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*resource.DeviceConstraint)(nil), (*v1alpha3.DeviceConstraint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceConstraint_To_v1alpha3_DeviceConstraint(a.(*resource.DeviceConstraint), b.(*v1alpha3.DeviceConstraint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceRequest)(nil), (*resource.DeviceRequest)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceRequest_To_resource_DeviceRequest(a.(*v1alpha3.DeviceRequest), b.(*resource.DeviceRequest), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*resource.DeviceRequest)(nil), (*v1alpha3.DeviceRequest)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceRequest_To_v1alpha3_DeviceRequest(a.(*resource.DeviceRequest), b.(*v1alpha3.DeviceRequest), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceRequestAllocationResult)(nil), (*resource.DeviceRequestAllocationResult)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceRequestAllocationResult_To_resource_DeviceRequestAllocationResult(a.(*v1alpha3.DeviceRequestAllocationResult), b.(*resource.DeviceRequestAllocationResult), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*resource.DeviceRequestAllocationResult)(nil), (*v1alpha3.DeviceRequestAllocationResult)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceRequestAllocationResult_To_v1alpha3_DeviceRequestAllocationResult(a.(*resource.DeviceRequestAllocationResult), b.(*v1alpha3.DeviceRequestAllocationResult), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1alpha3.DeviceSelector)(nil), (*resource.DeviceSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DeviceSelector_To_resource_DeviceSelector(a.(*v1alpha3.DeviceSelector), b.(*resource.DeviceSelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*resource.DeviceSelector)(nil), (*v1alpha3.DeviceSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_DeviceSelector_To_v1alpha3_DeviceSelector(a.(*resource.DeviceSelector), b.(*v1alpha3.DeviceSelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1alpha3.OpaqueDeviceConfiguration)(nil), (*resource.OpaqueDeviceConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_OpaqueDeviceConfiguration_To_resource_OpaqueDeviceConfiguration(a.(*v1alpha3.OpaqueDeviceConfiguration), b.(*resource.OpaqueDeviceConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*resource.OpaqueDeviceConfiguration)(nil), (*v1alpha3.OpaqueDeviceConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_OpaqueDeviceConfiguration_To_v1alpha3_OpaqueDeviceConfiguration(a.(*resource.OpaqueDeviceConfiguration), b.(*v1alpha3.OpaqueDeviceConfiguration), scope) }); err != nil { return err } @@ -241,36 +301,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceClaimParameters)(nil), (*resource.ResourceClaimParameters)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceClaimParameters_To_resource_ResourceClaimParameters(a.(*v1alpha3.ResourceClaimParameters), b.(*resource.ResourceClaimParameters), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceClaimParameters)(nil), (*v1alpha3.ResourceClaimParameters)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceClaimParameters_To_v1alpha3_ResourceClaimParameters(a.(*resource.ResourceClaimParameters), b.(*v1alpha3.ResourceClaimParameters), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceClaimParametersList)(nil), (*resource.ResourceClaimParametersList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceClaimParametersList_To_resource_ResourceClaimParametersList(a.(*v1alpha3.ResourceClaimParametersList), b.(*resource.ResourceClaimParametersList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceClaimParametersList)(nil), (*v1alpha3.ResourceClaimParametersList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceClaimParametersList_To_v1alpha3_ResourceClaimParametersList(a.(*resource.ResourceClaimParametersList), b.(*v1alpha3.ResourceClaimParametersList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceClaimParametersReference)(nil), (*resource.ResourceClaimParametersReference)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceClaimParametersReference_To_resource_ResourceClaimParametersReference(a.(*v1alpha3.ResourceClaimParametersReference), b.(*resource.ResourceClaimParametersReference), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceClaimParametersReference)(nil), (*v1alpha3.ResourceClaimParametersReference)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceClaimParametersReference_To_v1alpha3_ResourceClaimParametersReference(a.(*resource.ResourceClaimParametersReference), b.(*v1alpha3.ResourceClaimParametersReference), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceClaimSchedulingStatus)(nil), (*resource.ResourceClaimSchedulingStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha3_ResourceClaimSchedulingStatus_To_resource_ResourceClaimSchedulingStatus(a.(*v1alpha3.ResourceClaimSchedulingStatus), b.(*resource.ResourceClaimSchedulingStatus), scope) }); err != nil { @@ -331,113 +361,13 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceClass)(nil), (*resource.ResourceClass)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceClass_To_resource_ResourceClass(a.(*v1alpha3.ResourceClass), b.(*resource.ResourceClass), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourcePool)(nil), (*resource.ResourcePool)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_ResourcePool_To_resource_ResourcePool(a.(*v1alpha3.ResourcePool), b.(*resource.ResourcePool), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.ResourceClass)(nil), (*v1alpha3.ResourceClass)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceClass_To_v1alpha3_ResourceClass(a.(*resource.ResourceClass), b.(*v1alpha3.ResourceClass), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceClassList)(nil), (*resource.ResourceClassList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceClassList_To_resource_ResourceClassList(a.(*v1alpha3.ResourceClassList), b.(*resource.ResourceClassList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceClassList)(nil), (*v1alpha3.ResourceClassList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceClassList_To_v1alpha3_ResourceClassList(a.(*resource.ResourceClassList), b.(*v1alpha3.ResourceClassList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceClassParameters)(nil), (*resource.ResourceClassParameters)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceClassParameters_To_resource_ResourceClassParameters(a.(*v1alpha3.ResourceClassParameters), b.(*resource.ResourceClassParameters), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceClassParameters)(nil), (*v1alpha3.ResourceClassParameters)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceClassParameters_To_v1alpha3_ResourceClassParameters(a.(*resource.ResourceClassParameters), b.(*v1alpha3.ResourceClassParameters), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceClassParametersList)(nil), (*resource.ResourceClassParametersList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceClassParametersList_To_resource_ResourceClassParametersList(a.(*v1alpha3.ResourceClassParametersList), b.(*resource.ResourceClassParametersList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceClassParametersList)(nil), (*v1alpha3.ResourceClassParametersList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceClassParametersList_To_v1alpha3_ResourceClassParametersList(a.(*resource.ResourceClassParametersList), b.(*v1alpha3.ResourceClassParametersList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceClassParametersReference)(nil), (*resource.ResourceClassParametersReference)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceClassParametersReference_To_resource_ResourceClassParametersReference(a.(*v1alpha3.ResourceClassParametersReference), b.(*resource.ResourceClassParametersReference), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceClassParametersReference)(nil), (*v1alpha3.ResourceClassParametersReference)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceClassParametersReference_To_v1alpha3_ResourceClassParametersReference(a.(*resource.ResourceClassParametersReference), b.(*v1alpha3.ResourceClassParametersReference), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceFilter)(nil), (*resource.ResourceFilter)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceFilter_To_resource_ResourceFilter(a.(*v1alpha3.ResourceFilter), b.(*resource.ResourceFilter), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceFilter)(nil), (*v1alpha3.ResourceFilter)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceFilter_To_v1alpha3_ResourceFilter(a.(*resource.ResourceFilter), b.(*v1alpha3.ResourceFilter), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceFilterModel)(nil), (*resource.ResourceFilterModel)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceFilterModel_To_resource_ResourceFilterModel(a.(*v1alpha3.ResourceFilterModel), b.(*resource.ResourceFilterModel), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceFilterModel)(nil), (*v1alpha3.ResourceFilterModel)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceFilterModel_To_v1alpha3_ResourceFilterModel(a.(*resource.ResourceFilterModel), b.(*v1alpha3.ResourceFilterModel), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceHandle)(nil), (*resource.ResourceHandle)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceHandle_To_resource_ResourceHandle(a.(*v1alpha3.ResourceHandle), b.(*resource.ResourceHandle), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceHandle)(nil), (*v1alpha3.ResourceHandle)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceHandle_To_v1alpha3_ResourceHandle(a.(*resource.ResourceHandle), b.(*v1alpha3.ResourceHandle), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceModel)(nil), (*resource.ResourceModel)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceModel_To_resource_ResourceModel(a.(*v1alpha3.ResourceModel), b.(*resource.ResourceModel), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceModel)(nil), (*v1alpha3.ResourceModel)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceModel_To_v1alpha3_ResourceModel(a.(*resource.ResourceModel), b.(*v1alpha3.ResourceModel), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceRequest)(nil), (*resource.ResourceRequest)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceRequest_To_resource_ResourceRequest(a.(*v1alpha3.ResourceRequest), b.(*resource.ResourceRequest), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceRequest)(nil), (*v1alpha3.ResourceRequest)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceRequest_To_v1alpha3_ResourceRequest(a.(*resource.ResourceRequest), b.(*v1alpha3.ResourceRequest), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceRequestModel)(nil), (*resource.ResourceRequestModel)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_ResourceRequestModel_To_resource_ResourceRequestModel(a.(*v1alpha3.ResourceRequestModel), b.(*resource.ResourceRequestModel), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.ResourceRequestModel)(nil), (*v1alpha3.ResourceRequestModel)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_ResourceRequestModel_To_v1alpha3_ResourceRequestModel(a.(*resource.ResourceRequestModel), b.(*v1alpha3.ResourceRequestModel), scope) + if err := s.AddGeneratedConversionFunc((*resource.ResourcePool)(nil), (*v1alpha3.ResourcePool)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_ResourcePool_To_v1alpha3_ResourcePool(a.(*resource.ResourcePool), b.(*v1alpha3.ResourcePool), scope) }); err != nil { return err } @@ -461,23 +391,13 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1alpha3.StructuredResourceHandle)(nil), (*resource.StructuredResourceHandle)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_StructuredResourceHandle_To_resource_StructuredResourceHandle(a.(*v1alpha3.StructuredResourceHandle), b.(*resource.StructuredResourceHandle), scope) + if err := s.AddGeneratedConversionFunc((*v1alpha3.ResourceSliceSpec)(nil), (*resource.ResourceSliceSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_ResourceSliceSpec_To_resource_ResourceSliceSpec(a.(*v1alpha3.ResourceSliceSpec), b.(*resource.ResourceSliceSpec), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*resource.StructuredResourceHandle)(nil), (*v1alpha3.StructuredResourceHandle)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_StructuredResourceHandle_To_v1alpha3_StructuredResourceHandle(a.(*resource.StructuredResourceHandle), b.(*v1alpha3.StructuredResourceHandle), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.VendorParameters)(nil), (*resource.VendorParameters)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_VendorParameters_To_resource_VendorParameters(a.(*v1alpha3.VendorParameters), b.(*resource.VendorParameters), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*resource.VendorParameters)(nil), (*v1alpha3.VendorParameters)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_resource_VendorParameters_To_v1alpha3_VendorParameters(a.(*resource.VendorParameters), b.(*v1alpha3.VendorParameters), scope) + if err := s.AddGeneratedConversionFunc((*resource.ResourceSliceSpec)(nil), (*v1alpha3.ResourceSliceSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_resource_ResourceSliceSpec_To_v1alpha3_ResourceSliceSpec(a.(*resource.ResourceSliceSpec), b.(*v1alpha3.ResourceSliceSpec), scope) }); err != nil { return err } @@ -485,18 +405,11 @@ func RegisterConversions(s *runtime.Scheme) error { } func autoConvert_v1alpha3_AllocationResult_To_resource_AllocationResult(in *v1alpha3.AllocationResult, out *resource.AllocationResult, s conversion.Scope) error { - if in.ResourceHandles != nil { - in, out := &in.ResourceHandles, &out.ResourceHandles - *out = make([]resource.ResourceHandle, len(*in)) - for i := range *in { - if err := Convert_v1alpha3_ResourceHandle_To_resource_ResourceHandle(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.ResourceHandles = nil + if err := Convert_v1alpha3_DeviceAllocationResult_To_resource_DeviceAllocationResult(&in.Devices, &out.Devices, s); err != nil { + return err } - out.AvailableOnNodes = (*core.NodeSelector)(unsafe.Pointer(in.AvailableOnNodes)) + out.NodeSelector = (*core.NodeSelector)(unsafe.Pointer(in.NodeSelector)) + out.Controller = in.Controller return nil } @@ -506,18 +419,11 @@ func Convert_v1alpha3_AllocationResult_To_resource_AllocationResult(in *v1alpha3 } func autoConvert_resource_AllocationResult_To_v1alpha3_AllocationResult(in *resource.AllocationResult, out *v1alpha3.AllocationResult, s conversion.Scope) error { - if in.ResourceHandles != nil { - in, out := &in.ResourceHandles, &out.ResourceHandles - *out = make([]v1alpha3.ResourceHandle, len(*in)) - for i := range *in { - if err := Convert_resource_ResourceHandle_To_v1alpha3_ResourceHandle(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.ResourceHandles = nil + if err := Convert_resource_DeviceAllocationResult_To_v1alpha3_DeviceAllocationResult(&in.Devices, &out.Devices, s); err != nil { + return err } - out.AvailableOnNodes = (*v1.NodeSelector)(unsafe.Pointer(in.AvailableOnNodes)) + out.NodeSelector = (*v1.NodeSelector)(unsafe.Pointer(in.NodeSelector)) + out.Controller = in.Controller return nil } @@ -526,302 +432,430 @@ func Convert_resource_AllocationResult_To_v1alpha3_AllocationResult(in *resource return autoConvert_resource_AllocationResult_To_v1alpha3_AllocationResult(in, out, s) } -func autoConvert_v1alpha3_AllocationResultModel_To_resource_AllocationResultModel(in *v1alpha3.AllocationResultModel, out *resource.AllocationResultModel, s conversion.Scope) error { - out.NamedResources = (*resource.NamedResourcesAllocationResult)(unsafe.Pointer(in.NamedResources)) +func autoConvert_v1alpha3_BasicDevice_To_resource_BasicDevice(in *v1alpha3.BasicDevice, out *resource.BasicDevice, s conversion.Scope) error { + out.Attributes = *(*map[resource.QualifiedName]resource.DeviceAttribute)(unsafe.Pointer(&in.Attributes)) + out.Capacity = *(*map[resource.QualifiedName]apiresource.Quantity)(unsafe.Pointer(&in.Capacity)) return nil } -// Convert_v1alpha3_AllocationResultModel_To_resource_AllocationResultModel is an autogenerated conversion function. -func Convert_v1alpha3_AllocationResultModel_To_resource_AllocationResultModel(in *v1alpha3.AllocationResultModel, out *resource.AllocationResultModel, s conversion.Scope) error { - return autoConvert_v1alpha3_AllocationResultModel_To_resource_AllocationResultModel(in, out, s) +// Convert_v1alpha3_BasicDevice_To_resource_BasicDevice is an autogenerated conversion function. +func Convert_v1alpha3_BasicDevice_To_resource_BasicDevice(in *v1alpha3.BasicDevice, out *resource.BasicDevice, s conversion.Scope) error { + return autoConvert_v1alpha3_BasicDevice_To_resource_BasicDevice(in, out, s) } -func autoConvert_resource_AllocationResultModel_To_v1alpha3_AllocationResultModel(in *resource.AllocationResultModel, out *v1alpha3.AllocationResultModel, s conversion.Scope) error { - out.NamedResources = (*v1alpha3.NamedResourcesAllocationResult)(unsafe.Pointer(in.NamedResources)) +func autoConvert_resource_BasicDevice_To_v1alpha3_BasicDevice(in *resource.BasicDevice, out *v1alpha3.BasicDevice, s conversion.Scope) error { + out.Attributes = *(*map[v1alpha3.QualifiedName]v1alpha3.DeviceAttribute)(unsafe.Pointer(&in.Attributes)) + out.Capacity = *(*map[v1alpha3.QualifiedName]apiresource.Quantity)(unsafe.Pointer(&in.Capacity)) return nil } -// Convert_resource_AllocationResultModel_To_v1alpha3_AllocationResultModel is an autogenerated conversion function. -func Convert_resource_AllocationResultModel_To_v1alpha3_AllocationResultModel(in *resource.AllocationResultModel, out *v1alpha3.AllocationResultModel, s conversion.Scope) error { - return autoConvert_resource_AllocationResultModel_To_v1alpha3_AllocationResultModel(in, out, s) +// Convert_resource_BasicDevice_To_v1alpha3_BasicDevice is an autogenerated conversion function. +func Convert_resource_BasicDevice_To_v1alpha3_BasicDevice(in *resource.BasicDevice, out *v1alpha3.BasicDevice, s conversion.Scope) error { + return autoConvert_resource_BasicDevice_To_v1alpha3_BasicDevice(in, out, s) } -func autoConvert_v1alpha3_DriverAllocationResult_To_resource_DriverAllocationResult(in *v1alpha3.DriverAllocationResult, out *resource.DriverAllocationResult, s conversion.Scope) error { - if err := runtime.Convert_runtime_RawExtension_To_runtime_Object(&in.VendorRequestParameters, &out.VendorRequestParameters, s); err != nil { - return err - } - if err := Convert_v1alpha3_AllocationResultModel_To_resource_AllocationResultModel(&in.AllocationResultModel, &out.AllocationResultModel, s); err != nil { - return err - } +func autoConvert_v1alpha3_CELDeviceSelector_To_resource_CELDeviceSelector(in *v1alpha3.CELDeviceSelector, out *resource.CELDeviceSelector, s conversion.Scope) error { + out.Expression = in.Expression return nil } -// Convert_v1alpha3_DriverAllocationResult_To_resource_DriverAllocationResult is an autogenerated conversion function. -func Convert_v1alpha3_DriverAllocationResult_To_resource_DriverAllocationResult(in *v1alpha3.DriverAllocationResult, out *resource.DriverAllocationResult, s conversion.Scope) error { - return autoConvert_v1alpha3_DriverAllocationResult_To_resource_DriverAllocationResult(in, out, s) +// Convert_v1alpha3_CELDeviceSelector_To_resource_CELDeviceSelector is an autogenerated conversion function. +func Convert_v1alpha3_CELDeviceSelector_To_resource_CELDeviceSelector(in *v1alpha3.CELDeviceSelector, out *resource.CELDeviceSelector, s conversion.Scope) error { + return autoConvert_v1alpha3_CELDeviceSelector_To_resource_CELDeviceSelector(in, out, s) } -func autoConvert_resource_DriverAllocationResult_To_v1alpha3_DriverAllocationResult(in *resource.DriverAllocationResult, out *v1alpha3.DriverAllocationResult, s conversion.Scope) error { - if err := runtime.Convert_runtime_Object_To_runtime_RawExtension(&in.VendorRequestParameters, &out.VendorRequestParameters, s); err != nil { - return err - } - if err := Convert_resource_AllocationResultModel_To_v1alpha3_AllocationResultModel(&in.AllocationResultModel, &out.AllocationResultModel, s); err != nil { - return err - } +func autoConvert_resource_CELDeviceSelector_To_v1alpha3_CELDeviceSelector(in *resource.CELDeviceSelector, out *v1alpha3.CELDeviceSelector, s conversion.Scope) error { + out.Expression = in.Expression return nil } -// Convert_resource_DriverAllocationResult_To_v1alpha3_DriverAllocationResult is an autogenerated conversion function. -func Convert_resource_DriverAllocationResult_To_v1alpha3_DriverAllocationResult(in *resource.DriverAllocationResult, out *v1alpha3.DriverAllocationResult, s conversion.Scope) error { - return autoConvert_resource_DriverAllocationResult_To_v1alpha3_DriverAllocationResult(in, out, s) +// Convert_resource_CELDeviceSelector_To_v1alpha3_CELDeviceSelector is an autogenerated conversion function. +func Convert_resource_CELDeviceSelector_To_v1alpha3_CELDeviceSelector(in *resource.CELDeviceSelector, out *v1alpha3.CELDeviceSelector, s conversion.Scope) error { + return autoConvert_resource_CELDeviceSelector_To_v1alpha3_CELDeviceSelector(in, out, s) } -func autoConvert_v1alpha3_DriverRequests_To_resource_DriverRequests(in *v1alpha3.DriverRequests, out *resource.DriverRequests, s conversion.Scope) error { - out.DriverName = in.DriverName - if err := runtime.Convert_runtime_RawExtension_To_runtime_Object(&in.VendorParameters, &out.VendorParameters, s); err != nil { - return err - } - if in.Requests != nil { - in, out := &in.Requests, &out.Requests - *out = make([]resource.ResourceRequest, len(*in)) - for i := range *in { - if err := Convert_v1alpha3_ResourceRequest_To_resource_ResourceRequest(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Requests = nil - } - return nil -} - -// Convert_v1alpha3_DriverRequests_To_resource_DriverRequests is an autogenerated conversion function. -func Convert_v1alpha3_DriverRequests_To_resource_DriverRequests(in *v1alpha3.DriverRequests, out *resource.DriverRequests, s conversion.Scope) error { - return autoConvert_v1alpha3_DriverRequests_To_resource_DriverRequests(in, out, s) -} - -func autoConvert_resource_DriverRequests_To_v1alpha3_DriverRequests(in *resource.DriverRequests, out *v1alpha3.DriverRequests, s conversion.Scope) error { - out.DriverName = in.DriverName - if err := runtime.Convert_runtime_Object_To_runtime_RawExtension(&in.VendorParameters, &out.VendorParameters, s); err != nil { - return err - } - if in.Requests != nil { - in, out := &in.Requests, &out.Requests - *out = make([]v1alpha3.ResourceRequest, len(*in)) - for i := range *in { - if err := Convert_resource_ResourceRequest_To_v1alpha3_ResourceRequest(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Requests = nil - } - return nil -} - -// Convert_resource_DriverRequests_To_v1alpha3_DriverRequests is an autogenerated conversion function. -func Convert_resource_DriverRequests_To_v1alpha3_DriverRequests(in *resource.DriverRequests, out *v1alpha3.DriverRequests, s conversion.Scope) error { - return autoConvert_resource_DriverRequests_To_v1alpha3_DriverRequests(in, out, s) -} - -func autoConvert_v1alpha3_NamedResourcesAllocationResult_To_resource_NamedResourcesAllocationResult(in *v1alpha3.NamedResourcesAllocationResult, out *resource.NamedResourcesAllocationResult, s conversion.Scope) error { +func autoConvert_v1alpha3_Device_To_resource_Device(in *v1alpha3.Device, out *resource.Device, s conversion.Scope) error { out.Name = in.Name + out.Basic = (*resource.BasicDevice)(unsafe.Pointer(in.Basic)) return nil } -// Convert_v1alpha3_NamedResourcesAllocationResult_To_resource_NamedResourcesAllocationResult is an autogenerated conversion function. -func Convert_v1alpha3_NamedResourcesAllocationResult_To_resource_NamedResourcesAllocationResult(in *v1alpha3.NamedResourcesAllocationResult, out *resource.NamedResourcesAllocationResult, s conversion.Scope) error { - return autoConvert_v1alpha3_NamedResourcesAllocationResult_To_resource_NamedResourcesAllocationResult(in, out, s) +// Convert_v1alpha3_Device_To_resource_Device is an autogenerated conversion function. +func Convert_v1alpha3_Device_To_resource_Device(in *v1alpha3.Device, out *resource.Device, s conversion.Scope) error { + return autoConvert_v1alpha3_Device_To_resource_Device(in, out, s) } -func autoConvert_resource_NamedResourcesAllocationResult_To_v1alpha3_NamedResourcesAllocationResult(in *resource.NamedResourcesAllocationResult, out *v1alpha3.NamedResourcesAllocationResult, s conversion.Scope) error { +func autoConvert_resource_Device_To_v1alpha3_Device(in *resource.Device, out *v1alpha3.Device, s conversion.Scope) error { out.Name = in.Name + out.Basic = (*v1alpha3.BasicDevice)(unsafe.Pointer(in.Basic)) return nil } -// Convert_resource_NamedResourcesAllocationResult_To_v1alpha3_NamedResourcesAllocationResult is an autogenerated conversion function. -func Convert_resource_NamedResourcesAllocationResult_To_v1alpha3_NamedResourcesAllocationResult(in *resource.NamedResourcesAllocationResult, out *v1alpha3.NamedResourcesAllocationResult, s conversion.Scope) error { - return autoConvert_resource_NamedResourcesAllocationResult_To_v1alpha3_NamedResourcesAllocationResult(in, out, s) +// Convert_resource_Device_To_v1alpha3_Device is an autogenerated conversion function. +func Convert_resource_Device_To_v1alpha3_Device(in *resource.Device, out *v1alpha3.Device, s conversion.Scope) error { + return autoConvert_resource_Device_To_v1alpha3_Device(in, out, s) } -func autoConvert_v1alpha3_NamedResourcesAttribute_To_resource_NamedResourcesAttribute(in *v1alpha3.NamedResourcesAttribute, out *resource.NamedResourcesAttribute, s conversion.Scope) error { - out.Name = in.Name - if err := Convert_v1alpha3_NamedResourcesAttributeValue_To_resource_NamedResourcesAttributeValue(&in.NamedResourcesAttributeValue, &out.NamedResourcesAttributeValue, s); err != nil { +func autoConvert_v1alpha3_DeviceAllocationConfiguration_To_resource_DeviceAllocationConfiguration(in *v1alpha3.DeviceAllocationConfiguration, out *resource.DeviceAllocationConfiguration, s conversion.Scope) error { + out.Source = resource.AllocationConfigSource(in.Source) + out.Requests = *(*[]string)(unsafe.Pointer(&in.Requests)) + if err := Convert_v1alpha3_DeviceConfiguration_To_resource_DeviceConfiguration(&in.DeviceConfiguration, &out.DeviceConfiguration, s); err != nil { return err } return nil } -// Convert_v1alpha3_NamedResourcesAttribute_To_resource_NamedResourcesAttribute is an autogenerated conversion function. -func Convert_v1alpha3_NamedResourcesAttribute_To_resource_NamedResourcesAttribute(in *v1alpha3.NamedResourcesAttribute, out *resource.NamedResourcesAttribute, s conversion.Scope) error { - return autoConvert_v1alpha3_NamedResourcesAttribute_To_resource_NamedResourcesAttribute(in, out, s) +// Convert_v1alpha3_DeviceAllocationConfiguration_To_resource_DeviceAllocationConfiguration is an autogenerated conversion function. +func Convert_v1alpha3_DeviceAllocationConfiguration_To_resource_DeviceAllocationConfiguration(in *v1alpha3.DeviceAllocationConfiguration, out *resource.DeviceAllocationConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceAllocationConfiguration_To_resource_DeviceAllocationConfiguration(in, out, s) } -func autoConvert_resource_NamedResourcesAttribute_To_v1alpha3_NamedResourcesAttribute(in *resource.NamedResourcesAttribute, out *v1alpha3.NamedResourcesAttribute, s conversion.Scope) error { - out.Name = in.Name - if err := Convert_resource_NamedResourcesAttributeValue_To_v1alpha3_NamedResourcesAttributeValue(&in.NamedResourcesAttributeValue, &out.NamedResourcesAttributeValue, s); err != nil { +func autoConvert_resource_DeviceAllocationConfiguration_To_v1alpha3_DeviceAllocationConfiguration(in *resource.DeviceAllocationConfiguration, out *v1alpha3.DeviceAllocationConfiguration, s conversion.Scope) error { + out.Source = v1alpha3.AllocationConfigSource(in.Source) + out.Requests = *(*[]string)(unsafe.Pointer(&in.Requests)) + if err := Convert_resource_DeviceConfiguration_To_v1alpha3_DeviceConfiguration(&in.DeviceConfiguration, &out.DeviceConfiguration, s); err != nil { return err } return nil } -// Convert_resource_NamedResourcesAttribute_To_v1alpha3_NamedResourcesAttribute is an autogenerated conversion function. -func Convert_resource_NamedResourcesAttribute_To_v1alpha3_NamedResourcesAttribute(in *resource.NamedResourcesAttribute, out *v1alpha3.NamedResourcesAttribute, s conversion.Scope) error { - return autoConvert_resource_NamedResourcesAttribute_To_v1alpha3_NamedResourcesAttribute(in, out, s) +// Convert_resource_DeviceAllocationConfiguration_To_v1alpha3_DeviceAllocationConfiguration is an autogenerated conversion function. +func Convert_resource_DeviceAllocationConfiguration_To_v1alpha3_DeviceAllocationConfiguration(in *resource.DeviceAllocationConfiguration, out *v1alpha3.DeviceAllocationConfiguration, s conversion.Scope) error { + return autoConvert_resource_DeviceAllocationConfiguration_To_v1alpha3_DeviceAllocationConfiguration(in, out, s) } -func autoConvert_v1alpha3_NamedResourcesAttributeValue_To_resource_NamedResourcesAttributeValue(in *v1alpha3.NamedResourcesAttributeValue, out *resource.NamedResourcesAttributeValue, s conversion.Scope) error { - out.QuantityValue = (*apiresource.Quantity)(unsafe.Pointer(in.QuantityValue)) - out.BoolValue = (*bool)(unsafe.Pointer(in.BoolValue)) +func autoConvert_v1alpha3_DeviceAllocationResult_To_resource_DeviceAllocationResult(in *v1alpha3.DeviceAllocationResult, out *resource.DeviceAllocationResult, s conversion.Scope) error { + out.Results = *(*[]resource.DeviceRequestAllocationResult)(unsafe.Pointer(&in.Results)) + out.Config = *(*[]resource.DeviceAllocationConfiguration)(unsafe.Pointer(&in.Config)) + return nil +} + +// Convert_v1alpha3_DeviceAllocationResult_To_resource_DeviceAllocationResult is an autogenerated conversion function. +func Convert_v1alpha3_DeviceAllocationResult_To_resource_DeviceAllocationResult(in *v1alpha3.DeviceAllocationResult, out *resource.DeviceAllocationResult, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceAllocationResult_To_resource_DeviceAllocationResult(in, out, s) +} + +func autoConvert_resource_DeviceAllocationResult_To_v1alpha3_DeviceAllocationResult(in *resource.DeviceAllocationResult, out *v1alpha3.DeviceAllocationResult, s conversion.Scope) error { + out.Results = *(*[]v1alpha3.DeviceRequestAllocationResult)(unsafe.Pointer(&in.Results)) + out.Config = *(*[]v1alpha3.DeviceAllocationConfiguration)(unsafe.Pointer(&in.Config)) + return nil +} + +// Convert_resource_DeviceAllocationResult_To_v1alpha3_DeviceAllocationResult is an autogenerated conversion function. +func Convert_resource_DeviceAllocationResult_To_v1alpha3_DeviceAllocationResult(in *resource.DeviceAllocationResult, out *v1alpha3.DeviceAllocationResult, s conversion.Scope) error { + return autoConvert_resource_DeviceAllocationResult_To_v1alpha3_DeviceAllocationResult(in, out, s) +} + +func autoConvert_v1alpha3_DeviceAttribute_To_resource_DeviceAttribute(in *v1alpha3.DeviceAttribute, out *resource.DeviceAttribute, s conversion.Scope) error { out.IntValue = (*int64)(unsafe.Pointer(in.IntValue)) - out.IntSliceValue = (*resource.NamedResourcesIntSlice)(unsafe.Pointer(in.IntSliceValue)) + out.BoolValue = (*bool)(unsafe.Pointer(in.BoolValue)) out.StringValue = (*string)(unsafe.Pointer(in.StringValue)) - out.StringSliceValue = (*resource.NamedResourcesStringSlice)(unsafe.Pointer(in.StringSliceValue)) out.VersionValue = (*string)(unsafe.Pointer(in.VersionValue)) return nil } -// Convert_v1alpha3_NamedResourcesAttributeValue_To_resource_NamedResourcesAttributeValue is an autogenerated conversion function. -func Convert_v1alpha3_NamedResourcesAttributeValue_To_resource_NamedResourcesAttributeValue(in *v1alpha3.NamedResourcesAttributeValue, out *resource.NamedResourcesAttributeValue, s conversion.Scope) error { - return autoConvert_v1alpha3_NamedResourcesAttributeValue_To_resource_NamedResourcesAttributeValue(in, out, s) +// Convert_v1alpha3_DeviceAttribute_To_resource_DeviceAttribute is an autogenerated conversion function. +func Convert_v1alpha3_DeviceAttribute_To_resource_DeviceAttribute(in *v1alpha3.DeviceAttribute, out *resource.DeviceAttribute, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceAttribute_To_resource_DeviceAttribute(in, out, s) } -func autoConvert_resource_NamedResourcesAttributeValue_To_v1alpha3_NamedResourcesAttributeValue(in *resource.NamedResourcesAttributeValue, out *v1alpha3.NamedResourcesAttributeValue, s conversion.Scope) error { - out.QuantityValue = (*apiresource.Quantity)(unsafe.Pointer(in.QuantityValue)) - out.BoolValue = (*bool)(unsafe.Pointer(in.BoolValue)) +func autoConvert_resource_DeviceAttribute_To_v1alpha3_DeviceAttribute(in *resource.DeviceAttribute, out *v1alpha3.DeviceAttribute, s conversion.Scope) error { out.IntValue = (*int64)(unsafe.Pointer(in.IntValue)) - out.IntSliceValue = (*v1alpha3.NamedResourcesIntSlice)(unsafe.Pointer(in.IntSliceValue)) + out.BoolValue = (*bool)(unsafe.Pointer(in.BoolValue)) out.StringValue = (*string)(unsafe.Pointer(in.StringValue)) - out.StringSliceValue = (*v1alpha3.NamedResourcesStringSlice)(unsafe.Pointer(in.StringSliceValue)) out.VersionValue = (*string)(unsafe.Pointer(in.VersionValue)) return nil } -// Convert_resource_NamedResourcesAttributeValue_To_v1alpha3_NamedResourcesAttributeValue is an autogenerated conversion function. -func Convert_resource_NamedResourcesAttributeValue_To_v1alpha3_NamedResourcesAttributeValue(in *resource.NamedResourcesAttributeValue, out *v1alpha3.NamedResourcesAttributeValue, s conversion.Scope) error { - return autoConvert_resource_NamedResourcesAttributeValue_To_v1alpha3_NamedResourcesAttributeValue(in, out, s) +// Convert_resource_DeviceAttribute_To_v1alpha3_DeviceAttribute is an autogenerated conversion function. +func Convert_resource_DeviceAttribute_To_v1alpha3_DeviceAttribute(in *resource.DeviceAttribute, out *v1alpha3.DeviceAttribute, s conversion.Scope) error { + return autoConvert_resource_DeviceAttribute_To_v1alpha3_DeviceAttribute(in, out, s) } -func autoConvert_v1alpha3_NamedResourcesFilter_To_resource_NamedResourcesFilter(in *v1alpha3.NamedResourcesFilter, out *resource.NamedResourcesFilter, s conversion.Scope) error { - out.Selector = in.Selector +func autoConvert_v1alpha3_DeviceClaim_To_resource_DeviceClaim(in *v1alpha3.DeviceClaim, out *resource.DeviceClaim, s conversion.Scope) error { + out.Requests = *(*[]resource.DeviceRequest)(unsafe.Pointer(&in.Requests)) + out.Constraints = *(*[]resource.DeviceConstraint)(unsafe.Pointer(&in.Constraints)) + out.Config = *(*[]resource.DeviceClaimConfiguration)(unsafe.Pointer(&in.Config)) return nil } -// Convert_v1alpha3_NamedResourcesFilter_To_resource_NamedResourcesFilter is an autogenerated conversion function. -func Convert_v1alpha3_NamedResourcesFilter_To_resource_NamedResourcesFilter(in *v1alpha3.NamedResourcesFilter, out *resource.NamedResourcesFilter, s conversion.Scope) error { - return autoConvert_v1alpha3_NamedResourcesFilter_To_resource_NamedResourcesFilter(in, out, s) +// Convert_v1alpha3_DeviceClaim_To_resource_DeviceClaim is an autogenerated conversion function. +func Convert_v1alpha3_DeviceClaim_To_resource_DeviceClaim(in *v1alpha3.DeviceClaim, out *resource.DeviceClaim, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceClaim_To_resource_DeviceClaim(in, out, s) } -func autoConvert_resource_NamedResourcesFilter_To_v1alpha3_NamedResourcesFilter(in *resource.NamedResourcesFilter, out *v1alpha3.NamedResourcesFilter, s conversion.Scope) error { - out.Selector = in.Selector +func autoConvert_resource_DeviceClaim_To_v1alpha3_DeviceClaim(in *resource.DeviceClaim, out *v1alpha3.DeviceClaim, s conversion.Scope) error { + out.Requests = *(*[]v1alpha3.DeviceRequest)(unsafe.Pointer(&in.Requests)) + out.Constraints = *(*[]v1alpha3.DeviceConstraint)(unsafe.Pointer(&in.Constraints)) + out.Config = *(*[]v1alpha3.DeviceClaimConfiguration)(unsafe.Pointer(&in.Config)) return nil } -// Convert_resource_NamedResourcesFilter_To_v1alpha3_NamedResourcesFilter is an autogenerated conversion function. -func Convert_resource_NamedResourcesFilter_To_v1alpha3_NamedResourcesFilter(in *resource.NamedResourcesFilter, out *v1alpha3.NamedResourcesFilter, s conversion.Scope) error { - return autoConvert_resource_NamedResourcesFilter_To_v1alpha3_NamedResourcesFilter(in, out, s) +// Convert_resource_DeviceClaim_To_v1alpha3_DeviceClaim is an autogenerated conversion function. +func Convert_resource_DeviceClaim_To_v1alpha3_DeviceClaim(in *resource.DeviceClaim, out *v1alpha3.DeviceClaim, s conversion.Scope) error { + return autoConvert_resource_DeviceClaim_To_v1alpha3_DeviceClaim(in, out, s) } -func autoConvert_v1alpha3_NamedResourcesInstance_To_resource_NamedResourcesInstance(in *v1alpha3.NamedResourcesInstance, out *resource.NamedResourcesInstance, s conversion.Scope) error { +func autoConvert_v1alpha3_DeviceClaimConfiguration_To_resource_DeviceClaimConfiguration(in *v1alpha3.DeviceClaimConfiguration, out *resource.DeviceClaimConfiguration, s conversion.Scope) error { + out.Requests = *(*[]string)(unsafe.Pointer(&in.Requests)) + if err := Convert_v1alpha3_DeviceConfiguration_To_resource_DeviceConfiguration(&in.DeviceConfiguration, &out.DeviceConfiguration, s); err != nil { + return err + } + return nil +} + +// Convert_v1alpha3_DeviceClaimConfiguration_To_resource_DeviceClaimConfiguration is an autogenerated conversion function. +func Convert_v1alpha3_DeviceClaimConfiguration_To_resource_DeviceClaimConfiguration(in *v1alpha3.DeviceClaimConfiguration, out *resource.DeviceClaimConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceClaimConfiguration_To_resource_DeviceClaimConfiguration(in, out, s) +} + +func autoConvert_resource_DeviceClaimConfiguration_To_v1alpha3_DeviceClaimConfiguration(in *resource.DeviceClaimConfiguration, out *v1alpha3.DeviceClaimConfiguration, s conversion.Scope) error { + out.Requests = *(*[]string)(unsafe.Pointer(&in.Requests)) + if err := Convert_resource_DeviceConfiguration_To_v1alpha3_DeviceConfiguration(&in.DeviceConfiguration, &out.DeviceConfiguration, s); err != nil { + return err + } + return nil +} + +// Convert_resource_DeviceClaimConfiguration_To_v1alpha3_DeviceClaimConfiguration is an autogenerated conversion function. +func Convert_resource_DeviceClaimConfiguration_To_v1alpha3_DeviceClaimConfiguration(in *resource.DeviceClaimConfiguration, out *v1alpha3.DeviceClaimConfiguration, s conversion.Scope) error { + return autoConvert_resource_DeviceClaimConfiguration_To_v1alpha3_DeviceClaimConfiguration(in, out, s) +} + +func autoConvert_v1alpha3_DeviceClass_To_resource_DeviceClass(in *v1alpha3.DeviceClass, out *resource.DeviceClass, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1alpha3_DeviceClassSpec_To_resource_DeviceClassSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + return nil +} + +// Convert_v1alpha3_DeviceClass_To_resource_DeviceClass is an autogenerated conversion function. +func Convert_v1alpha3_DeviceClass_To_resource_DeviceClass(in *v1alpha3.DeviceClass, out *resource.DeviceClass, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceClass_To_resource_DeviceClass(in, out, s) +} + +func autoConvert_resource_DeviceClass_To_v1alpha3_DeviceClass(in *resource.DeviceClass, out *v1alpha3.DeviceClass, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_resource_DeviceClassSpec_To_v1alpha3_DeviceClassSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + return nil +} + +// Convert_resource_DeviceClass_To_v1alpha3_DeviceClass is an autogenerated conversion function. +func Convert_resource_DeviceClass_To_v1alpha3_DeviceClass(in *resource.DeviceClass, out *v1alpha3.DeviceClass, s conversion.Scope) error { + return autoConvert_resource_DeviceClass_To_v1alpha3_DeviceClass(in, out, s) +} + +func autoConvert_v1alpha3_DeviceClassConfiguration_To_resource_DeviceClassConfiguration(in *v1alpha3.DeviceClassConfiguration, out *resource.DeviceClassConfiguration, s conversion.Scope) error { + if err := Convert_v1alpha3_DeviceConfiguration_To_resource_DeviceConfiguration(&in.DeviceConfiguration, &out.DeviceConfiguration, s); err != nil { + return err + } + return nil +} + +// Convert_v1alpha3_DeviceClassConfiguration_To_resource_DeviceClassConfiguration is an autogenerated conversion function. +func Convert_v1alpha3_DeviceClassConfiguration_To_resource_DeviceClassConfiguration(in *v1alpha3.DeviceClassConfiguration, out *resource.DeviceClassConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceClassConfiguration_To_resource_DeviceClassConfiguration(in, out, s) +} + +func autoConvert_resource_DeviceClassConfiguration_To_v1alpha3_DeviceClassConfiguration(in *resource.DeviceClassConfiguration, out *v1alpha3.DeviceClassConfiguration, s conversion.Scope) error { + if err := Convert_resource_DeviceConfiguration_To_v1alpha3_DeviceConfiguration(&in.DeviceConfiguration, &out.DeviceConfiguration, s); err != nil { + return err + } + return nil +} + +// Convert_resource_DeviceClassConfiguration_To_v1alpha3_DeviceClassConfiguration is an autogenerated conversion function. +func Convert_resource_DeviceClassConfiguration_To_v1alpha3_DeviceClassConfiguration(in *resource.DeviceClassConfiguration, out *v1alpha3.DeviceClassConfiguration, s conversion.Scope) error { + return autoConvert_resource_DeviceClassConfiguration_To_v1alpha3_DeviceClassConfiguration(in, out, s) +} + +func autoConvert_v1alpha3_DeviceClassList_To_resource_DeviceClassList(in *v1alpha3.DeviceClassList, out *resource.DeviceClassList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]resource.DeviceClass)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_v1alpha3_DeviceClassList_To_resource_DeviceClassList is an autogenerated conversion function. +func Convert_v1alpha3_DeviceClassList_To_resource_DeviceClassList(in *v1alpha3.DeviceClassList, out *resource.DeviceClassList, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceClassList_To_resource_DeviceClassList(in, out, s) +} + +func autoConvert_resource_DeviceClassList_To_v1alpha3_DeviceClassList(in *resource.DeviceClassList, out *v1alpha3.DeviceClassList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]v1alpha3.DeviceClass)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_resource_DeviceClassList_To_v1alpha3_DeviceClassList is an autogenerated conversion function. +func Convert_resource_DeviceClassList_To_v1alpha3_DeviceClassList(in *resource.DeviceClassList, out *v1alpha3.DeviceClassList, s conversion.Scope) error { + return autoConvert_resource_DeviceClassList_To_v1alpha3_DeviceClassList(in, out, s) +} + +func autoConvert_v1alpha3_DeviceClassSpec_To_resource_DeviceClassSpec(in *v1alpha3.DeviceClassSpec, out *resource.DeviceClassSpec, s conversion.Scope) error { + out.Selectors = *(*[]resource.DeviceSelector)(unsafe.Pointer(&in.Selectors)) + out.Config = *(*[]resource.DeviceClassConfiguration)(unsafe.Pointer(&in.Config)) + out.SuitableNodes = (*core.NodeSelector)(unsafe.Pointer(in.SuitableNodes)) + return nil +} + +// Convert_v1alpha3_DeviceClassSpec_To_resource_DeviceClassSpec is an autogenerated conversion function. +func Convert_v1alpha3_DeviceClassSpec_To_resource_DeviceClassSpec(in *v1alpha3.DeviceClassSpec, out *resource.DeviceClassSpec, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceClassSpec_To_resource_DeviceClassSpec(in, out, s) +} + +func autoConvert_resource_DeviceClassSpec_To_v1alpha3_DeviceClassSpec(in *resource.DeviceClassSpec, out *v1alpha3.DeviceClassSpec, s conversion.Scope) error { + out.Selectors = *(*[]v1alpha3.DeviceSelector)(unsafe.Pointer(&in.Selectors)) + out.Config = *(*[]v1alpha3.DeviceClassConfiguration)(unsafe.Pointer(&in.Config)) + out.SuitableNodes = (*v1.NodeSelector)(unsafe.Pointer(in.SuitableNodes)) + return nil +} + +// Convert_resource_DeviceClassSpec_To_v1alpha3_DeviceClassSpec is an autogenerated conversion function. +func Convert_resource_DeviceClassSpec_To_v1alpha3_DeviceClassSpec(in *resource.DeviceClassSpec, out *v1alpha3.DeviceClassSpec, s conversion.Scope) error { + return autoConvert_resource_DeviceClassSpec_To_v1alpha3_DeviceClassSpec(in, out, s) +} + +func autoConvert_v1alpha3_DeviceConfiguration_To_resource_DeviceConfiguration(in *v1alpha3.DeviceConfiguration, out *resource.DeviceConfiguration, s conversion.Scope) error { + out.Opaque = (*resource.OpaqueDeviceConfiguration)(unsafe.Pointer(in.Opaque)) + return nil +} + +// Convert_v1alpha3_DeviceConfiguration_To_resource_DeviceConfiguration is an autogenerated conversion function. +func Convert_v1alpha3_DeviceConfiguration_To_resource_DeviceConfiguration(in *v1alpha3.DeviceConfiguration, out *resource.DeviceConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceConfiguration_To_resource_DeviceConfiguration(in, out, s) +} + +func autoConvert_resource_DeviceConfiguration_To_v1alpha3_DeviceConfiguration(in *resource.DeviceConfiguration, out *v1alpha3.DeviceConfiguration, s conversion.Scope) error { + out.Opaque = (*v1alpha3.OpaqueDeviceConfiguration)(unsafe.Pointer(in.Opaque)) + return nil +} + +// Convert_resource_DeviceConfiguration_To_v1alpha3_DeviceConfiguration is an autogenerated conversion function. +func Convert_resource_DeviceConfiguration_To_v1alpha3_DeviceConfiguration(in *resource.DeviceConfiguration, out *v1alpha3.DeviceConfiguration, s conversion.Scope) error { + return autoConvert_resource_DeviceConfiguration_To_v1alpha3_DeviceConfiguration(in, out, s) +} + +func autoConvert_v1alpha3_DeviceConstraint_To_resource_DeviceConstraint(in *v1alpha3.DeviceConstraint, out *resource.DeviceConstraint, s conversion.Scope) error { + out.Requests = *(*[]string)(unsafe.Pointer(&in.Requests)) + out.MatchAttribute = (*resource.FullyQualifiedName)(unsafe.Pointer(in.MatchAttribute)) + return nil +} + +// Convert_v1alpha3_DeviceConstraint_To_resource_DeviceConstraint is an autogenerated conversion function. +func Convert_v1alpha3_DeviceConstraint_To_resource_DeviceConstraint(in *v1alpha3.DeviceConstraint, out *resource.DeviceConstraint, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceConstraint_To_resource_DeviceConstraint(in, out, s) +} + +func autoConvert_resource_DeviceConstraint_To_v1alpha3_DeviceConstraint(in *resource.DeviceConstraint, out *v1alpha3.DeviceConstraint, s conversion.Scope) error { + out.Requests = *(*[]string)(unsafe.Pointer(&in.Requests)) + out.MatchAttribute = (*v1alpha3.FullyQualifiedName)(unsafe.Pointer(in.MatchAttribute)) + return nil +} + +// Convert_resource_DeviceConstraint_To_v1alpha3_DeviceConstraint is an autogenerated conversion function. +func Convert_resource_DeviceConstraint_To_v1alpha3_DeviceConstraint(in *resource.DeviceConstraint, out *v1alpha3.DeviceConstraint, s conversion.Scope) error { + return autoConvert_resource_DeviceConstraint_To_v1alpha3_DeviceConstraint(in, out, s) +} + +func autoConvert_v1alpha3_DeviceRequest_To_resource_DeviceRequest(in *v1alpha3.DeviceRequest, out *resource.DeviceRequest, s conversion.Scope) error { out.Name = in.Name - out.Attributes = *(*[]resource.NamedResourcesAttribute)(unsafe.Pointer(&in.Attributes)) + out.DeviceClassName = in.DeviceClassName + out.Selectors = *(*[]resource.DeviceSelector)(unsafe.Pointer(&in.Selectors)) + out.AllocationMode = resource.DeviceAllocationMode(in.AllocationMode) + out.Count = in.Count + out.AdminAccess = in.AdminAccess return nil } -// Convert_v1alpha3_NamedResourcesInstance_To_resource_NamedResourcesInstance is an autogenerated conversion function. -func Convert_v1alpha3_NamedResourcesInstance_To_resource_NamedResourcesInstance(in *v1alpha3.NamedResourcesInstance, out *resource.NamedResourcesInstance, s conversion.Scope) error { - return autoConvert_v1alpha3_NamedResourcesInstance_To_resource_NamedResourcesInstance(in, out, s) +// Convert_v1alpha3_DeviceRequest_To_resource_DeviceRequest is an autogenerated conversion function. +func Convert_v1alpha3_DeviceRequest_To_resource_DeviceRequest(in *v1alpha3.DeviceRequest, out *resource.DeviceRequest, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceRequest_To_resource_DeviceRequest(in, out, s) } -func autoConvert_resource_NamedResourcesInstance_To_v1alpha3_NamedResourcesInstance(in *resource.NamedResourcesInstance, out *v1alpha3.NamedResourcesInstance, s conversion.Scope) error { +func autoConvert_resource_DeviceRequest_To_v1alpha3_DeviceRequest(in *resource.DeviceRequest, out *v1alpha3.DeviceRequest, s conversion.Scope) error { out.Name = in.Name - out.Attributes = *(*[]v1alpha3.NamedResourcesAttribute)(unsafe.Pointer(&in.Attributes)) + out.DeviceClassName = in.DeviceClassName + out.Selectors = *(*[]v1alpha3.DeviceSelector)(unsafe.Pointer(&in.Selectors)) + out.AllocationMode = v1alpha3.DeviceAllocationMode(in.AllocationMode) + out.Count = in.Count + out.AdminAccess = in.AdminAccess return nil } -// Convert_resource_NamedResourcesInstance_To_v1alpha3_NamedResourcesInstance is an autogenerated conversion function. -func Convert_resource_NamedResourcesInstance_To_v1alpha3_NamedResourcesInstance(in *resource.NamedResourcesInstance, out *v1alpha3.NamedResourcesInstance, s conversion.Scope) error { - return autoConvert_resource_NamedResourcesInstance_To_v1alpha3_NamedResourcesInstance(in, out, s) +// Convert_resource_DeviceRequest_To_v1alpha3_DeviceRequest is an autogenerated conversion function. +func Convert_resource_DeviceRequest_To_v1alpha3_DeviceRequest(in *resource.DeviceRequest, out *v1alpha3.DeviceRequest, s conversion.Scope) error { + return autoConvert_resource_DeviceRequest_To_v1alpha3_DeviceRequest(in, out, s) } -func autoConvert_v1alpha3_NamedResourcesIntSlice_To_resource_NamedResourcesIntSlice(in *v1alpha3.NamedResourcesIntSlice, out *resource.NamedResourcesIntSlice, s conversion.Scope) error { - out.Ints = *(*[]int64)(unsafe.Pointer(&in.Ints)) +func autoConvert_v1alpha3_DeviceRequestAllocationResult_To_resource_DeviceRequestAllocationResult(in *v1alpha3.DeviceRequestAllocationResult, out *resource.DeviceRequestAllocationResult, s conversion.Scope) error { + out.Request = in.Request + out.Driver = in.Driver + out.Pool = in.Pool + out.Device = in.Device return nil } -// Convert_v1alpha3_NamedResourcesIntSlice_To_resource_NamedResourcesIntSlice is an autogenerated conversion function. -func Convert_v1alpha3_NamedResourcesIntSlice_To_resource_NamedResourcesIntSlice(in *v1alpha3.NamedResourcesIntSlice, out *resource.NamedResourcesIntSlice, s conversion.Scope) error { - return autoConvert_v1alpha3_NamedResourcesIntSlice_To_resource_NamedResourcesIntSlice(in, out, s) +// Convert_v1alpha3_DeviceRequestAllocationResult_To_resource_DeviceRequestAllocationResult is an autogenerated conversion function. +func Convert_v1alpha3_DeviceRequestAllocationResult_To_resource_DeviceRequestAllocationResult(in *v1alpha3.DeviceRequestAllocationResult, out *resource.DeviceRequestAllocationResult, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceRequestAllocationResult_To_resource_DeviceRequestAllocationResult(in, out, s) } -func autoConvert_resource_NamedResourcesIntSlice_To_v1alpha3_NamedResourcesIntSlice(in *resource.NamedResourcesIntSlice, out *v1alpha3.NamedResourcesIntSlice, s conversion.Scope) error { - out.Ints = *(*[]int64)(unsafe.Pointer(&in.Ints)) +func autoConvert_resource_DeviceRequestAllocationResult_To_v1alpha3_DeviceRequestAllocationResult(in *resource.DeviceRequestAllocationResult, out *v1alpha3.DeviceRequestAllocationResult, s conversion.Scope) error { + out.Request = in.Request + out.Driver = in.Driver + out.Pool = in.Pool + out.Device = in.Device return nil } -// Convert_resource_NamedResourcesIntSlice_To_v1alpha3_NamedResourcesIntSlice is an autogenerated conversion function. -func Convert_resource_NamedResourcesIntSlice_To_v1alpha3_NamedResourcesIntSlice(in *resource.NamedResourcesIntSlice, out *v1alpha3.NamedResourcesIntSlice, s conversion.Scope) error { - return autoConvert_resource_NamedResourcesIntSlice_To_v1alpha3_NamedResourcesIntSlice(in, out, s) +// Convert_resource_DeviceRequestAllocationResult_To_v1alpha3_DeviceRequestAllocationResult is an autogenerated conversion function. +func Convert_resource_DeviceRequestAllocationResult_To_v1alpha3_DeviceRequestAllocationResult(in *resource.DeviceRequestAllocationResult, out *v1alpha3.DeviceRequestAllocationResult, s conversion.Scope) error { + return autoConvert_resource_DeviceRequestAllocationResult_To_v1alpha3_DeviceRequestAllocationResult(in, out, s) } -func autoConvert_v1alpha3_NamedResourcesRequest_To_resource_NamedResourcesRequest(in *v1alpha3.NamedResourcesRequest, out *resource.NamedResourcesRequest, s conversion.Scope) error { - out.Selector = in.Selector +func autoConvert_v1alpha3_DeviceSelector_To_resource_DeviceSelector(in *v1alpha3.DeviceSelector, out *resource.DeviceSelector, s conversion.Scope) error { + out.CEL = (*resource.CELDeviceSelector)(unsafe.Pointer(in.CEL)) return nil } -// Convert_v1alpha3_NamedResourcesRequest_To_resource_NamedResourcesRequest is an autogenerated conversion function. -func Convert_v1alpha3_NamedResourcesRequest_To_resource_NamedResourcesRequest(in *v1alpha3.NamedResourcesRequest, out *resource.NamedResourcesRequest, s conversion.Scope) error { - return autoConvert_v1alpha3_NamedResourcesRequest_To_resource_NamedResourcesRequest(in, out, s) +// Convert_v1alpha3_DeviceSelector_To_resource_DeviceSelector is an autogenerated conversion function. +func Convert_v1alpha3_DeviceSelector_To_resource_DeviceSelector(in *v1alpha3.DeviceSelector, out *resource.DeviceSelector, s conversion.Scope) error { + return autoConvert_v1alpha3_DeviceSelector_To_resource_DeviceSelector(in, out, s) } -func autoConvert_resource_NamedResourcesRequest_To_v1alpha3_NamedResourcesRequest(in *resource.NamedResourcesRequest, out *v1alpha3.NamedResourcesRequest, s conversion.Scope) error { - out.Selector = in.Selector +func autoConvert_resource_DeviceSelector_To_v1alpha3_DeviceSelector(in *resource.DeviceSelector, out *v1alpha3.DeviceSelector, s conversion.Scope) error { + out.CEL = (*v1alpha3.CELDeviceSelector)(unsafe.Pointer(in.CEL)) return nil } -// Convert_resource_NamedResourcesRequest_To_v1alpha3_NamedResourcesRequest is an autogenerated conversion function. -func Convert_resource_NamedResourcesRequest_To_v1alpha3_NamedResourcesRequest(in *resource.NamedResourcesRequest, out *v1alpha3.NamedResourcesRequest, s conversion.Scope) error { - return autoConvert_resource_NamedResourcesRequest_To_v1alpha3_NamedResourcesRequest(in, out, s) +// Convert_resource_DeviceSelector_To_v1alpha3_DeviceSelector is an autogenerated conversion function. +func Convert_resource_DeviceSelector_To_v1alpha3_DeviceSelector(in *resource.DeviceSelector, out *v1alpha3.DeviceSelector, s conversion.Scope) error { + return autoConvert_resource_DeviceSelector_To_v1alpha3_DeviceSelector(in, out, s) } -func autoConvert_v1alpha3_NamedResourcesResources_To_resource_NamedResourcesResources(in *v1alpha3.NamedResourcesResources, out *resource.NamedResourcesResources, s conversion.Scope) error { - out.Instances = *(*[]resource.NamedResourcesInstance)(unsafe.Pointer(&in.Instances)) +func autoConvert_v1alpha3_OpaqueDeviceConfiguration_To_resource_OpaqueDeviceConfiguration(in *v1alpha3.OpaqueDeviceConfiguration, out *resource.OpaqueDeviceConfiguration, s conversion.Scope) error { + out.Driver = in.Driver + out.Parameters = in.Parameters return nil } -// Convert_v1alpha3_NamedResourcesResources_To_resource_NamedResourcesResources is an autogenerated conversion function. -func Convert_v1alpha3_NamedResourcesResources_To_resource_NamedResourcesResources(in *v1alpha3.NamedResourcesResources, out *resource.NamedResourcesResources, s conversion.Scope) error { - return autoConvert_v1alpha3_NamedResourcesResources_To_resource_NamedResourcesResources(in, out, s) +// Convert_v1alpha3_OpaqueDeviceConfiguration_To_resource_OpaqueDeviceConfiguration is an autogenerated conversion function. +func Convert_v1alpha3_OpaqueDeviceConfiguration_To_resource_OpaqueDeviceConfiguration(in *v1alpha3.OpaqueDeviceConfiguration, out *resource.OpaqueDeviceConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha3_OpaqueDeviceConfiguration_To_resource_OpaqueDeviceConfiguration(in, out, s) } -func autoConvert_resource_NamedResourcesResources_To_v1alpha3_NamedResourcesResources(in *resource.NamedResourcesResources, out *v1alpha3.NamedResourcesResources, s conversion.Scope) error { - out.Instances = *(*[]v1alpha3.NamedResourcesInstance)(unsafe.Pointer(&in.Instances)) +func autoConvert_resource_OpaqueDeviceConfiguration_To_v1alpha3_OpaqueDeviceConfiguration(in *resource.OpaqueDeviceConfiguration, out *v1alpha3.OpaqueDeviceConfiguration, s conversion.Scope) error { + out.Driver = in.Driver + out.Parameters = in.Parameters return nil } -// Convert_resource_NamedResourcesResources_To_v1alpha3_NamedResourcesResources is an autogenerated conversion function. -func Convert_resource_NamedResourcesResources_To_v1alpha3_NamedResourcesResources(in *resource.NamedResourcesResources, out *v1alpha3.NamedResourcesResources, s conversion.Scope) error { - return autoConvert_resource_NamedResourcesResources_To_v1alpha3_NamedResourcesResources(in, out, s) -} - -func autoConvert_v1alpha3_NamedResourcesStringSlice_To_resource_NamedResourcesStringSlice(in *v1alpha3.NamedResourcesStringSlice, out *resource.NamedResourcesStringSlice, s conversion.Scope) error { - out.Strings = *(*[]string)(unsafe.Pointer(&in.Strings)) - return nil -} - -// Convert_v1alpha3_NamedResourcesStringSlice_To_resource_NamedResourcesStringSlice is an autogenerated conversion function. -func Convert_v1alpha3_NamedResourcesStringSlice_To_resource_NamedResourcesStringSlice(in *v1alpha3.NamedResourcesStringSlice, out *resource.NamedResourcesStringSlice, s conversion.Scope) error { - return autoConvert_v1alpha3_NamedResourcesStringSlice_To_resource_NamedResourcesStringSlice(in, out, s) -} - -func autoConvert_resource_NamedResourcesStringSlice_To_v1alpha3_NamedResourcesStringSlice(in *resource.NamedResourcesStringSlice, out *v1alpha3.NamedResourcesStringSlice, s conversion.Scope) error { - out.Strings = *(*[]string)(unsafe.Pointer(&in.Strings)) - return nil -} - -// Convert_resource_NamedResourcesStringSlice_To_v1alpha3_NamedResourcesStringSlice is an autogenerated conversion function. -func Convert_resource_NamedResourcesStringSlice_To_v1alpha3_NamedResourcesStringSlice(in *resource.NamedResourcesStringSlice, out *v1alpha3.NamedResourcesStringSlice, s conversion.Scope) error { - return autoConvert_resource_NamedResourcesStringSlice_To_v1alpha3_NamedResourcesStringSlice(in, out, s) +// Convert_resource_OpaqueDeviceConfiguration_To_v1alpha3_OpaqueDeviceConfiguration is an autogenerated conversion function. +func Convert_resource_OpaqueDeviceConfiguration_To_v1alpha3_OpaqueDeviceConfiguration(in *resource.OpaqueDeviceConfiguration, out *v1alpha3.OpaqueDeviceConfiguration, s conversion.Scope) error { + return autoConvert_resource_OpaqueDeviceConfiguration_To_v1alpha3_OpaqueDeviceConfiguration(in, out, s) } func autoConvert_v1alpha3_PodSchedulingContext_To_resource_PodSchedulingContext(in *v1alpha3.PodSchedulingContext, out *resource.PodSchedulingContext, s conversion.Scope) error { @@ -980,17 +1014,7 @@ func Convert_resource_ResourceClaimConsumerReference_To_v1alpha3_ResourceClaimCo func autoConvert_v1alpha3_ResourceClaimList_To_resource_ResourceClaimList(in *v1alpha3.ResourceClaimList, out *resource.ResourceClaimList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]resource.ResourceClaim, len(*in)) - for i := range *in { - if err := Convert_v1alpha3_ResourceClaim_To_resource_ResourceClaim(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } + out.Items = *(*[]resource.ResourceClaim)(unsafe.Pointer(&in.Items)) return nil } @@ -1001,17 +1025,7 @@ func Convert_v1alpha3_ResourceClaimList_To_resource_ResourceClaimList(in *v1alph func autoConvert_resource_ResourceClaimList_To_v1alpha3_ResourceClaimList(in *resource.ResourceClaimList, out *v1alpha3.ResourceClaimList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]v1alpha3.ResourceClaim, len(*in)) - for i := range *in { - if err := Convert_resource_ResourceClaim_To_v1alpha3_ResourceClaim(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } + out.Items = *(*[]v1alpha3.ResourceClaim)(unsafe.Pointer(&in.Items)) return nil } @@ -1020,116 +1034,6 @@ func Convert_resource_ResourceClaimList_To_v1alpha3_ResourceClaimList(in *resour return autoConvert_resource_ResourceClaimList_To_v1alpha3_ResourceClaimList(in, out, s) } -func autoConvert_v1alpha3_ResourceClaimParameters_To_resource_ResourceClaimParameters(in *v1alpha3.ResourceClaimParameters, out *resource.ResourceClaimParameters, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.GeneratedFrom = (*resource.ResourceClaimParametersReference)(unsafe.Pointer(in.GeneratedFrom)) - if in.DriverRequests != nil { - in, out := &in.DriverRequests, &out.DriverRequests - *out = make([]resource.DriverRequests, len(*in)) - for i := range *in { - if err := Convert_v1alpha3_DriverRequests_To_resource_DriverRequests(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.DriverRequests = nil - } - return nil -} - -// Convert_v1alpha3_ResourceClaimParameters_To_resource_ResourceClaimParameters is an autogenerated conversion function. -func Convert_v1alpha3_ResourceClaimParameters_To_resource_ResourceClaimParameters(in *v1alpha3.ResourceClaimParameters, out *resource.ResourceClaimParameters, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceClaimParameters_To_resource_ResourceClaimParameters(in, out, s) -} - -func autoConvert_resource_ResourceClaimParameters_To_v1alpha3_ResourceClaimParameters(in *resource.ResourceClaimParameters, out *v1alpha3.ResourceClaimParameters, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.GeneratedFrom = (*v1alpha3.ResourceClaimParametersReference)(unsafe.Pointer(in.GeneratedFrom)) - if in.DriverRequests != nil { - in, out := &in.DriverRequests, &out.DriverRequests - *out = make([]v1alpha3.DriverRequests, len(*in)) - for i := range *in { - if err := Convert_resource_DriverRequests_To_v1alpha3_DriverRequests(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.DriverRequests = nil - } - return nil -} - -// Convert_resource_ResourceClaimParameters_To_v1alpha3_ResourceClaimParameters is an autogenerated conversion function. -func Convert_resource_ResourceClaimParameters_To_v1alpha3_ResourceClaimParameters(in *resource.ResourceClaimParameters, out *v1alpha3.ResourceClaimParameters, s conversion.Scope) error { - return autoConvert_resource_ResourceClaimParameters_To_v1alpha3_ResourceClaimParameters(in, out, s) -} - -func autoConvert_v1alpha3_ResourceClaimParametersList_To_resource_ResourceClaimParametersList(in *v1alpha3.ResourceClaimParametersList, out *resource.ResourceClaimParametersList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]resource.ResourceClaimParameters, len(*in)) - for i := range *in { - if err := Convert_v1alpha3_ResourceClaimParameters_To_resource_ResourceClaimParameters(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } - return nil -} - -// Convert_v1alpha3_ResourceClaimParametersList_To_resource_ResourceClaimParametersList is an autogenerated conversion function. -func Convert_v1alpha3_ResourceClaimParametersList_To_resource_ResourceClaimParametersList(in *v1alpha3.ResourceClaimParametersList, out *resource.ResourceClaimParametersList, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceClaimParametersList_To_resource_ResourceClaimParametersList(in, out, s) -} - -func autoConvert_resource_ResourceClaimParametersList_To_v1alpha3_ResourceClaimParametersList(in *resource.ResourceClaimParametersList, out *v1alpha3.ResourceClaimParametersList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]v1alpha3.ResourceClaimParameters, len(*in)) - for i := range *in { - if err := Convert_resource_ResourceClaimParameters_To_v1alpha3_ResourceClaimParameters(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } - return nil -} - -// Convert_resource_ResourceClaimParametersList_To_v1alpha3_ResourceClaimParametersList is an autogenerated conversion function. -func Convert_resource_ResourceClaimParametersList_To_v1alpha3_ResourceClaimParametersList(in *resource.ResourceClaimParametersList, out *v1alpha3.ResourceClaimParametersList, s conversion.Scope) error { - return autoConvert_resource_ResourceClaimParametersList_To_v1alpha3_ResourceClaimParametersList(in, out, s) -} - -func autoConvert_v1alpha3_ResourceClaimParametersReference_To_resource_ResourceClaimParametersReference(in *v1alpha3.ResourceClaimParametersReference, out *resource.ResourceClaimParametersReference, s conversion.Scope) error { - out.APIGroup = in.APIGroup - out.Kind = in.Kind - out.Name = in.Name - return nil -} - -// Convert_v1alpha3_ResourceClaimParametersReference_To_resource_ResourceClaimParametersReference is an autogenerated conversion function. -func Convert_v1alpha3_ResourceClaimParametersReference_To_resource_ResourceClaimParametersReference(in *v1alpha3.ResourceClaimParametersReference, out *resource.ResourceClaimParametersReference, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceClaimParametersReference_To_resource_ResourceClaimParametersReference(in, out, s) -} - -func autoConvert_resource_ResourceClaimParametersReference_To_v1alpha3_ResourceClaimParametersReference(in *resource.ResourceClaimParametersReference, out *v1alpha3.ResourceClaimParametersReference, s conversion.Scope) error { - out.APIGroup = in.APIGroup - out.Kind = in.Kind - out.Name = in.Name - return nil -} - -// Convert_resource_ResourceClaimParametersReference_To_v1alpha3_ResourceClaimParametersReference is an autogenerated conversion function. -func Convert_resource_ResourceClaimParametersReference_To_v1alpha3_ResourceClaimParametersReference(in *resource.ResourceClaimParametersReference, out *v1alpha3.ResourceClaimParametersReference, s conversion.Scope) error { - return autoConvert_resource_ResourceClaimParametersReference_To_v1alpha3_ResourceClaimParametersReference(in, out, s) -} - func autoConvert_v1alpha3_ResourceClaimSchedulingStatus_To_resource_ResourceClaimSchedulingStatus(in *v1alpha3.ResourceClaimSchedulingStatus, out *resource.ResourceClaimSchedulingStatus, s conversion.Scope) error { out.Name = in.Name out.UnsuitableNodes = *(*[]string)(unsafe.Pointer(&in.UnsuitableNodes)) @@ -1153,8 +1057,10 @@ func Convert_resource_ResourceClaimSchedulingStatus_To_v1alpha3_ResourceClaimSch } func autoConvert_v1alpha3_ResourceClaimSpec_To_resource_ResourceClaimSpec(in *v1alpha3.ResourceClaimSpec, out *resource.ResourceClaimSpec, s conversion.Scope) error { - out.ResourceClassName = in.ResourceClassName - out.ParametersRef = (*resource.ResourceClaimParametersReference)(unsafe.Pointer(in.ParametersRef)) + if err := Convert_v1alpha3_DeviceClaim_To_resource_DeviceClaim(&in.Devices, &out.Devices, s); err != nil { + return err + } + out.Controller = in.Controller return nil } @@ -1164,8 +1070,10 @@ func Convert_v1alpha3_ResourceClaimSpec_To_resource_ResourceClaimSpec(in *v1alph } func autoConvert_resource_ResourceClaimSpec_To_v1alpha3_ResourceClaimSpec(in *resource.ResourceClaimSpec, out *v1alpha3.ResourceClaimSpec, s conversion.Scope) error { - out.ResourceClassName = in.ResourceClassName - out.ParametersRef = (*v1alpha3.ResourceClaimParametersReference)(unsafe.Pointer(in.ParametersRef)) + if err := Convert_resource_DeviceClaim_To_v1alpha3_DeviceClaim(&in.Devices, &out.Devices, s); err != nil { + return err + } + out.Controller = in.Controller return nil } @@ -1175,16 +1083,7 @@ func Convert_resource_ResourceClaimSpec_To_v1alpha3_ResourceClaimSpec(in *resour } func autoConvert_v1alpha3_ResourceClaimStatus_To_resource_ResourceClaimStatus(in *v1alpha3.ResourceClaimStatus, out *resource.ResourceClaimStatus, s conversion.Scope) error { - out.DriverName = in.DriverName - if in.Allocation != nil { - in, out := &in.Allocation, &out.Allocation - *out = new(resource.AllocationResult) - if err := Convert_v1alpha3_AllocationResult_To_resource_AllocationResult(*in, *out, s); err != nil { - return err - } - } else { - out.Allocation = nil - } + out.Allocation = (*resource.AllocationResult)(unsafe.Pointer(in.Allocation)) out.ReservedFor = *(*[]resource.ResourceClaimConsumerReference)(unsafe.Pointer(&in.ReservedFor)) out.DeallocationRequested = in.DeallocationRequested return nil @@ -1196,16 +1095,7 @@ func Convert_v1alpha3_ResourceClaimStatus_To_resource_ResourceClaimStatus(in *v1 } func autoConvert_resource_ResourceClaimStatus_To_v1alpha3_ResourceClaimStatus(in *resource.ResourceClaimStatus, out *v1alpha3.ResourceClaimStatus, s conversion.Scope) error { - out.DriverName = in.DriverName - if in.Allocation != nil { - in, out := &in.Allocation, &out.Allocation - *out = new(v1alpha3.AllocationResult) - if err := Convert_resource_AllocationResult_To_v1alpha3_AllocationResult(*in, *out, s); err != nil { - return err - } - } else { - out.Allocation = nil - } + out.Allocation = (*v1alpha3.AllocationResult)(unsafe.Pointer(in.Allocation)) out.ReservedFor = *(*[]v1alpha3.ResourceClaimConsumerReference)(unsafe.Pointer(&in.ReservedFor)) out.DeallocationRequested = in.DeallocationRequested return nil @@ -1290,331 +1180,33 @@ func Convert_resource_ResourceClaimTemplateSpec_To_v1alpha3_ResourceClaimTemplat return autoConvert_resource_ResourceClaimTemplateSpec_To_v1alpha3_ResourceClaimTemplateSpec(in, out, s) } -func autoConvert_v1alpha3_ResourceClass_To_resource_ResourceClass(in *v1alpha3.ResourceClass, out *resource.ResourceClass, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.DriverName = in.DriverName - out.ParametersRef = (*resource.ResourceClassParametersReference)(unsafe.Pointer(in.ParametersRef)) - out.SuitableNodes = (*core.NodeSelector)(unsafe.Pointer(in.SuitableNodes)) - out.StructuredParameters = (*bool)(unsafe.Pointer(in.StructuredParameters)) - return nil -} - -// Convert_v1alpha3_ResourceClass_To_resource_ResourceClass is an autogenerated conversion function. -func Convert_v1alpha3_ResourceClass_To_resource_ResourceClass(in *v1alpha3.ResourceClass, out *resource.ResourceClass, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceClass_To_resource_ResourceClass(in, out, s) -} - -func autoConvert_resource_ResourceClass_To_v1alpha3_ResourceClass(in *resource.ResourceClass, out *v1alpha3.ResourceClass, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.DriverName = in.DriverName - out.ParametersRef = (*v1alpha3.ResourceClassParametersReference)(unsafe.Pointer(in.ParametersRef)) - out.SuitableNodes = (*v1.NodeSelector)(unsafe.Pointer(in.SuitableNodes)) - out.StructuredParameters = (*bool)(unsafe.Pointer(in.StructuredParameters)) - return nil -} - -// Convert_resource_ResourceClass_To_v1alpha3_ResourceClass is an autogenerated conversion function. -func Convert_resource_ResourceClass_To_v1alpha3_ResourceClass(in *resource.ResourceClass, out *v1alpha3.ResourceClass, s conversion.Scope) error { - return autoConvert_resource_ResourceClass_To_v1alpha3_ResourceClass(in, out, s) -} - -func autoConvert_v1alpha3_ResourceClassList_To_resource_ResourceClassList(in *v1alpha3.ResourceClassList, out *resource.ResourceClassList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]resource.ResourceClass)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_v1alpha3_ResourceClassList_To_resource_ResourceClassList is an autogenerated conversion function. -func Convert_v1alpha3_ResourceClassList_To_resource_ResourceClassList(in *v1alpha3.ResourceClassList, out *resource.ResourceClassList, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceClassList_To_resource_ResourceClassList(in, out, s) -} - -func autoConvert_resource_ResourceClassList_To_v1alpha3_ResourceClassList(in *resource.ResourceClassList, out *v1alpha3.ResourceClassList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]v1alpha3.ResourceClass)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_resource_ResourceClassList_To_v1alpha3_ResourceClassList is an autogenerated conversion function. -func Convert_resource_ResourceClassList_To_v1alpha3_ResourceClassList(in *resource.ResourceClassList, out *v1alpha3.ResourceClassList, s conversion.Scope) error { - return autoConvert_resource_ResourceClassList_To_v1alpha3_ResourceClassList(in, out, s) -} - -func autoConvert_v1alpha3_ResourceClassParameters_To_resource_ResourceClassParameters(in *v1alpha3.ResourceClassParameters, out *resource.ResourceClassParameters, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.GeneratedFrom = (*resource.ResourceClassParametersReference)(unsafe.Pointer(in.GeneratedFrom)) - if in.VendorParameters != nil { - in, out := &in.VendorParameters, &out.VendorParameters - *out = make([]resource.VendorParameters, len(*in)) - for i := range *in { - if err := Convert_v1alpha3_VendorParameters_To_resource_VendorParameters(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.VendorParameters = nil - } - out.Filters = *(*[]resource.ResourceFilter)(unsafe.Pointer(&in.Filters)) - return nil -} - -// Convert_v1alpha3_ResourceClassParameters_To_resource_ResourceClassParameters is an autogenerated conversion function. -func Convert_v1alpha3_ResourceClassParameters_To_resource_ResourceClassParameters(in *v1alpha3.ResourceClassParameters, out *resource.ResourceClassParameters, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceClassParameters_To_resource_ResourceClassParameters(in, out, s) -} - -func autoConvert_resource_ResourceClassParameters_To_v1alpha3_ResourceClassParameters(in *resource.ResourceClassParameters, out *v1alpha3.ResourceClassParameters, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.GeneratedFrom = (*v1alpha3.ResourceClassParametersReference)(unsafe.Pointer(in.GeneratedFrom)) - if in.VendorParameters != nil { - in, out := &in.VendorParameters, &out.VendorParameters - *out = make([]v1alpha3.VendorParameters, len(*in)) - for i := range *in { - if err := Convert_resource_VendorParameters_To_v1alpha3_VendorParameters(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.VendorParameters = nil - } - out.Filters = *(*[]v1alpha3.ResourceFilter)(unsafe.Pointer(&in.Filters)) - return nil -} - -// Convert_resource_ResourceClassParameters_To_v1alpha3_ResourceClassParameters is an autogenerated conversion function. -func Convert_resource_ResourceClassParameters_To_v1alpha3_ResourceClassParameters(in *resource.ResourceClassParameters, out *v1alpha3.ResourceClassParameters, s conversion.Scope) error { - return autoConvert_resource_ResourceClassParameters_To_v1alpha3_ResourceClassParameters(in, out, s) -} - -func autoConvert_v1alpha3_ResourceClassParametersList_To_resource_ResourceClassParametersList(in *v1alpha3.ResourceClassParametersList, out *resource.ResourceClassParametersList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]resource.ResourceClassParameters, len(*in)) - for i := range *in { - if err := Convert_v1alpha3_ResourceClassParameters_To_resource_ResourceClassParameters(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } - return nil -} - -// Convert_v1alpha3_ResourceClassParametersList_To_resource_ResourceClassParametersList is an autogenerated conversion function. -func Convert_v1alpha3_ResourceClassParametersList_To_resource_ResourceClassParametersList(in *v1alpha3.ResourceClassParametersList, out *resource.ResourceClassParametersList, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceClassParametersList_To_resource_ResourceClassParametersList(in, out, s) -} - -func autoConvert_resource_ResourceClassParametersList_To_v1alpha3_ResourceClassParametersList(in *resource.ResourceClassParametersList, out *v1alpha3.ResourceClassParametersList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]v1alpha3.ResourceClassParameters, len(*in)) - for i := range *in { - if err := Convert_resource_ResourceClassParameters_To_v1alpha3_ResourceClassParameters(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } - return nil -} - -// Convert_resource_ResourceClassParametersList_To_v1alpha3_ResourceClassParametersList is an autogenerated conversion function. -func Convert_resource_ResourceClassParametersList_To_v1alpha3_ResourceClassParametersList(in *resource.ResourceClassParametersList, out *v1alpha3.ResourceClassParametersList, s conversion.Scope) error { - return autoConvert_resource_ResourceClassParametersList_To_v1alpha3_ResourceClassParametersList(in, out, s) -} - -func autoConvert_v1alpha3_ResourceClassParametersReference_To_resource_ResourceClassParametersReference(in *v1alpha3.ResourceClassParametersReference, out *resource.ResourceClassParametersReference, s conversion.Scope) error { - out.APIGroup = in.APIGroup - out.Kind = in.Kind +func autoConvert_v1alpha3_ResourcePool_To_resource_ResourcePool(in *v1alpha3.ResourcePool, out *resource.ResourcePool, s conversion.Scope) error { out.Name = in.Name - out.Namespace = in.Namespace + out.Generation = in.Generation + out.ResourceSliceCount = in.ResourceSliceCount return nil } -// Convert_v1alpha3_ResourceClassParametersReference_To_resource_ResourceClassParametersReference is an autogenerated conversion function. -func Convert_v1alpha3_ResourceClassParametersReference_To_resource_ResourceClassParametersReference(in *v1alpha3.ResourceClassParametersReference, out *resource.ResourceClassParametersReference, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceClassParametersReference_To_resource_ResourceClassParametersReference(in, out, s) +// Convert_v1alpha3_ResourcePool_To_resource_ResourcePool is an autogenerated conversion function. +func Convert_v1alpha3_ResourcePool_To_resource_ResourcePool(in *v1alpha3.ResourcePool, out *resource.ResourcePool, s conversion.Scope) error { + return autoConvert_v1alpha3_ResourcePool_To_resource_ResourcePool(in, out, s) } -func autoConvert_resource_ResourceClassParametersReference_To_v1alpha3_ResourceClassParametersReference(in *resource.ResourceClassParametersReference, out *v1alpha3.ResourceClassParametersReference, s conversion.Scope) error { - out.APIGroup = in.APIGroup - out.Kind = in.Kind +func autoConvert_resource_ResourcePool_To_v1alpha3_ResourcePool(in *resource.ResourcePool, out *v1alpha3.ResourcePool, s conversion.Scope) error { out.Name = in.Name - out.Namespace = in.Namespace + out.Generation = in.Generation + out.ResourceSliceCount = in.ResourceSliceCount return nil } -// Convert_resource_ResourceClassParametersReference_To_v1alpha3_ResourceClassParametersReference is an autogenerated conversion function. -func Convert_resource_ResourceClassParametersReference_To_v1alpha3_ResourceClassParametersReference(in *resource.ResourceClassParametersReference, out *v1alpha3.ResourceClassParametersReference, s conversion.Scope) error { - return autoConvert_resource_ResourceClassParametersReference_To_v1alpha3_ResourceClassParametersReference(in, out, s) -} - -func autoConvert_v1alpha3_ResourceFilter_To_resource_ResourceFilter(in *v1alpha3.ResourceFilter, out *resource.ResourceFilter, s conversion.Scope) error { - out.DriverName = in.DriverName - if err := Convert_v1alpha3_ResourceFilterModel_To_resource_ResourceFilterModel(&in.ResourceFilterModel, &out.ResourceFilterModel, s); err != nil { - return err - } - return nil -} - -// Convert_v1alpha3_ResourceFilter_To_resource_ResourceFilter is an autogenerated conversion function. -func Convert_v1alpha3_ResourceFilter_To_resource_ResourceFilter(in *v1alpha3.ResourceFilter, out *resource.ResourceFilter, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceFilter_To_resource_ResourceFilter(in, out, s) -} - -func autoConvert_resource_ResourceFilter_To_v1alpha3_ResourceFilter(in *resource.ResourceFilter, out *v1alpha3.ResourceFilter, s conversion.Scope) error { - out.DriverName = in.DriverName - if err := Convert_resource_ResourceFilterModel_To_v1alpha3_ResourceFilterModel(&in.ResourceFilterModel, &out.ResourceFilterModel, s); err != nil { - return err - } - return nil -} - -// Convert_resource_ResourceFilter_To_v1alpha3_ResourceFilter is an autogenerated conversion function. -func Convert_resource_ResourceFilter_To_v1alpha3_ResourceFilter(in *resource.ResourceFilter, out *v1alpha3.ResourceFilter, s conversion.Scope) error { - return autoConvert_resource_ResourceFilter_To_v1alpha3_ResourceFilter(in, out, s) -} - -func autoConvert_v1alpha3_ResourceFilterModel_To_resource_ResourceFilterModel(in *v1alpha3.ResourceFilterModel, out *resource.ResourceFilterModel, s conversion.Scope) error { - out.NamedResources = (*resource.NamedResourcesFilter)(unsafe.Pointer(in.NamedResources)) - return nil -} - -// Convert_v1alpha3_ResourceFilterModel_To_resource_ResourceFilterModel is an autogenerated conversion function. -func Convert_v1alpha3_ResourceFilterModel_To_resource_ResourceFilterModel(in *v1alpha3.ResourceFilterModel, out *resource.ResourceFilterModel, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceFilterModel_To_resource_ResourceFilterModel(in, out, s) -} - -func autoConvert_resource_ResourceFilterModel_To_v1alpha3_ResourceFilterModel(in *resource.ResourceFilterModel, out *v1alpha3.ResourceFilterModel, s conversion.Scope) error { - out.NamedResources = (*v1alpha3.NamedResourcesFilter)(unsafe.Pointer(in.NamedResources)) - return nil -} - -// Convert_resource_ResourceFilterModel_To_v1alpha3_ResourceFilterModel is an autogenerated conversion function. -func Convert_resource_ResourceFilterModel_To_v1alpha3_ResourceFilterModel(in *resource.ResourceFilterModel, out *v1alpha3.ResourceFilterModel, s conversion.Scope) error { - return autoConvert_resource_ResourceFilterModel_To_v1alpha3_ResourceFilterModel(in, out, s) -} - -func autoConvert_v1alpha3_ResourceHandle_To_resource_ResourceHandle(in *v1alpha3.ResourceHandle, out *resource.ResourceHandle, s conversion.Scope) error { - out.DriverName = in.DriverName - out.Data = in.Data - if in.StructuredData != nil { - in, out := &in.StructuredData, &out.StructuredData - *out = new(resource.StructuredResourceHandle) - if err := Convert_v1alpha3_StructuredResourceHandle_To_resource_StructuredResourceHandle(*in, *out, s); err != nil { - return err - } - } else { - out.StructuredData = nil - } - return nil -} - -// Convert_v1alpha3_ResourceHandle_To_resource_ResourceHandle is an autogenerated conversion function. -func Convert_v1alpha3_ResourceHandle_To_resource_ResourceHandle(in *v1alpha3.ResourceHandle, out *resource.ResourceHandle, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceHandle_To_resource_ResourceHandle(in, out, s) -} - -func autoConvert_resource_ResourceHandle_To_v1alpha3_ResourceHandle(in *resource.ResourceHandle, out *v1alpha3.ResourceHandle, s conversion.Scope) error { - out.DriverName = in.DriverName - out.Data = in.Data - if in.StructuredData != nil { - in, out := &in.StructuredData, &out.StructuredData - *out = new(v1alpha3.StructuredResourceHandle) - if err := Convert_resource_StructuredResourceHandle_To_v1alpha3_StructuredResourceHandle(*in, *out, s); err != nil { - return err - } - } else { - out.StructuredData = nil - } - return nil -} - -// Convert_resource_ResourceHandle_To_v1alpha3_ResourceHandle is an autogenerated conversion function. -func Convert_resource_ResourceHandle_To_v1alpha3_ResourceHandle(in *resource.ResourceHandle, out *v1alpha3.ResourceHandle, s conversion.Scope) error { - return autoConvert_resource_ResourceHandle_To_v1alpha3_ResourceHandle(in, out, s) -} - -func autoConvert_v1alpha3_ResourceModel_To_resource_ResourceModel(in *v1alpha3.ResourceModel, out *resource.ResourceModel, s conversion.Scope) error { - out.NamedResources = (*resource.NamedResourcesResources)(unsafe.Pointer(in.NamedResources)) - return nil -} - -// Convert_v1alpha3_ResourceModel_To_resource_ResourceModel is an autogenerated conversion function. -func Convert_v1alpha3_ResourceModel_To_resource_ResourceModel(in *v1alpha3.ResourceModel, out *resource.ResourceModel, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceModel_To_resource_ResourceModel(in, out, s) -} - -func autoConvert_resource_ResourceModel_To_v1alpha3_ResourceModel(in *resource.ResourceModel, out *v1alpha3.ResourceModel, s conversion.Scope) error { - out.NamedResources = (*v1alpha3.NamedResourcesResources)(unsafe.Pointer(in.NamedResources)) - return nil -} - -// Convert_resource_ResourceModel_To_v1alpha3_ResourceModel is an autogenerated conversion function. -func Convert_resource_ResourceModel_To_v1alpha3_ResourceModel(in *resource.ResourceModel, out *v1alpha3.ResourceModel, s conversion.Scope) error { - return autoConvert_resource_ResourceModel_To_v1alpha3_ResourceModel(in, out, s) -} - -func autoConvert_v1alpha3_ResourceRequest_To_resource_ResourceRequest(in *v1alpha3.ResourceRequest, out *resource.ResourceRequest, s conversion.Scope) error { - if err := runtime.Convert_runtime_RawExtension_To_runtime_Object(&in.VendorParameters, &out.VendorParameters, s); err != nil { - return err - } - if err := Convert_v1alpha3_ResourceRequestModel_To_resource_ResourceRequestModel(&in.ResourceRequestModel, &out.ResourceRequestModel, s); err != nil { - return err - } - return nil -} - -// Convert_v1alpha3_ResourceRequest_To_resource_ResourceRequest is an autogenerated conversion function. -func Convert_v1alpha3_ResourceRequest_To_resource_ResourceRequest(in *v1alpha3.ResourceRequest, out *resource.ResourceRequest, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceRequest_To_resource_ResourceRequest(in, out, s) -} - -func autoConvert_resource_ResourceRequest_To_v1alpha3_ResourceRequest(in *resource.ResourceRequest, out *v1alpha3.ResourceRequest, s conversion.Scope) error { - if err := runtime.Convert_runtime_Object_To_runtime_RawExtension(&in.VendorParameters, &out.VendorParameters, s); err != nil { - return err - } - if err := Convert_resource_ResourceRequestModel_To_v1alpha3_ResourceRequestModel(&in.ResourceRequestModel, &out.ResourceRequestModel, s); err != nil { - return err - } - return nil -} - -// Convert_resource_ResourceRequest_To_v1alpha3_ResourceRequest is an autogenerated conversion function. -func Convert_resource_ResourceRequest_To_v1alpha3_ResourceRequest(in *resource.ResourceRequest, out *v1alpha3.ResourceRequest, s conversion.Scope) error { - return autoConvert_resource_ResourceRequest_To_v1alpha3_ResourceRequest(in, out, s) -} - -func autoConvert_v1alpha3_ResourceRequestModel_To_resource_ResourceRequestModel(in *v1alpha3.ResourceRequestModel, out *resource.ResourceRequestModel, s conversion.Scope) error { - out.NamedResources = (*resource.NamedResourcesRequest)(unsafe.Pointer(in.NamedResources)) - return nil -} - -// Convert_v1alpha3_ResourceRequestModel_To_resource_ResourceRequestModel is an autogenerated conversion function. -func Convert_v1alpha3_ResourceRequestModel_To_resource_ResourceRequestModel(in *v1alpha3.ResourceRequestModel, out *resource.ResourceRequestModel, s conversion.Scope) error { - return autoConvert_v1alpha3_ResourceRequestModel_To_resource_ResourceRequestModel(in, out, s) -} - -func autoConvert_resource_ResourceRequestModel_To_v1alpha3_ResourceRequestModel(in *resource.ResourceRequestModel, out *v1alpha3.ResourceRequestModel, s conversion.Scope) error { - out.NamedResources = (*v1alpha3.NamedResourcesRequest)(unsafe.Pointer(in.NamedResources)) - return nil -} - -// Convert_resource_ResourceRequestModel_To_v1alpha3_ResourceRequestModel is an autogenerated conversion function. -func Convert_resource_ResourceRequestModel_To_v1alpha3_ResourceRequestModel(in *resource.ResourceRequestModel, out *v1alpha3.ResourceRequestModel, s conversion.Scope) error { - return autoConvert_resource_ResourceRequestModel_To_v1alpha3_ResourceRequestModel(in, out, s) +// Convert_resource_ResourcePool_To_v1alpha3_ResourcePool is an autogenerated conversion function. +func Convert_resource_ResourcePool_To_v1alpha3_ResourcePool(in *resource.ResourcePool, out *v1alpha3.ResourcePool, s conversion.Scope) error { + return autoConvert_resource_ResourcePool_To_v1alpha3_ResourcePool(in, out, s) } func autoConvert_v1alpha3_ResourceSlice_To_resource_ResourceSlice(in *v1alpha3.ResourceSlice, out *resource.ResourceSlice, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - out.NodeName = in.NodeName - out.DriverName = in.DriverName - if err := Convert_v1alpha3_ResourceModel_To_resource_ResourceModel(&in.ResourceModel, &out.ResourceModel, s); err != nil { + if err := Convert_v1alpha3_ResourceSliceSpec_To_resource_ResourceSliceSpec(&in.Spec, &out.Spec, s); err != nil { return err } return nil @@ -1627,9 +1219,7 @@ func Convert_v1alpha3_ResourceSlice_To_resource_ResourceSlice(in *v1alpha3.Resou func autoConvert_resource_ResourceSlice_To_v1alpha3_ResourceSlice(in *resource.ResourceSlice, out *v1alpha3.ResourceSlice, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - out.NodeName = in.NodeName - out.DriverName = in.DriverName - if err := Convert_resource_ResourceModel_To_v1alpha3_ResourceModel(&in.ResourceModel, &out.ResourceModel, s); err != nil { + if err := Convert_resource_ResourceSliceSpec_To_v1alpha3_ResourceSliceSpec(&in.Spec, &out.Spec, s); err != nil { return err } return nil @@ -1662,82 +1252,36 @@ func Convert_resource_ResourceSliceList_To_v1alpha3_ResourceSliceList(in *resour return autoConvert_resource_ResourceSliceList_To_v1alpha3_ResourceSliceList(in, out, s) } -func autoConvert_v1alpha3_StructuredResourceHandle_To_resource_StructuredResourceHandle(in *v1alpha3.StructuredResourceHandle, out *resource.StructuredResourceHandle, s conversion.Scope) error { - if err := runtime.Convert_runtime_RawExtension_To_runtime_Object(&in.VendorClassParameters, &out.VendorClassParameters, s); err != nil { - return err - } - if err := runtime.Convert_runtime_RawExtension_To_runtime_Object(&in.VendorClaimParameters, &out.VendorClaimParameters, s); err != nil { +func autoConvert_v1alpha3_ResourceSliceSpec_To_resource_ResourceSliceSpec(in *v1alpha3.ResourceSliceSpec, out *resource.ResourceSliceSpec, s conversion.Scope) error { + out.Driver = in.Driver + if err := Convert_v1alpha3_ResourcePool_To_resource_ResourcePool(&in.Pool, &out.Pool, s); err != nil { return err } out.NodeName = in.NodeName - if in.Results != nil { - in, out := &in.Results, &out.Results - *out = make([]resource.DriverAllocationResult, len(*in)) - for i := range *in { - if err := Convert_v1alpha3_DriverAllocationResult_To_resource_DriverAllocationResult(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Results = nil - } + out.NodeSelector = (*core.NodeSelector)(unsafe.Pointer(in.NodeSelector)) + out.AllNodes = in.AllNodes + out.Devices = *(*[]resource.Device)(unsafe.Pointer(&in.Devices)) return nil } -// Convert_v1alpha3_StructuredResourceHandle_To_resource_StructuredResourceHandle is an autogenerated conversion function. -func Convert_v1alpha3_StructuredResourceHandle_To_resource_StructuredResourceHandle(in *v1alpha3.StructuredResourceHandle, out *resource.StructuredResourceHandle, s conversion.Scope) error { - return autoConvert_v1alpha3_StructuredResourceHandle_To_resource_StructuredResourceHandle(in, out, s) +// Convert_v1alpha3_ResourceSliceSpec_To_resource_ResourceSliceSpec is an autogenerated conversion function. +func Convert_v1alpha3_ResourceSliceSpec_To_resource_ResourceSliceSpec(in *v1alpha3.ResourceSliceSpec, out *resource.ResourceSliceSpec, s conversion.Scope) error { + return autoConvert_v1alpha3_ResourceSliceSpec_To_resource_ResourceSliceSpec(in, out, s) } -func autoConvert_resource_StructuredResourceHandle_To_v1alpha3_StructuredResourceHandle(in *resource.StructuredResourceHandle, out *v1alpha3.StructuredResourceHandle, s conversion.Scope) error { - if err := runtime.Convert_runtime_Object_To_runtime_RawExtension(&in.VendorClassParameters, &out.VendorClassParameters, s); err != nil { - return err - } - if err := runtime.Convert_runtime_Object_To_runtime_RawExtension(&in.VendorClaimParameters, &out.VendorClaimParameters, s); err != nil { +func autoConvert_resource_ResourceSliceSpec_To_v1alpha3_ResourceSliceSpec(in *resource.ResourceSliceSpec, out *v1alpha3.ResourceSliceSpec, s conversion.Scope) error { + out.Driver = in.Driver + if err := Convert_resource_ResourcePool_To_v1alpha3_ResourcePool(&in.Pool, &out.Pool, s); err != nil { return err } out.NodeName = in.NodeName - if in.Results != nil { - in, out := &in.Results, &out.Results - *out = make([]v1alpha3.DriverAllocationResult, len(*in)) - for i := range *in { - if err := Convert_resource_DriverAllocationResult_To_v1alpha3_DriverAllocationResult(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Results = nil - } + out.NodeSelector = (*v1.NodeSelector)(unsafe.Pointer(in.NodeSelector)) + out.AllNodes = in.AllNodes + out.Devices = *(*[]v1alpha3.Device)(unsafe.Pointer(&in.Devices)) return nil } -// Convert_resource_StructuredResourceHandle_To_v1alpha3_StructuredResourceHandle is an autogenerated conversion function. -func Convert_resource_StructuredResourceHandle_To_v1alpha3_StructuredResourceHandle(in *resource.StructuredResourceHandle, out *v1alpha3.StructuredResourceHandle, s conversion.Scope) error { - return autoConvert_resource_StructuredResourceHandle_To_v1alpha3_StructuredResourceHandle(in, out, s) -} - -func autoConvert_v1alpha3_VendorParameters_To_resource_VendorParameters(in *v1alpha3.VendorParameters, out *resource.VendorParameters, s conversion.Scope) error { - out.DriverName = in.DriverName - if err := runtime.Convert_runtime_RawExtension_To_runtime_Object(&in.Parameters, &out.Parameters, s); err != nil { - return err - } - return nil -} - -// Convert_v1alpha3_VendorParameters_To_resource_VendorParameters is an autogenerated conversion function. -func Convert_v1alpha3_VendorParameters_To_resource_VendorParameters(in *v1alpha3.VendorParameters, out *resource.VendorParameters, s conversion.Scope) error { - return autoConvert_v1alpha3_VendorParameters_To_resource_VendorParameters(in, out, s) -} - -func autoConvert_resource_VendorParameters_To_v1alpha3_VendorParameters(in *resource.VendorParameters, out *v1alpha3.VendorParameters, s conversion.Scope) error { - out.DriverName = in.DriverName - if err := runtime.Convert_runtime_Object_To_runtime_RawExtension(&in.Parameters, &out.Parameters, s); err != nil { - return err - } - return nil -} - -// Convert_resource_VendorParameters_To_v1alpha3_VendorParameters is an autogenerated conversion function. -func Convert_resource_VendorParameters_To_v1alpha3_VendorParameters(in *resource.VendorParameters, out *v1alpha3.VendorParameters, s conversion.Scope) error { - return autoConvert_resource_VendorParameters_To_v1alpha3_VendorParameters(in, out, s) +// Convert_resource_ResourceSliceSpec_To_v1alpha3_ResourceSliceSpec is an autogenerated conversion function. +func Convert_resource_ResourceSliceSpec_To_v1alpha3_ResourceSliceSpec(in *resource.ResourceSliceSpec, out *v1alpha3.ResourceSliceSpec, s conversion.Scope) error { + return autoConvert_resource_ResourceSliceSpec_To_v1alpha3_ResourceSliceSpec(in, out, s) } diff --git a/pkg/apis/resource/v1alpha3/zz_generated.defaults.go b/pkg/apis/resource/v1alpha3/zz_generated.defaults.go index 8b3ec1e1c4a..e5386fbc921 100644 --- a/pkg/apis/resource/v1alpha3/zz_generated.defaults.go +++ b/pkg/apis/resource/v1alpha3/zz_generated.defaults.go @@ -22,6 +22,7 @@ limitations under the License. package v1alpha3 import ( + v1alpha3 "k8s.io/api/resource/v1alpha3" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -29,5 +30,39 @@ import ( // Public to allow building arbitrary schemes. // All generated defaulters are covering - they call all nested defaulters. func RegisterDefaults(scheme *runtime.Scheme) error { + scheme.AddTypeDefaultingFunc(&v1alpha3.ResourceClaim{}, func(obj interface{}) { SetObjectDefaults_ResourceClaim(obj.(*v1alpha3.ResourceClaim)) }) + scheme.AddTypeDefaultingFunc(&v1alpha3.ResourceClaimList{}, func(obj interface{}) { SetObjectDefaults_ResourceClaimList(obj.(*v1alpha3.ResourceClaimList)) }) + scheme.AddTypeDefaultingFunc(&v1alpha3.ResourceClaimTemplate{}, func(obj interface{}) { SetObjectDefaults_ResourceClaimTemplate(obj.(*v1alpha3.ResourceClaimTemplate)) }) + scheme.AddTypeDefaultingFunc(&v1alpha3.ResourceClaimTemplateList{}, func(obj interface{}) { + SetObjectDefaults_ResourceClaimTemplateList(obj.(*v1alpha3.ResourceClaimTemplateList)) + }) return nil } + +func SetObjectDefaults_ResourceClaim(in *v1alpha3.ResourceClaim) { + for i := range in.Spec.Devices.Requests { + a := &in.Spec.Devices.Requests[i] + SetDefaults_DeviceRequest(a) + } +} + +func SetObjectDefaults_ResourceClaimList(in *v1alpha3.ResourceClaimList) { + for i := range in.Items { + a := &in.Items[i] + SetObjectDefaults_ResourceClaim(a) + } +} + +func SetObjectDefaults_ResourceClaimTemplate(in *v1alpha3.ResourceClaimTemplate) { + for i := range in.Spec.Spec.Devices.Requests { + a := &in.Spec.Spec.Devices.Requests[i] + SetDefaults_DeviceRequest(a) + } +} + +func SetObjectDefaults_ResourceClaimTemplateList(in *v1alpha3.ResourceClaimTemplateList) { + for i := range in.Items { + a := &in.Items[i] + SetObjectDefaults_ResourceClaimTemplate(a) + } +} diff --git a/pkg/apis/resource/validation/validation.go b/pkg/apis/resource/validation/validation.go index e1c9f6430f5..4b4567345f5 100644 --- a/pkg/apis/resource/validation/validation.go +++ b/pkg/apis/resource/validation/validation.go @@ -17,164 +17,260 @@ limitations under the License. package validation import ( + "encoding/json" + "errors" + "fmt" + "regexp" + "strings" + apiequality "k8s.io/apimachinery/pkg/api/equality" + apiresource "k8s.io/apimachinery/pkg/api/resource" apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation" - pathvalidation "k8s.io/apimachinery/pkg/api/validation/path" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" - utilvalidation "k8s.io/apimachinery/pkg/util/validation" + "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" + "k8s.io/apiserver/pkg/cel" + "k8s.io/apiserver/pkg/cel/environment" + dracel "k8s.io/dynamic-resource-allocation/cel" corevalidation "k8s.io/kubernetes/pkg/apis/core/validation" "k8s.io/kubernetes/pkg/apis/resource" - namedresourcesvalidation "k8s.io/kubernetes/pkg/apis/resource/structured/namedresources/validation" ) -// validateResourceDriverName reuses the validation of a CSI driver because -// the allowed values are exactly the same. -var validateResourceDriverName = corevalidation.ValidateCSIDriverName +var ( + // validateResourceDriverName reuses the validation of a CSI driver because + // the allowed values are exactly the same. + validateDriverName = corevalidation.ValidateCSIDriverName + validateDeviceName = corevalidation.ValidateDNS1123Label + validateDeviceClassName = corevalidation.ValidateDNS1123Subdomain + validateRequestName = corevalidation.ValidateDNS1123Label +) -// ValidateClaim validates a ResourceClaim. -func ValidateClaim(resourceClaim *resource.ResourceClaim) field.ErrorList { +func validatePoolName(name string, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + if name == "" { + allErrs = append(allErrs, field.Required(fldPath, "")) + } else { + if len(name) > resource.PoolNameMaxLength { + allErrs = append(allErrs, field.TooLongMaxLength(fldPath, name, resource.PoolNameMaxLength)) + } + parts := strings.Split(name, "/") + for _, part := range parts { + allErrs = append(allErrs, corevalidation.ValidateDNS1123Subdomain(part, fldPath)...) + } + } + return allErrs +} + +// ValidateResourceClaim validates a ResourceClaim. +func ValidateResourceClaim(resourceClaim *resource.ResourceClaim) field.ErrorList { allErrs := corevalidation.ValidateObjectMeta(&resourceClaim.ObjectMeta, true, corevalidation.ValidateResourceClaimName, field.NewPath("metadata")) - allErrs = append(allErrs, validateResourceClaimSpec(&resourceClaim.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, validateResourceClaimSpec(&resourceClaim.Spec, field.NewPath("spec"), false)...) return allErrs } -func validateResourceClaimSpec(spec *resource.ResourceClaimSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - for _, msg := range corevalidation.ValidateClassName(spec.ResourceClassName, false) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("resourceClassName"), spec.ResourceClassName, msg)) - } - allErrs = append(allErrs, validateResourceClaimParametersRef(spec.ParametersRef, fldPath.Child("parametersRef"))...) - return allErrs -} - -// It would have been nice to use Go generics to reuse the same validation -// function for Kind and Name in both types, but generics cannot be used to -// access common fields in structs. - -func validateResourceClaimParametersRef(ref *resource.ResourceClaimParametersReference, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - - if ref == nil { - return allErrs - } - - // group is required but the Core group is the empty value, so it can not be enforced. - if ref.APIGroup != "" { - for _, msg := range utilvalidation.IsDNS1123Subdomain(ref.APIGroup) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("apiGroup"), ref.APIGroup, msg)) - } - } - - if ref.Kind == "" { - allErrs = append(allErrs, field.Required(fldPath.Child("kind"), "")) - } else { - for _, msg := range pathvalidation.IsValidPathSegmentName(ref.Kind) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("kind"), ref.Kind, msg)) - } - } - - if ref.Name == "" { - allErrs = append(allErrs, field.Required(fldPath.Child("name"), "")) - } else { - for _, msg := range pathvalidation.IsValidPathSegmentName(ref.Name) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), ref.Name, msg)) - } - } - return allErrs -} - -func validateClassParameters(ref *resource.ResourceClassParametersReference, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - - if ref == nil { - return allErrs - } - - // group is required but the Core group is the empty value, so it can not be enforced. - if ref.APIGroup != "" { - for _, msg := range utilvalidation.IsDNS1123Subdomain(ref.APIGroup) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("apiGroup"), ref.APIGroup, msg)) - } - } - - if ref.Kind == "" { - allErrs = append(allErrs, field.Required(fldPath.Child("kind"), "")) - } else { - for _, msg := range pathvalidation.IsValidPathSegmentName(ref.Kind) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("kind"), ref.Kind, msg)) - } - } - - if ref.Name == "" { - allErrs = append(allErrs, field.Required(fldPath.Child("name"), "")) - } else { - for _, msg := range pathvalidation.IsValidPathSegmentName(ref.Name) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), ref.Name, msg)) - } - } - - // namespace is optional. - if ref.Namespace != "" { - for _, msg := range apimachineryvalidation.ValidateNamespaceName(ref.Namespace, false) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("namespace"), ref.Namespace, msg)) - } - } - return allErrs -} - -// ValidateClass validates a ResourceClass. -func ValidateClass(resourceClass *resource.ResourceClass) field.ErrorList { - allErrs := corevalidation.ValidateObjectMeta(&resourceClass.ObjectMeta, false, corevalidation.ValidateClassName, field.NewPath("metadata")) - allErrs = append(allErrs, validateResourceDriverName(resourceClass.DriverName, field.NewPath("driverName"))...) - allErrs = append(allErrs, validateClassParameters(resourceClass.ParametersRef, field.NewPath("parametersRef"))...) - if resourceClass.SuitableNodes != nil { - allErrs = append(allErrs, corevalidation.ValidateNodeSelector(resourceClass.SuitableNodes, field.NewPath("suitableNodes"))...) - } - - return allErrs -} - -// ValidateClassUpdate tests if an update to ResourceClass is valid. -func ValidateClassUpdate(resourceClass, oldClass *resource.ResourceClass) field.ErrorList { - allErrs := corevalidation.ValidateObjectMetaUpdate(&resourceClass.ObjectMeta, &oldClass.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateClass(resourceClass)...) - return allErrs -} - -// ValidateClaimUpdate tests if an update to ResourceClaim is valid. -func ValidateClaimUpdate(resourceClaim, oldClaim *resource.ResourceClaim) field.ErrorList { +// ValidateResourceClaimUpdate tests if an update to ResourceClaim is valid. +func ValidateResourceClaimUpdate(resourceClaim, oldClaim *resource.ResourceClaim) field.ErrorList { allErrs := corevalidation.ValidateObjectMetaUpdate(&resourceClaim.ObjectMeta, &oldClaim.ObjectMeta, field.NewPath("metadata")) allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(resourceClaim.Spec, oldClaim.Spec, field.NewPath("spec"))...) - allErrs = append(allErrs, ValidateClaim(resourceClaim)...) + // Because the spec is immutable, all CEL expressions in it must have been stored. + // If the user tries an update, this is not true and checking is less strict, but + // as there are errors, it doesn't matter. + allErrs = append(allErrs, validateResourceClaimSpec(&resourceClaim.Spec, field.NewPath("spec"), true)...) return allErrs } -// ValidateClaimStatusUpdate tests if an update to the status of a ResourceClaim is valid. -func ValidateClaimStatusUpdate(resourceClaim, oldClaim *resource.ResourceClaim) field.ErrorList { +// ValidateResourceClaimStatusUpdate tests if an update to the status of a ResourceClaim is valid. +func ValidateResourceClaimStatusUpdate(resourceClaim, oldClaim *resource.ResourceClaim) field.ErrorList { allErrs := corevalidation.ValidateObjectMetaUpdate(&resourceClaim.ObjectMeta, &oldClaim.ObjectMeta, field.NewPath("metadata")) - fldPath := field.NewPath("status") - // The name might not be set yet. - if resourceClaim.Status.DriverName != "" { - allErrs = append(allErrs, validateResourceDriverName(resourceClaim.Status.DriverName, fldPath.Child("driverName"))...) - } else if resourceClaim.Status.Allocation != nil { - allErrs = append(allErrs, field.Required(fldPath.Child("driverName"), "must be specified when `allocation` is set")) + requestNames := gatherRequestNames(&resourceClaim.Spec.Devices) + allErrs = append(allErrs, validateResourceClaimStatusUpdate(&resourceClaim.Status, &oldClaim.Status, resourceClaim.DeletionTimestamp != nil, requestNames, field.NewPath("status"))...) + return allErrs +} + +func validateResourceClaimSpec(spec *resource.ResourceClaimSpec, fldPath *field.Path, stored bool) field.ErrorList { + allErrs := field.ErrorList{} + allErrs = append(allErrs, validateDeviceClaim(&spec.Devices, fldPath.Child("devices"), stored)...) + if spec.Controller != "" { + allErrs = append(allErrs, validateDriverName(spec.Controller, fldPath.Child("controller"))...) + } + return allErrs +} + +func validateDeviceClaim(deviceClaim *resource.DeviceClaim, fldPath *field.Path, stored bool) field.ErrorList { + allErrs := field.ErrorList{} + requestNames := gatherRequestNames(deviceClaim) + allErrs = append(allErrs, validateSet(deviceClaim.Requests, resource.DeviceRequestsMaxSize, + func(request resource.DeviceRequest, fldPath *field.Path) field.ErrorList { + return validateDeviceRequest(request, fldPath, stored) + }, + func(request resource.DeviceRequest) (string, string) { + return request.Name, "name" + }, + fldPath.Child("requests"))...) + allErrs = append(allErrs, validateSlice(deviceClaim.Constraints, resource.DeviceConstraintsMaxSize, + func(constraint resource.DeviceConstraint, fldPath *field.Path) field.ErrorList { + return validateDeviceConstraint(constraint, fldPath, requestNames) + }, fldPath.Child("constraints"))...) + allErrs = append(allErrs, validateSlice(deviceClaim.Config, resource.DeviceConfigMaxSize, + func(config resource.DeviceClaimConfiguration, fldPath *field.Path) field.ErrorList { + return validateDeviceClaimConfiguration(config, fldPath, requestNames) + }, fldPath.Child("config"))...) + return allErrs +} + +func gatherRequestNames(deviceClaim *resource.DeviceClaim) sets.Set[string] { + requestNames := sets.New[string]() + for _, request := range deviceClaim.Requests { + requestNames.Insert(request.Name) + } + return requestNames +} + +func validateDeviceRequest(request resource.DeviceRequest, fldPath *field.Path, stored bool) field.ErrorList { + allErrs := validateRequestName(request.Name, fldPath.Child("name")) + if request.DeviceClassName == "" { + allErrs = append(allErrs, field.Required(fldPath.Child("deviceClassName"), "")) + } else { + allErrs = append(allErrs, validateDeviceClassName(request.DeviceClassName, fldPath.Child("deviceClassName"))...) + } + allErrs = append(allErrs, validateSlice(request.Selectors, resource.DeviceSelectorsMaxSize, + func(selector resource.DeviceSelector, fldPath *field.Path) field.ErrorList { + return validateSelector(selector, fldPath, stored) + }, + fldPath.Child("selectors"))...) + switch request.AllocationMode { + case resource.DeviceAllocationModeAll: + if request.Count != 0 { + allErrs = append(allErrs, field.Invalid(fldPath.Child("count"), request.Count, fmt.Sprintf("must not be specified when allocationMode is '%s'", request.AllocationMode))) + } + case resource.DeviceAllocationModeExactCount: + if request.Count <= 0 { + allErrs = append(allErrs, field.Invalid(fldPath.Child("count"), request.Count, "must be greater than zero")) + } + default: + allErrs = append(allErrs, field.NotSupported(fldPath.Child("allocationMode"), request.AllocationMode, []resource.DeviceAllocationMode{resource.DeviceAllocationModeAll, resource.DeviceAllocationModeExactCount})) + } + return allErrs +} + +func validateSelector(selector resource.DeviceSelector, fldPath *field.Path, stored bool) field.ErrorList { + var allErrs field.ErrorList + if selector.CEL == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("cel"), "")) + } else { + allErrs = append(allErrs, validateCELSelector(*selector.CEL, fldPath.Child("cel"), stored)...) + } + return allErrs +} + +func validateCELSelector(celSelector resource.CELDeviceSelector, fldPath *field.Path, stored bool) field.ErrorList { + var allErrs field.ErrorList + envType := environment.NewExpressions + if stored { + envType = environment.StoredExpressions + } + result := dracel.GetCompiler().CompileCELExpression(celSelector.Expression, envType) + if result.Error != nil { + allErrs = append(allErrs, convertCELErrorToValidationError(fldPath.Child("expression"), celSelector.Expression, result.Error)) + } + return allErrs +} + +func convertCELErrorToValidationError(fldPath *field.Path, expression string, err error) *field.Error { + var celErr *cel.Error + if errors.As(err, &celErr) { + switch celErr.Type { + case cel.ErrorTypeRequired: + return field.Required(fldPath, celErr.Detail) + case cel.ErrorTypeInvalid: + return field.Invalid(fldPath, expression, celErr.Detail) + case cel.ErrorTypeInternal: + return field.InternalError(fldPath, celErr) + } + } + return field.InternalError(fldPath, fmt.Errorf("unsupported error type: %w", err)) +} + +func validateDeviceConstraint(constraint resource.DeviceConstraint, fldPath *field.Path, requestNames sets.Set[string]) field.ErrorList { + var allErrs field.ErrorList + allErrs = append(allErrs, validateSet(constraint.Requests, resource.DeviceRequestsMaxSize, + func(name string, fldPath *field.Path) field.ErrorList { + return validateRequestNameRef(name, fldPath, requestNames) + }, + stringKey, fldPath.Child("requests"))...) + if constraint.MatchAttribute == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("matchAttribute"), "")) + } else { + allErrs = append(allErrs, validateFullyQualifiedName(*constraint.MatchAttribute, fldPath.Child("matchAttribute"))...) + } + return allErrs +} + +func validateDeviceClaimConfiguration(config resource.DeviceClaimConfiguration, fldPath *field.Path, requestNames sets.Set[string]) field.ErrorList { + var allErrs field.ErrorList + allErrs = append(allErrs, validateSet(config.Requests, resource.DeviceRequestsMaxSize, + func(name string, fldPath *field.Path) field.ErrorList { + return validateRequestNameRef(name, fldPath, requestNames) + }, stringKey, fldPath.Child("requests"))...) + allErrs = append(allErrs, validateDeviceConfiguration(config.DeviceConfiguration, fldPath)...) + return allErrs +} + +func validateRequestNameRef(name string, fldPath *field.Path, requestNames sets.Set[string]) field.ErrorList { + allErrs := validateRequestName(name, fldPath) + if !requestNames.Has(name) { + allErrs = append(allErrs, field.Invalid(fldPath, name, "must be the name of a request in the claim")) + } + return allErrs +} + +func validateDeviceConfiguration(config resource.DeviceConfiguration, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + if config.Opaque == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("opaque"), "")) + } else { + allErrs = append(allErrs, validateOpaqueConfiguration(*config.Opaque, fldPath.Child("opaque"))...) + } + return allErrs +} + +func validateOpaqueConfiguration(config resource.OpaqueDeviceConfiguration, fldPath *field.Path) 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 err := json.Unmarshal(config.Parameters.Raw, &v); err != nil { + allErrs = append(allErrs, field.Invalid(fldPath.Child("parameters"), "", fmt.Sprintf("error parsing data: %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, validateAllocationResult(resourceClaim.Status.Allocation, fldPath.Child("allocation"))...) - allErrs = append(allErrs, validateResourceClaimConsumers(resourceClaim.Status.ReservedFor, resource.ResourceClaimReservedForMaxSize, fldPath.Child("reservedFor"))...) + return allErrs +} + +func validateResourceClaimStatusUpdate(status, oldStatus *resource.ResourceClaimStatus, claimDeleted bool, requestNames sets.Set[string], fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + allErrs = append(allErrs, validateAllocationResult(status.Allocation, fldPath.Child("allocation"), requestNames)...) + allErrs = append(allErrs, validateSet(status.ReservedFor, resource.ResourceClaimReservedForMaxSize, + validateResourceClaimUserReference, + func(consumer resource.ResourceClaimConsumerReference) (types.UID, string) { return consumer.UID, "uid" }, + fldPath.Child("reservedFor"))...) // Now check for invariants that must be valid for a ResourceClaim. - if len(resourceClaim.Status.ReservedFor) > 0 { - if resourceClaim.Status.Allocation == nil { + if len(status.ReservedFor) > 0 { + if status.Allocation == nil { allErrs = append(allErrs, field.Forbidden(fldPath.Child("reservedFor"), "may not be specified when `allocated` is not set")) } else { // Items may be removed from ReservedFor while the claim is meant to be deallocated, // but not added. - if resourceClaim.DeletionTimestamp != nil || resourceClaim.Status.DeallocationRequested { - oldSet := sets.New(oldClaim.Status.ReservedFor...) - newSet := sets.New(resourceClaim.Status.ReservedFor...) + if claimDeleted || status.DeallocationRequested { + oldSet := sets.New(oldStatus.ReservedFor...) + newSet := sets.New(status.ReservedFor...) newItems := newSet.Difference(oldSet) if len(newItems) > 0 { allErrs = append(allErrs, field.Forbidden(fldPath.Child("reservedFor"), "new entries may not be added while `deallocationRequested` or `deletionTimestamp` are set")) @@ -183,19 +279,19 @@ func ValidateClaimStatusUpdate(resourceClaim, oldClaim *resource.ResourceClaim) } } - // Updates to a populated resourceClaim.Status.Allocation are not allowed - if oldClaim.Status.Allocation != nil && resourceClaim.Status.Allocation != nil { - allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(resourceClaim.Status.Allocation, oldClaim.Status.Allocation, fldPath.Child("allocation"))...) + // Updates to a populated status.Allocation are not allowed + if oldStatus.Allocation != nil && status.Allocation != nil { + allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(status.Allocation, oldStatus.Allocation, fldPath.Child("allocation"))...) } - if !oldClaim.Status.DeallocationRequested && - resourceClaim.Status.DeallocationRequested && - len(resourceClaim.Status.ReservedFor) > 0 { + if !oldStatus.DeallocationRequested && + status.DeallocationRequested && + len(status.ReservedFor) > 0 { allErrs = append(allErrs, field.Forbidden(fldPath.Child("deallocationRequested"), "deallocation cannot be requested while `reservedFor` is set")) } - if resourceClaim.Status.Allocation == nil && - resourceClaim.Status.DeallocationRequested { + if status.Allocation == nil && + status.DeallocationRequested { // Either one or the other field was modified incorrectly. // For the sake of simplicity this only reports the invalid // end result. @@ -206,88 +302,15 @@ func ValidateClaimStatusUpdate(resourceClaim, oldClaim *resource.ResourceClaim) // anymore because the deallocation may already have started. The field // can only get reset by the driver together with removing the // allocation. - if oldClaim.Status.DeallocationRequested && - !resourceClaim.Status.DeallocationRequested && - resourceClaim.Status.Allocation != nil { + if oldStatus.DeallocationRequested && + !status.DeallocationRequested && + status.Allocation != nil { allErrs = append(allErrs, field.Forbidden(fldPath.Child("deallocationRequested"), "may not be cleared when `allocation` is set")) } return allErrs } -func validateAllocationResult(allocation *resource.AllocationResult, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - if allocation != nil { - if len(allocation.ResourceHandles) > 0 { - allErrs = append(allErrs, validateResourceHandles(allocation.ResourceHandles, resource.AllocationResultResourceHandlesMaxSize, fldPath.Child("resourceHandles"))...) - } - if allocation.AvailableOnNodes != nil { - allErrs = append(allErrs, corevalidation.ValidateNodeSelector(allocation.AvailableOnNodes, fldPath.Child("availableOnNodes"))...) - } - } - return allErrs -} - -func validateResourceHandles(resourceHandles []resource.ResourceHandle, maxSize int, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - for i, resourceHandle := range resourceHandles { - idxPath := fldPath.Index(i) - allErrs = append(allErrs, validateResourceDriverName(resourceHandle.DriverName, idxPath.Child("driverName"))...) - if len(resourceHandle.Data) > resource.ResourceHandleDataMaxSize { - allErrs = append(allErrs, field.TooLongMaxLength(idxPath.Child("data"), len(resourceHandle.Data), resource.ResourceHandleDataMaxSize)) - } - if resourceHandle.StructuredData != nil { - allErrs = append(allErrs, validateStructuredResourceHandle(resourceHandle.StructuredData, idxPath.Child("structuredData"))...) - } - if len(resourceHandle.Data) > 0 && resourceHandle.StructuredData != nil { - allErrs = append(allErrs, field.Invalid(idxPath, nil, "data and structuredData are mutually exclusive")) - } - } - if len(resourceHandles) > maxSize { - // Dumping the entire field into the error message is likely to be too long, - // in particular when it is already beyond the maximum size. Instead this - // just shows the number of entries. - allErrs = append(allErrs, field.TooLongMaxLength(fldPath, len(resourceHandles), maxSize)) - } - return allErrs -} - -func validateStructuredResourceHandle(handle *resource.StructuredResourceHandle, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - if handle.NodeName != "" { - allErrs = append(allErrs, validateNodeName(handle.NodeName, fldPath.Child("nodeName"))...) - } - allErrs = append(allErrs, validateDriverAllocationResults(handle.Results, fldPath.Child("results"))...) - return allErrs -} - -func validateDriverAllocationResults(results []resource.DriverAllocationResult, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - for index, result := range results { - idxPath := fldPath.Index(index) - allErrs = append(allErrs, validateAllocationResultModel(&result.AllocationResultModel, idxPath)...) - } - return allErrs -} - -func validateAllocationResultModel(model *resource.AllocationResultModel, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - entries := sets.New[string]() - if model.NamedResources != nil { - entries.Insert("namedResources") - allErrs = append(allErrs, namedresourcesvalidation.ValidateAllocationResult(model.NamedResources, fldPath.Child("namedResources"))...) - } - switch len(entries) { - case 0: - allErrs = append(allErrs, field.Required(fldPath, "exactly one structured model field must be set")) - case 1: - // Okay. - default: - allErrs = append(allErrs, field.Invalid(fldPath, sets.List(entries), "exactly one field must be set, not several")) - } - return allErrs -} - func validateResourceClaimUserReference(ref resource.ResourceClaimConsumerReference, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList if ref.Resource == "" { @@ -302,50 +325,107 @@ func validateResourceClaimUserReference(ref resource.ResourceClaimConsumerRefere return allErrs } -// validateSliceIsASet ensures that a slice contains no duplicates and does not exceed a certain maximum size. -func validateSliceIsASet[T comparable](slice []T, maxSize int, validateItem func(item T, fldPath *field.Path) field.ErrorList, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - allItems := sets.New[T]() - for i, item := range slice { - idxPath := fldPath.Index(i) - if allItems.Has(item) { - allErrs = append(allErrs, field.Duplicate(idxPath, item)) - } else { - allErrs = append(allErrs, validateItem(item, idxPath)...) - allItems.Insert(item) - } +func validateAllocationResult(allocation *resource.AllocationResult, fldPath *field.Path, requestNames sets.Set[string]) field.ErrorList { + if allocation == nil { + return nil } - if len(slice) > maxSize { - // Dumping the entire field into the error message is likely to be too long, - // in particular when it is already beyond the maximum size. Instead this - // just shows the number of entries. - allErrs = append(allErrs, field.TooLongMaxLength(fldPath, len(slice), maxSize)) + + var allErrs field.ErrorList + allErrs = append(allErrs, validateDeviceAllocationResult(allocation.Devices, fldPath.Child("devices"), requestNames)...) + if allocation.NodeSelector != nil { + allErrs = append(allErrs, corevalidation.ValidateNodeSelector(allocation.NodeSelector, fldPath.Child("nodeSelector"))...) + } + if allocation.Controller != "" { + allErrs = append(allErrs, validateDriverName(allocation.Controller, fldPath.Child("controller"))...) } return allErrs } -// validateResourceClaimConsumers ensures that the slice contains no duplicate UIDs and does not exceed a certain maximum size. -func validateResourceClaimConsumers(consumers []resource.ResourceClaimConsumerReference, maxSize int, fldPath *field.Path) field.ErrorList { +func validateDeviceAllocationResult(allocation resource.DeviceAllocationResult, fldPath *field.Path, requestNames sets.Set[string]) field.ErrorList { var allErrs field.ErrorList - allUIDs := sets.New[types.UID]() - for i, consumer := range consumers { - idxPath := fldPath.Index(i) - if allUIDs.Has(consumer.UID) { - allErrs = append(allErrs, field.Duplicate(idxPath.Child("uid"), consumer.UID)) - } else { - allErrs = append(allErrs, validateResourceClaimUserReference(consumer, idxPath)...) - allUIDs.Insert(consumer.UID) - } - } - if len(consumers) > maxSize { - // Dumping the entire field into the error message is likely to be too long, - // in particular when it is already beyond the maximum size. Instead this - // just shows the number of entries. - allErrs = append(allErrs, field.TooLongMaxLength(fldPath, len(consumers), maxSize)) + allErrs = append(allErrs, validateSlice(allocation.Results, resource.AllocationResultsMaxSize, + func(result resource.DeviceRequestAllocationResult, fldPath *field.Path) field.ErrorList { + return validateDeviceRequestAllocationResult(result, fldPath, requestNames) + }, fldPath.Child("results"))...) + allErrs = append(allErrs, validateSlice(allocation.Config, 2*resource.DeviceConfigMaxSize, /* class + claim */ + func(config resource.DeviceAllocationConfiguration, fldPath *field.Path) field.ErrorList { + return validateDeviceAllocationConfiguration(config, fldPath, requestNames) + }, fldPath.Child("config"))...) + + return allErrs +} + +func validateDeviceRequestAllocationResult(result resource.DeviceRequestAllocationResult, fldPath *field.Path, requestNames sets.Set[string]) field.ErrorList { + var allErrs field.ErrorList + allErrs = append(allErrs, validateRequestNameRef(result.Request, fldPath.Child("request"), requestNames)...) + allErrs = append(allErrs, validateDriverName(result.Driver, fldPath.Child("driver"))...) + allErrs = append(allErrs, validatePoolName(result.Pool, fldPath.Child("pool"))...) + allErrs = append(allErrs, validateDeviceName(result.Device, fldPath.Child("device"))...) + return allErrs +} + +func validateDeviceAllocationConfiguration(config resource.DeviceAllocationConfiguration, fldPath *field.Path, requestNames sets.Set[string]) field.ErrorList { + var allErrs field.ErrorList + allErrs = append(allErrs, validateAllocationConfigSource(config.Source, fldPath.Child("source"))...) + allErrs = append(allErrs, validateSet(config.Requests, resource.DeviceRequestsMaxSize, + func(name string, fldPath *field.Path) field.ErrorList { + return validateRequestNameRef(name, fldPath, requestNames) + }, stringKey, fldPath.Child("requests"))...) + allErrs = append(allErrs, validateDeviceConfiguration(config.DeviceConfiguration, fldPath)...) + return allErrs +} + +func validateAllocationConfigSource(source resource.AllocationConfigSource, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + switch source { + case "": + allErrs = append(allErrs, field.Required(fldPath, "")) + case resource.AllocationConfigSourceClaim, resource.AllocationConfigSourceClass: + default: + allErrs = append(allErrs, field.NotSupported(fldPath, source, []resource.AllocationConfigSource{resource.AllocationConfigSourceClaim, resource.AllocationConfigSourceClass})) } return allErrs } +// ValidateClass validates a DeviceClass. +func ValidateDeviceClass(class *resource.DeviceClass) field.ErrorList { + allErrs := corevalidation.ValidateObjectMeta(&class.ObjectMeta, false, corevalidation.ValidateClassName, field.NewPath("metadata")) + allErrs = append(allErrs, validateDeviceClassSpec(&class.Spec, nil, field.NewPath("spec"))...) + return allErrs +} + +// ValidateClassUpdate tests if an update to DeviceClass is valid. +func ValidateDeviceClassUpdate(class, oldClass *resource.DeviceClass) field.ErrorList { + allErrs := corevalidation.ValidateObjectMetaUpdate(&class.ObjectMeta, &oldClass.ObjectMeta, field.NewPath("metadata")) + allErrs = append(allErrs, validateDeviceClassSpec(&class.Spec, &oldClass.Spec, field.NewPath("spec"))...) + return allErrs +} + +func validateDeviceClassSpec(spec, oldSpec *resource.DeviceClassSpec, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + // If the selectors are exactly as before, we treat the CEL expressions as "stored". + // Any change, including merely reordering selectors, triggers validation as new + // expressions. + stored := false + if oldSpec != nil { + stored = apiequality.Semantic.DeepEqual(spec.Selectors, oldSpec.Selectors) + } + allErrs = append(allErrs, validateSlice(spec.Selectors, resource.DeviceSelectorsMaxSize, + func(selector resource.DeviceSelector, fldPath *field.Path) field.ErrorList { + return validateSelector(selector, fldPath, stored) + }, + fldPath.Child("selectors"))...) + allErrs = append(allErrs, validateSlice(spec.Config, resource.DeviceConfigMaxSize, validateDeviceClassConfiguration, fldPath.Child("config"))...) + if spec.SuitableNodes != nil { + allErrs = append(allErrs, corevalidation.ValidateNodeSelector(spec.SuitableNodes, field.NewPath("suitableNodes"))...) + } + return allErrs +} + +func validateDeviceClassConfiguration(config resource.DeviceClassConfiguration, fldPath *field.Path) field.ErrorList { + return validateDeviceConfiguration(config.DeviceConfiguration, fldPath) +} + // ValidatePodSchedulingContext validates a PodSchedulingContext. func ValidatePodSchedulingContexts(schedulingCtx *resource.PodSchedulingContext) field.ErrorList { allErrs := corevalidation.ValidateObjectMeta(&schedulingCtx.ObjectMeta, true, corevalidation.ValidatePodName, field.NewPath("metadata")) @@ -354,7 +434,7 @@ func ValidatePodSchedulingContexts(schedulingCtx *resource.PodSchedulingContext) } func validatePodSchedulingSpec(spec *resource.PodSchedulingContextSpec, fldPath *field.Path) field.ErrorList { - allErrs := validateSliceIsASet(spec.PotentialNodes, resource.PodSchedulingNodeListMaxSize, validateNodeName, fldPath.Child("potentialNodes")) + allErrs := validateSet(spec.PotentialNodes, resource.PodSchedulingNodeListMaxSize, validateNodeName, stringKey, fldPath.Child("potentialNodes")) return allErrs } @@ -391,28 +471,31 @@ func validatePodSchedulingClaims(claimStatuses []resource.ResourceClaimSchedulin } func validatePodSchedulingClaim(status resource.ResourceClaimSchedulingStatus, fldPath *field.Path) field.ErrorList { - allErrs := validateSliceIsASet(status.UnsuitableNodes, resource.PodSchedulingNodeListMaxSize, validateNodeName, fldPath.Child("unsuitableNodes")) + allErrs := validateSet(status.UnsuitableNodes, resource.PodSchedulingNodeListMaxSize, validateNodeName, stringKey, fldPath.Child("unsuitableNodes")) return allErrs } -// ValidateClaimTemplace validates a ResourceClaimTemplate. -func ValidateClaimTemplate(template *resource.ResourceClaimTemplate) field.ErrorList { +// ValidateResourceClaimTemplate validates a ResourceClaimTemplate. +func ValidateResourceClaimTemplate(template *resource.ResourceClaimTemplate) field.ErrorList { allErrs := corevalidation.ValidateObjectMeta(&template.ObjectMeta, true, corevalidation.ValidateResourceClaimTemplateName, field.NewPath("metadata")) - allErrs = append(allErrs, validateResourceClaimTemplateSpec(&template.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, validateResourceClaimTemplateSpec(&template.Spec, field.NewPath("spec"), false)...) return allErrs } -func validateResourceClaimTemplateSpec(spec *resource.ResourceClaimTemplateSpec, fldPath *field.Path) field.ErrorList { +func validateResourceClaimTemplateSpec(spec *resource.ResourceClaimTemplateSpec, fldPath *field.Path, stored bool) field.ErrorList { allErrs := corevalidation.ValidateTemplateObjectMeta(&spec.ObjectMeta, fldPath.Child("metadata")) - allErrs = append(allErrs, validateResourceClaimSpec(&spec.Spec, fldPath.Child("spec"))...) + allErrs = append(allErrs, validateResourceClaimSpec(&spec.Spec, fldPath.Child("spec"), stored)...) return allErrs } -// ValidateClaimTemplateUpdate tests if an update to template is valid. -func ValidateClaimTemplateUpdate(template, oldTemplate *resource.ResourceClaimTemplate) field.ErrorList { +// ValidateResourceClaimTemplateUpdate tests if an update to template is valid. +func ValidateResourceClaimTemplateUpdate(template, oldTemplate *resource.ResourceClaimTemplate) field.ErrorList { allErrs := corevalidation.ValidateObjectMetaUpdate(&template.ObjectMeta, &oldTemplate.ObjectMeta, field.NewPath("metadata")) allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(template.Spec, oldTemplate.Spec, field.NewPath("spec"))...) - allErrs = append(allErrs, ValidateClaimTemplate(template)...) + // Because the spec is immutable, all CEL expressions in it must have been stored. + // If the user tries an update, this is not true and checking is less strict, but + // as there are errors, it doesn't matter. + allErrs = append(allErrs, validateResourceClaimTemplateSpec(&template.Spec, field.NewPath("spec"), true)...) return allErrs } @@ -425,179 +508,258 @@ func validateNodeName(name string, fldPath *field.Path) field.ErrorList { } // ValidateResourceSlice tests if a ResourceSlice object is valid. -func ValidateResourceSlice(resourceSlice *resource.ResourceSlice) field.ErrorList { - allErrs := corevalidation.ValidateObjectMeta(&resourceSlice.ObjectMeta, false, apimachineryvalidation.NameIsDNSSubdomain, field.NewPath("metadata")) - if resourceSlice.NodeName != "" { - allErrs = append(allErrs, validateNodeName(resourceSlice.NodeName, field.NewPath("nodeName"))...) - } - allErrs = append(allErrs, validateResourceDriverName(resourceSlice.DriverName, field.NewPath("driverName"))...) - allErrs = append(allErrs, validateResourceModel(&resourceSlice.ResourceModel, nil)...) - return allErrs -} - -func validateResourceModel(model *resource.ResourceModel, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - entries := sets.New[string]() - if model.NamedResources != nil { - entries.Insert("namedResources") - allErrs = append(allErrs, namedresourcesvalidation.ValidateResources(model.NamedResources, fldPath.Child("namedResources"))...) - } - switch len(entries) { - case 0: - allErrs = append(allErrs, field.Required(fldPath, "exactly one structured model field must be set")) - case 1: - // Okay. - default: - allErrs = append(allErrs, field.Invalid(fldPath, sets.List(entries), "exactly one field must be set, not several")) - } +func ValidateResourceSlice(slice *resource.ResourceSlice) field.ErrorList { + allErrs := corevalidation.ValidateObjectMeta(&slice.ObjectMeta, false, apimachineryvalidation.NameIsDNSSubdomain, field.NewPath("metadata")) + allErrs = append(allErrs, validateResourceSliceSpec(&slice.Spec, nil, field.NewPath("spec"))...) return allErrs } // ValidateResourceSlice tests if a ResourceSlice update is valid. func ValidateResourceSliceUpdate(resourceSlice, oldResourceSlice *resource.ResourceSlice) field.ErrorList { allErrs := corevalidation.ValidateObjectMetaUpdate(&resourceSlice.ObjectMeta, &oldResourceSlice.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateResourceSlice(resourceSlice)...) - allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(resourceSlice.NodeName, oldResourceSlice.NodeName, field.NewPath("nodeName"))...) - allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(resourceSlice.DriverName, oldResourceSlice.DriverName, field.NewPath("driverName"))...) + allErrs = append(allErrs, validateResourceSliceSpec(&resourceSlice.Spec, &oldResourceSlice.Spec, field.NewPath("spec"))...) return allErrs } -// ValidateResourceClaimParameters tests if a ResourceClaimParameters object is valid for creation. -func ValidateResourceClaimParameters(parameters *resource.ResourceClaimParameters) field.ErrorList { - return validateResourceClaimParameters(parameters, false) -} - -func validateResourceClaimParameters(parameters *resource.ResourceClaimParameters, requestStored bool) field.ErrorList { - allErrs := corevalidation.ValidateObjectMeta(¶meters.ObjectMeta, true, apimachineryvalidation.NameIsDNSSubdomain, field.NewPath("metadata")) - allErrs = append(allErrs, validateResourceClaimParametersRef(parameters.GeneratedFrom, field.NewPath("generatedFrom"))...) - allErrs = append(allErrs, validateDriverRequests(parameters.DriverRequests, field.NewPath("driverRequests"), requestStored)...) - return allErrs -} - -func validateDriverRequests(requests []resource.DriverRequests, fldPath *field.Path, requestStored bool) field.ErrorList { +func validateResourceSliceSpec(spec, oldSpec *resource.ResourceSliceSpec, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList - driverNames := sets.New[string]() - for i, request := range requests { - idxPath := fldPath.Index(i) - driverName := request.DriverName - allErrs = append(allErrs, validateResourceDriverName(driverName, idxPath.Child("driverName"))...) - if driverNames.Has(driverName) { - allErrs = append(allErrs, field.Duplicate(idxPath.Child("driverName"), driverName)) - } else { - driverNames.Insert(driverName) + allErrs = append(allErrs, validateDriverName(spec.Driver, fldPath.Child("driver"))...) + allErrs = append(allErrs, validateResourcePool(spec.Pool, fldPath.Child("pool"))...) + if oldSpec != nil { + allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(spec.Pool.Name, oldSpec.Pool.Name, fldPath.Child("pool", "name"))...) + allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(spec.Driver, oldSpec.Driver, fldPath.Child("driver"))...) + allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(spec.NodeName, oldSpec.NodeName, fldPath.Child("nodeName"))...) + } + + numNodeSelectionFields := 0 + if spec.NodeName != "" { + numNodeSelectionFields++ + allErrs = append(allErrs, validateNodeName(spec.NodeName, fldPath.Child("nodeName"))...) + } + if spec.NodeSelector != nil { + numNodeSelectionFields++ + allErrs = append(allErrs, corevalidation.ValidateNodeSelector(spec.NodeSelector, fldPath.Child("nodeSelector"))...) + if len(spec.NodeSelector.NodeSelectorTerms) != 1 { + // This additional constraint simplifies merging of different selectors + // when devices are allocated from different slices. + allErrs = append(allErrs, field.Invalid(fldPath.Child("nodeSelector", "nodeSelectorTerms"), spec.NodeSelector.NodeSelectorTerms, "must have exactly one selector term")) } - allErrs = append(allErrs, validateResourceRequests(request.Requests, idxPath.Child("requests"), requestStored)...) } - return allErrs -} - -func validateResourceRequests(requests []resource.ResourceRequest, fldPath *field.Path, requestStored bool) field.ErrorList { - var allErrs field.ErrorList - for i, request := range requests { - idxPath := fldPath.Index(i) - allErrs = append(allErrs, validateResourceRequestModel(&request.ResourceRequestModel, idxPath, requestStored)...) + if spec.AllNodes { + numNodeSelectionFields++ } - if len(requests) == 0 { - // We could allow this, it just doesn't make sense: the entire entry would get ignored and thus - // should have been left out entirely. - allErrs = append(allErrs, field.Required(fldPath, "empty entries with no requests are not allowed")) - } - return allErrs -} - -func validateResourceRequestModel(model *resource.ResourceRequestModel, fldPath *field.Path, requestStored bool) field.ErrorList { - var allErrs field.ErrorList - entries := sets.New[string]() - if model.NamedResources != nil { - entries.Insert("namedResources") - allErrs = append(allErrs, namedresourcesvalidation.ValidateRequest(namedresourcesvalidation.Options{StoredExpressions: requestStored}, model.NamedResources, fldPath.Child("namedResources"))...) - } - switch len(entries) { + switch numNodeSelectionFields { case 0: - allErrs = append(allErrs, field.Required(fldPath, "exactly one structured model field must be set")) + allErrs = append(allErrs, field.Required(fldPath, "exactly one of `nodeName`, `nodeSelector`, or `allNodes` is required")) + case 1: + default: + allErrs = append(allErrs, field.Invalid(fldPath, spec, "exactly one of `nodeName`, `nodeSelector`, or `allNodes` is required")) + } + + allErrs = append(allErrs, validateSet(spec.Devices, resource.ResourceSliceMaxDevices, validateDevice, + func(device resource.Device) (string, string) { + return device.Name, "name" + }, fldPath.Child("devices"))...) + + return allErrs +} + +func validateResourcePool(pool resource.ResourcePool, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + allErrs = append(allErrs, validatePoolName(pool.Name, fldPath.Child("name"))...) + if pool.ResourceSliceCount <= 0 { + allErrs = append(allErrs, field.Invalid(fldPath.Child("resourceSliceCount"), pool.ResourceSliceCount, "must be greater than zero")) + } + if pool.Generation < 0 { + allErrs = append(allErrs, field.Invalid(fldPath.Child("generation"), pool.Generation, "must be greater than or equal to zero")) + } + return allErrs +} + +func validateDevice(device resource.Device, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + allErrs = append(allErrs, validateDeviceName(device.Name, fldPath.Child("name"))...) + if device.Basic == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("basic"), "")) + } else { + allErrs = append(allErrs, validateBasicDevice(*device.Basic, fldPath.Child("basic"))...) + } + return allErrs +} + +func validateBasicDevice(device resource.BasicDevice, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + // Warn about exceeding the maximum length only once. If any individual + // field is too large, then so is the combination. + allErrs = append(allErrs, validateMap(device.Attributes, -1, validateQualifiedName, validateDeviceAttribute, fldPath.Child("attributes"))...) + allErrs = append(allErrs, validateMap(device.Capacity, -1, validateQualifiedName, validateQuantity, fldPath.Child("capacity"))...) + if combinedLen, max := len(device.Attributes)+len(device.Capacity), resource.ResourceSliceMaxAttributesAndCapacitiesPerDevice; combinedLen > max { + allErrs = append(allErrs, field.Invalid(fldPath, combinedLen, fmt.Sprintf("the total number of attributes and capacities must not exceed %d", max))) + } + return allErrs +} + +var ( + numericIdentifier = `(0|[1-9]\d*)` + + preReleaseIdentifier = `(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)` + + buildIdentifier = `[0-9a-zA-Z-]+` + + semverRe = regexp.MustCompile(`^` + + + // dot-separated version segments (e.g. 1.2.3) + numericIdentifier + `\.` + numericIdentifier + `\.` + numericIdentifier + + + // optional dot-separated prerelease segments (e.g. -alpha.PRERELEASE.1) + `(-` + preReleaseIdentifier + `(\.` + preReleaseIdentifier + `)*)?` + + + // optional dot-separated build identifier segments (e.g. +build.id.20240305) + `(\+` + buildIdentifier + `(\.` + buildIdentifier + `)*)?` + + + `$`) +) + +func validateDeviceAttribute(attribute resource.DeviceAttribute, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + numFields := 0 + if attribute.BoolValue != nil { + numFields++ + } + if attribute.IntValue != nil { + numFields++ + } + if attribute.StringValue != nil { + if len(*attribute.StringValue) > resource.DeviceAttributeMaxValueLength { + allErrs = append(allErrs, field.TooLongMaxLength(fldPath.Child("string"), *attribute.StringValue, resource.DeviceAttributeMaxValueLength)) + } + numFields++ + } + if attribute.VersionValue != nil { + numFields++ + if !semverRe.MatchString(*attribute.VersionValue) { + allErrs = append(allErrs, field.Invalid(fldPath.Child("version"), *attribute.VersionValue, "must be a string compatible with semver.org spec 2.0.0")) + } + if len(*attribute.VersionValue) > resource.DeviceAttributeMaxValueLength { + allErrs = append(allErrs, field.TooLongMaxLength(fldPath.Child("version"), *attribute.VersionValue, resource.DeviceAttributeMaxValueLength)) + } + } + + switch numFields { + case 0: + allErrs = append(allErrs, field.Required(fldPath, "exactly one value must be specified")) case 1: // Okay. default: - allErrs = append(allErrs, field.Invalid(fldPath, sets.List(entries), "exactly one field must be set, not several")) + allErrs = append(allErrs, field.Invalid(fldPath, attribute, "exactly one field must be specified")) } return allErrs } -// ValidateResourceClaimParameters tests if a ResourceClaimParameters update is valid. -func ValidateResourceClaimParametersUpdate(resourceClaimParameters, oldResourceClaimParameters *resource.ResourceClaimParameters) field.ErrorList { - allErrs := corevalidation.ValidateObjectMetaUpdate(&resourceClaimParameters.ObjectMeta, &oldResourceClaimParameters.ObjectMeta, field.NewPath("metadata")) - requestStored := apiequality.Semantic.DeepEqual(oldResourceClaimParameters.DriverRequests, resourceClaimParameters.DriverRequests) - allErrs = append(allErrs, validateResourceClaimParameters(resourceClaimParameters, requestStored)...) - return allErrs +func validateQuantity(quantity apiresource.Quantity, fldPath *field.Path) field.ErrorList { + // Any parsed quantity is valid. + return nil } -// ValidateResourceClassParameters tests if a ResourceClassParameters object is valid for creation. -func ValidateResourceClassParameters(parameters *resource.ResourceClassParameters) field.ErrorList { - return validateResourceClassParameters(parameters, false) -} - -func validateResourceClassParameters(parameters *resource.ResourceClassParameters, filtersStored bool) field.ErrorList { - allErrs := corevalidation.ValidateObjectMeta(¶meters.ObjectMeta, true, apimachineryvalidation.NameIsDNSSubdomain, field.NewPath("metadata")) - allErrs = append(allErrs, validateClassParameters(parameters.GeneratedFrom, field.NewPath("generatedFrom"))...) - allErrs = append(allErrs, validateResourceFilters(parameters.Filters, field.NewPath("filters"), filtersStored)...) - allErrs = append(allErrs, validateVendorParameters(parameters.VendorParameters, field.NewPath("vendorParameters"))...) - return allErrs -} - -func validateResourceFilters(filters []resource.ResourceFilter, fldPath *field.Path, filtersStored bool) field.ErrorList { +func validateQualifiedName(name resource.QualifiedName, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList - driverNames := sets.New[string]() - for i, filter := range filters { - idxPath := fldPath.Index(i) - driverName := filter.DriverName - allErrs = append(allErrs, validateResourceDriverName(driverName, idxPath.Child("driverName"))...) - if driverNames.Has(driverName) { - allErrs = append(allErrs, field.Duplicate(idxPath.Child("driverName"), driverName)) - } else { - driverNames.Insert(driverName) - } - allErrs = append(allErrs, validateResourceFilterModel(&filter.ResourceFilterModel, idxPath, filtersStored)...) + if name == "" { + allErrs = append(allErrs, field.Required(fldPath, "name required")) + return allErrs } - return allErrs -} -func validateResourceFilterModel(model *resource.ResourceFilterModel, fldPath *field.Path, filtersStored bool) field.ErrorList { - var allErrs field.ErrorList - entries := sets.New[string]() - if model.NamedResources != nil { - entries.Insert("namedResources") - allErrs = append(allErrs, namedresourcesvalidation.ValidateFilter(namedresourcesvalidation.Options{StoredExpressions: filtersStored}, model.NamedResources, fldPath.Child("namedResources"))...) - } - switch len(entries) { - case 0: - allErrs = append(allErrs, field.Required(fldPath, "exactly one structured model field must be set")) + parts := strings.Split(string(name), "/") + switch len(parts) { case 1: - // Okay. - default: - allErrs = append(allErrs, field.Invalid(fldPath, sets.List(entries), "exactly one field must be set, not several")) - } - return allErrs -} - -func validateVendorParameters(parameters []resource.VendorParameters, fldPath *field.Path) field.ErrorList { - var allErrs field.ErrorList - driverNames := sets.New[string]() - for i, parameters := range parameters { - idxPath := fldPath.Index(i) - driverName := parameters.DriverName - allErrs = append(allErrs, validateResourceDriverName(driverName, idxPath.Child("driverName"))...) - if driverNames.Has(driverName) { - allErrs = append(allErrs, field.Duplicate(idxPath.Child("driverName"), driverName)) + allErrs = append(allErrs, validateCIdentifier(parts[0], fldPath)...) + case 2: + if len(parts[0]) == 0 { + allErrs = append(allErrs, field.Required(fldPath, "the prefix must not be empty")) } else { - driverNames.Insert(driverName) + allErrs = append(allErrs, validateDriverName(parts[0], fldPath)...) + } + if len(parts[1]) == 0 { + allErrs = append(allErrs, field.Required(fldPath, "the name must not be empty")) + } else { + allErrs = append(allErrs, validateCIdentifier(parts[1], fldPath)...) } } return allErrs } -// ValidateResourceClassParameters tests if a ResourceClassParameters update is valid. -func ValidateResourceClassParametersUpdate(resourceClassParameters, oldResourceClassParameters *resource.ResourceClassParameters) field.ErrorList { - allErrs := corevalidation.ValidateObjectMetaUpdate(&resourceClassParameters.ObjectMeta, &oldResourceClassParameters.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateResourceClassParameters(resourceClassParameters)...) +func validateFullyQualifiedName(name resource.FullyQualifiedName, fldPath *field.Path) field.ErrorList { + allErrs := validateQualifiedName(resource.QualifiedName(name), fldPath) + if !strings.Contains(string(name), "/") { + allErrs = append(allErrs, field.Required(fldPath.Child("domain"), "must include a prefix")) + } + return allErrs +} + +func validateCIdentifier(id string, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + if len(id) > resource.DeviceMaxIDLength { + allErrs = append(allErrs, field.TooLongMaxLength(fldPath, id, resource.DeviceMaxIDLength)) + } + for _, msg := range validation.IsCIdentifier(id) { + allErrs = append(allErrs, field.TypeInvalid(fldPath, id, msg)) + } + return allErrs +} + +// validateSlice ensures that a slice does not exceed a certain maximum size +// and that all entries are valid. +// A negative maxSize disables the length check. +func validateSlice[T any](slice []T, maxSize int, validateItem func(T, *field.Path) field.ErrorList, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + for i, item := range slice { + idxPath := fldPath.Index(i) + allErrs = append(allErrs, validateItem(item, idxPath)...) + } + if maxSize >= 0 && len(slice) > maxSize { + // Dumping the entire field into the error message is likely to be too long, + // in particular when it is already beyond the maximum size. Instead this + // just shows the number of entries. + allErrs = append(allErrs, field.TooLongMaxLength(fldPath, len(slice), maxSize)) + } + return allErrs +} + +// validateSet ensures that a slice contains no duplicates, does not +// exceed a certain maximum size and that all entries are valid. +func validateSet[T any, K comparable](slice []T, maxSize int, validateItem func(item T, fldPath *field.Path) field.ErrorList, itemKey func(T) (K, string), fldPath *field.Path) field.ErrorList { + allErrs := validateSlice(slice, maxSize, validateItem, fldPath) + allItems := sets.New[K]() + for i, item := range slice { + idxPath := fldPath.Index(i) + key, fieldName := itemKey(item) + childPath := idxPath + if fieldName != "" { + childPath = childPath.Child(fieldName) + } + if allItems.Has(key) { + allErrs = append(allErrs, field.Duplicate(childPath, key)) + } else { + allItems.Insert(key) + } + } + return allErrs +} + +// stringKey uses the item itself as a key for validateSet. +func stringKey(item string) (string, string) { + return item, "" +} + +// validateMap validates keys, items and the maximum length of a map. +// A negative maxSize disables the length check. +func validateMap[K ~string, T any](m map[K]T, maxSize int, validateKey func(K, *field.Path) field.ErrorList, validateItem func(T, *field.Path) field.ErrorList, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + if maxSize >= 0 && len(m) > maxSize { + allErrs = append(allErrs, field.TooLongMaxLength(fldPath, len(m), maxSize)) + } + for key, item := range m { + allErrs = append(allErrs, validateKey(key, fldPath)...) + allErrs = append(allErrs, validateItem(item, fldPath.Key(string(key)))...) + } return allErrs } diff --git a/pkg/apis/resource/validation/validation_deviceclass_test.go b/pkg/apis/resource/validation/validation_deviceclass_test.go new file mode 100644 index 00000000000..3acc4be9d18 --- /dev/null +++ b/pkg/apis/resource/validation/validation_deviceclass_test.go @@ -0,0 +1,247 @@ +/* +Copyright 2022 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 validation + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/validation/field" + "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/apis/resource" + "k8s.io/utils/ptr" +) + +func testClass(name string) *resource.DeviceClass { + return &resource.DeviceClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + } +} + +func TestValidateClass(t *testing.T) { + goodName := "foo" + now := metav1.Now() + badName := "!@#$%^" + badValue := "spaces not allowed" + + scenarios := map[string]struct { + class *resource.DeviceClass + wantFailures field.ErrorList + }{ + "good-class": { + class: testClass(goodName), + }, + "missing-name": { + wantFailures: field.ErrorList{field.Required(field.NewPath("metadata", "name"), "name or generateName is required")}, + class: testClass(""), + }, + "bad-name": { + wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "name"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, + class: testClass(badName), + }, + "generate-name": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.GenerateName = "pvc-" + return class + }(), + }, + "uid": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.UID = "ac051fac-2ead-46d9-b8b4-4e0fbeb7455d" + return class + }(), + }, + "resource-version": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.ResourceVersion = "1" + return class + }(), + }, + "generation": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.Generation = 100 + return class + }(), + }, + "creation-timestamp": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.CreationTimestamp = now + return class + }(), + }, + "deletion-grace-period-seconds": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.DeletionGracePeriodSeconds = ptr.To(int64(10)) + return class + }(), + }, + "owner-references": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.OwnerReferences = []metav1.OwnerReference{ + { + APIVersion: "v1", + Kind: "pod", + Name: "foo", + UID: "ac051fac-2ead-46d9-b8b4-4e0fbeb7455d", + }, + } + return class + }(), + }, + "finalizers": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.Finalizers = []string{ + "example.com/foo", + } + return class + }(), + }, + "managed-fields": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.ManagedFields = []metav1.ManagedFieldsEntry{ + { + FieldsType: "FieldsV1", + Operation: "Apply", + APIVersion: "apps/v1", + Manager: "foo", + }, + } + return class + }(), + }, + "good-labels": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.Labels = map[string]string{ + "apps.kubernetes.io/name": "test", + } + return class + }(), + }, + "bad-labels": { + wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "labels"), badValue, "a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyValue', or 'my_value', or '12345', regex used for validation is '(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?')")}, + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.Labels = map[string]string{ + "hello-world": badValue, + } + return class + }(), + }, + "good-annotations": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.Annotations = map[string]string{ + "foo": "bar", + } + return class + }(), + }, + "bad-annotations": { + wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "annotations"), badName, "name part must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]')")}, + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.Annotations = map[string]string{ + badName: "hello world", + } + return class + }(), + }, + "invalid-node-selector": { + wantFailures: field.ErrorList{field.Required(field.NewPath("suitableNodes", "nodeSelectorTerms"), "must have at least one node selector term")}, + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.Spec.SuitableNodes = &core.NodeSelector{ + // Must not be empty. + } + return class + }(), + }, + "valid-node-selector": { + class: func() *resource.DeviceClass { + class := testClass(goodName) + class.Spec.SuitableNodes = &core.NodeSelector{ + NodeSelectorTerms: []core.NodeSelectorTerm{{ + MatchExpressions: []core.NodeSelectorRequirement{{ + Key: "foo", + Operator: core.NodeSelectorOpDoesNotExist, + }}, + }}, + } + return class + }(), + }, + } + + for name, scenario := range scenarios { + t.Run(name, func(t *testing.T) { + errs := ValidateDeviceClass(scenario.class) + assert.Equal(t, scenario.wantFailures, errs) + }) + } +} + +func TestValidateClassUpdate(t *testing.T) { + validClass := testClass(goodName) + + scenarios := map[string]struct { + oldClass *resource.DeviceClass + update func(class *resource.DeviceClass) *resource.DeviceClass + wantFailures field.ErrorList + }{ + "valid-no-op-update": { + oldClass: validClass, + update: func(class *resource.DeviceClass) *resource.DeviceClass { return class }, + }, + "update-node-selector": { + oldClass: validClass, + update: func(class *resource.DeviceClass) *resource.DeviceClass { + class = class.DeepCopy() + class.Spec.SuitableNodes = &core.NodeSelector{ + NodeSelectorTerms: []core.NodeSelectorTerm{{ + MatchExpressions: []core.NodeSelectorRequirement{{ + Key: "foo", + Operator: core.NodeSelectorOpDoesNotExist, + }}, + }}, + } + return class + }, + }, + } + + for name, scenario := range scenarios { + t.Run(name, func(t *testing.T) { + scenario.oldClass.ResourceVersion = "1" + errs := ValidateDeviceClassUpdate(scenario.update(scenario.oldClass.DeepCopy()), scenario.oldClass) + assert.Equal(t, scenario.wantFailures, errs) + }) + } +} diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index 0f1062f9c40..64c1c75797e 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -18,17 +18,18 @@ package validation import ( "fmt" - "strings" "testing" "github.com/stretchr/testify/assert" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/resource" "k8s.io/utils/pointer" + "k8s.io/utils/ptr" ) func testClaim(name, namespace string, spec resource.ResourceClaimSpec) *resource.ResourceClaim { @@ -37,86 +38,98 @@ func testClaim(name, namespace string, spec resource.ResourceClaimSpec) *resourc Name: name, Namespace: namespace, }, - Spec: spec, + Spec: *spec.DeepCopy(), } } -func TestValidateClaim(t *testing.T) { - goodName := "foo" - badName := "!@#$%^" - goodNS := "ns" - goodClaimSpec := resource.ResourceClaimSpec{ - ResourceClassName: goodName, +const ( + goodName = "foo" + badName = "!@#$%^" + goodNS = "ns" +) + +var ( + validClaimSpec = resource.ResourceClaimSpec{ + Devices: resource.DeviceClaim{ + Requests: []resource.DeviceRequest{{ + Name: goodName, + DeviceClassName: goodName, + AllocationMode: resource.DeviceAllocationModeExactCount, + Count: 1, + }}, + }, } + validClaim = testClaim(goodName, goodNS, validClaimSpec) +) + +func TestValidateClaim(t *testing.T) { now := metav1.Now() badValue := "spaces not allowed" - badAPIGroup := "example.com/v1" - goodAPIGroup := "example.com" scenarios := map[string]struct { claim *resource.ResourceClaim wantFailures field.ErrorList }{ "good-claim": { - claim: testClaim(goodName, goodNS, goodClaimSpec), + claim: testClaim(goodName, goodNS, validClaimSpec), }, "missing-name": { wantFailures: field.ErrorList{field.Required(field.NewPath("metadata", "name"), "name or generateName is required")}, - claim: testClaim("", goodNS, goodClaimSpec), + claim: testClaim("", goodNS, validClaimSpec), }, "bad-name": { wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "name"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - claim: testClaim(badName, goodNS, goodClaimSpec), + claim: testClaim(badName, goodNS, validClaimSpec), }, "missing-namespace": { wantFailures: field.ErrorList{field.Required(field.NewPath("metadata", "namespace"), "")}, - claim: testClaim(goodName, "", goodClaimSpec), + claim: testClaim(goodName, "", validClaimSpec), }, "generate-name": { claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.GenerateName = "pvc-" return claim }(), }, "uid": { claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.UID = "ac051fac-2ead-46d9-b8b4-4e0fbeb7455d" return claim }(), }, "resource-version": { claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.ResourceVersion = "1" return claim }(), }, "generation": { claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.Generation = 100 return claim }(), }, "creation-timestamp": { claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.CreationTimestamp = now return claim }(), }, "deletion-grace-period-seconds": { claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.DeletionGracePeriodSeconds = pointer.Int64(10) return claim }(), }, "owner-references": { claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.OwnerReferences = []metav1.OwnerReference{ { APIVersion: "v1", @@ -130,7 +143,7 @@ func TestValidateClaim(t *testing.T) { }, "finalizers": { claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.Finalizers = []string{ "example.com/foo", } @@ -139,7 +152,7 @@ func TestValidateClaim(t *testing.T) { }, "managed-fields": { claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.ManagedFields = []metav1.ManagedFieldsEntry{ { FieldsType: "FieldsV1", @@ -153,7 +166,7 @@ func TestValidateClaim(t *testing.T) { }, "good-labels": { claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.Labels = map[string]string{ "apps.kubernetes.io/name": "test", } @@ -163,7 +176,7 @@ func TestValidateClaim(t *testing.T) { "bad-labels": { wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "labels"), badValue, "a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyValue', or 'my_value', or '12345', regex used for validation is '(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?')")}, claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.Labels = map[string]string{ "hello-world": badValue, } @@ -172,7 +185,7 @@ func TestValidateClaim(t *testing.T) { }, "good-annotations": { claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.Annotations = map[string]string{ "foo": "bar", } @@ -182,7 +195,7 @@ func TestValidateClaim(t *testing.T) { "bad-annotations": { wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "annotations"), badName, "name part must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]')")}, claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) + claim := testClaim(goodName, goodNS, validClaimSpec) claim.Annotations = map[string]string{ badName: "hello world", } @@ -190,62 +203,115 @@ func TestValidateClaim(t *testing.T) { }(), }, "bad-classname": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec", "resourceClassName"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, + wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec", "devices", "requests").Index(0).Child("deviceClassName"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) - claim.Spec.ResourceClassName = badName + claim := testClaim(goodName, goodNS, validClaimSpec) + claim.Spec.Devices.Requests[0].DeviceClassName = badName return claim }(), }, - "good-parameters": { + "invalid-request-name": { + wantFailures: field.ErrorList{ + field.Invalid(field.NewPath("spec", "devices", "constraints").Index(0).Child("requests").Index(1), badName, "a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')"), + field.Invalid(field.NewPath("spec", "devices", "constraints").Index(0).Child("requests").Index(1), badName, "must be the name of a request in the claim"), + field.Invalid(field.NewPath("spec", "devices", "config").Index(0).Child("requests").Index(1), badName, "a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')"), + field.Invalid(field.NewPath("spec", "devices", "config").Index(0).Child("requests").Index(1), badName, "must be the name of a request in the claim"), + }, claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) - claim.Spec.ParametersRef = &resource.ResourceClaimParametersReference{ - Kind: "foo", - Name: "bar", + claim := testClaim(goodName, goodNS, validClaimSpec) + claim.Spec.Devices.Constraints = []resource.DeviceConstraint{{ + Requests: []string{claim.Spec.Devices.Requests[0].Name, badName}, + MatchAttribute: ptr.To(resource.FullyQualifiedName("dra.example.com/numa")), + }} + claim.Spec.Devices.Config = []resource.DeviceClaimConfiguration{{ + Requests: []string{claim.Spec.Devices.Requests[0].Name, badName}, + DeviceConfiguration: resource.DeviceConfiguration{ + Opaque: &resource.OpaqueDeviceConfiguration{ + Driver: "dra.example.com", + Parameters: runtime.RawExtension{ + Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), + }, + }, + }, + }} + return claim + }(), + }, + "invalid-config-json": { + wantFailures: field.ErrorList{ + field.Required(field.NewPath("spec", "devices", "config").Index(0).Child("opaque", "parameters"), ""), + field.Invalid(field.NewPath("spec", "devices", "config").Index(1).Child("opaque", "parameters"), "", "error parsing data: unexpected end of JSON input"), + field.Invalid(field.NewPath("spec", "devices", "config").Index(2).Child("opaque", "parameters"), "", "parameters must be a valid JSON object"), + field.Required(field.NewPath("spec", "devices", "config").Index(3).Child("opaque", "parameters"), ""), + }, + claim: func() *resource.ResourceClaim { + claim := testClaim(goodName, goodNS, validClaimSpec) + claim.Spec.Devices.Config = []resource.DeviceClaimConfiguration{ + { + DeviceConfiguration: resource.DeviceConfiguration{ + Opaque: &resource.OpaqueDeviceConfiguration{ + Driver: "dra.example.com", + Parameters: runtime.RawExtension{ + Raw: []byte(``), + }, + }, + }, + }, + { + DeviceConfiguration: resource.DeviceConfiguration{ + Opaque: &resource.OpaqueDeviceConfiguration{ + Driver: "dra.example.com", + Parameters: runtime.RawExtension{ + Raw: []byte(`{`), + }, + }, + }, + }, + { + DeviceConfiguration: resource.DeviceConfiguration{ + Opaque: &resource.OpaqueDeviceConfiguration{ + Driver: "dra.example.com", + Parameters: runtime.RawExtension{ + Raw: []byte(`"hello-world"`), + }, + }, + }, + }, + { + DeviceConfiguration: resource.DeviceConfiguration{ + Opaque: &resource.OpaqueDeviceConfiguration{ + Driver: "dra.example.com", + Parameters: runtime.RawExtension{ + Raw: []byte(`null`), + }, + }, + }, + }, } return claim }(), }, - "good-parameters-apigroup": { + "CEL-compile-errors": { + wantFailures: field.ErrorList{ + field.Invalid(field.NewPath("spec", "devices", "requests").Index(1).Child("selectors").Index(1).Child("cel", "expression"), `device.attributes[true].someBoolean`, "compilation failed: ERROR: :1:18: found no matching overload for '_[_]' applied to '(map(string, map(string, any)), bool)'\n | device.attributes[true].someBoolean\n | .................^"), + }, claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) - claim.Spec.ParametersRef = &resource.ResourceClaimParametersReference{ - APIGroup: goodAPIGroup, - Kind: "foo", - Name: "bar", - } - return claim - }(), - }, - "bad-parameters-apigroup": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec", "parametersRef", "apiGroup"), badAPIGroup, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) - claim.Spec.ParametersRef = &resource.ResourceClaimParametersReference{ - APIGroup: badAPIGroup, - Kind: "foo", - Name: "bar", - } - return claim - }(), - }, - "missing-parameters-kind": { - wantFailures: field.ErrorList{field.Required(field.NewPath("spec", "parametersRef", "kind"), "")}, - claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) - claim.Spec.ParametersRef = &resource.ResourceClaimParametersReference{ - Name: "bar", - } - return claim - }(), - }, - "missing-parameters-name": { - wantFailures: field.ErrorList{field.Required(field.NewPath("spec", "parametersRef", "name"), "")}, - claim: func() *resource.ResourceClaim { - claim := testClaim(goodName, goodNS, goodClaimSpec) - claim.Spec.ParametersRef = &resource.ResourceClaimParametersReference{ - Kind: "foo", + claim := testClaim(goodName, goodNS, validClaimSpec) + claim.Spec.Devices.Requests = append(claim.Spec.Devices.Requests, claim.Spec.Devices.Requests[0]) + claim.Spec.Devices.Requests[1].Name += "-2" + claim.Spec.Devices.Requests[1].Selectors = []resource.DeviceSelector{ + { + // Good selector. + CEL: &resource.CELDeviceSelector{ + Expression: `device.driver == "dra.example.com"`, + }, + }, + { + // Bad selector. + CEL: &resource.CELDeviceSelector{ + Expression: `device.attributes[true].someBoolean`, + }, + }, } return claim }(), @@ -254,23 +320,13 @@ func TestValidateClaim(t *testing.T) { for name, scenario := range scenarios { t.Run(name, func(t *testing.T) { - errs := ValidateClaim(scenario.claim) + errs := ValidateResourceClaim(scenario.claim) assert.Equal(t, scenario.wantFailures, errs) }) } } func TestValidateClaimUpdate(t *testing.T) { - name := "valid" - parameters := &resource.ResourceClaimParametersReference{ - Kind: "foo", - Name: "bar", - } - validClaim := testClaim("foo", "ns", resource.ResourceClaimSpec{ - ResourceClassName: name, - ParametersRef: parameters, - }) - scenarios := map[string]struct { oldClaim *resource.ResourceClaim update func(claim *resource.ResourceClaim) *resource.ResourceClaim @@ -283,24 +339,12 @@ func TestValidateClaimUpdate(t *testing.T) { "invalid-update-class": { wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec"), func() resource.ResourceClaimSpec { spec := validClaim.Spec.DeepCopy() - spec.ResourceClassName += "2" + spec.Devices.Requests[0].DeviceClassName += "2" return *spec }(), "field is immutable")}, oldClaim: validClaim, update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Spec.ResourceClassName += "2" - return claim - }, - }, - "invalid-update-remove-parameters": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec"), func() resource.ResourceClaimSpec { - spec := validClaim.Spec.DeepCopy() - spec.ParametersRef = nil - return *spec - }(), "field is immutable")}, - oldClaim: validClaim, - update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Spec.ParametersRef = nil + claim.Spec.Devices.Requests[0].DeviceClassName += "2" return claim }, }, @@ -309,33 +353,24 @@ func TestValidateClaimUpdate(t *testing.T) { for name, scenario := range scenarios { t.Run(name, func(t *testing.T) { scenario.oldClaim.ResourceVersion = "1" - errs := ValidateClaimUpdate(scenario.update(scenario.oldClaim.DeepCopy()), scenario.oldClaim) + errs := ValidateResourceClaimUpdate(scenario.update(scenario.oldClaim.DeepCopy()), scenario.oldClaim) assert.Equal(t, scenario.wantFailures, errs) }) } } func TestValidateClaimStatusUpdate(t *testing.T) { - invalidName := "!@#$%^" - validClaim := testClaim("foo", "ns", resource.ResourceClaimSpec{ - ResourceClassName: "valid", - }) - validAllocatedClaim := validClaim.DeepCopy() validAllocatedClaim.Status = resource.ResourceClaimStatus{ - DriverName: "valid", Allocation: &resource.AllocationResult{ - ResourceHandles: func() []resource.ResourceHandle { - var handles []resource.ResourceHandle - for i := 0; i < resource.AllocationResultResourceHandlesMaxSize; i++ { - handle := resource.ResourceHandle{ - DriverName: "valid", - Data: strings.Repeat(" ", resource.ResourceHandleDataMaxSize), - } - handles = append(handles, handle) - } - return handles - }(), + Devices: resource.DeviceAllocationResult{ + Results: []resource.DeviceRequestAllocationResult{{ + Request: goodName, + Driver: goodName, + Pool: goodName, + Device: goodName, + }}, + }, }, } @@ -348,176 +383,55 @@ func TestValidateClaimStatusUpdate(t *testing.T) { oldClaim: validClaim, update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { return claim }, }, - "add-driver": { + "valid-add-allocation-empty": { oldClaim: validClaim, update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.DriverName = "valid" - return claim - }, - }, - "invalid-add-allocation": { - wantFailures: field.ErrorList{field.Required(field.NewPath("status", "driverName"), "must be specified when `allocation` is set")}, - oldClaim: validClaim, - update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - // DriverName must also get set here! claim.Status.Allocation = &resource.AllocationResult{} return claim }, }, - "valid-add-allocation": { + "valid-add-allocation-non-empty": { oldClaim: validClaim, update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.DriverName = "valid" claim.Status.Allocation = &resource.AllocationResult{ - ResourceHandles: []resource.ResourceHandle{ - { - DriverName: "valid", - Data: strings.Repeat(" ", resource.ResourceHandleDataMaxSize), - }, + Devices: resource.DeviceAllocationResult{ + Results: []resource.DeviceRequestAllocationResult{{ + Request: goodName, + Driver: goodName, + Pool: goodName, + Device: goodName, + }}, }, } return claim }, }, - "valid-add-empty-allocation-structured": { - oldClaim: validClaim, - update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.DriverName = "valid" - claim.Status.Allocation = &resource.AllocationResult{ - ResourceHandles: []resource.ResourceHandle{ - { - DriverName: "valid", - StructuredData: &resource.StructuredResourceHandle{}, - }, - }, - } - return claim - }, - }, - "valid-add-allocation-structured": { - oldClaim: validClaim, - update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.DriverName = "valid" - claim.Status.Allocation = &resource.AllocationResult{ - ResourceHandles: []resource.ResourceHandle{ - { - DriverName: "valid", - StructuredData: &resource.StructuredResourceHandle{ - NodeName: "worker", - }, - }, - }, - } - return claim - }, - }, - "invalid-add-allocation-structured": { + "invalid-add-allocation-bad-request": { wantFailures: field.ErrorList{ - field.Invalid(field.NewPath("status", "allocation", "resourceHandles").Index(0).Child("structuredData", "nodeName"), "&^!", "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')"), - field.Required(field.NewPath("status", "allocation", "resourceHandles").Index(0).Child("structuredData", "results").Index(1), "exactly one structured model field must be set"), + field.Invalid(field.NewPath("status", "allocation", "devices", "results").Index(0).Child("request"), badName, "a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')"), + field.Invalid(field.NewPath("status", "allocation", "devices", "results").Index(0).Child("request"), badName, "must be the name of a request in the claim"), }, oldClaim: validClaim, update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.DriverName = "valid" claim.Status.Allocation = &resource.AllocationResult{ - ResourceHandles: []resource.ResourceHandle{ - { - DriverName: "valid", - StructuredData: &resource.StructuredResourceHandle{ - NodeName: "&^!", - Results: []resource.DriverAllocationResult{ - { - AllocationResultModel: resource.AllocationResultModel{ - NamedResources: &resource.NamedResourcesAllocationResult{ - Name: "some-resource-instance", - }, - }, - }, - { - AllocationResultModel: resource.AllocationResultModel{}, // invalid - }, - }, - }, - }, - }, - } - return claim - }, - }, - "invalid-duplicated-data": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("status", "allocation", "resourceHandles").Index(0), nil, "data and structuredData are mutually exclusive")}, - oldClaim: validClaim, - update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.DriverName = "valid" - claim.Status.Allocation = &resource.AllocationResult{ - ResourceHandles: []resource.ResourceHandle{ - { - DriverName: "valid", - Data: "something", - StructuredData: &resource.StructuredResourceHandle{ - NodeName: "worker", - }, - }, - }, - } - return claim - }, - }, - "invalid-allocation-resourceHandles": { - wantFailures: field.ErrorList{field.TooLongMaxLength(field.NewPath("status", "allocation", "resourceHandles"), resource.AllocationResultResourceHandlesMaxSize+1, resource.AllocationResultResourceHandlesMaxSize)}, - oldClaim: validClaim, - update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.DriverName = "valid" - claim.Status.Allocation = &resource.AllocationResult{ - ResourceHandles: func() []resource.ResourceHandle { - var handles []resource.ResourceHandle - for i := 0; i < resource.AllocationResultResourceHandlesMaxSize+1; i++ { - handles = append(handles, resource.ResourceHandle{DriverName: "valid"}) - } - return handles - }(), - } - return claim - }, - }, - "invalid-allocation-resource-handle-drivername": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("status", "allocation", "resourceHandles[0]", "driverName"), invalidName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - oldClaim: validClaim, - update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.DriverName = "valid" - claim.Status.Allocation = &resource.AllocationResult{ - ResourceHandles: []resource.ResourceHandle{ - { - DriverName: invalidName, - }, - }, - } - return claim - }, - }, - "invalid-allocation-resource-handle-data": { - wantFailures: field.ErrorList{field.TooLongMaxLength(field.NewPath("status", "allocation", "resourceHandles").Index(0).Child("data"), resource.ResourceHandleDataMaxSize+1, resource.ResourceHandleDataMaxSize)}, - oldClaim: validClaim, - update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.DriverName = "valid" - claim.Status.Allocation = &resource.AllocationResult{ - ResourceHandles: []resource.ResourceHandle{ - { - DriverName: "valid", - Data: strings.Repeat(" ", resource.ResourceHandleDataMaxSize+1), - }, + Devices: resource.DeviceAllocationResult{ + Results: []resource.DeviceRequestAllocationResult{{ + Request: badName, + Driver: goodName, + Pool: goodName, + Device: goodName, + }}, }, } return claim }, }, "invalid-node-selector": { - wantFailures: field.ErrorList{field.Required(field.NewPath("status", "allocation", "availableOnNodes", "nodeSelectorTerms"), "must have at least one node selector term")}, + wantFailures: field.ErrorList{field.Required(field.NewPath("status", "allocation", "nodeSelector", "nodeSelectorTerms"), "must have at least one node selector term")}, oldClaim: validClaim, update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.DriverName = "valid" claim.Status.Allocation = &resource.AllocationResult{ - AvailableOnNodes: &core.NodeSelector{ + NodeSelector: &core.NodeSelector{ // Must not be empty. }, } @@ -587,7 +501,6 @@ func TestValidateClaimStatusUpdate(t *testing.T) { wantFailures: field.ErrorList{field.Forbidden(field.NewPath("status", "reservedFor"), "may not be specified when `allocated` is not set")}, oldClaim: validClaim, update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.DriverName = "valid" claim.Status.ReservedFor = []resource.ResourceClaimConsumerReference{ { Resource: "pods", @@ -708,26 +621,12 @@ func TestValidateClaimStatusUpdate(t *testing.T) { "invalid-allocation-modification": { wantFailures: field.ErrorList{field.Invalid(field.NewPath("status.allocation"), func() *resource.AllocationResult { claim := validAllocatedClaim.DeepCopy() - claim.Status.Allocation.ResourceHandles = []resource.ResourceHandle{ - { - DriverName: "valid", - Data: strings.Repeat(" ", resource.ResourceHandleDataMaxSize/2), - }, - } + claim.Status.Allocation.Devices.Results[0].Driver += "-2" return claim.Status.Allocation }(), "field is immutable")}, - oldClaim: func() *resource.ResourceClaim { - claim := validAllocatedClaim.DeepCopy() - claim.Status.DeallocationRequested = false - return claim - }(), + oldClaim: validAllocatedClaim, update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { - claim.Status.Allocation.ResourceHandles = []resource.ResourceHandle{ - { - DriverName: "valid", - Data: strings.Repeat(" ", resource.ResourceHandleDataMaxSize/2), - }, - } + claim.Status.Allocation.Devices.Results[0].Driver += "-2" return claim }, }, @@ -769,12 +668,36 @@ func TestValidateClaimStatusUpdate(t *testing.T) { return claim }, }, + "invalid-request-name": { + wantFailures: field.ErrorList{ + field.Invalid(field.NewPath("status", "allocation", "devices", "config").Index(0).Child("requests").Index(1), badName, "a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')"), + field.Invalid(field.NewPath("status", "allocation", "devices", "config").Index(0).Child("requests").Index(1), badName, "must be the name of a request in the claim"), + }, + oldClaim: validClaim, + update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { + claim = claim.DeepCopy() + claim.Status.Allocation = validAllocatedClaim.Status.Allocation.DeepCopy() + claim.Status.Allocation.Devices.Config = []resource.DeviceAllocationConfiguration{{ + Source: resource.AllocationConfigSourceClaim, + Requests: []string{claim.Spec.Devices.Requests[0].Name, badName}, + DeviceConfiguration: resource.DeviceConfiguration{ + Opaque: &resource.OpaqueDeviceConfiguration{ + Driver: "dra.example.com", + Parameters: runtime.RawExtension{ + Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), + }, + }, + }, + }} + return claim + }, + }, } for name, scenario := range scenarios { t.Run(name, func(t *testing.T) { scenario.oldClaim.ResourceVersion = "1" - errs := ValidateClaimStatusUpdate(scenario.update(scenario.oldClaim.DeepCopy()), scenario.oldClaim) + errs := ValidateResourceClaimStatusUpdate(scenario.update(scenario.oldClaim.DeepCopy()), scenario.oldClaim) assert.Equal(t, scenario.wantFailures, errs) }) } diff --git a/pkg/apis/resource/validation/validation_resourceclaimparameters_test.go b/pkg/apis/resource/validation/validation_resourceclaimparameters_test.go deleted file mode 100644 index f4af43f8b46..00000000000 --- a/pkg/apis/resource/validation/validation_resourceclaimparameters_test.go +++ /dev/null @@ -1,306 +0,0 @@ -/* -Copyright 2022 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 validation - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/validation/field" - "k8s.io/kubernetes/pkg/apis/resource" - "k8s.io/utils/ptr" -) - -func testResourceClaimParameters(name, namespace string, requests []resource.DriverRequests) *resource.ResourceClaimParameters { - return &resource.ResourceClaimParameters{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - DriverRequests: requests, - } -} - -var goodRequests []resource.DriverRequests - -func TestValidateResourceClaimParameters(t *testing.T) { - goodName := "foo" - badName := "!@#$%^" - badValue := "spaces not allowed" - now := metav1.Now() - - scenarios := map[string]struct { - parameters *resource.ResourceClaimParameters - wantFailures field.ErrorList - }{ - "good": { - parameters: testResourceClaimParameters(goodName, goodName, goodRequests), - }, - "missing-name": { - wantFailures: field.ErrorList{field.Required(field.NewPath("metadata", "name"), "name or generateName is required")}, - parameters: testResourceClaimParameters("", goodName, goodRequests), - }, - "missing-namespace": { - wantFailures: field.ErrorList{field.Required(field.NewPath("metadata", "namespace"), "")}, - parameters: testResourceClaimParameters(goodName, "", goodRequests), - }, - "bad-name": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "name"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - parameters: testResourceClaimParameters(badName, goodName, goodRequests), - }, - "bad-namespace": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "namespace"), badName, "a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')")}, - parameters: testResourceClaimParameters(goodName, badName, goodRequests), - }, - "generate-name": { - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.GenerateName = "prefix-" - return parameters - }(), - }, - "uid": { - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.UID = "ac051fac-2ead-46d9-b8b4-4e0fbeb7455d" - return parameters - }(), - }, - "resource-version": { - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.ResourceVersion = "1" - return parameters - }(), - }, - "generation": { - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.Generation = 100 - return parameters - }(), - }, - "creation-timestamp": { - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.CreationTimestamp = now - return parameters - }(), - }, - "deletion-grace-period-seconds": { - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.DeletionGracePeriodSeconds = ptr.To[int64](10) - return parameters - }(), - }, - "owner-references": { - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.OwnerReferences = []metav1.OwnerReference{ - { - APIVersion: "v1", - Kind: "pod", - Name: "foo", - UID: "ac051fac-2ead-46d9-b8b4-4e0fbeb7455d", - }, - } - return parameters - }(), - }, - "finalizers": { - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.Finalizers = []string{ - "example.com/foo", - } - return parameters - }(), - }, - "managed-fields": { - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.ManagedFields = []metav1.ManagedFieldsEntry{ - { - FieldsType: "FieldsV1", - Operation: "Apply", - APIVersion: "apps/v1", - Manager: "foo", - }, - } - return parameters - }(), - }, - "good-labels": { - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.Labels = map[string]string{ - "apps.kubernetes.io/name": "test", - } - return parameters - }(), - }, - "bad-labels": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "labels"), badValue, "a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyValue', or 'my_value', or '12345', regex used for validation is '(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?')")}, - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.Labels = map[string]string{ - "hello-world": badValue, - } - return parameters - }(), - }, - "good-annotations": { - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.Annotations = map[string]string{ - "foo": "bar", - } - return parameters - }(), - }, - "bad-annotations": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "annotations"), badName, "name part must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]')")}, - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.Annotations = map[string]string{ - badName: "hello world", - } - return parameters - }(), - }, - - "empty-model": { - wantFailures: field.ErrorList{field.Required(field.NewPath("driverRequests").Index(0).Child("requests").Index(0), "exactly one structured model field must be set")}, - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.DriverRequests = []resource.DriverRequests{{DriverName: goodName, Requests: []resource.ResourceRequest{{}}}} - return parameters - }(), - }, - - "empty-requests": { - wantFailures: field.ErrorList{field.Required(field.NewPath("driverRequests").Index(0).Child("requests"), "empty entries with no requests are not allowed")}, - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.DriverRequests = []resource.DriverRequests{{DriverName: goodName}} - return parameters - }(), - }, - - "invalid-driver": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("driverRequests").Index(1).Child("driverName"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.DriverRequests = []resource.DriverRequests{ - { - DriverName: goodName, - Requests: []resource.ResourceRequest{ - { - ResourceRequestModel: resource.ResourceRequestModel{ - NamedResources: &resource.NamedResourcesRequest{Selector: "true"}, - }, - }, - }, - }, - { - DriverName: badName, - Requests: []resource.ResourceRequest{ - { - ResourceRequestModel: resource.ResourceRequestModel{ - NamedResources: &resource.NamedResourcesRequest{Selector: "true"}, - }, - }, - }, - }, - } - return parameters - }(), - }, - - "duplicate-driver": { - wantFailures: field.ErrorList{field.Duplicate(field.NewPath("driverRequests").Index(1).Child("driverName"), goodName)}, - parameters: func() *resource.ResourceClaimParameters { - parameters := testResourceClaimParameters(goodName, goodName, goodRequests) - parameters.DriverRequests = []resource.DriverRequests{ - { - DriverName: goodName, - Requests: []resource.ResourceRequest{ - { - ResourceRequestModel: resource.ResourceRequestModel{ - NamedResources: &resource.NamedResourcesRequest{Selector: "true"}, - }, - }, - }, - }, - { - DriverName: goodName, - Requests: []resource.ResourceRequest{ - { - ResourceRequestModel: resource.ResourceRequestModel{ - NamedResources: &resource.NamedResourcesRequest{Selector: "true"}, - }, - }, - }, - }, - } - return parameters - }(), - }, - } - - for name, scenario := range scenarios { - t.Run(name, func(t *testing.T) { - errs := ValidateResourceClaimParameters(scenario.parameters) - assert.Equal(t, scenario.wantFailures, errs) - }) - } -} - -func TestValidateResourceClaimParametersUpdate(t *testing.T) { - name := "valid" - validResourceClaimParameters := testResourceClaimParameters(name, name, nil) - - scenarios := map[string]struct { - oldResourceClaimParameters *resource.ResourceClaimParameters - update func(claim *resource.ResourceClaimParameters) *resource.ResourceClaimParameters - wantFailures field.ErrorList - }{ - "valid-no-op-update": { - oldResourceClaimParameters: validResourceClaimParameters, - update: func(claim *resource.ResourceClaimParameters) *resource.ResourceClaimParameters { return claim }, - }, - "invalid-name-update": { - oldResourceClaimParameters: validResourceClaimParameters, - update: func(claim *resource.ResourceClaimParameters) *resource.ResourceClaimParameters { - claim.Name += "-update" - return claim - }, - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "name"), name+"-update", "field is immutable")}, - }, - } - - for name, scenario := range scenarios { - t.Run(name, func(t *testing.T) { - scenario.oldResourceClaimParameters.ResourceVersion = "1" - errs := ValidateResourceClaimParametersUpdate(scenario.update(scenario.oldResourceClaimParameters.DeepCopy()), scenario.oldResourceClaimParameters) - assert.Equal(t, scenario.wantFailures, errs) - }) - } -} diff --git a/pkg/apis/resource/validation/validation_resourceclaimtemplate_test.go b/pkg/apis/resource/validation/validation_resourceclaimtemplate_test.go index ba51420c268..9c4640fb75b 100644 --- a/pkg/apis/resource/validation/validation_resourceclaimtemplate_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaimtemplate_test.go @@ -34,87 +34,79 @@ func testClaimTemplate(name, namespace string, spec resource.ResourceClaimSpec) Namespace: namespace, }, Spec: resource.ResourceClaimTemplateSpec{ - Spec: spec, + Spec: *spec.DeepCopy(), }, } } func TestValidateClaimTemplate(t *testing.T) { - goodName := "foo" - badName := "!@#$%^" - goodNS := "ns" - goodClaimSpec := resource.ResourceClaimSpec{ - ResourceClassName: goodName, - } now := metav1.Now() badValue := "spaces not allowed" - badAPIGroup := "example.com/v1" - goodAPIGroup := "example.com" scenarios := map[string]struct { template *resource.ResourceClaimTemplate wantFailures field.ErrorList }{ "good-claim": { - template: testClaimTemplate(goodName, goodNS, goodClaimSpec), + template: testClaimTemplate(goodName, goodNS, validClaimSpec), }, "missing-name": { wantFailures: field.ErrorList{field.Required(field.NewPath("metadata", "name"), "name or generateName is required")}, - template: testClaimTemplate("", goodNS, goodClaimSpec), + template: testClaimTemplate("", goodNS, validClaimSpec), }, "bad-name": { wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "name"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - template: testClaimTemplate(badName, goodNS, goodClaimSpec), + template: testClaimTemplate(badName, goodNS, validClaimSpec), }, "missing-namespace": { wantFailures: field.ErrorList{field.Required(field.NewPath("metadata", "namespace"), "")}, - template: testClaimTemplate(goodName, "", goodClaimSpec), + template: testClaimTemplate(goodName, "", validClaimSpec), }, "generate-name": { template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.GenerateName = "pvc-" return template }(), }, "uid": { template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.UID = "ac051fac-2ead-46d9-b8b4-4e0fbeb7455d" return template }(), }, "resource-version": { template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.ResourceVersion = "1" return template }(), }, "generation": { template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.Generation = 100 return template }(), }, "creation-timestamp": { template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.CreationTimestamp = now return template }(), }, "deletion-grace-period-seconds": { template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.DeletionGracePeriodSeconds = pointer.Int64(10) return template }(), }, "owner-references": { template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.OwnerReferences = []metav1.OwnerReference{ { APIVersion: "v1", @@ -128,7 +120,7 @@ func TestValidateClaimTemplate(t *testing.T) { }, "finalizers": { template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.Finalizers = []string{ "example.com/foo", } @@ -137,7 +129,7 @@ func TestValidateClaimTemplate(t *testing.T) { }, "managed-fields": { template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.ManagedFields = []metav1.ManagedFieldsEntry{ { FieldsType: "FieldsV1", @@ -151,7 +143,7 @@ func TestValidateClaimTemplate(t *testing.T) { }, "good-labels": { template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.Labels = map[string]string{ "apps.kubernetes.io/name": "test", } @@ -161,7 +153,7 @@ func TestValidateClaimTemplate(t *testing.T) { "bad-labels": { wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "labels"), badValue, "a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyValue', or 'my_value', or '12345', regex used for validation is '(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?')")}, template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.Labels = map[string]string{ "hello-world": badValue, } @@ -170,7 +162,7 @@ func TestValidateClaimTemplate(t *testing.T) { }, "good-annotations": { template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.Annotations = map[string]string{ "foo": "bar", } @@ -180,7 +172,7 @@ func TestValidateClaimTemplate(t *testing.T) { "bad-annotations": { wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "annotations"), badName, "name part must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]')")}, template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) + template := testClaimTemplate(goodName, goodNS, validClaimSpec) template.Annotations = map[string]string{ badName: "hello world", } @@ -188,63 +180,10 @@ func TestValidateClaimTemplate(t *testing.T) { }(), }, "bad-classname": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec", "spec", "resourceClassName"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, + wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec", "spec", "devices", "requests").Index(0).Child("deviceClassName"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) - template.Spec.Spec.ResourceClassName = badName - return template - }(), - }, - "good-parameters": { - template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) - template.Spec.Spec.ParametersRef = &resource.ResourceClaimParametersReference{ - Kind: "foo", - Name: "bar", - } - return template - }(), - }, - "good-parameters-apigroup": { - template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) - template.Spec.Spec.ParametersRef = &resource.ResourceClaimParametersReference{ - APIGroup: goodAPIGroup, - Kind: "foo", - Name: "bar", - } - return template - }(), - }, - "bad-parameters-apigroup": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec", "spec", "parametersRef", "apiGroup"), badAPIGroup, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) - template.Spec.Spec.ParametersRef = &resource.ResourceClaimParametersReference{ - APIGroup: badAPIGroup, - Kind: "foo", - Name: "bar", - } - return template - }(), - }, - "missing-parameters-kind": { - wantFailures: field.ErrorList{field.Required(field.NewPath("spec", "spec", "parametersRef", "kind"), "")}, - template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) - template.Spec.Spec.ParametersRef = &resource.ResourceClaimParametersReference{ - Name: "bar", - } - return template - }(), - }, - "missing-parameters-name": { - wantFailures: field.ErrorList{field.Required(field.NewPath("spec", "spec", "parametersRef", "name"), "")}, - template: func() *resource.ResourceClaimTemplate { - template := testClaimTemplate(goodName, goodNS, goodClaimSpec) - template.Spec.Spec.ParametersRef = &resource.ResourceClaimParametersReference{ - Kind: "foo", - } + template := testClaimTemplate(goodName, goodNS, validClaimSpec) + template.Spec.Spec.Devices.Requests[0].DeviceClassName = badName return template }(), }, @@ -252,22 +191,14 @@ func TestValidateClaimTemplate(t *testing.T) { for name, scenario := range scenarios { t.Run(name, func(t *testing.T) { - errs := ValidateClaimTemplate(scenario.template) + errs := ValidateResourceClaimTemplate(scenario.template) assert.Equal(t, scenario.wantFailures, errs) }) } } func TestValidateClaimTemplateUpdate(t *testing.T) { - name := "valid" - parameters := &resource.ResourceClaimParametersReference{ - Kind: "foo", - Name: "bar", - } - validClaimTemplate := testClaimTemplate("foo", "ns", resource.ResourceClaimSpec{ - ResourceClassName: name, - ParametersRef: parameters, - }) + validClaimTemplate := testClaimTemplate(goodName, goodNS, validClaimSpec) scenarios := map[string]struct { oldClaimTemplate *resource.ResourceClaimTemplate @@ -281,24 +212,12 @@ func TestValidateClaimTemplateUpdate(t *testing.T) { "invalid-update-class": { wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec"), func() resource.ResourceClaimTemplateSpec { spec := validClaimTemplate.Spec.DeepCopy() - spec.Spec.ResourceClassName += "2" + spec.Spec.Devices.Requests[0].DeviceClassName += "2" return *spec }(), "field is immutable")}, oldClaimTemplate: validClaimTemplate, update: func(template *resource.ResourceClaimTemplate) *resource.ResourceClaimTemplate { - template.Spec.Spec.ResourceClassName += "2" - return template - }, - }, - "invalid-update-remove-parameters": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec"), func() resource.ResourceClaimTemplateSpec { - spec := validClaimTemplate.Spec.DeepCopy() - spec.Spec.ParametersRef = nil - return *spec - }(), "field is immutable")}, - oldClaimTemplate: validClaimTemplate, - update: func(template *resource.ResourceClaimTemplate) *resource.ResourceClaimTemplate { - template.Spec.Spec.ParametersRef = nil + template.Spec.Spec.Devices.Requests[0].DeviceClassName += "2" return template }, }, @@ -307,7 +226,7 @@ func TestValidateClaimTemplateUpdate(t *testing.T) { for name, scenario := range scenarios { t.Run(name, func(t *testing.T) { scenario.oldClaimTemplate.ResourceVersion = "1" - errs := ValidateClaimTemplateUpdate(scenario.update(scenario.oldClaimTemplate.DeepCopy()), scenario.oldClaimTemplate) + errs := ValidateResourceClaimTemplateUpdate(scenario.update(scenario.oldClaimTemplate.DeepCopy()), scenario.oldClaimTemplate) assert.Equal(t, scenario.wantFailures, errs) }) } diff --git a/pkg/apis/resource/validation/validation_resourceclass_test.go b/pkg/apis/resource/validation/validation_resourceclass_test.go deleted file mode 100644 index e4de81d04e5..00000000000 --- a/pkg/apis/resource/validation/validation_resourceclass_test.go +++ /dev/null @@ -1,301 +0,0 @@ -/* -Copyright 2022 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 validation - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/validation/field" - "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/apis/resource" - "k8s.io/utils/pointer" -) - -func testClass(name, driverName string) *resource.ResourceClass { - return &resource.ResourceClass{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - DriverName: driverName, - } -} - -func TestValidateClass(t *testing.T) { - goodName := "foo" - now := metav1.Now() - goodParameters := resource.ResourceClassParametersReference{ - Name: "valid", - Namespace: "valid", - Kind: "foo", - } - badName := "!@#$%^" - badValue := "spaces not allowed" - badAPIGroup := "example.com/v1" - goodAPIGroup := "example.com" - - scenarios := map[string]struct { - class *resource.ResourceClass - wantFailures field.ErrorList - }{ - "good-class": { - class: testClass(goodName, goodName), - }, - "good-long-driver-name": { - class: testClass(goodName, "acme.example.com"), - }, - "missing-name": { - wantFailures: field.ErrorList{field.Required(field.NewPath("metadata", "name"), "name or generateName is required")}, - class: testClass("", goodName), - }, - "bad-name": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "name"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - class: testClass(badName, goodName), - }, - "generate-name": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.GenerateName = "pvc-" - return class - }(), - }, - "uid": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.UID = "ac051fac-2ead-46d9-b8b4-4e0fbeb7455d" - return class - }(), - }, - "resource-version": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.ResourceVersion = "1" - return class - }(), - }, - "generation": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.Generation = 100 - return class - }(), - }, - "creation-timestamp": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.CreationTimestamp = now - return class - }(), - }, - "deletion-grace-period-seconds": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.DeletionGracePeriodSeconds = pointer.Int64(10) - return class - }(), - }, - "owner-references": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.OwnerReferences = []metav1.OwnerReference{ - { - APIVersion: "v1", - Kind: "pod", - Name: "foo", - UID: "ac051fac-2ead-46d9-b8b4-4e0fbeb7455d", - }, - } - return class - }(), - }, - "finalizers": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.Finalizers = []string{ - "example.com/foo", - } - return class - }(), - }, - "managed-fields": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.ManagedFields = []metav1.ManagedFieldsEntry{ - { - FieldsType: "FieldsV1", - Operation: "Apply", - APIVersion: "apps/v1", - Manager: "foo", - }, - } - return class - }(), - }, - "good-labels": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.Labels = map[string]string{ - "apps.kubernetes.io/name": "test", - } - return class - }(), - }, - "bad-labels": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "labels"), badValue, "a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyValue', or 'my_value', or '12345', regex used for validation is '(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?')")}, - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.Labels = map[string]string{ - "hello-world": badValue, - } - return class - }(), - }, - "good-annotations": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.Annotations = map[string]string{ - "foo": "bar", - } - return class - }(), - }, - "bad-annotations": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "annotations"), badName, "name part must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]')")}, - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.Annotations = map[string]string{ - badName: "hello world", - } - return class - }(), - }, - "missing-driver-name": { - wantFailures: field.ErrorList{field.Required(field.NewPath("driverName"), ""), - field.Invalid(field.NewPath("driverName"), "", "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')"), - }, - class: testClass(goodName, ""), - }, - "invalid-driver-name": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("driverName"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - class: testClass(goodName, badName), - }, - "invalid-qualified-driver-name": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("driverName"), goodName+"/path", "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - class: testClass(goodName, goodName+"/path"), - }, - "good-parameters": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.ParametersRef = goodParameters.DeepCopy() - return class - }(), - }, - "good-parameters-apigroup": { - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.ParametersRef = goodParameters.DeepCopy() - class.ParametersRef.APIGroup = goodAPIGroup - return class - }(), - }, - "bad-parameters-apigroup": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("parametersRef", "apiGroup"), badAPIGroup, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.ParametersRef = goodParameters.DeepCopy() - class.ParametersRef.APIGroup = badAPIGroup - return class - }(), - }, - "missing-parameters-name": { - wantFailures: field.ErrorList{field.Required(field.NewPath("parametersRef", "name"), "")}, - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.ParametersRef = goodParameters.DeepCopy() - class.ParametersRef.Name = "" - return class - }(), - }, - "bad-parameters-namespace": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("parametersRef", "namespace"), badName, "a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')")}, - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.ParametersRef = goodParameters.DeepCopy() - class.ParametersRef.Namespace = badName - return class - }(), - }, - "missing-parameters-kind": { - wantFailures: field.ErrorList{field.Required(field.NewPath("parametersRef", "kind"), "")}, - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.ParametersRef = goodParameters.DeepCopy() - class.ParametersRef.Kind = "" - return class - }(), - }, - "invalid-node-selector": { - wantFailures: field.ErrorList{field.Required(field.NewPath("suitableNodes", "nodeSelectorTerms"), "must have at least one node selector term")}, - class: func() *resource.ResourceClass { - class := testClass(goodName, goodName) - class.SuitableNodes = &core.NodeSelector{ - // Must not be empty. - } - return class - }(), - }, - } - - for name, scenario := range scenarios { - t.Run(name, func(t *testing.T) { - errs := ValidateClass(scenario.class) - assert.Equal(t, scenario.wantFailures, errs) - }) - } -} - -func TestValidateClassUpdate(t *testing.T) { - validClass := testClass("foo", "valid") - - scenarios := map[string]struct { - oldClass *resource.ResourceClass - update func(class *resource.ResourceClass) *resource.ResourceClass - wantFailures field.ErrorList - }{ - "valid-no-op-update": { - oldClass: validClass, - update: func(class *resource.ResourceClass) *resource.ResourceClass { return class }, - }, - "update-driver": { - oldClass: validClass, - update: func(class *resource.ResourceClass) *resource.ResourceClass { - class.DriverName += "2" - return class - }, - }, - } - - for name, scenario := range scenarios { - t.Run(name, func(t *testing.T) { - scenario.oldClass.ResourceVersion = "1" - errs := ValidateClassUpdate(scenario.update(scenario.oldClass.DeepCopy()), scenario.oldClass) - assert.Equal(t, scenario.wantFailures, errs) - }) - } -} diff --git a/pkg/apis/resource/validation/validation_resourceclassparameters_test.go b/pkg/apis/resource/validation/validation_resourceclassparameters_test.go deleted file mode 100644 index 8286bf44d32..00000000000 --- a/pkg/apis/resource/validation/validation_resourceclassparameters_test.go +++ /dev/null @@ -1,313 +0,0 @@ -/* -Copyright 2022 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 validation - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/validation/field" - "k8s.io/kubernetes/pkg/apis/resource" - "k8s.io/utils/ptr" -) - -func testResourceClassParameters(name, namespace string, filters []resource.ResourceFilter) *resource.ResourceClassParameters { - return &resource.ResourceClassParameters{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Filters: filters, - } -} - -var goodFilters []resource.ResourceFilter - -func TestValidateResourceClassParameters(t *testing.T) { - goodName := "foo" - badName := "!@#$%^" - badValue := "spaces not allowed" - now := metav1.Now() - - scenarios := map[string]struct { - parameters *resource.ResourceClassParameters - wantFailures field.ErrorList - }{ - "good": { - parameters: testResourceClassParameters(goodName, goodName, goodFilters), - }, - "missing-name": { - wantFailures: field.ErrorList{field.Required(field.NewPath("metadata", "name"), "name or generateName is required")}, - parameters: testResourceClassParameters("", goodName, goodFilters), - }, - "missing-namespace": { - wantFailures: field.ErrorList{field.Required(field.NewPath("metadata", "namespace"), "")}, - parameters: testResourceClassParameters(goodName, "", goodFilters), - }, - "bad-name": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "name"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - parameters: testResourceClassParameters(badName, goodName, goodFilters), - }, - "bad-namespace": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "namespace"), badName, "a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')")}, - parameters: testResourceClassParameters(goodName, badName, goodFilters), - }, - "generate-name": { - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.GenerateName = "prefix-" - return parameters - }(), - }, - "uid": { - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.UID = "ac051fac-2ead-46d9-b8b4-4e0fbeb7455d" - return parameters - }(), - }, - "resource-version": { - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.ResourceVersion = "1" - return parameters - }(), - }, - "generation": { - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.Generation = 100 - return parameters - }(), - }, - "creation-timestamp": { - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.CreationTimestamp = now - return parameters - }(), - }, - "deletion-grace-period-seconds": { - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.DeletionGracePeriodSeconds = ptr.To[int64](10) - return parameters - }(), - }, - "owner-references": { - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.OwnerReferences = []metav1.OwnerReference{ - { - APIVersion: "v1", - Kind: "pod", - Name: "foo", - UID: "ac051fac-2ead-46d9-b8b4-4e0fbeb7455d", - }, - } - return parameters - }(), - }, - "finalizers": { - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.Finalizers = []string{ - "example.com/foo", - } - return parameters - }(), - }, - "managed-fields": { - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.ManagedFields = []metav1.ManagedFieldsEntry{ - { - FieldsType: "FieldsV1", - Operation: "Apply", - APIVersion: "apps/v1", - Manager: "foo", - }, - } - return parameters - }(), - }, - "good-labels": { - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.Labels = map[string]string{ - "apps.kubernetes.io/name": "test", - } - return parameters - }(), - }, - "bad-labels": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "labels"), badValue, "a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyValue', or 'my_value', or '12345', regex used for validation is '(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?')")}, - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.Labels = map[string]string{ - "hello-world": badValue, - } - return parameters - }(), - }, - "good-annotations": { - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.Annotations = map[string]string{ - "foo": "bar", - } - return parameters - }(), - }, - "bad-annotations": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "annotations"), badName, "name part must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]')")}, - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.Annotations = map[string]string{ - badName: "hello world", - } - return parameters - }(), - }, - - "empty-model": { - wantFailures: field.ErrorList{field.Required(field.NewPath("filters").Index(0), "exactly one structured model field must be set")}, - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.Filters = []resource.ResourceFilter{{DriverName: goodName}} - return parameters - }(), - }, - - "filters-invalid-driver": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("filters").Index(1).Child("driverName"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.Filters = []resource.ResourceFilter{ - { - DriverName: goodName, - ResourceFilterModel: resource.ResourceFilterModel{ - NamedResources: &resource.NamedResourcesFilter{Selector: "true"}, - }, - }, - { - DriverName: badName, - ResourceFilterModel: resource.ResourceFilterModel{ - NamedResources: &resource.NamedResourcesFilter{Selector: "true"}, - }, - }, - } - return parameters - }(), - }, - - "filters-duplicate-driver": { - wantFailures: field.ErrorList{field.Duplicate(field.NewPath("filters").Index(1).Child("driverName"), goodName)}, - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.Filters = []resource.ResourceFilter{ - { - DriverName: goodName, - ResourceFilterModel: resource.ResourceFilterModel{ - NamedResources: &resource.NamedResourcesFilter{Selector: "true"}, - }, - }, - { - DriverName: goodName, - ResourceFilterModel: resource.ResourceFilterModel{ - NamedResources: &resource.NamedResourcesFilter{Selector: "true"}, - }, - }, - } - return parameters - }(), - }, - - "parameters-invalid-driver": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("vendorParameters").Index(1).Child("driverName"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.VendorParameters = []resource.VendorParameters{ - { - DriverName: goodName, - }, - { - DriverName: badName, - }, - } - return parameters - }(), - }, - - "parameters-duplicate-driver": { - wantFailures: field.ErrorList{field.Duplicate(field.NewPath("vendorParameters").Index(1).Child("driverName"), goodName)}, - parameters: func() *resource.ResourceClassParameters { - parameters := testResourceClassParameters(goodName, goodName, goodFilters) - parameters.VendorParameters = []resource.VendorParameters{ - { - DriverName: goodName, - }, - { - DriverName: goodName, - }, - } - return parameters - }(), - }, - } - - for name, scenario := range scenarios { - t.Run(name, func(t *testing.T) { - errs := ValidateResourceClassParameters(scenario.parameters) - assert.Equal(t, scenario.wantFailures, errs) - }) - } -} - -func TestValidateResourceClassParametersUpdate(t *testing.T) { - name := "valid" - validResourceClassParameters := testResourceClassParameters(name, name, nil) - - scenarios := map[string]struct { - oldResourceClassParameters *resource.ResourceClassParameters - update func(class *resource.ResourceClassParameters) *resource.ResourceClassParameters - wantFailures field.ErrorList - }{ - "valid-no-op-update": { - oldResourceClassParameters: validResourceClassParameters, - update: func(class *resource.ResourceClassParameters) *resource.ResourceClassParameters { return class }, - }, - "invalid-name-update": { - oldResourceClassParameters: validResourceClassParameters, - update: func(class *resource.ResourceClassParameters) *resource.ResourceClassParameters { - class.Name += "-update" - return class - }, - wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "name"), name+"-update", "field is immutable")}, - }, - } - - for name, scenario := range scenarios { - t.Run(name, func(t *testing.T) { - scenario.oldResourceClassParameters.ResourceVersion = "1" - errs := ValidateResourceClassParametersUpdate(scenario.update(scenario.oldResourceClassParameters.DeepCopy()), scenario.oldResourceClassParameters) - assert.Equal(t, scenario.wantFailures, errs) - }) - } -} diff --git a/pkg/apis/resource/validation/validation_resourceslice_test.go b/pkg/apis/resource/validation/validation_resourceslice_test.go index 8e68fdcefb2..5b5bd66c574 100644 --- a/pkg/apis/resource/validation/validation_resourceslice_test.go +++ b/pkg/apis/resource/validation/validation_resourceslice_test.go @@ -32,10 +32,13 @@ func testResourceSlice(name, nodeName, driverName string) *resource.ResourceSlic ObjectMeta: metav1.ObjectMeta{ Name: name, }, - NodeName: nodeName, - DriverName: driverName, - ResourceModel: resource.ResourceModel{ - NamedResources: &resource.NamedResourcesResources{}, + Spec: resource.ResourceSliceSpec{ + NodeName: nodeName, + Driver: driverName, + Pool: resource.ResourcePool{ + Name: nodeName, + ResourceSliceCount: 1, + }, }, } } @@ -180,22 +183,24 @@ func TestValidateResourceSlice(t *testing.T) { }(), }, "bad-nodename": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("nodeName"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, - slice: testResourceSlice(goodName, badName, driverName), + wantFailures: field.ErrorList{ + field.Invalid(field.NewPath("spec", "pool", "name"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')"), + field.Invalid(field.NewPath("spec", "nodeName"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')"), + }, + slice: testResourceSlice(goodName, badName, driverName), + }, + "bad-multi-pool-name": { + wantFailures: field.ErrorList{ + field.Invalid(field.NewPath("spec", "pool", "name"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')"), + field.Invalid(field.NewPath("spec", "pool", "name"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')"), + field.Invalid(field.NewPath("spec", "nodeName"), badName+"/"+badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')"), + }, + slice: testResourceSlice(goodName, badName+"/"+badName, driverName), }, "bad-drivername": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("driverName"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, + wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec", "driver"), badName, "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')")}, slice: testResourceSlice(goodName, goodName, badName), }, - - "empty-model": { - wantFailures: field.ErrorList{field.Required(nil, "exactly one structured model field must be set")}, - slice: func() *resource.ResourceSlice { - slice := testResourceSlice(goodName, goodName, driverName) - slice.ResourceModel = resource.ResourceModel{} - return slice - }(), - }, } for name, scenario := range scenarios { @@ -228,18 +233,26 @@ func TestValidateResourceSliceUpdate(t *testing.T) { wantFailures: field.ErrorList{field.Invalid(field.NewPath("metadata", "name"), name+"-update", "field is immutable")}, }, "invalid-update-nodename": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("nodeName"), name+"-updated", "field is immutable")}, + wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec", "nodeName"), name+"-updated", "field is immutable")}, oldResourceSlice: validResourceSlice, update: func(slice *resource.ResourceSlice) *resource.ResourceSlice { - slice.NodeName += "-updated" + slice.Spec.NodeName += "-updated" return slice }, }, "invalid-update-drivername": { - wantFailures: field.ErrorList{field.Invalid(field.NewPath("driverName"), name+"-updated", "field is immutable")}, + wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec", "driver"), name+"-updated", "field is immutable")}, oldResourceSlice: validResourceSlice, update: func(slice *resource.ResourceSlice) *resource.ResourceSlice { - slice.DriverName += "-updated" + slice.Spec.Driver += "-updated" + return slice + }, + }, + "invalid-update-pool": { + wantFailures: field.ErrorList{field.Invalid(field.NewPath("spec", "pool", "name"), validResourceSlice.Spec.Pool.Name+"-updated", "field is immutable")}, + oldResourceSlice: validResourceSlice, + update: func(slice *resource.ResourceSlice) *resource.ResourceSlice { + slice.Spec.Pool.Name += "-updated" return slice }, }, diff --git a/pkg/apis/resource/zz_generated.deepcopy.go b/pkg/apis/resource/zz_generated.deepcopy.go index ec26381c01b..54b43208f40 100644 --- a/pkg/apis/resource/zz_generated.deepcopy.go +++ b/pkg/apis/resource/zz_generated.deepcopy.go @@ -22,6 +22,7 @@ limitations under the License. package resource import ( + apiresource "k8s.io/apimachinery/pkg/api/resource" runtime "k8s.io/apimachinery/pkg/runtime" core "k8s.io/kubernetes/pkg/apis/core" ) @@ -29,15 +30,9 @@ import ( // 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 - if in.ResourceHandles != nil { - in, out := &in.ResourceHandles, &out.ResourceHandles - *out = make([]ResourceHandle, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.AvailableOnNodes != nil { - in, out := &in.AvailableOnNodes, &out.AvailableOnNodes + in.Devices.DeepCopyInto(&out.Devices) + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector *out = new(core.NodeSelector) (*in).DeepCopyInto(*out) } @@ -55,55 +50,105 @@ func (in *AllocationResult) DeepCopy() *AllocationResult { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AllocationResultModel) DeepCopyInto(out *AllocationResultModel) { +func (in *BasicDevice) DeepCopyInto(out *BasicDevice) { *out = *in - if in.NamedResources != nil { - in, out := &in.NamedResources, &out.NamedResources - *out = new(NamedResourcesAllocationResult) - **out = **in + if in.Attributes != nil { + in, out := &in.Attributes, &out.Attributes + *out = make(map[QualifiedName]DeviceAttribute, len(*in)) + for key, val := range *in { + (*out)[key] = *val.DeepCopy() + } + } + if in.Capacity != nil { + in, out := &in.Capacity, &out.Capacity + *out = make(map[QualifiedName]apiresource.Quantity, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AllocationResultModel. -func (in *AllocationResultModel) DeepCopy() *AllocationResultModel { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BasicDevice. +func (in *BasicDevice) DeepCopy() *BasicDevice { if in == nil { return nil } - out := new(AllocationResultModel) + out := new(BasicDevice) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DriverAllocationResult) DeepCopyInto(out *DriverAllocationResult) { +func (in *CELDeviceSelector) DeepCopyInto(out *CELDeviceSelector) { *out = *in - if in.VendorRequestParameters != nil { - out.VendorRequestParameters = in.VendorRequestParameters.DeepCopyObject() - } - in.AllocationResultModel.DeepCopyInto(&out.AllocationResultModel) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DriverAllocationResult. -func (in *DriverAllocationResult) DeepCopy() *DriverAllocationResult { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CELDeviceSelector. +func (in *CELDeviceSelector) DeepCopy() *CELDeviceSelector { if in == nil { return nil } - out := new(DriverAllocationResult) + out := new(CELDeviceSelector) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DriverRequests) DeepCopyInto(out *DriverRequests) { +func (in *Device) DeepCopyInto(out *Device) { *out = *in - if in.VendorParameters != nil { - out.VendorParameters = in.VendorParameters.DeepCopyObject() + if in.Basic != nil { + in, out := &in.Basic, &out.Basic + *out = new(BasicDevice) + (*in).DeepCopyInto(*out) } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Device. +func (in *Device) DeepCopy() *Device { + if in == nil { + return nil + } + out := new(Device) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceAllocationConfiguration) DeepCopyInto(out *DeviceAllocationConfiguration) { + *out = *in if in.Requests != nil { in, out := &in.Requests, &out.Requests - *out = make([]ResourceRequest, len(*in)) + *out = make([]string, len(*in)) + copy(*out, *in) + } + in.DeviceConfiguration.DeepCopyInto(&out.DeviceConfiguration) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceAllocationConfiguration. +func (in *DeviceAllocationConfiguration) DeepCopy() *DeviceAllocationConfiguration { + if in == nil { + return nil + } + out := new(DeviceAllocationConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceAllocationResult) DeepCopyInto(out *DeviceAllocationResult) { + *out = *in + if in.Results != nil { + in, out := &in.Results, &out.Results + *out = make([]DeviceRequestAllocationResult, len(*in)) + copy(*out, *in) + } + if in.Config != nil { + in, out := &in.Config, &out.Config + *out = make([]DeviceAllocationConfiguration, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -111,82 +156,34 @@ func (in *DriverRequests) DeepCopyInto(out *DriverRequests) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DriverRequests. -func (in *DriverRequests) DeepCopy() *DriverRequests { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceAllocationResult. +func (in *DeviceAllocationResult) DeepCopy() *DeviceAllocationResult { if in == nil { return nil } - out := new(DriverRequests) + out := new(DeviceAllocationResult) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesAllocationResult) DeepCopyInto(out *NamedResourcesAllocationResult) { +func (in *DeviceAttribute) DeepCopyInto(out *DeviceAttribute) { *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesAllocationResult. -func (in *NamedResourcesAllocationResult) DeepCopy() *NamedResourcesAllocationResult { - if in == nil { - return nil - } - out := new(NamedResourcesAllocationResult) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesAttribute) DeepCopyInto(out *NamedResourcesAttribute) { - *out = *in - in.NamedResourcesAttributeValue.DeepCopyInto(&out.NamedResourcesAttributeValue) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesAttribute. -func (in *NamedResourcesAttribute) DeepCopy() *NamedResourcesAttribute { - if in == nil { - return nil - } - out := new(NamedResourcesAttribute) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesAttributeValue) DeepCopyInto(out *NamedResourcesAttributeValue) { - *out = *in - if in.QuantityValue != nil { - in, out := &in.QuantityValue, &out.QuantityValue - x := (*in).DeepCopy() - *out = &x + if in.IntValue != nil { + in, out := &in.IntValue, &out.IntValue + *out = new(int64) + **out = **in } if in.BoolValue != nil { in, out := &in.BoolValue, &out.BoolValue *out = new(bool) **out = **in } - if in.IntValue != nil { - in, out := &in.IntValue, &out.IntValue - *out = new(int64) - **out = **in - } - if in.IntSliceValue != nil { - in, out := &in.IntSliceValue, &out.IntSliceValue - *out = new(NamedResourcesIntSlice) - (*in).DeepCopyInto(*out) - } if in.StringValue != nil { in, out := &in.StringValue, &out.StringValue *out = new(string) **out = **in } - if in.StringSliceValue != nil { - in, out := &in.StringSliceValue, &out.StringSliceValue - *out = new(NamedResourcesStringSlice) - (*in).DeepCopyInto(*out) - } if in.VersionValue != nil { in, out := &in.VersionValue, &out.VersionValue *out = new(string) @@ -195,38 +192,36 @@ func (in *NamedResourcesAttributeValue) DeepCopyInto(out *NamedResourcesAttribut return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesAttributeValue. -func (in *NamedResourcesAttributeValue) DeepCopy() *NamedResourcesAttributeValue { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceAttribute. +func (in *DeviceAttribute) DeepCopy() *DeviceAttribute { if in == nil { return nil } - out := new(NamedResourcesAttributeValue) + out := new(DeviceAttribute) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesFilter) DeepCopyInto(out *NamedResourcesFilter) { +func (in *DeviceClaim) DeepCopyInto(out *DeviceClaim) { *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesFilter. -func (in *NamedResourcesFilter) DeepCopy() *NamedResourcesFilter { - if in == nil { - return nil + if in.Requests != nil { + in, out := &in.Requests, &out.Requests + *out = make([]DeviceRequest, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } - out := new(NamedResourcesFilter) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesInstance) DeepCopyInto(out *NamedResourcesInstance) { - *out = *in - if in.Attributes != nil { - in, out := &in.Attributes, &out.Attributes - *out = make([]NamedResourcesAttribute, len(*in)) + if in.Constraints != nil { + in, out := &in.Constraints, &out.Constraints + *out = make([]DeviceConstraint, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Config != nil { + in, out := &in.Config, &out.Config + *out = make([]DeviceClaimConfiguration, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -234,93 +229,270 @@ func (in *NamedResourcesInstance) DeepCopyInto(out *NamedResourcesInstance) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesInstance. -func (in *NamedResourcesInstance) DeepCopy() *NamedResourcesInstance { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClaim. +func (in *DeviceClaim) DeepCopy() *DeviceClaim { if in == nil { return nil } - out := new(NamedResourcesInstance) + out := new(DeviceClaim) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesIntSlice) DeepCopyInto(out *NamedResourcesIntSlice) { +func (in *DeviceClaimConfiguration) DeepCopyInto(out *DeviceClaimConfiguration) { *out = *in - if in.Ints != nil { - in, out := &in.Ints, &out.Ints - *out = make([]int64, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesIntSlice. -func (in *NamedResourcesIntSlice) DeepCopy() *NamedResourcesIntSlice { - if in == nil { - return nil - } - out := new(NamedResourcesIntSlice) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesRequest) DeepCopyInto(out *NamedResourcesRequest) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesRequest. -func (in *NamedResourcesRequest) DeepCopy() *NamedResourcesRequest { - if in == nil { - return nil - } - out := new(NamedResourcesRequest) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesResources) DeepCopyInto(out *NamedResourcesResources) { - *out = *in - if in.Instances != nil { - in, out := &in.Instances, &out.Instances - *out = make([]NamedResourcesInstance, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesResources. -func (in *NamedResourcesResources) DeepCopy() *NamedResourcesResources { - if in == nil { - return nil - } - out := new(NamedResourcesResources) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesStringSlice) DeepCopyInto(out *NamedResourcesStringSlice) { - *out = *in - if in.Strings != nil { - in, out := &in.Strings, &out.Strings + if in.Requests != nil { + in, out := &in.Requests, &out.Requests *out = make([]string, len(*in)) copy(*out, *in) } + in.DeviceConfiguration.DeepCopyInto(&out.DeviceConfiguration) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesStringSlice. -func (in *NamedResourcesStringSlice) DeepCopy() *NamedResourcesStringSlice { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClaimConfiguration. +func (in *DeviceClaimConfiguration) DeepCopy() *DeviceClaimConfiguration { if in == nil { return nil } - out := new(NamedResourcesStringSlice) + out := new(DeviceClaimConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceClass) DeepCopyInto(out *DeviceClass) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClass. +func (in *DeviceClass) DeepCopy() *DeviceClass { + if in == nil { + return nil + } + out := new(DeviceClass) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *DeviceClass) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceClassConfiguration) DeepCopyInto(out *DeviceClassConfiguration) { + *out = *in + in.DeviceConfiguration.DeepCopyInto(&out.DeviceConfiguration) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClassConfiguration. +func (in *DeviceClassConfiguration) DeepCopy() *DeviceClassConfiguration { + if in == nil { + return nil + } + out := new(DeviceClassConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceClassList) DeepCopyInto(out *DeviceClassList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]DeviceClass, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClassList. +func (in *DeviceClassList) DeepCopy() *DeviceClassList { + if in == nil { + return nil + } + out := new(DeviceClassList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *DeviceClassList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceClassSpec) DeepCopyInto(out *DeviceClassSpec) { + *out = *in + if in.Selectors != nil { + in, out := &in.Selectors, &out.Selectors + *out = make([]DeviceSelector, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Config != nil { + in, out := &in.Config, &out.Config + *out = make([]DeviceClassConfiguration, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.SuitableNodes != nil { + in, out := &in.SuitableNodes, &out.SuitableNodes + *out = new(core.NodeSelector) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClassSpec. +func (in *DeviceClassSpec) DeepCopy() *DeviceClassSpec { + if in == nil { + return nil + } + out := new(DeviceClassSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceConfiguration) DeepCopyInto(out *DeviceConfiguration) { + *out = *in + if in.Opaque != nil { + in, out := &in.Opaque, &out.Opaque + *out = new(OpaqueDeviceConfiguration) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceConfiguration. +func (in *DeviceConfiguration) DeepCopy() *DeviceConfiguration { + if in == nil { + return nil + } + out := new(DeviceConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceConstraint) DeepCopyInto(out *DeviceConstraint) { + *out = *in + if in.Requests != nil { + in, out := &in.Requests, &out.Requests + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.MatchAttribute != nil { + in, out := &in.MatchAttribute, &out.MatchAttribute + *out = new(FullyQualifiedName) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceConstraint. +func (in *DeviceConstraint) DeepCopy() *DeviceConstraint { + if in == nil { + return nil + } + out := new(DeviceConstraint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceRequest) DeepCopyInto(out *DeviceRequest) { + *out = *in + if in.Selectors != nil { + in, out := &in.Selectors, &out.Selectors + *out = make([]DeviceSelector, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceRequest. +func (in *DeviceRequest) DeepCopy() *DeviceRequest { + if in == nil { + return nil + } + out := new(DeviceRequest) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceRequestAllocationResult) DeepCopyInto(out *DeviceRequestAllocationResult) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceRequestAllocationResult. +func (in *DeviceRequestAllocationResult) DeepCopy() *DeviceRequestAllocationResult { + if in == nil { + return nil + } + out := new(DeviceRequestAllocationResult) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceSelector) DeepCopyInto(out *DeviceSelector) { + *out = *in + if in.CEL != nil { + in, out := &in.CEL, &out.CEL + *out = new(CELDeviceSelector) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceSelector. +func (in *DeviceSelector) DeepCopy() *DeviceSelector { + if in == nil { + return nil + } + out := new(DeviceSelector) + 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 + in.Parameters.DeepCopyInto(&out.Parameters) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpaqueDeviceConfiguration. +func (in *OpaqueDeviceConfiguration) DeepCopy() *OpaqueDeviceConfiguration { + if in == nil { + return nil + } + out := new(OpaqueDeviceConfiguration) in.DeepCopyInto(out) return out } @@ -507,93 +679,6 @@ func (in *ResourceClaimList) DeepCopyObject() runtime.Object { return nil } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClaimParameters) DeepCopyInto(out *ResourceClaimParameters) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.GeneratedFrom != nil { - in, out := &in.GeneratedFrom, &out.GeneratedFrom - *out = new(ResourceClaimParametersReference) - **out = **in - } - if in.DriverRequests != nil { - in, out := &in.DriverRequests, &out.DriverRequests - *out = make([]DriverRequests, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClaimParameters. -func (in *ResourceClaimParameters) DeepCopy() *ResourceClaimParameters { - if in == nil { - return nil - } - out := new(ResourceClaimParameters) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClaimParameters) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClaimParametersList) DeepCopyInto(out *ResourceClaimParametersList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ResourceClaimParameters, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClaimParametersList. -func (in *ResourceClaimParametersList) DeepCopy() *ResourceClaimParametersList { - if in == nil { - return nil - } - out := new(ResourceClaimParametersList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClaimParametersList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClaimParametersReference) DeepCopyInto(out *ResourceClaimParametersReference) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClaimParametersReference. -func (in *ResourceClaimParametersReference) DeepCopy() *ResourceClaimParametersReference { - if in == nil { - return nil - } - out := new(ResourceClaimParametersReference) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ResourceClaimSchedulingStatus) DeepCopyInto(out *ResourceClaimSchedulingStatus) { *out = *in @@ -618,11 +703,7 @@ func (in *ResourceClaimSchedulingStatus) DeepCopy() *ResourceClaimSchedulingStat // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ResourceClaimSpec) DeepCopyInto(out *ResourceClaimSpec) { *out = *in - if in.ParametersRef != nil { - in, out := &in.ParametersRef, &out.ParametersRef - *out = new(ResourceClaimParametersReference) - **out = **in - } + in.Devices.DeepCopyInto(&out.Devices) return } @@ -741,290 +822,17 @@ func (in *ResourceClaimTemplateSpec) DeepCopy() *ResourceClaimTemplateSpec { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClass) DeepCopyInto(out *ResourceClass) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.ParametersRef != nil { - in, out := &in.ParametersRef, &out.ParametersRef - *out = new(ResourceClassParametersReference) - **out = **in - } - if in.SuitableNodes != nil { - in, out := &in.SuitableNodes, &out.SuitableNodes - *out = new(core.NodeSelector) - (*in).DeepCopyInto(*out) - } - if in.StructuredParameters != nil { - in, out := &in.StructuredParameters, &out.StructuredParameters - *out = new(bool) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClass. -func (in *ResourceClass) DeepCopy() *ResourceClass { - if in == nil { - return nil - } - out := new(ResourceClass) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClass) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClassList) DeepCopyInto(out *ResourceClassList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ResourceClass, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClassList. -func (in *ResourceClassList) DeepCopy() *ResourceClassList { - if in == nil { - return nil - } - out := new(ResourceClassList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClassList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClassParameters) DeepCopyInto(out *ResourceClassParameters) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.GeneratedFrom != nil { - in, out := &in.GeneratedFrom, &out.GeneratedFrom - *out = new(ResourceClassParametersReference) - **out = **in - } - if in.VendorParameters != nil { - in, out := &in.VendorParameters, &out.VendorParameters - *out = make([]VendorParameters, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Filters != nil { - in, out := &in.Filters, &out.Filters - *out = make([]ResourceFilter, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClassParameters. -func (in *ResourceClassParameters) DeepCopy() *ResourceClassParameters { - if in == nil { - return nil - } - out := new(ResourceClassParameters) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClassParameters) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClassParametersList) DeepCopyInto(out *ResourceClassParametersList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ResourceClassParameters, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClassParametersList. -func (in *ResourceClassParametersList) DeepCopy() *ResourceClassParametersList { - if in == nil { - return nil - } - out := new(ResourceClassParametersList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClassParametersList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClassParametersReference) DeepCopyInto(out *ResourceClassParametersReference) { +func (in *ResourcePool) DeepCopyInto(out *ResourcePool) { *out = *in return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClassParametersReference. -func (in *ResourceClassParametersReference) DeepCopy() *ResourceClassParametersReference { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourcePool. +func (in *ResourcePool) DeepCopy() *ResourcePool { if in == nil { return nil } - out := new(ResourceClassParametersReference) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceFilter) DeepCopyInto(out *ResourceFilter) { - *out = *in - in.ResourceFilterModel.DeepCopyInto(&out.ResourceFilterModel) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceFilter. -func (in *ResourceFilter) DeepCopy() *ResourceFilter { - if in == nil { - return nil - } - out := new(ResourceFilter) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceFilterModel) DeepCopyInto(out *ResourceFilterModel) { - *out = *in - if in.NamedResources != nil { - in, out := &in.NamedResources, &out.NamedResources - *out = new(NamedResourcesFilter) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceFilterModel. -func (in *ResourceFilterModel) DeepCopy() *ResourceFilterModel { - if in == nil { - return nil - } - out := new(ResourceFilterModel) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceHandle) DeepCopyInto(out *ResourceHandle) { - *out = *in - if in.StructuredData != nil { - in, out := &in.StructuredData, &out.StructuredData - *out = new(StructuredResourceHandle) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceHandle. -func (in *ResourceHandle) DeepCopy() *ResourceHandle { - if in == nil { - return nil - } - out := new(ResourceHandle) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceModel) DeepCopyInto(out *ResourceModel) { - *out = *in - if in.NamedResources != nil { - in, out := &in.NamedResources, &out.NamedResources - *out = new(NamedResourcesResources) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceModel. -func (in *ResourceModel) DeepCopy() *ResourceModel { - if in == nil { - return nil - } - out := new(ResourceModel) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceRequest) DeepCopyInto(out *ResourceRequest) { - *out = *in - if in.VendorParameters != nil { - out.VendorParameters = in.VendorParameters.DeepCopyObject() - } - in.ResourceRequestModel.DeepCopyInto(&out.ResourceRequestModel) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceRequest. -func (in *ResourceRequest) DeepCopy() *ResourceRequest { - if in == nil { - return nil - } - out := new(ResourceRequest) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceRequestModel) DeepCopyInto(out *ResourceRequestModel) { - *out = *in - if in.NamedResources != nil { - in, out := &in.NamedResources, &out.NamedResources - *out = new(NamedResourcesRequest) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceRequestModel. -func (in *ResourceRequestModel) DeepCopy() *ResourceRequestModel { - if in == nil { - return nil - } - out := new(ResourceRequestModel) + out := new(ResourcePool) in.DeepCopyInto(out) return out } @@ -1034,7 +842,7 @@ func (in *ResourceSlice) DeepCopyInto(out *ResourceSlice) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.ResourceModel.DeepCopyInto(&out.ResourceModel) + in.Spec.DeepCopyInto(&out.Spec) return } @@ -1090,17 +898,17 @@ func (in *ResourceSliceList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *StructuredResourceHandle) DeepCopyInto(out *StructuredResourceHandle) { +func (in *ResourceSliceSpec) DeepCopyInto(out *ResourceSliceSpec) { *out = *in - if in.VendorClassParameters != nil { - out.VendorClassParameters = in.VendorClassParameters.DeepCopyObject() + out.Pool = in.Pool + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = new(core.NodeSelector) + (*in).DeepCopyInto(*out) } - if in.VendorClaimParameters != nil { - out.VendorClaimParameters = in.VendorClaimParameters.DeepCopyObject() - } - if in.Results != nil { - in, out := &in.Results, &out.Results - *out = make([]DriverAllocationResult, len(*in)) + if in.Devices != nil { + in, out := &in.Devices, &out.Devices + *out = make([]Device, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -1108,31 +916,12 @@ func (in *StructuredResourceHandle) DeepCopyInto(out *StructuredResourceHandle) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StructuredResourceHandle. -func (in *StructuredResourceHandle) DeepCopy() *StructuredResourceHandle { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceSliceSpec. +func (in *ResourceSliceSpec) DeepCopy() *ResourceSliceSpec { if in == nil { return nil } - out := new(StructuredResourceHandle) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VendorParameters) DeepCopyInto(out *VendorParameters) { - *out = *in - if in.Parameters != nil { - out.Parameters = in.Parameters.DeepCopyObject() - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VendorParameters. -func (in *VendorParameters) DeepCopy() *VendorParameters { - if in == nil { - return nil - } - out := new(VendorParameters) + out := new(ResourceSliceSpec) in.DeepCopyInto(out) return out } diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index b0293ba5ccf..368fab102db 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -887,18 +887,24 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "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.AllocationResult": schema_k8sio_api_resource_v1alpha3_AllocationResult(ref), - "k8s.io/api/resource/v1alpha3.AllocationResultModel": schema_k8sio_api_resource_v1alpha3_AllocationResultModel(ref), - "k8s.io/api/resource/v1alpha3.DriverAllocationResult": schema_k8sio_api_resource_v1alpha3_DriverAllocationResult(ref), - "k8s.io/api/resource/v1alpha3.DriverRequests": schema_k8sio_api_resource_v1alpha3_DriverRequests(ref), - "k8s.io/api/resource/v1alpha3.NamedResourcesAllocationResult": schema_k8sio_api_resource_v1alpha3_NamedResourcesAllocationResult(ref), - "k8s.io/api/resource/v1alpha3.NamedResourcesAttribute": schema_k8sio_api_resource_v1alpha3_NamedResourcesAttribute(ref), - "k8s.io/api/resource/v1alpha3.NamedResourcesAttributeValue": schema_k8sio_api_resource_v1alpha3_NamedResourcesAttributeValue(ref), - "k8s.io/api/resource/v1alpha3.NamedResourcesFilter": schema_k8sio_api_resource_v1alpha3_NamedResourcesFilter(ref), - "k8s.io/api/resource/v1alpha3.NamedResourcesInstance": schema_k8sio_api_resource_v1alpha3_NamedResourcesInstance(ref), - "k8s.io/api/resource/v1alpha3.NamedResourcesIntSlice": schema_k8sio_api_resource_v1alpha3_NamedResourcesIntSlice(ref), - "k8s.io/api/resource/v1alpha3.NamedResourcesRequest": schema_k8sio_api_resource_v1alpha3_NamedResourcesRequest(ref), - "k8s.io/api/resource/v1alpha3.NamedResourcesResources": schema_k8sio_api_resource_v1alpha3_NamedResourcesResources(ref), - "k8s.io/api/resource/v1alpha3.NamedResourcesStringSlice": schema_k8sio_api_resource_v1alpha3_NamedResourcesStringSlice(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), + "k8s.io/api/resource/v1alpha3.Device": schema_k8sio_api_resource_v1alpha3_Device(ref), + "k8s.io/api/resource/v1alpha3.DeviceAllocationConfiguration": schema_k8sio_api_resource_v1alpha3_DeviceAllocationConfiguration(ref), + "k8s.io/api/resource/v1alpha3.DeviceAllocationResult": schema_k8sio_api_resource_v1alpha3_DeviceAllocationResult(ref), + "k8s.io/api/resource/v1alpha3.DeviceAttribute": schema_k8sio_api_resource_v1alpha3_DeviceAttribute(ref), + "k8s.io/api/resource/v1alpha3.DeviceClaim": schema_k8sio_api_resource_v1alpha3_DeviceClaim(ref), + "k8s.io/api/resource/v1alpha3.DeviceClaimConfiguration": schema_k8sio_api_resource_v1alpha3_DeviceClaimConfiguration(ref), + "k8s.io/api/resource/v1alpha3.DeviceClass": schema_k8sio_api_resource_v1alpha3_DeviceClass(ref), + "k8s.io/api/resource/v1alpha3.DeviceClassConfiguration": schema_k8sio_api_resource_v1alpha3_DeviceClassConfiguration(ref), + "k8s.io/api/resource/v1alpha3.DeviceClassList": schema_k8sio_api_resource_v1alpha3_DeviceClassList(ref), + "k8s.io/api/resource/v1alpha3.DeviceClassSpec": schema_k8sio_api_resource_v1alpha3_DeviceClassSpec(ref), + "k8s.io/api/resource/v1alpha3.DeviceConfiguration": schema_k8sio_api_resource_v1alpha3_DeviceConfiguration(ref), + "k8s.io/api/resource/v1alpha3.DeviceConstraint": schema_k8sio_api_resource_v1alpha3_DeviceConstraint(ref), + "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.OpaqueDeviceConfiguration": schema_k8sio_api_resource_v1alpha3_OpaqueDeviceConfiguration(ref), "k8s.io/api/resource/v1alpha3.PodSchedulingContext": schema_k8sio_api_resource_v1alpha3_PodSchedulingContext(ref), "k8s.io/api/resource/v1alpha3.PodSchedulingContextList": schema_k8sio_api_resource_v1alpha3_PodSchedulingContextList(ref), "k8s.io/api/resource/v1alpha3.PodSchedulingContextSpec": schema_k8sio_api_resource_v1alpha3_PodSchedulingContextSpec(ref), @@ -906,30 +912,16 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "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), "k8s.io/api/resource/v1alpha3.ResourceClaimList": schema_k8sio_api_resource_v1alpha3_ResourceClaimList(ref), - "k8s.io/api/resource/v1alpha3.ResourceClaimParameters": schema_k8sio_api_resource_v1alpha3_ResourceClaimParameters(ref), - "k8s.io/api/resource/v1alpha3.ResourceClaimParametersList": schema_k8sio_api_resource_v1alpha3_ResourceClaimParametersList(ref), - "k8s.io/api/resource/v1alpha3.ResourceClaimParametersReference": schema_k8sio_api_resource_v1alpha3_ResourceClaimParametersReference(ref), "k8s.io/api/resource/v1alpha3.ResourceClaimSchedulingStatus": schema_k8sio_api_resource_v1alpha3_ResourceClaimSchedulingStatus(ref), "k8s.io/api/resource/v1alpha3.ResourceClaimSpec": schema_k8sio_api_resource_v1alpha3_ResourceClaimSpec(ref), "k8s.io/api/resource/v1alpha3.ResourceClaimStatus": schema_k8sio_api_resource_v1alpha3_ResourceClaimStatus(ref), "k8s.io/api/resource/v1alpha3.ResourceClaimTemplate": schema_k8sio_api_resource_v1alpha3_ResourceClaimTemplate(ref), "k8s.io/api/resource/v1alpha3.ResourceClaimTemplateList": schema_k8sio_api_resource_v1alpha3_ResourceClaimTemplateList(ref), "k8s.io/api/resource/v1alpha3.ResourceClaimTemplateSpec": schema_k8sio_api_resource_v1alpha3_ResourceClaimTemplateSpec(ref), - "k8s.io/api/resource/v1alpha3.ResourceClass": schema_k8sio_api_resource_v1alpha3_ResourceClass(ref), - "k8s.io/api/resource/v1alpha3.ResourceClassList": schema_k8sio_api_resource_v1alpha3_ResourceClassList(ref), - "k8s.io/api/resource/v1alpha3.ResourceClassParameters": schema_k8sio_api_resource_v1alpha3_ResourceClassParameters(ref), - "k8s.io/api/resource/v1alpha3.ResourceClassParametersList": schema_k8sio_api_resource_v1alpha3_ResourceClassParametersList(ref), - "k8s.io/api/resource/v1alpha3.ResourceClassParametersReference": schema_k8sio_api_resource_v1alpha3_ResourceClassParametersReference(ref), - "k8s.io/api/resource/v1alpha3.ResourceFilter": schema_k8sio_api_resource_v1alpha3_ResourceFilter(ref), - "k8s.io/api/resource/v1alpha3.ResourceFilterModel": schema_k8sio_api_resource_v1alpha3_ResourceFilterModel(ref), - "k8s.io/api/resource/v1alpha3.ResourceHandle": schema_k8sio_api_resource_v1alpha3_ResourceHandle(ref), - "k8s.io/api/resource/v1alpha3.ResourceModel": schema_k8sio_api_resource_v1alpha3_ResourceModel(ref), - "k8s.io/api/resource/v1alpha3.ResourceRequest": schema_k8sio_api_resource_v1alpha3_ResourceRequest(ref), - "k8s.io/api/resource/v1alpha3.ResourceRequestModel": schema_k8sio_api_resource_v1alpha3_ResourceRequestModel(ref), + "k8s.io/api/resource/v1alpha3.ResourcePool": schema_k8sio_api_resource_v1alpha3_ResourcePool(ref), "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.StructuredResourceHandle": schema_k8sio_api_resource_v1alpha3_StructuredResourceHandle(ref), - "k8s.io/api/resource/v1alpha3.VendorParameters": schema_k8sio_api_resource_v1alpha3_VendorParameters(ref), + "k8s.io/api/resource/v1alpha3.ResourceSliceSpec": schema_k8sio_api_resource_v1alpha3_ResourceSliceSpec(ref), "k8s.io/api/scheduling/v1.PriorityClass": schema_k8sio_api_scheduling_v1_PriorityClass(ref), "k8s.io/api/scheduling/v1.PriorityClassList": schema_k8sio_api_scheduling_v1_PriorityClassList(ref), "k8s.io/api/scheduling/v1alpha1.PriorityClass": schema_k8sio_api_scheduling_v1alpha1_PriorityClass(ref), @@ -29213,6 +29205,13 @@ func schema_k8sio_api_core_v1_ResourceClaim(ref common.ReferenceCallback) common Format: "", }, }, + "request": { + SchemaProps: spec.SchemaProps{ + Description: "Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request.", + Type: []string{"string"}, + Format: "", + }, + }, }, Required: []string{"name"}, }, @@ -45551,105 +45550,143 @@ func schema_k8sio_api_resource_v1alpha3_AllocationResult(ref common.ReferenceCal Description: "AllocationResult contains attributes of an allocated resource.", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "resourceHandles": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", - }, - }, + "devices": { SchemaProps: spec.SchemaProps{ - Description: "ResourceHandles contain the state associated with an allocation that should be maintained throughout the lifetime of a claim. Each ResourceHandle contains data that should be passed to a specific kubelet plugin once it lands on a node. This data is returned by the driver after a successful allocation and is opaque to Kubernetes. Driver documentation may explain to users how to interpret this data if needed.\n\nSetting this field is optional. It has a maximum size of 32 entries. If null (or empty), it is assumed this allocation will be processed by a single kubelet plugin with no ResourceHandle data attached. The name of the kubelet plugin invoked will match the DriverName set in the ResourceClaimStatus this AllocationResult is embedded in.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ + Description: "Devices is the result of allocating devices.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceAllocationResult"), + }, + }, + "nodeSelector": { + SchemaProps: spec.SchemaProps{ + Description: "NodeSelector defines where the allocated resources are available. If unset, they are available everywhere.", + Ref: ref("k8s.io/api/core/v1.NodeSelector"), + }, + }, + "controller": { + SchemaProps: spec.SchemaProps{ + Description: "Controller is the name of the DRA driver which handled the allocation. That driver is also responsible for deallocating the claim. It is empty when the claim can be deallocated without involving a driver.\n\nA driver may allocate devices provided by other drivers, so this driver name here can be different from the driver names listed for the results.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.NodeSelector", "k8s.io/api/resource/v1alpha3.DeviceAllocationResult"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_BasicDevice(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "BasicDevice defines one device instance.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "attributes": { + SchemaProps: spec.SchemaProps{ + Description: "Attributes defines the set of attributes for this device. The name of each attribute must be unique in that set.\n\nThe maximum number of attributes and capacities combined is 32.", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/resource/v1alpha3.ResourceHandle"), + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceAttribute"), }, }, }, }, }, - "availableOnNodes": { + "capacity": { SchemaProps: spec.SchemaProps{ - Description: "This field will get set by the resource driver after it has allocated the resource to inform the scheduler where it can schedule Pods using the ResourceClaim.\n\nSetting this field is optional. If null, the resource is available everywhere.", - Ref: ref("k8s.io/api/core/v1.NodeSelector"), + Description: "Capacity defines the set of capacities for this device. The name of each capacity must be unique in that set.\n\nThe maximum number of attributes and capacities combined is 32.", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"), + }, + }, + }, }, }, }, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.NodeSelector", "k8s.io/api/resource/v1alpha3.ResourceHandle"}, + "k8s.io/api/resource/v1alpha3.DeviceAttribute", "k8s.io/apimachinery/pkg/api/resource.Quantity"}, } } -func schema_k8sio_api_resource_v1alpha3_AllocationResultModel(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_resource_v1alpha3_CELDeviceSelector(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "AllocationResultModel must have one and only one field set.", + Description: "CELDeviceSelector contains a CEL expression for selecting a device.", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "namedResources": { + "expression": { SchemaProps: spec.SchemaProps{ - Description: "NamedResources describes the allocation result when using the named resources model.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesAllocationResult"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesAllocationResult"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_DriverAllocationResult(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "DriverAllocationResult contains vendor parameters and the allocation result for one request.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "vendorRequestParameters": { - SchemaProps: spec.SchemaProps{ - Description: "VendorRequestParameters are the per-request configuration parameters from the time that the claim was allocated.", - Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), - }, - }, - "namedResources": { - SchemaProps: spec.SchemaProps{ - Description: "NamedResources describes the allocation result when using the named resources model.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesAllocationResult"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesAllocationResult", "k8s.io/apimachinery/pkg/runtime.RawExtension"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_DriverRequests(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "DriverRequests describes all resources that are needed from one particular driver.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "driverName": { - SchemaProps: spec.SchemaProps{ - Description: "DriverName is the name used by the DRA driver kubelet plugin.", + Description: "Expression is a CEL expression which evaluates a single device. It must evaluate to true when the device under consideration satisfies the desired criteria, and false when it does not. Any other result is an error and causes allocation of devices to abort.\n\nThe expression's input is an object named \"device\", which carries the following properties:\n - driver (string): the name of the driver which defines this device.\n - attributes (map[string]object): the device's attributes, grouped by prefix\n (e.g. device.attributes[\"dra.example.com\"] evaluates to an object with all\n of the attributes which were prefixed by \"dra.example.com\".\n - capacity (map[string]object): the device's capacities, grouped by prefix.\n\nExample: Consider a device with driver=\"dra.example.com\", which exposes two attributes named \"model\" and \"ext.example.com/family\" and which exposes one capacity named \"modules\". This input to this expression would have the following fields:\n\n device.driver\n device.attributes[\"dra.example.com\"].model\n device.attributes[\"ext.example.com\"].family\n device.capacity[\"dra.example.com\"].modules\n\nThe device.driver field can be used to check for a specific driver, either as a high-level precondition (i.e. you only want to consider devices from this driver) or as part of a multi-clause expression that is meant to consider devices from different drivers.\n\nThe value type of each attribute is defined by the device definition, and users who write these expressions must consult the documentation for their specific drivers. The value type of each capacity is Quantity.\n\nIf an unknown prefix is used as a lookup in either device.attributes or device.capacity, an empty map will be returned. Any reference to an unknown field will cause an evaluation error and allocation to abort.\n\nA robust expression should check for the existence of attributes before referencing them.\n\nFor ease of use, the cel.bind() function is enabled, and can be used to simplify expressions that access multiple attributes with the same domain. For example:\n\n cel.bind(dra, device.attributes[\"dra.example.com\"], dra.someBool && dra.anotherBool)", + Default: "", Type: []string{"string"}, Format: "", }, }, - "vendorParameters": { + }, + Required: []string{"expression"}, + }, + }, + } +} + +func schema_k8sio_api_resource_v1alpha3_Device(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Device represents one individual hardware instance that can be selected based on its attributes. Besides the name, exactly one field must be set.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { SchemaProps: spec.SchemaProps{ - Description: "VendorParameters are arbitrary setup parameters for all requests of the claim. They are ignored while allocating the claim.", - Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), + Description: "Name is unique identifier among all devices managed by the driver in the pool. It must be a DNS label.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "basic": { + SchemaProps: spec.SchemaProps{ + Description: "Basic defines one device instance.", + Ref: ref("k8s.io/api/resource/v1alpha3.BasicDevice"), + }, + }, + }, + Required: []string{"name"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.BasicDevice"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceAllocationConfiguration(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceAllocationConfiguration gets embedded in an AllocationResult.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "source": { + SchemaProps: spec.SchemaProps{ + Description: "Source records whether the configuration comes from a class and thus is not something that a normal user would have been able to set or from a claim.", + Default: "", + Type: []string{"string"}, + Format: "", }, }, "requests": { @@ -45659,350 +45696,7 @@ func schema_k8sio_api_resource_v1alpha3_DriverRequests(ref common.ReferenceCallb }, }, SchemaProps: spec.SchemaProps{ - Description: "Requests describes all resources that are needed from the driver.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/resource/v1alpha3.ResourceRequest"), - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.ResourceRequest", "k8s.io/apimachinery/pkg/runtime.RawExtension"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_NamedResourcesAllocationResult(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "NamedResourcesAllocationResult is used in AllocationResultModel.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Description: "Name is the name of the selected resource instance.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"name"}, - }, - }, - } -} - -func schema_k8sio_api_resource_v1alpha3_NamedResourcesAttribute(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "NamedResourcesAttribute is a combination of an attribute name and its value.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Description: "Name is unique identifier among all resource instances managed by the driver on the node. It must be a DNS subdomain.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "quantity": { - SchemaProps: spec.SchemaProps{ - Description: "QuantityValue is a quantity.", - Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"), - }, - }, - "bool": { - SchemaProps: spec.SchemaProps{ - Description: "BoolValue is a true/false value.", - Type: []string{"boolean"}, - Format: "", - }, - }, - "int": { - SchemaProps: spec.SchemaProps{ - Description: "IntValue is a 64-bit integer.", - Type: []string{"integer"}, - Format: "int64", - }, - }, - "intSlice": { - SchemaProps: spec.SchemaProps{ - Description: "IntSliceValue is an array of 64-bit integers.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesIntSlice"), - }, - }, - "string": { - SchemaProps: spec.SchemaProps{ - Description: "StringValue is a string.", - Type: []string{"string"}, - Format: "", - }, - }, - "stringSlice": { - SchemaProps: spec.SchemaProps{ - Description: "StringSliceValue is an array of strings.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesStringSlice"), - }, - }, - "version": { - SchemaProps: spec.SchemaProps{ - Description: "VersionValue is a semantic version according to semver.org spec 2.0.0.", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"name"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesIntSlice", "k8s.io/api/resource/v1alpha3.NamedResourcesStringSlice", "k8s.io/apimachinery/pkg/api/resource.Quantity"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_NamedResourcesAttributeValue(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "NamedResourcesAttributeValue must have one and only one field set.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "quantity": { - SchemaProps: spec.SchemaProps{ - Description: "QuantityValue is a quantity.", - Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"), - }, - }, - "bool": { - SchemaProps: spec.SchemaProps{ - Description: "BoolValue is a true/false value.", - Type: []string{"boolean"}, - Format: "", - }, - }, - "int": { - SchemaProps: spec.SchemaProps{ - Description: "IntValue is a 64-bit integer.", - Type: []string{"integer"}, - Format: "int64", - }, - }, - "intSlice": { - SchemaProps: spec.SchemaProps{ - Description: "IntSliceValue is an array of 64-bit integers.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesIntSlice"), - }, - }, - "string": { - SchemaProps: spec.SchemaProps{ - Description: "StringValue is a string.", - Type: []string{"string"}, - Format: "", - }, - }, - "stringSlice": { - SchemaProps: spec.SchemaProps{ - Description: "StringSliceValue is an array of strings.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesStringSlice"), - }, - }, - "version": { - SchemaProps: spec.SchemaProps{ - Description: "VersionValue is a semantic version according to semver.org spec 2.0.0.", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesIntSlice", "k8s.io/api/resource/v1alpha3.NamedResourcesStringSlice", "k8s.io/apimachinery/pkg/api/resource.Quantity"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_NamedResourcesFilter(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "NamedResourcesFilter is used in ResourceFilterModel.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "selector": { - SchemaProps: spec.SchemaProps{ - Description: "Selector is a CEL expression which must evaluate to true if a resource instance is suitable. The language is as defined in https://kubernetes.io/docs/reference/using-api/cel/\n\nIn addition, for each type in NamedResourcesAttributeValue there is a map that resolves to the corresponding value of the instance under evaluation. For example:\n\n attributes.quantity[\"a\"].isGreaterThan(quantity(\"0\")) &&\n attributes.stringslice[\"b\"].isSorted()", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"selector"}, - }, - }, - } -} - -func schema_k8sio_api_resource_v1alpha3_NamedResourcesInstance(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "NamedResourcesInstance represents one individual hardware instance that can be selected based on its attributes.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Description: "Name is unique identifier among all resource instances managed by the driver on the node. It must be a DNS subdomain.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "attributes": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", - }, - }, - SchemaProps: spec.SchemaProps{ - Description: "Attributes defines the attributes of this resource instance. The name of each attribute must be unique.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesAttribute"), - }, - }, - }, - }, - }, - }, - Required: []string{"name"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesAttribute"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_NamedResourcesIntSlice(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "NamedResourcesIntSlice contains a slice of 64-bit integers.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "ints": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", - }, - }, - SchemaProps: spec.SchemaProps{ - Description: "Ints is the slice of 64-bit integers.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: 0, - Type: []string{"integer"}, - Format: "int64", - }, - }, - }, - }, - }, - }, - Required: []string{"ints"}, - }, - }, - } -} - -func schema_k8sio_api_resource_v1alpha3_NamedResourcesRequest(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "NamedResourcesRequest is used in ResourceRequestModel.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "selector": { - SchemaProps: spec.SchemaProps{ - Description: "Selector is a CEL expression which must evaluate to true if a resource instance is suitable. The language is as defined in https://kubernetes.io/docs/reference/using-api/cel/\n\nIn addition, for each type NamedResourcesin AttributeValue there is a map that resolves to the corresponding value of the instance under evaluation. For example:\n\n attributes.quantity[\"a\"].isGreaterThan(quantity(\"0\")) &&\n attributes.stringslice[\"b\"].isSorted()", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"selector"}, - }, - }, - } -} - -func schema_k8sio_api_resource_v1alpha3_NamedResourcesResources(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "NamedResourcesResources is used in ResourceModel.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "instances": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", - }, - }, - SchemaProps: spec.SchemaProps{ - Description: "The list of all individual resources instances currently available.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesInstance"), - }, - }, - }, - }, - }, - }, - Required: []string{"instances"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesInstance"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_NamedResourcesStringSlice(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "NamedResourcesStringSlice contains a slice of strings.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "strings": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", - }, - }, - SchemaProps: spec.SchemaProps{ - Description: "Strings is the slice of strings.", + Description: "Requests lists the names of requests where the configuration applies. If empty, its applies to all requests.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -46015,10 +45709,631 @@ func schema_k8sio_api_resource_v1alpha3_NamedResourcesStringSlice(ref common.Ref }, }, }, + "opaque": { + SchemaProps: spec.SchemaProps{ + Description: "Opaque provides driver-specific configuration parameters.", + Ref: ref("k8s.io/api/resource/v1alpha3.OpaqueDeviceConfiguration"), + }, + }, }, - Required: []string{"strings"}, + Required: []string{"source"}, }, }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.OpaqueDeviceConfiguration"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceAllocationResult(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceAllocationResult is the result of allocating devices.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "results": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Results lists all allocated devices.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceRequestAllocationResult"), + }, + }, + }, + }, + }, + "config": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "This field is a combination of all the claim and class configuration parameters. Drivers can distinguish between those based on a flag.\n\nThis includes configuration parameters for drivers which have no allocated devices in the result because it is up to the drivers which configuration parameters they support. They can silently ignore unknown configuration parameters.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceAllocationConfiguration"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.DeviceAllocationConfiguration", "k8s.io/api/resource/v1alpha3.DeviceRequestAllocationResult"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceAttribute(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceAttribute must have exactly one field set.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "int": { + SchemaProps: spec.SchemaProps{ + Description: "IntValue is a number.", + Type: []string{"integer"}, + Format: "int64", + }, + }, + "bool": { + SchemaProps: spec.SchemaProps{ + Description: "BoolValue is a true/false value.", + Type: []string{"boolean"}, + Format: "", + }, + }, + "string": { + SchemaProps: spec.SchemaProps{ + Description: "StringValue is a string. Must not be longer than 64 characters.", + Type: []string{"string"}, + Format: "", + }, + }, + "version": { + SchemaProps: spec.SchemaProps{ + Description: "VersionValue is a semantic version according to semver.org spec 2.0.0. Must not be longer than 64 characters.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceClaim(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceClaim defines how to request devices with a ResourceClaim.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "requests": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Requests represent individual requests for distinct devices which must all be satisfied. If empty, nothing needs to be allocated.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceRequest"), + }, + }, + }, + }, + }, + "constraints": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "These constraints must be satisfied by the set of devices that get allocated for the claim.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceConstraint"), + }, + }, + }, + }, + }, + "config": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "This field holds configuration for multiple potential drivers which could satisfy requests in this claim. It is ignored while allocating the claim.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceClaimConfiguration"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.DeviceClaimConfiguration", "k8s.io/api/resource/v1alpha3.DeviceConstraint", "k8s.io/api/resource/v1alpha3.DeviceRequest"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceClaimConfiguration(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceClaimConfiguration is used for configuration parameters in DeviceClaim.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "requests": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Requests lists the names of requests where the configuration applies. If empty, it applies to all requests.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "opaque": { + SchemaProps: spec.SchemaProps{ + Description: "Opaque provides driver-specific configuration parameters.", + Ref: ref("k8s.io/api/resource/v1alpha3.OpaqueDeviceConfiguration"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.OpaqueDeviceConfiguration"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceClass(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceClass is a vendor- or admin-provided resource that contains device configuration and selectors. It can be referenced in the device requests of a claim to apply these presets. Cluster scoped.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard object metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Description: "Spec defines what can be allocated and how to configure it.\n\nThis is mutable. Consumers have to be prepared for classes changing at any time, either because they get updated or replaced. Claim allocations are done once based on whatever was set in classes at the time of allocation.\n\nChanging the spec automatically increments the metadata.generation number.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceClassSpec"), + }, + }, + }, + Required: []string{"spec"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.DeviceClassSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceClassConfiguration(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceClassConfiguration is used in DeviceClass.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "opaque": { + SchemaProps: spec.SchemaProps{ + Description: "Opaque provides driver-specific configuration parameters.", + Ref: ref("k8s.io/api/resource/v1alpha3.OpaqueDeviceConfiguration"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.OpaqueDeviceConfiguration"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceClassList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceClassList is a collection of classes.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard list metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Description: "Items is the list of resource classes.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceClass"), + }, + }, + }, + }, + }, + }, + Required: []string{"items"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.DeviceClass", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceClassSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceClassSpec is used in a [DeviceClass] to define what can be allocated and how to configure it.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "selectors": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Each selector must be satisfied by a device which is claimed via this class.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceSelector"), + }, + }, + }, + }, + }, + "config": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Config defines configuration parameters that apply to each device that is claimed via this class. Some classses may potentially be satisfied by multiple drivers, so each instance of a vendor configuration applies to exactly one driver.\n\nThey are passed to the driver, but are not considered while allocating the claim.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceClassConfiguration"), + }, + }, + }, + }, + }, + "suitableNodes": { + SchemaProps: spec.SchemaProps{ + Description: "Only nodes matching the selector will be considered by the scheduler when trying to find a Node that fits a Pod when that Pod uses a claim that has not been allocated yet *and* that claim gets allocated through a control plane controller. It is ignored when the claim does not use a control plane controller for allocation.\n\nSetting this field is optional. If unset, all Nodes are candidates.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", + Ref: ref("k8s.io/api/core/v1.NodeSelector"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.NodeSelector", "k8s.io/api/resource/v1alpha3.DeviceClassConfiguration", "k8s.io/api/resource/v1alpha3.DeviceSelector"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceConfiguration(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceConfiguration must have exactly one field set. It gets embedded inline in some other structs which have other fields, so field names must not conflict with those.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "opaque": { + SchemaProps: spec.SchemaProps{ + Description: "Opaque provides driver-specific configuration parameters.", + Ref: ref("k8s.io/api/resource/v1alpha3.OpaqueDeviceConfiguration"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.OpaqueDeviceConfiguration"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceConstraint(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceConstraint must have exactly one field set besides Requests.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "requests": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Requests is a list of the one or more requests in this claim which must co-satisfy this constraint. If a request is fulfilled by multiple devices, then all of the devices must satisfy the constraint. If this is not specified, this constraint applies to all requests in this claim.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "matchAttribute": { + SchemaProps: spec.SchemaProps{ + Description: "MatchAttribute requires that all devices in question have this attribute and that its type and value are the same across those devices.\n\nFor example, if you specified \"dra.example.com/numa\" (a hypothetical example!), then only devices in the same NUMA node will be chosen. A device which does not have that attribute will not be chosen. All devices should use a value of the same type for this attribute because that is part of its specification, but if one device doesn't, then it also will not be chosen.\n\nMust include the domain qualifier.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceRequest(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceRequest is a request for devices required for a claim. This is typically a request for a single resource like a device, but can also ask for several identical devices.\n\nA DeviceClassName is currently required. Clients must check that it is indeed set. It's absence indicates that something changed in a way that is not supported by the client yet, in which case it must refuse to handle the request.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name can be used to reference this request in a pod.spec.containers[].resources.claims entry and in a constraint of the claim.\n\nMust be a DNS label.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "deviceClassName": { + SchemaProps: spec.SchemaProps{ + Description: "DeviceClassName references a specific DeviceClass, which can define additional configuration and selectors to be inherited by this request.\n\nA class is required. Which classes are available depends on the cluster.\n\nAdministrators may use this to restrict which devices may get requested by only installing classes with selectors for permitted devices. If users are free to request anything without restrictions, then administrators can create an empty DeviceClass for users to reference.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "selectors": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Selectors define criteria which must be satisfied by a specific device in order for that device to be considered for this request. All selectors must be satisfied for a device to be considered.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceSelector"), + }, + }, + }, + }, + }, + "allocationMode": { + SchemaProps: spec.SchemaProps{ + Description: "AllocationMode and its related fields define how devices are allocated to satisfy this request. Supported values are:\n\n- ExactCount: This request is for a specific number of devices.\n This is the default. The exact number is provided in the\n count field.\n\n- All: This request is for all of the matching devices in a pool.\n Allocation will fail if some devices are already allocated,\n unless adminAccess is requested.\n\nIf AlloctionMode is not specified, the default mode is ExactCount. If the mode is ExactCount and count is not specified, the default count is one. Any other requests must specify this field.\n\nMore modes may get added in the future. Clients must refuse to handle requests with unknown modes.", + Type: []string{"string"}, + Format: "", + }, + }, + "count": { + SchemaProps: spec.SchemaProps{ + Description: "Count is used only when the count mode is \"ExactCount\". Must be greater than zero. If AllocationMode is ExactCount and this field is not specified, the default is one.", + Type: []string{"integer"}, + Format: "int64", + }, + }, + "adminAccess": { + SchemaProps: spec.SchemaProps{ + Description: "AdminAccess indicates that this is a claim for administrative access to the device(s). Claims with AdminAccess are expected to be used for monitoring or other management services for a device. They ignore all ordinary claims to the device with respect to access modes and any resource allocations.", + Default: false, + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + Required: []string{"name", "deviceClassName"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.DeviceSelector"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceRequestAllocationResult(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceRequestAllocationResult contains the allocation result for one request.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "request": { + SchemaProps: spec.SchemaProps{ + Description: "Request is the name of the request in the claim which caused this device to be allocated. Multiple devices may have been allocated per request.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "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: "", + }, + }, + }, + Required: []string{"request", "driver", "pool", "device"}, + }, + }, + } +} + +func schema_k8sio_api_resource_v1alpha3_DeviceSelector(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeviceSelector must have exactly one field set.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "cel": { + SchemaProps: spec.SchemaProps{ + Description: "CEL contains a CEL expression for selecting a device.", + Ref: ref("k8s.io/api/resource/v1alpha3.CELDeviceSelector"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/resource/v1alpha3.CELDeviceSelector"}, + } +} + +func schema_k8sio_api_resource_v1alpha3_OpaqueDeviceConfiguration(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "OpaqueDeviceConfiguration contains configuration parameters for a driver in a format defined by the driver vendor.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "driver": { + SchemaProps: spec.SchemaProps{ + Description: "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.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "parameters": { + SchemaProps: spec.SchemaProps{ + Description: "Parameters can contain arbitrary data. It is the responsibility of the driver developer to handle validation and versioning. Typically this includes self-identification and a version (\"kind\" + \"apiVersion\" for Kubernetes types), with conversion between different versions.", + Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), + }, + }, + }, + Required: []string{"driver", "parameters"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/runtime.RawExtension"}, } } @@ -46026,7 +46341,7 @@ func schema_k8sio_api_resource_v1alpha3_PodSchedulingContext(ref common.Referenc return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "PodSchedulingContext objects hold information that is needed to schedule a Pod with ResourceClaims that use \"WaitForFirstConsumer\" allocation mode.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + Description: "PodSchedulingContext objects hold information that is needed to schedule a Pod with ResourceClaims that use \"WaitForFirstConsumer\" allocation mode.\n\nThis is an alpha type and requires enabling the DRAControlPlaneController feature gate.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -46205,7 +46520,7 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaim(ref common.ReferenceCallba return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "ResourceClaim describes which resources are needed by a resource consumer. Its status tracks whether the resource has been allocated and what the resulting attributes are.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + Description: "ResourceClaim describes a request for access to resources in the cluster, for use by workloads. For example, if a workload needs an accelerator device with specific properties, this is how that request is expressed. The status stanza tracks whether this claim has been satisfied and what specific resources have been allocated.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -46231,14 +46546,14 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaim(ref common.ReferenceCallba }, "spec": { SchemaProps: spec.SchemaProps{ - Description: "Spec describes the desired attributes of a resource that then needs to be allocated. It can only be set once when creating the ResourceClaim.", + Description: "Spec describes what is being requested and how to configure it. The spec is immutable.", Default: map[string]interface{}{}, Ref: ref("k8s.io/api/resource/v1alpha3.ResourceClaimSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Description: "Status describes whether the resource is available and with which attributes.", + Description: "Status describes whether the claim is ready to use and what has been allocated.", Default: map[string]interface{}{}, Ref: ref("k8s.io/api/resource/v1alpha3.ResourceClaimStatus"), }, @@ -46348,155 +46663,6 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaimList(ref common.ReferenceCa } } -func schema_k8sio_api_resource_v1alpha3_ResourceClaimParameters(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceClaimParameters defines resource requests for a ResourceClaim in an in-tree format understood by Kubernetes.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard object metadata", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "generatedFrom": { - SchemaProps: spec.SchemaProps{ - Description: "If this object was created from some other resource, then this links back to that resource. This field is used to find the in-tree representation of the claim parameters when the parameter reference of the claim refers to some unknown type.", - Ref: ref("k8s.io/api/resource/v1alpha3.ResourceClaimParametersReference"), - }, - }, - "driverRequests": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", - }, - }, - SchemaProps: spec.SchemaProps{ - Description: "DriverRequests describes all resources that are needed for the allocated claim. A single claim may use resources coming from different drivers. For each driver, this array has at most one entry which then may have one or more per-driver requests.\n\nMay be empty, in which case the claim can always be allocated.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/resource/v1alpha3.DriverRequests"), - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.DriverRequests", "k8s.io/api/resource/v1alpha3.ResourceClaimParametersReference", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_ResourceClaimParametersList(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceClaimParametersList is a collection of ResourceClaimParameters.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard list metadata", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), - }, - }, - "items": { - SchemaProps: spec.SchemaProps{ - Description: "Items is the list of node resource capacity objects.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/resource/v1alpha3.ResourceClaimParameters"), - }, - }, - }, - }, - }, - }, - Required: []string{"items"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.ResourceClaimParameters", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_ResourceClaimParametersReference(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceClaimParametersReference contains enough information to let you locate the parameters for a ResourceClaim. The object must be in the same namespace as the ResourceClaim.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "apiGroup": { - SchemaProps: spec.SchemaProps{ - Description: "APIGroup is the group for the resource being referenced. It is empty for the core API. This matches the group in the APIVersion that is used when creating the resources.", - Type: []string{"string"}, - Format: "", - }, - }, - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is the type of resource being referenced. This is the same value as in the parameter object's metadata, for example \"ConfigMap\".", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "name": { - SchemaProps: spec.SchemaProps{ - Description: "Name is the name of resource being referenced.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"kind", "name"}, - }, - }, - } -} - func schema_k8sio_api_resource_v1alpha3_ResourceClaimSchedulingStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -46507,6 +46673,7 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaimSchedulingStatus(ref common "name": { SchemaProps: spec.SchemaProps{ Description: "Name matches the pod.spec.resourceClaims[*].Name field.", + Default: "", Type: []string{"string"}, Format: "", }, @@ -46532,6 +46699,7 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaimSchedulingStatus(ref common }, }, }, + Required: []string{"name"}, }, }, } @@ -46541,29 +46709,28 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaimSpec(ref common.ReferenceCa return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "ResourceClaimSpec defines how a resource is to be allocated.", + Description: "ResourceClaimSpec defines what is being requested in a ResourceClaim and how to configure it.", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "resourceClassName": { + "devices": { SchemaProps: spec.SchemaProps{ - Description: "ResourceClassName references the driver and additional parameters via the name of a ResourceClass that was created as part of the driver deployment.", - Default: "", + Description: "Devices defines how to request devices.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.DeviceClaim"), + }, + }, + "controller": { + SchemaProps: spec.SchemaProps{ + Description: "Controller is the name of the DRA driver that is meant to handle allocation of this claim. If empty, allocation is handled by the scheduler while scheduling a pod.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", Type: []string{"string"}, Format: "", }, }, - "parametersRef": { - SchemaProps: spec.SchemaProps{ - Description: "ParametersRef references a separate object with arbitrary parameters that will be used by the driver when allocating a resource for the claim.\n\nThe object must be in the same namespace as the ResourceClaim.", - Ref: ref("k8s.io/api/resource/v1alpha3.ResourceClaimParametersReference"), - }, - }, }, - Required: []string{"resourceClassName"}, }, }, Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.ResourceClaimParametersReference"}, + "k8s.io/api/resource/v1alpha3.DeviceClaim"}, } } @@ -46571,19 +46738,12 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaimStatus(ref common.Reference return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "ResourceClaimStatus tracks whether the resource has been allocated and what the resulting attributes are.", + Description: "ResourceClaimStatus tracks whether the resource has been allocated and what the result of that was.", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "driverName": { - SchemaProps: spec.SchemaProps{ - Description: "DriverName is a copy of the driver name from the ResourceClass at the time when allocation started.", - Type: []string{"string"}, - Format: "", - }, - }, "allocation": { SchemaProps: spec.SchemaProps{ - Description: "Allocation is set by the resource driver once a resource or set of resources has been allocated successfully. If this is not specified, the resources have not been allocated yet.", + Description: "Allocation is set once the claim has been allocated successfully.", Ref: ref("k8s.io/api/resource/v1alpha3.AllocationResult"), }, }, @@ -46599,7 +46759,7 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaimStatus(ref common.Reference }, }, SchemaProps: spec.SchemaProps{ - 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.\n\nThere can be at most 32 such reservations. This may get increased in the future, but not reduced.", + 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.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -46613,7 +46773,7 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaimStatus(ref common.Reference }, "deallocationRequested": { SchemaProps: spec.SchemaProps{ - Description: "DeallocationRequested indicates that a ResourceClaim is to be deallocated.\n\nThe driver then must deallocate this claim and reset the field together with clearing the Allocation field.\n\nWhile DeallocationRequested is set, no new consumers may be added to ReservedFor.", + Description: "Indicates that a claim is to be deallocated. While this is set, no new consumers may be added to ReservedFor.\n\nThis is only used if the claim needs to be deallocated by a DRA driver. That driver then must deallocate this claim and reset the field together with clearing the Allocation field.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", Type: []string{"boolean"}, Format: "", }, @@ -46630,7 +46790,7 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaimTemplate(ref common.Referen return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "ResourceClaimTemplate is used to produce ResourceClaim objects.", + Description: "ResourceClaimTemplate is used to produce ResourceClaim objects.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -46751,456 +46911,49 @@ func schema_k8sio_api_resource_v1alpha3_ResourceClaimTemplateSpec(ref common.Ref } } -func schema_k8sio_api_resource_v1alpha3_ResourceClass(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_resource_v1alpha3_ResourcePool(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "ResourceClass is used by administrators to influence how resources are allocated.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + Description: "ResourcePool describes the pool that ResourceSlices belong to.", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard object metadata", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "driverName": { - SchemaProps: spec.SchemaProps{ - Description: "DriverName defines the name of the dynamic resource driver that is used for allocation of a ResourceClaim that uses this class.\n\nResource drivers have a unique name in forward domain order (acme.example.com).", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "parametersRef": { - SchemaProps: spec.SchemaProps{ - Description: "ParametersRef references an arbitrary separate object that may hold parameters that will be used by the driver when allocating a resource that uses this class. A dynamic resource driver can distinguish between parameters stored here and and those stored in ResourceClaimSpec.", - Ref: ref("k8s.io/api/resource/v1alpha3.ResourceClassParametersReference"), - }, - }, - "suitableNodes": { - SchemaProps: spec.SchemaProps{ - Description: "Only nodes matching the selector will be considered by the scheduler when trying to find a Node that fits a Pod when that Pod uses a ResourceClaim that has not been allocated yet.\n\nSetting this field is optional. If null, all nodes are candidates.", - Ref: ref("k8s.io/api/core/v1.NodeSelector"), - }, - }, - "structuredParameters": { - SchemaProps: spec.SchemaProps{ - Description: "If and only if allocation of claims using this class is handled via structured parameters, then StructuredParameters must be set to true.", - Type: []string{"boolean"}, - Format: "", - }, - }, - }, - Required: []string{"driverName"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/core/v1.NodeSelector", "k8s.io/api/resource/v1alpha3.ResourceClassParametersReference", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_ResourceClassList(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceClassList is a collection of classes.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard list metadata", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), - }, - }, - "items": { - SchemaProps: spec.SchemaProps{ - Description: "Items is the list of resource classes.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/resource/v1alpha3.ResourceClass"), - }, - }, - }, - }, - }, - }, - Required: []string{"items"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.ResourceClass", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_ResourceClassParameters(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceClassParameters defines resource requests for a ResourceClass in an in-tree format understood by Kubernetes.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard object metadata", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "generatedFrom": { - SchemaProps: spec.SchemaProps{ - Description: "If this object was created from some other resource, then this links back to that resource. This field is used to find the in-tree representation of the class parameters when the parameter reference of the class refers to some unknown type.", - Ref: ref("k8s.io/api/resource/v1alpha3.ResourceClassParametersReference"), - }, - }, - "vendorParameters": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", - }, - }, - SchemaProps: spec.SchemaProps{ - Description: "VendorParameters are arbitrary setup parameters for all claims using this class. They are ignored while allocating the claim. There must not be more than one entry per driver.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/resource/v1alpha3.VendorParameters"), - }, - }, - }, - }, - }, - "filters": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", - }, - }, - SchemaProps: spec.SchemaProps{ - Description: "Filters describes additional contraints that must be met when using the class.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/resource/v1alpha3.ResourceFilter"), - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.ResourceClassParametersReference", "k8s.io/api/resource/v1alpha3.ResourceFilter", "k8s.io/api/resource/v1alpha3.VendorParameters", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_ResourceClassParametersList(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceClassParametersList is a collection of ResourceClassParameters.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard list metadata", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), - }, - }, - "items": { - SchemaProps: spec.SchemaProps{ - Description: "Items is the list of node resource capacity objects.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/resource/v1alpha3.ResourceClassParameters"), - }, - }, - }, - }, - }, - }, - Required: []string{"items"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.ResourceClassParameters", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_ResourceClassParametersReference(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceClassParametersReference contains enough information to let you locate the parameters for a ResourceClass.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "apiGroup": { - SchemaProps: spec.SchemaProps{ - Description: "APIGroup is the group for the resource being referenced. It is empty for the core API. This matches the group in the APIVersion that is used when creating the resources.", - Type: []string{"string"}, - Format: "", - }, - }, - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is the type of resource being referenced. This is the same value as in the parameter object's metadata.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, "name": { SchemaProps: spec.SchemaProps{ - Description: "Name is the name of resource being referenced.", + Description: "Name is used to identify the pool. For node-local devices, this is often the node name, but this is not required.\n\nIt must not be longer than 253 characters and must consist of one or more DNS sub-domains separated by slashes. This field is immutable.", Default: "", Type: []string{"string"}, Format: "", }, }, - "namespace": { + "generation": { SchemaProps: spec.SchemaProps{ - Description: "Namespace that contains the referenced resource. Must be empty for cluster-scoped resources and non-empty for namespaced resources.", - Type: []string{"string"}, - Format: "", + Description: "Generation tracks the change in a pool over time. Whenever a driver changes something about one or more of the resources in a pool, it must change the generation in all ResourceSlices which are part of that pool. Consumers of ResourceSlices should only consider resources from the pool with the highest generation number. The generation may be reset by drivers, which should be fine for consumers, assuming that all ResourceSlices in a pool are updated to match or deleted.\n\nCombined with ResourceSliceCount, this mechanism enables consumers to detect pools which are comprised of multiple ResourceSlices and are in an incomplete state.", + Default: 0, + Type: []string{"integer"}, + Format: "int64", + }, + }, + "resourceSliceCount": { + SchemaProps: spec.SchemaProps{ + Description: "ResourceSliceCount is the total number of ResourceSlices in the pool at this generation number. Must be greater than zero.\n\nConsumers can use this to check whether they have seen all ResourceSlices belonging to the same pool.", + Default: 0, + Type: []string{"integer"}, + Format: "int64", }, }, }, - Required: []string{"kind", "name"}, + Required: []string{"name", "generation", "resourceSliceCount"}, }, }, } } -func schema_k8sio_api_resource_v1alpha3_ResourceFilter(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceFilter is a filter for resources from one particular driver.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "driverName": { - SchemaProps: spec.SchemaProps{ - Description: "DriverName is the name used by the DRA driver kubelet plugin.", - Type: []string{"string"}, - Format: "", - }, - }, - "namedResources": { - SchemaProps: spec.SchemaProps{ - Description: "NamedResources describes a resource filter using the named resources model.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesFilter"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesFilter"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_ResourceFilterModel(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceFilterModel must have one and only one field set.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "namedResources": { - SchemaProps: spec.SchemaProps{ - Description: "NamedResources describes a resource filter using the named resources model.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesFilter"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesFilter"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_ResourceHandle(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceHandle holds opaque resource data for processing by a specific kubelet plugin.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "driverName": { - SchemaProps: spec.SchemaProps{ - Description: "DriverName specifies the name of the resource driver whose kubelet plugin should be invoked to process this ResourceHandle's data once it lands on a node. This may differ from the DriverName set in ResourceClaimStatus this ResourceHandle is embedded in.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "data": { - SchemaProps: spec.SchemaProps{ - Description: "Data contains the opaque data associated with this ResourceHandle. It is set by the controller component of the resource driver whose name matches the DriverName set in the ResourceClaimStatus this ResourceHandle is embedded in. It is set at allocation time and is intended for processing by the kubelet plugin whose name matches the DriverName set in this ResourceHandle.\n\nThe maximum size of this field is 16KiB. This may get increased in the future, but not reduced.", - Type: []string{"string"}, - Format: "", - }, - }, - "structuredData": { - SchemaProps: spec.SchemaProps{ - Description: "If StructuredData is set, then it needs to be used instead of Data.", - Ref: ref("k8s.io/api/resource/v1alpha3.StructuredResourceHandle"), - }, - }, - }, - Required: []string{"driverName"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.StructuredResourceHandle"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_ResourceModel(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceModel must have one and only one field set.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "namedResources": { - SchemaProps: spec.SchemaProps{ - Description: "NamedResources describes available resources using the named resources model.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesResources"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesResources"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_ResourceRequest(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceRequest is a request for resources from one particular driver.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "vendorParameters": { - SchemaProps: spec.SchemaProps{ - Description: "VendorParameters are arbitrary setup parameters for the requested resource. They are ignored while allocating a claim.", - Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), - }, - }, - "namedResources": { - SchemaProps: spec.SchemaProps{ - Description: "NamedResources describes a request for resources with the named resources model.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesRequest"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesRequest", "k8s.io/apimachinery/pkg/runtime.RawExtension"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_ResourceRequestModel(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ResourceRequestModel must have one and only one field set.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "namedResources": { - SchemaProps: spec.SchemaProps{ - Description: "NamedResources describes a request for resources with the named resources model.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesRequest"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesRequest"}, - } -} - func schema_k8sio_api_resource_v1alpha3_ResourceSlice(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "ResourceSlice provides information about available resources on individual nodes.", + Description: "ResourceSlice represents one or more resources in a pool of similar resources, managed by a common driver. A pool may span more than one ResourceSlice, and exactly how many ResourceSlices comprise a pool is determined by the driver.\n\nAt the moment, the only supported resources are devices with attributes and capacities. Each device in a given pool, regardless of how many ResourceSlices, must have a unique name. The ResourceSlice in which a device gets published may change over time. The unique identifier for a device is the tuple , , .\n\nWhenever a driver needs to update a pool, it increments the pool.Spec.Pool.Generation number and updates all ResourceSlices with that new number and new resource definitions. A consumer must only use ResourceSlices with the highest generation number and ignore all others.\n\nWhen allocating all resources in a pool matching certain criteria or when looking for the best solution among several different alternatives, a consumer should check the number of ResourceSlices in a pool (included in each ResourceSlice) to determine whether its view of a pool is complete and if not, should wait until the driver has completed updating the pool.\n\nFor resources that are not local to a node, the node name is not set. Instead, the driver may use a node selector to specify where the devices are available.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -47224,33 +46977,19 @@ func schema_k8sio_api_resource_v1alpha3_ResourceSlice(ref common.ReferenceCallba Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), }, }, - "nodeName": { + "spec": { SchemaProps: spec.SchemaProps{ - Description: "NodeName identifies the node which provides the resources if they are local to a node.\n\nA field selector can be used to list only ResourceSlice objects with a certain node name.", - Type: []string{"string"}, - Format: "", - }, - }, - "driverName": { - SchemaProps: spec.SchemaProps{ - Description: "DriverName identifies the DRA driver providing the capacity information. A field selector can be used to list only ResourceSlice objects with a certain driver name.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "namedResources": { - SchemaProps: spec.SchemaProps{ - Description: "NamedResources describes available resources using the named resources model.", - Ref: ref("k8s.io/api/resource/v1alpha3.NamedResourcesResources"), + Description: "Contains the information published by the driver.\n\nChanging the spec automatically increments the metadata.generation number.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.ResourceSliceSpec"), }, }, }, - Required: []string{"driverName"}, + Required: []string{"spec"}, }, }, Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.NamedResourcesResources", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "k8s.io/api/resource/v1alpha3.ResourceSliceSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -47275,7 +47014,7 @@ func schema_k8sio_api_resource_v1alpha3_ResourceSliceList(ref common.ReferenceCa Format: "", }, }, - "metadata": { + "listMeta": { SchemaProps: spec.SchemaProps{ Description: "Standard list metadata", Default: map[string]interface{}{}, @@ -47284,7 +47023,7 @@ func schema_k8sio_api_resource_v1alpha3_ResourceSliceList(ref common.ReferenceCa }, "items": { SchemaProps: spec.SchemaProps{ - Description: "Items is the list of node resource capacity objects.", + Description: "Items is the list of resource ResourceSlices.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -47305,85 +47044,73 @@ func schema_k8sio_api_resource_v1alpha3_ResourceSliceList(ref common.ReferenceCa } } -func schema_k8sio_api_resource_v1alpha3_StructuredResourceHandle(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_resource_v1alpha3_ResourceSliceSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "StructuredResourceHandle is the in-tree representation of the allocation result.", + Description: "ResourceSliceSpec contains the information published by the driver in one ResourceSlice.", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "vendorClassParameters": { + "driver": { SchemaProps: spec.SchemaProps{ - Description: "VendorClassParameters are the per-claim configuration parameters from the resource class at the time that the claim was allocated.", - Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), - }, - }, - "vendorClaimParameters": { - SchemaProps: spec.SchemaProps{ - Description: "VendorClaimParameters are the per-claim configuration parameters from the resource claim parameters at the time that the claim was allocated.", - Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), - }, - }, - "nodeName": { - SchemaProps: spec.SchemaProps{ - Description: "NodeName is the name of the node providing the necessary resources if the resources are local to a node.", + Description: "Driver identifies the DRA driver providing the capacity information. A field selector can be used to list only ResourceSlice objects with a certain driver name.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver. This field is immutable.", + Default: "", Type: []string{"string"}, Format: "", }, }, - "results": { + "pool": { + SchemaProps: spec.SchemaProps{ + Description: "Pool describes the pool that this ResourceSlice belongs to.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/resource/v1alpha3.ResourcePool"), + }, + }, + "nodeName": { + SchemaProps: spec.SchemaProps{ + Description: "NodeName identifies the node which provides the resources in this pool. A field selector can be used to list only ResourceSlice objects belonging to a certain node.\n\nThis field can be used to limit access from nodes to ResourceSlices with the same node name. It also indicates to autoscalers that adding new nodes of the same type as some old node might also make new resources available.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set. This field is immutable.", + Type: []string{"string"}, + Format: "", + }, + }, + "nodeSelector": { + SchemaProps: spec.SchemaProps{ + Description: "NodeSelector defines which nodes have access to the resources in the pool, when that pool is not limited to a single node.\n\nMust use exactly one term.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set.", + Ref: ref("k8s.io/api/core/v1.NodeSelector"), + }, + }, + "allNodes": { + SchemaProps: spec.SchemaProps{ + Description: "AllNodes indicates that all nodes have access to the resources in the pool.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set.", + Type: []string{"boolean"}, + Format: "", + }, + }, + "devices": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ "x-kubernetes-list-type": "atomic", }, }, SchemaProps: spec.SchemaProps{ - Description: "Results lists all allocated driver resources.", + Description: "Devices lists some or all of the devices in this pool.\n\nMust not have more than 128 entries.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/resource/v1alpha3.DriverAllocationResult"), + Ref: ref("k8s.io/api/resource/v1alpha3.Device"), }, }, }, }, }, }, - Required: []string{"results"}, + Required: []string{"driver", "pool"}, }, }, Dependencies: []string{ - "k8s.io/api/resource/v1alpha3.DriverAllocationResult", "k8s.io/apimachinery/pkg/runtime.RawExtension"}, - } -} - -func schema_k8sio_api_resource_v1alpha3_VendorParameters(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "VendorParameters are opaque parameters for one particular driver.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "driverName": { - SchemaProps: spec.SchemaProps{ - Description: "DriverName is the name used by the DRA driver kubelet plugin.", - Type: []string{"string"}, - Format: "", - }, - }, - "parameters": { - SchemaProps: spec.SchemaProps{ - Description: "Parameters can be arbitrary setup parameters. They are ignored while allocating a claim.", - Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/apimachinery/pkg/runtime.RawExtension"}, + "k8s.io/api/core/v1.NodeSelector", "k8s.io/api/resource/v1alpha3.Device", "k8s.io/api/resource/v1alpha3.ResourcePool"}, } } diff --git a/pkg/kubelet/cm/dra/state/state_checkpoint.go b/pkg/kubelet/cm/dra/state/state_checkpoint.go index e473d3851a0..0da7e8c78b5 100644 --- a/pkg/kubelet/cm/dra/state/state_checkpoint.go +++ b/pkg/kubelet/cm/dra/state/state_checkpoint.go @@ -20,7 +20,6 @@ import ( "fmt" "sync" - resourceapi "k8s.io/api/resource/v1alpha3" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/pkg/kubelet/checkpointmanager" @@ -56,9 +55,6 @@ type ClaimInfoState struct { // PodUIDs is a set of pod UIDs that reference a resource PodUIDs sets.Set[string] - // ResourceHandles is a list of opaque resource data for processing by a specific kubelet plugin - ResourceHandles []resourceapi.ResourceHandle - // CDIDevices is a map of DriverName --> CDI devices returned by the // GRPC API call NodePrepareResource CDIDevices map[string][]string diff --git a/pkg/kubelet/cm/dra/state/zz_generated.deepcopy.go b/pkg/kubelet/cm/dra/state/zz_generated.deepcopy.go index 84a96f20593..a0ab5191dc4 100644 --- a/pkg/kubelet/cm/dra/state/zz_generated.deepcopy.go +++ b/pkg/kubelet/cm/dra/state/zz_generated.deepcopy.go @@ -22,7 +22,6 @@ limitations under the License. package state import ( - v1alpha3 "k8s.io/api/resource/v1alpha3" sets "k8s.io/apimachinery/pkg/util/sets" ) @@ -36,13 +35,6 @@ func (in *ClaimInfoState) DeepCopyInto(out *ClaimInfoState) { (*out)[key] = val } } - if in.ResourceHandles != nil { - in, out := &in.ResourceHandles, &out.ResourceHandles - *out = make([]v1alpha3.ResourceHandle, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } if in.CDIDevices != nil { in, out := &in.CDIDevices, &out.CDIDevices *out = make(map[string][]string, len(*in)) diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index ddd0fc83ea7..4e64e2539c9 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -623,17 +623,15 @@ func AddHandlers(h printers.PrintHandler) { } _ = h.TableHandler(scaleColumnDefinitions, printScale) - resourceClassColumnDefinitions := []metav1.TableColumnDefinition{ + deviceClassColumnDefinitions := []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, - {Name: "DriverName", Type: "string", Description: resourceapi.ResourceClass{}.SwaggerDoc()["driverName"]}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, } - _ = h.TableHandler(resourceClassColumnDefinitions, printResourceClass) - _ = h.TableHandler(resourceClassColumnDefinitions, printResourceClassList) + _ = h.TableHandler(deviceClassColumnDefinitions, printDeviceClass) + _ = h.TableHandler(deviceClassColumnDefinitions, printDeviceClassList) resourceClaimColumnDefinitions := []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, - {Name: "ResourceClassName", Type: "string", Description: resourceapi.ResourceClaimSpec{}.SwaggerDoc()["resourceClassName"]}, {Name: "State", Type: "string", Description: "A summary of the current state (allocated, pending, reserved, etc.)."}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, } @@ -642,7 +640,6 @@ func AddHandlers(h printers.PrintHandler) { resourceClaimTemplateColumnDefinitions := []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, - {Name: "ResourceClassName", Type: "string", Description: resourceapi.ResourceClaimSpec{}.SwaggerDoc()["resourceClassName"]}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, } _ = h.TableHandler(resourceClaimTemplateColumnDefinitions, printResourceClaimTemplate) @@ -656,30 +653,15 @@ func AddHandlers(h printers.PrintHandler) { _ = h.TableHandler(podSchedulingCtxColumnDefinitions, printPodSchedulingContext) _ = h.TableHandler(podSchedulingCtxColumnDefinitions, printPodSchedulingContextList) - resourceClaimParametersColumnDefinitions := []metav1.TableColumnDefinition{ + nodeResourceSliceColumnDefinitions := []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, - {Name: "GeneratedFrom", Type: "string", Description: resourceapi.ResourceClaimParameters{}.SwaggerDoc()["generatedFrom"]}, + {Name: "Node", Type: "string", Description: resourceapi.ResourceSliceSpec{}.SwaggerDoc()["nodeName"]}, + {Name: "Driver", Type: "string", Description: resourceapi.ResourceSliceSpec{}.SwaggerDoc()["driver"]}, + {Name: "Pool", Type: "string", Description: resourceapi.ResourcePool{}.SwaggerDoc()["name"]}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, } - _ = h.TableHandler(resourceClaimParametersColumnDefinitions, printResourceClaimParameters) - _ = h.TableHandler(resourceClaimParametersColumnDefinitions, printResourceClaimParametersList) - - resourceClassParametersColumnDefinitions := []metav1.TableColumnDefinition{ - {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, - {Name: "GeneratedFrom", Type: "string", Description: resourceapi.ResourceClassParameters{}.SwaggerDoc()["generatedFrom"]}, - {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, - } - _ = h.TableHandler(resourceClassParametersColumnDefinitions, printResourceClassParameters) - _ = h.TableHandler(resourceClassParametersColumnDefinitions, printResourceClassParametersList) - - nodeResourceCapacityColumnDefinitions := []metav1.TableColumnDefinition{ - {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, - {Name: "Node", Type: "string", Description: resourceapi.ResourceSlice{}.SwaggerDoc()["nodeName"]}, - {Name: "Driver", Type: "string", Description: resourceapi.ResourceSlice{}.SwaggerDoc()["driverName"]}, - {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, - } - _ = h.TableHandler(nodeResourceCapacityColumnDefinitions, printResourceSlice) - _ = h.TableHandler(nodeResourceCapacityColumnDefinitions, printResourceSliceList) + _ = h.TableHandler(nodeResourceSliceColumnDefinitions, printResourceSlice) + _ = h.TableHandler(nodeResourceSliceColumnDefinitions, printResourceSliceList) serviceCIDRColumnDefinitions := []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, @@ -2979,19 +2961,19 @@ func printScale(obj *autoscaling.Scale, options printers.GenerateOptions) ([]met return []metav1.TableRow{row}, nil } -func printResourceClass(obj *resource.ResourceClass, options printers.GenerateOptions) ([]metav1.TableRow, error) { +func printDeviceClass(obj *resource.DeviceClass, options printers.GenerateOptions) ([]metav1.TableRow, error) { row := metav1.TableRow{ Object: runtime.RawExtension{Object: obj}, } - row.Cells = append(row.Cells, obj.Name, obj.DriverName, translateTimestampSince(obj.CreationTimestamp)) + row.Cells = append(row.Cells, obj.Name, translateTimestampSince(obj.CreationTimestamp)) return []metav1.TableRow{row}, nil } -func printResourceClassList(list *resource.ResourceClassList, options printers.GenerateOptions) ([]metav1.TableRow, error) { +func printDeviceClassList(list *resource.DeviceClassList, options printers.GenerateOptions) ([]metav1.TableRow, error) { rows := make([]metav1.TableRow, 0, len(list.Items)) for i := range list.Items { - r, err := printResourceClass(&list.Items[i], options) + r, err := printDeviceClass(&list.Items[i], options) if err != nil { return nil, err } @@ -3004,7 +2986,7 @@ func printResourceClaim(obj *resource.ResourceClaim, options printers.GenerateOp row := metav1.TableRow{ Object: runtime.RawExtension{Object: obj}, } - row.Cells = append(row.Cells, obj.Name, obj.Spec.ResourceClassName, resourceClaimState(obj), translateTimestampSince(obj.CreationTimestamp)) + row.Cells = append(row.Cells, obj.Name, resourceClaimState(obj), translateTimestampSince(obj.CreationTimestamp)) return []metav1.TableRow{row}, nil } @@ -3045,7 +3027,7 @@ func printResourceClaimTemplate(obj *resource.ResourceClaimTemplate, options pri row := metav1.TableRow{ Object: runtime.RawExtension{Object: obj}, } - row.Cells = append(row.Cells, obj.Name, obj.Spec.Spec.ResourceClassName, translateTimestampSince(obj.CreationTimestamp)) + row.Cells = append(row.Cells, obj.Name, translateTimestampSince(obj.CreationTimestamp)) return []metav1.TableRow{row}, nil } @@ -3083,61 +3065,11 @@ func printPodSchedulingContextList(list *resource.PodSchedulingContextList, opti return rows, nil } -func printResourceClaimParameters(obj *resource.ResourceClaimParameters, options printers.GenerateOptions) ([]metav1.TableRow, error) { - row := metav1.TableRow{ - Object: runtime.RawExtension{Object: obj}, - } - generatedFrom := "" - if obj.GeneratedFrom != nil { - generatedFrom = fmt.Sprintf("%s.%s %s", obj.GeneratedFrom.Kind, obj.GeneratedFrom.APIGroup, obj.GeneratedFrom.Name) - } - row.Cells = append(row.Cells, obj.Name, generatedFrom, translateTimestampSince(obj.CreationTimestamp)) - - return []metav1.TableRow{row}, nil -} - -func printResourceClaimParametersList(list *resource.ResourceClaimParametersList, options printers.GenerateOptions) ([]metav1.TableRow, error) { - rows := make([]metav1.TableRow, 0, len(list.Items)) - for i := range list.Items { - r, err := printResourceClaimParameters(&list.Items[i], options) - if err != nil { - return nil, err - } - rows = append(rows, r...) - } - return rows, nil -} - -func printResourceClassParameters(obj *resource.ResourceClassParameters, options printers.GenerateOptions) ([]metav1.TableRow, error) { - row := metav1.TableRow{ - Object: runtime.RawExtension{Object: obj}, - } - generatedFrom := "" - if obj.GeneratedFrom != nil { - generatedFrom = fmt.Sprintf("%s.%s %s", obj.GeneratedFrom.Kind, obj.GeneratedFrom.APIGroup, obj.GeneratedFrom.Name) - } - row.Cells = append(row.Cells, obj.Name, generatedFrom, translateTimestampSince(obj.CreationTimestamp)) - - return []metav1.TableRow{row}, nil -} - -func printResourceClassParametersList(list *resource.ResourceClassParametersList, options printers.GenerateOptions) ([]metav1.TableRow, error) { - rows := make([]metav1.TableRow, 0, len(list.Items)) - for i := range list.Items { - r, err := printResourceClassParameters(&list.Items[i], options) - if err != nil { - return nil, err - } - rows = append(rows, r...) - } - return rows, nil -} - func printResourceSlice(obj *resource.ResourceSlice, options printers.GenerateOptions) ([]metav1.TableRow, error) { row := metav1.TableRow{ Object: runtime.RawExtension{Object: obj}, } - row.Cells = append(row.Cells, obj.Name, obj.NodeName, obj.DriverName, translateTimestampSince(obj.CreationTimestamp)) + row.Cells = append(row.Cells, obj.Name, obj.Spec.NodeName, obj.Spec.Driver, obj.Spec.Pool.Name, translateTimestampSince(obj.CreationTimestamp)) return []metav1.TableRow{row}, nil } diff --git a/pkg/registry/resource/resourceclass/storage/storage.go b/pkg/registry/resource/deviceclass/storage/storage.go similarity index 75% rename from pkg/registry/resource/resourceclass/storage/storage.go rename to pkg/registry/resource/deviceclass/storage/storage.go index ad7d283b954..875d61e018f 100644 --- a/pkg/registry/resource/resourceclass/storage/storage.go +++ b/pkg/registry/resource/deviceclass/storage/storage.go @@ -24,25 +24,25 @@ import ( "k8s.io/kubernetes/pkg/printers" printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" - "k8s.io/kubernetes/pkg/registry/resource/resourceclass" + "k8s.io/kubernetes/pkg/registry/resource/deviceclass" ) -// REST implements a RESTStorage for ResourceClass. +// REST implements a RESTStorage for DeviceClass. type REST struct { *genericregistry.Store } -// NewREST returns a RESTStorage object that will work against ResourceClass. +// NewREST returns a RESTStorage object that will work against DeviceClass. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) { store := &genericregistry.Store{ - NewFunc: func() runtime.Object { return &resource.ResourceClass{} }, - NewListFunc: func() runtime.Object { return &resource.ResourceClassList{} }, - DefaultQualifiedResource: resource.Resource("resourceclasses"), - SingularQualifiedResource: resource.Resource("resourceclass"), + NewFunc: func() runtime.Object { return &resource.DeviceClass{} }, + NewListFunc: func() runtime.Object { return &resource.DeviceClassList{} }, + DefaultQualifiedResource: resource.Resource("deviceclasses"), + SingularQualifiedResource: resource.Resource("deviceclass"), - CreateStrategy: resourceclass.Strategy, - UpdateStrategy: resourceclass.Strategy, - DeleteStrategy: resourceclass.Strategy, + CreateStrategy: deviceclass.Strategy, + UpdateStrategy: deviceclass.Strategy, + DeleteStrategy: deviceclass.Strategy, ReturnDeletedObject: true, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, diff --git a/pkg/registry/resource/resourceclass/storage/storage_test.go b/pkg/registry/resource/deviceclass/storage/storage_test.go similarity index 83% rename from pkg/registry/resource/resourceclass/storage/storage_test.go rename to pkg/registry/resource/deviceclass/storage/storage_test.go index 817623e7acc..01962571c01 100644 --- a/pkg/registry/resource/resourceclass/storage/storage_test.go +++ b/pkg/registry/resource/deviceclass/storage/storage_test.go @@ -37,21 +37,20 @@ func newStorage(t *testing.T) (*REST, *etcd3testing.EtcdTestServer) { StorageConfig: etcdStorage, Decorator: generic.UndecoratedStorage, DeleteCollectionWorkers: 1, - ResourcePrefix: "resourceclasses", + ResourcePrefix: "deviceclasses", } - resourceClassStorage, err := NewREST(restOptions) + deviceClassStorage, err := NewREST(restOptions) if err != nil { t.Fatalf("unexpected error from REST storage: %v", err) } - return resourceClassStorage, server + return deviceClassStorage, server } -func validNewClass(name string) *resource.ResourceClass { - return &resource.ResourceClass{ +func validNewClass(name string) *resource.DeviceClass { + return &resource.DeviceClass{ ObjectMeta: metav1.ObjectMeta{ Name: name, }, - DriverName: "cdi.example.com", } } @@ -60,13 +59,13 @@ func TestCreate(t *testing.T) { defer server.Terminate(t) defer storage.Store.DestroyFunc() test := genericregistrytest.New(t, storage.Store).ClusterScope() - resourceClass := validNewClass("foo") - resourceClass.ObjectMeta = metav1.ObjectMeta{GenerateName: "foo"} + deviceClass := validNewClass("foo") + deviceClass.ObjectMeta = metav1.ObjectMeta{GenerateName: "foo"} test.TestCreate( // valid - resourceClass, + deviceClass, // invalid - &resource.ResourceClass{ + &resource.DeviceClass{ ObjectMeta: metav1.ObjectMeta{Name: "*BadName!"}, }, ) @@ -82,14 +81,22 @@ func TestUpdate(t *testing.T) { validNewClass("foo"), // updateFunc func(obj runtime.Object) runtime.Object { - object := obj.(*resource.ResourceClass) - object.ParametersRef = &resource.ResourceClassParametersReference{Kind: "cdiexample", Name: "some-name"} + object := obj.(*resource.DeviceClass) + object.Spec.Selectors = []resource.DeviceSelector{{ + CEL: &resource.CELDeviceSelector{ + Expression: "true", + }, + }} return object }, //invalid update func(obj runtime.Object) runtime.Object { - object := obj.(*resource.ResourceClass) - object.DriverName = "" + object := obj.(*resource.DeviceClass) + object.Spec.Selectors = []resource.DeviceSelector{{ + CEL: &resource.CELDeviceSelector{ + Expression: "?!#$", + }, + }} return object }, ) diff --git a/pkg/registry/resource/deviceclass/strategy.go b/pkg/registry/resource/deviceclass/strategy.go new file mode 100644 index 00000000000..fc6d3a38b66 --- /dev/null +++ b/pkg/registry/resource/deviceclass/strategy.go @@ -0,0 +1,85 @@ +/* +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 deviceclass + +import ( + "context" + + apiequality "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/validation/field" + "k8s.io/apiserver/pkg/storage/names" + "k8s.io/kubernetes/pkg/api/legacyscheme" + "k8s.io/kubernetes/pkg/apis/resource" + "k8s.io/kubernetes/pkg/apis/resource/validation" +) + +// deviceClassStrategy implements behavior for DeviceClass objects +type deviceClassStrategy struct { + runtime.ObjectTyper + names.NameGenerator +} + +var Strategy = deviceClassStrategy{legacyscheme.Scheme, names.SimpleNameGenerator} + +func (deviceClassStrategy) NamespaceScoped() bool { + return false +} + +func (deviceClassStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { + class := obj.(*resource.DeviceClass) + class.Generation = 1 +} + +func (deviceClassStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { + deviceClass := obj.(*resource.DeviceClass) + return validation.ValidateDeviceClass(deviceClass) +} + +func (deviceClassStrategy) WarningsOnCreate(ctx context.Context, obj runtime.Object) []string { + return nil +} + +func (deviceClassStrategy) Canonicalize(obj runtime.Object) { +} + +func (deviceClassStrategy) AllowCreateOnUpdate() bool { + return false +} + +func (deviceClassStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { + class := obj.(*resource.DeviceClass) + oldClass := old.(*resource.DeviceClass) + + // Any changes to the spec increment the generation number. + if !apiequality.Semantic.DeepEqual(oldClass.Spec, class.Spec) { + class.Generation = oldClass.Generation + 1 + } +} + +func (deviceClassStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { + errorList := validation.ValidateDeviceClass(obj.(*resource.DeviceClass)) + return append(errorList, validation.ValidateDeviceClassUpdate(obj.(*resource.DeviceClass), old.(*resource.DeviceClass))...) +} + +func (deviceClassStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string { + return nil +} + +func (deviceClassStrategy) AllowUnconditionalUpdate() bool { + return true +} diff --git a/pkg/registry/resource/resourceclass/strategy_test.go b/pkg/registry/resource/deviceclass/strategy_test.go similarity index 67% rename from pkg/registry/resource/resourceclass/strategy_test.go rename to pkg/registry/resource/deviceclass/strategy_test.go index d55f8066769..468b11eac69 100644 --- a/pkg/registry/resource/resourceclass/strategy_test.go +++ b/pkg/registry/resource/deviceclass/strategy_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package resourceclass +package deviceclass import ( "testing" @@ -24,28 +24,27 @@ import ( "k8s.io/kubernetes/pkg/apis/resource" ) -var resourceClass = &resource.ResourceClass{ +var deviceClass = &resource.DeviceClass{ ObjectMeta: metav1.ObjectMeta{ Name: "valid-class", }, - DriverName: "resource-driver.example.com", } func TestClassStrategy(t *testing.T) { if Strategy.NamespaceScoped() { - t.Errorf("ResourceClass must not be namespace scoped") + t.Errorf("DeviceClass must not be namespace scoped") } if Strategy.AllowCreateOnUpdate() { - t.Errorf("ResourceClass should not allow create on update") + t.Errorf("DeviceClass should not allow create on update") } } func TestClassStrategyCreate(t *testing.T) { ctx := genericapirequest.NewDefaultContext() - resourceClass := resourceClass.DeepCopy() + deviceClass := deviceClass.DeepCopy() - Strategy.PrepareForCreate(ctx, resourceClass) - errs := Strategy.Validate(ctx, resourceClass) + Strategy.PrepareForCreate(ctx, deviceClass) + errs := Strategy.Validate(ctx, deviceClass) if len(errs) != 0 { t.Errorf("unexpected error validating for create %v", errs) } @@ -54,12 +53,12 @@ func TestClassStrategyCreate(t *testing.T) { func TestClassStrategyUpdate(t *testing.T) { t.Run("no-changes-okay", func(t *testing.T) { ctx := genericapirequest.NewDefaultContext() - resourceClass := resourceClass.DeepCopy() - newClass := resourceClass.DeepCopy() + deviceClass := deviceClass.DeepCopy() + newClass := deviceClass.DeepCopy() newClass.ResourceVersion = "4" - Strategy.PrepareForUpdate(ctx, newClass, resourceClass) - errs := Strategy.ValidateUpdate(ctx, newClass, resourceClass) + Strategy.PrepareForUpdate(ctx, newClass, deviceClass) + errs := Strategy.ValidateUpdate(ctx, newClass, deviceClass) if len(errs) != 0 { t.Errorf("unexpected validation errors: %v", errs) } @@ -67,13 +66,13 @@ func TestClassStrategyUpdate(t *testing.T) { t.Run("name-change-not-allowed", func(t *testing.T) { ctx := genericapirequest.NewDefaultContext() - resourceClass := resourceClass.DeepCopy() - newClass := resourceClass.DeepCopy() + deviceClass := deviceClass.DeepCopy() + newClass := deviceClass.DeepCopy() newClass.Name = "valid-class-2" newClass.ResourceVersion = "4" - Strategy.PrepareForUpdate(ctx, newClass, resourceClass) - errs := Strategy.ValidateUpdate(ctx, newClass, resourceClass) + Strategy.PrepareForUpdate(ctx, newClass, deviceClass) + errs := Strategy.ValidateUpdate(ctx, newClass, deviceClass) if len(errs) == 0 { t.Errorf("expected a validation error") } diff --git a/pkg/registry/resource/resourceclaim/storage/storage_test.go b/pkg/registry/resource/resourceclaim/storage/storage_test.go index 114c5f36b91..031aa8c95e7 100644 --- a/pkg/registry/resource/resourceclaim/storage/storage_test.go +++ b/pkg/registry/resource/resourceclaim/storage/storage_test.go @@ -56,10 +56,6 @@ func validNewClaim(name, ns string) *resource.ResourceClaim { Name: name, Namespace: ns, }, - Spec: resource.ResourceClaimSpec{ - ResourceClassName: "example", - }, - Status: resource.ResourceClaimStatus{}, } return claim } @@ -98,6 +94,12 @@ func TestUpdate(t *testing.T) { object.Labels["foo"] = "bar" return object }, + // invalid update + func(obj runtime.Object) runtime.Object { + object := obj.(*resource.ResourceClaim) + object.Name = "^%$#@#%" + return object + }, ) } @@ -163,7 +165,6 @@ func TestUpdateStatus(t *testing.T) { } claim := claimStart.DeepCopy() - claim.Status.DriverName = "some-driver.example.com" claim.Status.Allocation = &resource.AllocationResult{} _, _, err = statusStorage.Update(ctx, claim.Name, rest.DefaultUpdatedObjectInfo(claim), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc, false, &metav1.UpdateOptions{}) if err != nil { diff --git a/pkg/registry/resource/resourceclaim/strategy.go b/pkg/registry/resource/resourceclaim/strategy.go index c787bcf8e6b..f2a9eb82184 100644 --- a/pkg/registry/resource/resourceclaim/strategy.go +++ b/pkg/registry/resource/resourceclaim/strategy.go @@ -69,7 +69,7 @@ func (resourceclaimStrategy) PrepareForCreate(ctx context.Context, obj runtime.O func (resourceclaimStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { claim := obj.(*resource.ResourceClaim) - return validation.ValidateClaim(claim) + return validation.ValidateResourceClaim(claim) } func (resourceclaimStrategy) WarningsOnCreate(ctx context.Context, obj runtime.Object) []string { @@ -92,8 +92,8 @@ func (resourceclaimStrategy) PrepareForUpdate(ctx context.Context, obj, old runt func (resourceclaimStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { newClaim := obj.(*resource.ResourceClaim) oldClaim := old.(*resource.ResourceClaim) - errorList := validation.ValidateClaim(newClaim) - return append(errorList, validation.ValidateClaimUpdate(newClaim, oldClaim)...) + errorList := validation.ValidateResourceClaim(newClaim) + return append(errorList, validation.ValidateResourceClaimUpdate(newClaim, oldClaim)...) } func (resourceclaimStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string { @@ -132,7 +132,7 @@ func (resourceclaimStatusStrategy) PrepareForUpdate(ctx context.Context, obj, ol func (resourceclaimStatusStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { newClaim := obj.(*resource.ResourceClaim) oldClaim := old.(*resource.ResourceClaim) - return validation.ValidateClaimStatusUpdate(newClaim, oldClaim) + return validation.ValidateResourceClaimStatusUpdate(newClaim, oldClaim) } // WarningsOnUpdate returns warnings for the given update. diff --git a/pkg/registry/resource/resourceclaim/strategy_test.go b/pkg/registry/resource/resourceclaim/strategy_test.go index e99439234b0..8b2d8c3e713 100644 --- a/pkg/registry/resource/resourceclaim/strategy_test.go +++ b/pkg/registry/resource/resourceclaim/strategy_test.go @@ -29,9 +29,6 @@ var resourceClaim = &resource.ResourceClaim{ Name: "valid-claim", Namespace: "default", }, - Spec: resource.ResourceClaimSpec{ - ResourceClassName: "valid-class", - }, } func TestClaimStrategy(t *testing.T) { diff --git a/pkg/registry/resource/resourceclaimparameters/storage/storage.go b/pkg/registry/resource/resourceclaimparameters/storage/storage.go deleted file mode 100644 index 820411fede9..00000000000 --- a/pkg/registry/resource/resourceclaimparameters/storage/storage.go +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright 2022 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 storage - -import ( - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apiserver/pkg/registry/generic" - genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" - "k8s.io/kubernetes/pkg/apis/resource" - "k8s.io/kubernetes/pkg/printers" - printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" - printerstorage "k8s.io/kubernetes/pkg/printers/storage" - "k8s.io/kubernetes/pkg/registry/resource/resourceclaimparameters" -) - -// REST implements a RESTStorage for ResourceClaimParameters. -type REST struct { - *genericregistry.Store -} - -// NewREST returns a RESTStorage object that will work against ResourceClaimParameters. -func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) { - store := &genericregistry.Store{ - NewFunc: func() runtime.Object { return &resource.ResourceClaimParameters{} }, - NewListFunc: func() runtime.Object { return &resource.ResourceClaimParametersList{} }, - PredicateFunc: resourceclaimparameters.Match, - DefaultQualifiedResource: resource.Resource("resourceclaimparameters"), - SingularQualifiedResource: resource.Resource("resourceclaimparameters"), - - CreateStrategy: resourceclaimparameters.Strategy, - UpdateStrategy: resourceclaimparameters.Strategy, - DeleteStrategy: resourceclaimparameters.Strategy, - ReturnDeletedObject: true, - - TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, - } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: resourceclaimparameters.GetAttrs} - if err := store.CompleteWithOptions(options); err != nil { - return nil, err - } - - return &REST{store}, nil -} diff --git a/pkg/registry/resource/resourceclaimparameters/storage/storage_test.go b/pkg/registry/resource/resourceclaimparameters/storage/storage_test.go deleted file mode 100644 index c5ff63e9d5f..00000000000 --- a/pkg/registry/resource/resourceclaimparameters/storage/storage_test.go +++ /dev/null @@ -1,145 +0,0 @@ -/* -Copyright 2022 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 storage - -import ( - "testing" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apiserver/pkg/registry/generic" - genericregistrytest "k8s.io/apiserver/pkg/registry/generic/testing" - etcd3testing "k8s.io/apiserver/pkg/storage/etcd3/testing" - "k8s.io/kubernetes/pkg/apis/resource" - _ "k8s.io/kubernetes/pkg/apis/resource/install" - "k8s.io/kubernetes/pkg/registry/registrytest" -) - -func newStorage(t *testing.T) (*REST, *etcd3testing.EtcdTestServer) { - etcdStorage, server := registrytest.NewEtcdStorage(t, resource.GroupName) - restOptions := generic.RESTOptions{ - StorageConfig: etcdStorage, - Decorator: generic.UndecoratedStorage, - DeleteCollectionWorkers: 1, - ResourcePrefix: "resourceclaimparameters", - } - resourceClassStorage, err := NewREST(restOptions) - if err != nil { - t.Fatalf("unexpected error from REST storage: %v", err) - } - return resourceClassStorage, server -} - -func validNewResourceClaimParameters(name string) *resource.ResourceClaimParameters { - return &resource.ResourceClaimParameters{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: metav1.NamespaceDefault, - }, - } -} - -func TestCreate(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store) - resourceClass := validNewResourceClaimParameters("foo") - resourceClass.ObjectMeta = metav1.ObjectMeta{} - test.TestCreate( - // valid - resourceClass, - // invalid - &resource.ResourceClaimParameters{ - ObjectMeta: metav1.ObjectMeta{Name: "*BadName!"}, - }, - ) -} - -func TestUpdate(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store) - test.TestUpdate( - // valid - validNewResourceClaimParameters("foo"), - // updateFunc - func(obj runtime.Object) runtime.Object { - object := obj.(*resource.ResourceClaimParameters) - object.Labels = map[string]string{"foo": "bar"} - return object - }, - // invalid update - func(obj runtime.Object) runtime.Object { - object := obj.(*resource.ResourceClaimParameters) - object.Labels = map[string]string{"&$^^#%@": "1"} - return object - }, - ) - -} - -func TestDelete(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store).ReturnDeletedObject() - test.TestDelete(validNewResourceClaimParameters("foo")) -} - -func TestGet(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store) - test.TestGet(validNewResourceClaimParameters("foo")) -} - -func TestList(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store) - test.TestList(validNewResourceClaimParameters("foo")) -} - -func TestWatch(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store) - test.TestWatch( - validNewResourceClaimParameters("foo"), - // matching labels - []labels.Set{}, - // not matching labels - []labels.Set{ - {"foo": "bar"}, - }, - // matching fields - []fields.Set{ - {"metadata.name": "foo"}, - }, - // not matching fields - []fields.Set{ - {"metadata.name": "bar"}, - }, - ) -} diff --git a/pkg/registry/resource/resourceclaimparameters/strategy.go b/pkg/registry/resource/resourceclaimparameters/strategy.go deleted file mode 100644 index 9b17f14f228..00000000000 --- a/pkg/registry/resource/resourceclaimparameters/strategy.go +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright 2022 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 resourceclaimparameters - -import ( - "context" - "errors" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/validation/field" - "k8s.io/apiserver/pkg/registry/generic" - "k8s.io/apiserver/pkg/storage" - "k8s.io/apiserver/pkg/storage/names" - "k8s.io/kubernetes/pkg/api/legacyscheme" - "k8s.io/kubernetes/pkg/apis/resource" - "k8s.io/kubernetes/pkg/apis/resource/validation" -) - -// resourceClaimParametersStrategy implements behavior for ResourceClaimParameters objects -type resourceClaimParametersStrategy struct { - runtime.ObjectTyper - names.NameGenerator -} - -var Strategy = resourceClaimParametersStrategy{legacyscheme.Scheme, names.SimpleNameGenerator} - -func (resourceClaimParametersStrategy) NamespaceScoped() bool { - return true -} - -func (resourceClaimParametersStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { -} - -func (resourceClaimParametersStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { - resourceClaimParameters := obj.(*resource.ResourceClaimParameters) - return validation.ValidateResourceClaimParameters(resourceClaimParameters) -} - -func (resourceClaimParametersStrategy) WarningsOnCreate(ctx context.Context, obj runtime.Object) []string { - return nil -} - -func (resourceClaimParametersStrategy) Canonicalize(obj runtime.Object) { -} - -func (resourceClaimParametersStrategy) AllowCreateOnUpdate() bool { - return false -} - -func (resourceClaimParametersStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { -} - -func (resourceClaimParametersStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { - return validation.ValidateResourceClaimParametersUpdate(obj.(*resource.ResourceClaimParameters), old.(*resource.ResourceClaimParameters)) -} - -func (resourceClaimParametersStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string { - return nil -} - -func (resourceClaimParametersStrategy) AllowUnconditionalUpdate() bool { - return true -} - -// Match returns a generic matcher for a given label and field selector. -func Match(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { - parameters, ok := obj.(*resource.ResourceClaimParameters) - if !ok { - return nil, nil, errors.New("not a resourceclaim") - } - return labels.Set(parameters.Labels), toSelectableFields(parameters), nil -} - -// toSelectableFields returns a field set that represents the object -func toSelectableFields(claim *resource.ResourceClaimParameters) fields.Set { - fields := generic.ObjectMetaFieldsSet(&claim.ObjectMeta, true) - return fields -} diff --git a/pkg/registry/resource/resourceclaimparameters/strategy_test.go b/pkg/registry/resource/resourceclaimparameters/strategy_test.go deleted file mode 100644 index 931b4a8316a..00000000000 --- a/pkg/registry/resource/resourceclaimparameters/strategy_test.go +++ /dev/null @@ -1,81 +0,0 @@ -/* -Copyright 2022 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 resourceclaimparameters - -import ( - "testing" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/kubernetes/pkg/apis/resource" -) - -var resourceClaimParameters = &resource.ResourceClaimParameters{ - ObjectMeta: metav1.ObjectMeta{ - Name: "valid", - Namespace: "ns", - }, -} - -func TestClassStrategy(t *testing.T) { - if !Strategy.NamespaceScoped() { - t.Errorf("ResourceClaimParameters must be namespace scoped") - } - if Strategy.AllowCreateOnUpdate() { - t.Errorf("ResourceClaimParameters should not allow create on update") - } -} - -func TestClassStrategyCreate(t *testing.T) { - ctx := genericapirequest.NewDefaultContext() - resourceClaimParameters := resourceClaimParameters.DeepCopy() - - Strategy.PrepareForCreate(ctx, resourceClaimParameters) - errs := Strategy.Validate(ctx, resourceClaimParameters) - if len(errs) != 0 { - t.Errorf("unexpected error validating for create %v", errs) - } -} - -func TestClassStrategyUpdate(t *testing.T) { - t.Run("no-changes-okay", func(t *testing.T) { - ctx := genericapirequest.NewDefaultContext() - resourceClaimParameters := resourceClaimParameters.DeepCopy() - newObj := resourceClaimParameters.DeepCopy() - newObj.ResourceVersion = "4" - - Strategy.PrepareForUpdate(ctx, newObj, resourceClaimParameters) - errs := Strategy.ValidateUpdate(ctx, newObj, resourceClaimParameters) - if len(errs) != 0 { - t.Errorf("unexpected validation errors: %v", errs) - } - }) - - t.Run("name-change-not-allowed", func(t *testing.T) { - ctx := genericapirequest.NewDefaultContext() - resourceClaimParameters := resourceClaimParameters.DeepCopy() - newObj := resourceClaimParameters.DeepCopy() - newObj.Name += "-2" - newObj.ResourceVersion = "4" - - Strategy.PrepareForUpdate(ctx, newObj, resourceClaimParameters) - errs := Strategy.ValidateUpdate(ctx, newObj, resourceClaimParameters) - if len(errs) == 0 { - t.Errorf("expected a validation error") - } - }) -} diff --git a/pkg/registry/resource/resourceclaimtemplate/storage/storage_test.go b/pkg/registry/resource/resourceclaimtemplate/storage/storage_test.go index 332cfc2e851..ab10d139bdc 100644 --- a/pkg/registry/resource/resourceclaimtemplate/storage/storage_test.go +++ b/pkg/registry/resource/resourceclaimtemplate/storage/storage_test.go @@ -52,11 +52,6 @@ func validNewClaimTemplate(name string) *resource.ResourceClaimTemplate { Name: name, Namespace: metav1.NamespaceDefault, }, - Spec: resource.ResourceClaimTemplateSpec{ - Spec: resource.ResourceClaimSpec{ - ResourceClassName: "valid-class", - }, - }, } } @@ -94,7 +89,7 @@ func TestUpdate(t *testing.T) { //invalid update func(obj runtime.Object) runtime.Object { object := obj.(*resource.ResourceClaimTemplate) - object.Spec.Spec.ResourceClassName = "" + object.Name = "^%$#@#%" return object }, ) diff --git a/pkg/registry/resource/resourceclaimtemplate/strategy.go b/pkg/registry/resource/resourceclaimtemplate/strategy.go index 8c625c94d4b..02cda68d89d 100644 --- a/pkg/registry/resource/resourceclaimtemplate/strategy.go +++ b/pkg/registry/resource/resourceclaimtemplate/strategy.go @@ -48,7 +48,7 @@ func (resourceClaimTemplateStrategy) PrepareForCreate(ctx context.Context, obj r func (resourceClaimTemplateStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { resourceClaimTemplate := obj.(*resource.ResourceClaimTemplate) - return validation.ValidateClaimTemplate(resourceClaimTemplate) + return validation.ValidateResourceClaimTemplate(resourceClaimTemplate) } func (resourceClaimTemplateStrategy) WarningsOnCreate(ctx context.Context, obj runtime.Object) []string { @@ -66,8 +66,8 @@ func (resourceClaimTemplateStrategy) PrepareForUpdate(ctx context.Context, obj, } func (resourceClaimTemplateStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { - errorList := validation.ValidateClaimTemplate(obj.(*resource.ResourceClaimTemplate)) - return append(errorList, validation.ValidateClaimTemplateUpdate(obj.(*resource.ResourceClaimTemplate), old.(*resource.ResourceClaimTemplate))...) + errorList := validation.ValidateResourceClaimTemplate(obj.(*resource.ResourceClaimTemplate)) + return append(errorList, validation.ValidateResourceClaimTemplateUpdate(obj.(*resource.ResourceClaimTemplate), old.(*resource.ResourceClaimTemplate))...) } func (resourceClaimTemplateStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string { diff --git a/pkg/registry/resource/resourceclaimtemplate/strategy_test.go b/pkg/registry/resource/resourceclaimtemplate/strategy_test.go index 1eb8ad05c77..14c9eddaeba 100644 --- a/pkg/registry/resource/resourceclaimtemplate/strategy_test.go +++ b/pkg/registry/resource/resourceclaimtemplate/strategy_test.go @@ -29,11 +29,6 @@ var resourceClaimTemplate = &resource.ResourceClaimTemplate{ Name: "valid-claim-template", Namespace: "default", }, - Spec: resource.ResourceClaimTemplateSpec{ - Spec: resource.ResourceClaimSpec{ - ResourceClassName: "valid-class", - }, - }, } func TestClaimTemplateStrategy(t *testing.T) { diff --git a/pkg/registry/resource/resourceclass/strategy.go b/pkg/registry/resource/resourceclass/strategy.go deleted file mode 100644 index 55f98fe4065..00000000000 --- a/pkg/registry/resource/resourceclass/strategy.go +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright 2022 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 resourceclass - -import ( - "context" - - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/validation/field" - "k8s.io/apiserver/pkg/storage/names" - "k8s.io/kubernetes/pkg/api/legacyscheme" - "k8s.io/kubernetes/pkg/apis/resource" - "k8s.io/kubernetes/pkg/apis/resource/validation" -) - -// resourceClassStrategy implements behavior for ResourceClass objects -type resourceClassStrategy struct { - runtime.ObjectTyper - names.NameGenerator -} - -var Strategy = resourceClassStrategy{legacyscheme.Scheme, names.SimpleNameGenerator} - -func (resourceClassStrategy) NamespaceScoped() bool { - return false -} - -func (resourceClassStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { -} - -func (resourceClassStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { - resourceClass := obj.(*resource.ResourceClass) - return validation.ValidateClass(resourceClass) -} - -func (resourceClassStrategy) WarningsOnCreate(ctx context.Context, obj runtime.Object) []string { - return nil -} - -func (resourceClassStrategy) Canonicalize(obj runtime.Object) { -} - -func (resourceClassStrategy) AllowCreateOnUpdate() bool { - return false -} - -func (resourceClassStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { -} - -func (resourceClassStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { - errorList := validation.ValidateClass(obj.(*resource.ResourceClass)) - return append(errorList, validation.ValidateClassUpdate(obj.(*resource.ResourceClass), old.(*resource.ResourceClass))...) -} - -func (resourceClassStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string { - return nil -} - -func (resourceClassStrategy) AllowUnconditionalUpdate() bool { - return true -} diff --git a/pkg/registry/resource/resourceclassparameters/storage/storage.go b/pkg/registry/resource/resourceclassparameters/storage/storage.go deleted file mode 100644 index 1603b27c34a..00000000000 --- a/pkg/registry/resource/resourceclassparameters/storage/storage.go +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright 2022 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 storage - -import ( - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apiserver/pkg/registry/generic" - genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" - "k8s.io/kubernetes/pkg/apis/resource" - "k8s.io/kubernetes/pkg/printers" - printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" - printerstorage "k8s.io/kubernetes/pkg/printers/storage" - "k8s.io/kubernetes/pkg/registry/resource/resourceclassparameters" -) - -// REST implements a RESTStorage for ResourceClassParameters. -type REST struct { - *genericregistry.Store -} - -// NewREST returns a RESTStorage object that will work against ResourceClassParameters. -func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) { - store := &genericregistry.Store{ - NewFunc: func() runtime.Object { return &resource.ResourceClassParameters{} }, - NewListFunc: func() runtime.Object { return &resource.ResourceClassParametersList{} }, - PredicateFunc: resourceclassparameters.Match, - DefaultQualifiedResource: resource.Resource("resourceclassparameters"), - SingularQualifiedResource: resource.Resource("resourceclassparameters"), - - CreateStrategy: resourceclassparameters.Strategy, - UpdateStrategy: resourceclassparameters.Strategy, - DeleteStrategy: resourceclassparameters.Strategy, - ReturnDeletedObject: true, - - TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, - } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: resourceclassparameters.GetAttrs} - if err := store.CompleteWithOptions(options); err != nil { - return nil, err - } - - return &REST{store}, nil -} diff --git a/pkg/registry/resource/resourceclassparameters/storage/storage_test.go b/pkg/registry/resource/resourceclassparameters/storage/storage_test.go deleted file mode 100644 index 83e95449441..00000000000 --- a/pkg/registry/resource/resourceclassparameters/storage/storage_test.go +++ /dev/null @@ -1,145 +0,0 @@ -/* -Copyright 2022 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 storage - -import ( - "testing" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apiserver/pkg/registry/generic" - genericregistrytest "k8s.io/apiserver/pkg/registry/generic/testing" - etcd3testing "k8s.io/apiserver/pkg/storage/etcd3/testing" - "k8s.io/kubernetes/pkg/apis/resource" - _ "k8s.io/kubernetes/pkg/apis/resource/install" - "k8s.io/kubernetes/pkg/registry/registrytest" -) - -func newStorage(t *testing.T) (*REST, *etcd3testing.EtcdTestServer) { - etcdStorage, server := registrytest.NewEtcdStorage(t, resource.GroupName) - restOptions := generic.RESTOptions{ - StorageConfig: etcdStorage, - Decorator: generic.UndecoratedStorage, - DeleteCollectionWorkers: 1, - ResourcePrefix: "resourceclassparameters", - } - resourceClassStorage, err := NewREST(restOptions) - if err != nil { - t.Fatalf("unexpected error from REST storage: %v", err) - } - return resourceClassStorage, server -} - -func validNewResourceClassParameters(name string) *resource.ResourceClassParameters { - return &resource.ResourceClassParameters{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: metav1.NamespaceDefault, - }, - } -} - -func TestCreate(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store) - resourceClass := validNewResourceClassParameters("foo") - resourceClass.ObjectMeta = metav1.ObjectMeta{} - test.TestCreate( - // valid - resourceClass, - // invalid - &resource.ResourceClassParameters{ - ObjectMeta: metav1.ObjectMeta{Name: "*BadName!"}, - }, - ) -} - -func TestUpdate(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store) - test.TestUpdate( - // valid - validNewResourceClassParameters("foo"), - // updateFunc - func(obj runtime.Object) runtime.Object { - object := obj.(*resource.ResourceClassParameters) - object.Labels = map[string]string{"foo": "bar"} - return object - }, - // invalid update - func(obj runtime.Object) runtime.Object { - object := obj.(*resource.ResourceClassParameters) - object.Labels = map[string]string{"&$^^#%@": "1"} - return object - }, - ) - -} - -func TestDelete(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store).ReturnDeletedObject() - test.TestDelete(validNewResourceClassParameters("foo")) -} - -func TestGet(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store) - test.TestGet(validNewResourceClassParameters("foo")) -} - -func TestList(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store) - test.TestList(validNewResourceClassParameters("foo")) -} - -func TestWatch(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := genericregistrytest.New(t, storage.Store) - test.TestWatch( - validNewResourceClassParameters("foo"), - // matching labels - []labels.Set{}, - // not matching labels - []labels.Set{ - {"foo": "bar"}, - }, - // matching fields - []fields.Set{ - {"metadata.name": "foo"}, - }, - // not matching fields - []fields.Set{ - {"metadata.name": "bar"}, - }, - ) -} diff --git a/pkg/registry/resource/resourceclassparameters/strategy.go b/pkg/registry/resource/resourceclassparameters/strategy.go deleted file mode 100644 index a1cd1b968cd..00000000000 --- a/pkg/registry/resource/resourceclassparameters/strategy.go +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright 2022 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 resourceclassparameters - -import ( - "context" - "errors" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/validation/field" - "k8s.io/apiserver/pkg/registry/generic" - "k8s.io/apiserver/pkg/storage" - "k8s.io/apiserver/pkg/storage/names" - "k8s.io/kubernetes/pkg/api/legacyscheme" - "k8s.io/kubernetes/pkg/apis/resource" - "k8s.io/kubernetes/pkg/apis/resource/validation" -) - -// resourceClassParametersStrategy implements behavior for ResourceClassParameters objects -type resourceClassParametersStrategy struct { - runtime.ObjectTyper - names.NameGenerator -} - -var Strategy = resourceClassParametersStrategy{legacyscheme.Scheme, names.SimpleNameGenerator} - -func (resourceClassParametersStrategy) NamespaceScoped() bool { - return true -} - -func (resourceClassParametersStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { -} - -func (resourceClassParametersStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { - resourceClassParameters := obj.(*resource.ResourceClassParameters) - return validation.ValidateResourceClassParameters(resourceClassParameters) -} - -func (resourceClassParametersStrategy) WarningsOnCreate(ctx context.Context, obj runtime.Object) []string { - return nil -} - -func (resourceClassParametersStrategy) Canonicalize(obj runtime.Object) { -} - -func (resourceClassParametersStrategy) AllowCreateOnUpdate() bool { - return false -} - -func (resourceClassParametersStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { -} - -func (resourceClassParametersStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { - return validation.ValidateResourceClassParametersUpdate(obj.(*resource.ResourceClassParameters), old.(*resource.ResourceClassParameters)) -} - -func (resourceClassParametersStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string { - return nil -} - -func (resourceClassParametersStrategy) AllowUnconditionalUpdate() bool { - return true -} - -// Match returns a generic matcher for a given label and field selector. -func Match(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { - parameters, ok := obj.(*resource.ResourceClassParameters) - if !ok { - return nil, nil, errors.New("not a resourceclassparameters") - } - return labels.Set(parameters.Labels), toSelectableFields(parameters), nil -} - -// toSelectableFields returns a field set that represents the object -func toSelectableFields(class *resource.ResourceClassParameters) fields.Set { - fields := generic.ObjectMetaFieldsSet(&class.ObjectMeta, true) - return fields -} diff --git a/pkg/registry/resource/resourceclassparameters/strategy_test.go b/pkg/registry/resource/resourceclassparameters/strategy_test.go deleted file mode 100644 index 079f9279c9b..00000000000 --- a/pkg/registry/resource/resourceclassparameters/strategy_test.go +++ /dev/null @@ -1,81 +0,0 @@ -/* -Copyright 2022 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 resourceclassparameters - -import ( - "testing" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/kubernetes/pkg/apis/resource" -) - -var resourceClassParameters = &resource.ResourceClassParameters{ - ObjectMeta: metav1.ObjectMeta{ - Name: "valid", - Namespace: "ns", - }, -} - -func TestClassStrategy(t *testing.T) { - if !Strategy.NamespaceScoped() { - t.Errorf("ResourceClassParameters must be namespace scoped") - } - if Strategy.AllowCreateOnUpdate() { - t.Errorf("ResourceClassParameters should not allow create on update") - } -} - -func TestClassStrategyCreate(t *testing.T) { - ctx := genericapirequest.NewDefaultContext() - resourceClassParameters := resourceClassParameters.DeepCopy() - - Strategy.PrepareForCreate(ctx, resourceClassParameters) - errs := Strategy.Validate(ctx, resourceClassParameters) - if len(errs) != 0 { - t.Errorf("unexpected error validating for create %v", errs) - } -} - -func TestClassStrategyUpdate(t *testing.T) { - t.Run("no-changes-okay", func(t *testing.T) { - ctx := genericapirequest.NewDefaultContext() - resourceClassParameters := resourceClassParameters.DeepCopy() - newObj := resourceClassParameters.DeepCopy() - newObj.ResourceVersion = "4" - - Strategy.PrepareForUpdate(ctx, newObj, resourceClassParameters) - errs := Strategy.ValidateUpdate(ctx, newObj, resourceClassParameters) - if len(errs) != 0 { - t.Errorf("unexpected validation errors: %v", errs) - } - }) - - t.Run("name-change-not-allowed", func(t *testing.T) { - ctx := genericapirequest.NewDefaultContext() - resourceClassParameters := resourceClassParameters.DeepCopy() - newObj := resourceClassParameters.DeepCopy() - newObj.Name += "-2" - newObj.ResourceVersion = "4" - - Strategy.PrepareForUpdate(ctx, newObj, resourceClassParameters) - errs := Strategy.ValidateUpdate(ctx, newObj, resourceClassParameters) - if len(errs) == 0 { - t.Errorf("expected a validation error") - } - }) -} diff --git a/pkg/registry/resource/resourceslice/storage/storage_test.go b/pkg/registry/resource/resourceslice/storage/storage_test.go index 175cff4084f..793a836303b 100644 --- a/pkg/registry/resource/resourceslice/storage/storage_test.go +++ b/pkg/registry/resource/resourceslice/storage/storage_test.go @@ -51,10 +51,13 @@ func validNewResourceSlice(name string) *resource.ResourceSlice { ObjectMeta: metav1.ObjectMeta{ Name: name, }, - NodeName: name, - DriverName: "cdi.example.com", - ResourceModel: resource.ResourceModel{ - NamedResources: &resource.NamedResourcesResources{}, + Spec: resource.ResourceSliceSpec{ + NodeName: name, + Driver: "cdi.example.com", + Pool: resource.ResourcePool{ + Name: "worker-1", + ResourceSliceCount: 1, + }, }, } } @@ -93,7 +96,7 @@ func TestUpdate(t *testing.T) { // invalid update func(obj runtime.Object) runtime.Object { object := obj.(*resource.ResourceSlice) - object.DriverName = "" + object.Spec.Driver = "" return object }, ) diff --git a/pkg/registry/resource/resourceslice/strategy.go b/pkg/registry/resource/resourceslice/strategy.go index e23b7d7ba36..336de305c2f 100644 --- a/pkg/registry/resource/resourceslice/strategy.go +++ b/pkg/registry/resource/resourceslice/strategy.go @@ -20,6 +20,7 @@ import ( "context" "fmt" + apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -46,6 +47,8 @@ func (resourceSliceStrategy) NamespaceScoped() bool { } func (resourceSliceStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { + slice := obj.(*resource.ResourceSlice) + slice.Generation = 1 } func (resourceSliceStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { @@ -65,6 +68,13 @@ func (resourceSliceStrategy) AllowCreateOnUpdate() bool { } func (resourceSliceStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { + slice := obj.(*resource.ResourceSlice) + oldSlice := old.(*resource.ResourceSlice) + + // Any changes to the spec increment the generation number. + if !apiequality.Semantic.DeepEqual(oldSlice.Spec, slice.Spec) { + slice.Generation = oldSlice.Generation + 1 + } } func (resourceSliceStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { @@ -82,17 +92,17 @@ func (resourceSliceStrategy) AllowUnconditionalUpdate() bool { var TriggerFunc = map[string]storage.IndexerFunc{ // Only one index is supported: // https://github.com/kubernetes/kubernetes/blob/3aa8c59fec0bf339e67ca80ea7905c817baeca85/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go#L346-L350 - "nodeName": nodeNameTriggerFunc, + resource.ResourceSliceSelectorNodeName: nodeNameTriggerFunc, } func nodeNameTriggerFunc(obj runtime.Object) string { - return obj.(*resource.ResourceSlice).NodeName + return obj.(*resource.ResourceSlice).Spec.NodeName } // Indexers returns the indexers for ResourceSlice. func Indexers() *cache.Indexers { return &cache.Indexers{ - storage.FieldIndex("nodeName"): nodeNameIndexFunc, + storage.FieldIndex(resource.ResourceSliceSelectorNodeName): nodeNameIndexFunc, } } @@ -101,7 +111,7 @@ func nodeNameIndexFunc(obj interface{}) ([]string, error) { if !ok { return nil, fmt.Errorf("not a ResourceSlice") } - return []string{slice.NodeName}, nil + return []string{slice.Spec.NodeName}, nil } // GetAttrs returns labels and fields of a given object for filtering purposes. @@ -119,7 +129,7 @@ func Match(label labels.Selector, field fields.Selector) storage.SelectionPredic Label: label, Field: field, GetAttrs: GetAttrs, - IndexFields: []string{"nodeName"}, + IndexFields: []string{resource.ResourceSliceSelectorNodeName}, } } @@ -131,8 +141,8 @@ func toSelectableFields(slice *resource.ResourceSlice) fields.Set { // field here or the number of object-meta related fields changes, this should // be adjusted. fields := make(fields.Set, 3) - fields["nodeName"] = slice.NodeName - fields["driverName"] = slice.DriverName + fields[resource.ResourceSliceSelectorNodeName] = slice.Spec.NodeName + fields[resource.ResourceSliceSelectorDriver] = slice.Spec.Driver // Adds one field. return generic.AddObjectMetaFieldsSet(fields, &slice.ObjectMeta, false) diff --git a/pkg/registry/resource/resourceslice/strategy_test.go b/pkg/registry/resource/resourceslice/strategy_test.go index 923c5dfc2d5..0ee366655b0 100644 --- a/pkg/registry/resource/resourceslice/strategy_test.go +++ b/pkg/registry/resource/resourceslice/strategy_test.go @@ -28,14 +28,17 @@ var slice = &resource.ResourceSlice{ ObjectMeta: metav1.ObjectMeta{ Name: "valid-class", }, - NodeName: "valid-node-name", - DriverName: "testdriver.example.com", - ResourceModel: resource.ResourceModel{ - NamedResources: &resource.NamedResourcesResources{}, + Spec: resource.ResourceSliceSpec{ + NodeName: "valid-node-name", + Driver: "testdriver.example.com", + Pool: resource.ResourcePool{ + Name: "valid-pool-name", + ResourceSliceCount: 1, + }, }, } -func TestClassStrategy(t *testing.T) { +func TestResourceSliceStrategy(t *testing.T) { if Strategy.NamespaceScoped() { t.Errorf("ResourceSlice must not be namespace scoped") } @@ -44,7 +47,7 @@ func TestClassStrategy(t *testing.T) { } } -func TestClassStrategyCreate(t *testing.T) { +func TestResourceSliceStrategyCreate(t *testing.T) { ctx := genericapirequest.NewDefaultContext() slice := slice.DeepCopy() @@ -55,15 +58,15 @@ func TestClassStrategyCreate(t *testing.T) { } } -func TestClassStrategyUpdate(t *testing.T) { +func TestResourceSliceStrategyUpdate(t *testing.T) { t.Run("no-changes-okay", func(t *testing.T) { ctx := genericapirequest.NewDefaultContext() slice := slice.DeepCopy() - newClass := slice.DeepCopy() - newClass.ResourceVersion = "4" + newSlice := slice.DeepCopy() + newSlice.ResourceVersion = "4" - Strategy.PrepareForUpdate(ctx, newClass, slice) - errs := Strategy.ValidateUpdate(ctx, newClass, slice) + Strategy.PrepareForUpdate(ctx, newSlice, slice) + errs := Strategy.ValidateUpdate(ctx, newSlice, slice) if len(errs) != 0 { t.Errorf("unexpected validation errors: %v", errs) } @@ -72,12 +75,12 @@ func TestClassStrategyUpdate(t *testing.T) { t.Run("name-change-not-allowed", func(t *testing.T) { ctx := genericapirequest.NewDefaultContext() slice := slice.DeepCopy() - newClass := slice.DeepCopy() - newClass.Name = "valid-class-2" - newClass.ResourceVersion = "4" + newSlice := slice.DeepCopy() + newSlice.Name = "valid-slice-2" + newSlice.ResourceVersion = "4" - Strategy.PrepareForUpdate(ctx, newClass, slice) - errs := Strategy.ValidateUpdate(ctx, newClass, slice) + Strategy.PrepareForUpdate(ctx, newSlice, slice) + errs := Strategy.ValidateUpdate(ctx, newSlice, slice) if len(errs) == 0 { t.Errorf("expected a validation error") } diff --git a/pkg/registry/resource/rest/storage_resource.go b/pkg/registry/resource/rest/storage_resource.go index 88d180d8407..3be89acf499 100644 --- a/pkg/registry/resource/rest/storage_resource.go +++ b/pkg/registry/resource/rest/storage_resource.go @@ -24,12 +24,10 @@ import ( serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/resource" + deviceclassstore "k8s.io/kubernetes/pkg/registry/resource/deviceclass/storage" podschedulingcontextsstore "k8s.io/kubernetes/pkg/registry/resource/podschedulingcontext/storage" resourceclaimstore "k8s.io/kubernetes/pkg/registry/resource/resourceclaim/storage" - resourceclaimparametersstore "k8s.io/kubernetes/pkg/registry/resource/resourceclaimparameters/storage" resourceclaimtemplatestore "k8s.io/kubernetes/pkg/registry/resource/resourceclaimtemplate/storage" - resourceclassstore "k8s.io/kubernetes/pkg/registry/resource/resourceclass/storage" - resourceclassparametersstore "k8s.io/kubernetes/pkg/registry/resource/resourceclassparameters/storage" resourceslicestore "k8s.io/kubernetes/pkg/registry/resource/resourceslice/storage" ) @@ -52,12 +50,12 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorag func (p RESTStorageProvider) v1alpha3Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { storage := map[string]rest.Storage{} - if resource := "resourceclasses"; apiResourceConfigSource.ResourceEnabled(resourcev1alpha3.SchemeGroupVersion.WithResource(resource)) { - resourceClassStorage, err := resourceclassstore.NewREST(restOptionsGetter) + if resource := "deviceclasses"; apiResourceConfigSource.ResourceEnabled(resourcev1alpha3.SchemeGroupVersion.WithResource(resource)) { + deviceclassStorage, err := deviceclassstore.NewREST(restOptionsGetter) if err != nil { return nil, err } - storage[resource] = resourceClassStorage + storage[resource] = deviceclassStorage } if resource := "resourceclaims"; apiResourceConfigSource.ResourceEnabled(resourcev1alpha3.SchemeGroupVersion.WithResource(resource)) { @@ -86,22 +84,6 @@ func (p RESTStorageProvider) v1alpha3Storage(apiResourceConfigSource serverstora storage[resource+"/status"] = podSchedulingStatusStorage } - if resource := "resourceclaimparameters"; apiResourceConfigSource.ResourceEnabled(resourcev1alpha3.SchemeGroupVersion.WithResource(resource)) { - resourceClaimParametersStorage, err := resourceclaimparametersstore.NewREST(restOptionsGetter) - if err != nil { - return nil, err - } - storage[resource] = resourceClaimParametersStorage - } - - if resource := "resourceclassparameters"; apiResourceConfigSource.ResourceEnabled(resourcev1alpha3.SchemeGroupVersion.WithResource(resource)) { - resourceClassParametersStorage, err := resourceclassparametersstore.NewREST(restOptionsGetter) - if err != nil { - return nil, err - } - storage[resource] = resourceClassParametersStorage - } - if resource := "resourceslices"; apiResourceConfigSource.ResourceEnabled(resourcev1alpha3.SchemeGroupVersion.WithResource(resource)) { resourceSliceStorage, err := resourceslicestore.NewREST(restOptionsGetter) if err != nil { diff --git a/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources_test.go b/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources_test.go index 59385b3cb31..cecc5211ae3 100644 --- a/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources_test.go +++ b/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources_test.go @@ -34,7 +34,6 @@ import ( resourceapi "k8s.io/api/resource/v1alpha3" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiruntime "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" @@ -1363,13 +1362,6 @@ func setup(t *testing.T, nodes []*v1.Node, claims []*resourceapi.ResourceClaim, reactor := createReactor(tc.client.Tracker()) tc.client.PrependReactor("*", "*", reactor) - // Quick-and-dirty workaround for fake client storing ResourceClassParameters and - // ResourceClaimParameters as "resourceclassparameterses" and "resourceclaimparameterses": - // intercept the correct LIST from the informers and reply to them with the incorrect - // LIST result. - tc.client.PrependReactor("list", "resourceclaimparameters", createListReactor(tc.client.Tracker(), "ResourceClaimParameters")) - tc.client.PrependReactor("list", "resourceclassparameters", createListReactor(tc.client.Tracker(), "ResourceClassParameters")) - tc.informerFactory = informers.NewSharedInformerFactory(tc.client, 0) tc.claimAssumeCache = assumecache.NewAssumeCache(tCtx.Logger(), tc.informerFactory.Resource().V1alpha3().ResourceClaims().Informer(), "resource claim", "", nil) opts := []runtime.Option{ @@ -1485,17 +1477,6 @@ func createReactor(tracker cgotesting.ObjectTracker) func(action cgotesting.Acti } } -func createListReactor(tracker cgotesting.ObjectTracker, kind string) func(action cgotesting.Action) (handled bool, ret apiruntime.Object, err error) { - return func(action cgotesting.Action) (handled bool, ret apiruntime.Object, err error) { - // listAction := action.(cgotesting.ListAction) - gvr := action.GetResource() - ns := action.GetNamespace() - gvr.Resource += "es" - list, err := tracker.List(gvr, schema.GroupVersionKind{Group: gvr.Group, Version: gvr.Version, Kind: kind}, ns) - return true, list, err - } -} - func Test_isSchedulableAfterClaimChange(t *testing.T) { testcases := map[string]struct { pod *v1.Pod diff --git a/pkg/scheduler/framework/plugins/dynamicresources/structuredparameters.go b/pkg/scheduler/framework/plugins/dynamicresources/structuredparameters.go index 96880b9448c..cd100db742a 100644 --- a/pkg/scheduler/framework/plugins/dynamicresources/structuredparameters.go +++ b/pkg/scheduler/framework/plugins/dynamicresources/structuredparameters.go @@ -54,20 +54,36 @@ type assumeCacheLister interface { // with an unknown structured parameter model silently ignored. An error gets // logged later when parameters required for a pod depend on such an unknown // model. -func newResourceModel(logger klog.Logger, resourceSliceLister resourceSliceLister, claimAssumeCache assumeCacheLister, inFlightAllocations *sync.Map) (resources, error) { - model := make(resources) +func newResourceModel(logger klog.Logger, resourceSliceLister resourceSliceLister, claimAssumeCache assumeCacheLister, inFlightAllocations *sync.Map) (resourceMap, error) { + model := make(resourceMap) slices, err := resourceSliceLister.List(labels.Everything()) if err != nil { return nil, fmt.Errorf("list node resource slices: %w", err) } for _, slice := range slices { - if model[slice.NodeName] == nil { - model[slice.NodeName] = make(map[string]ResourceModels) + if slice.NamedResources == nil { + // Ignore unknown resource. We don't know what it is, + // so we cannot allocated anything depending on + // it. This is only an error if we actually see a claim + // which needs this unknown model. + continue } - resource := model[slice.NodeName][slice.DriverName] - namedresourcesmodel.AddResources(&resource.NamedResources, slice.NamedResources) - model[slice.NodeName][slice.DriverName] = resource + instances := slice.NamedResources.Instances + if model[slice.NodeName] == nil { + model[slice.NodeName] = make(map[string]Resources) + } + resources := model[slice.NodeName][slice.DriverName] + resources.Instances = make([]Instance, 0, len(instances)) + for i := range instances { + instance := Instance{ + NodeName: slice.NodeName, + DriverName: slice.DriverName, + NamedResourcesInstance: &instances[i], + } + resources.Instances = append(resources.Instances, instance) + } + model[slice.NodeName][slice.DriverName] = resources } objs := claimAssumeCache.List(nil) @@ -90,12 +106,23 @@ func newResourceModel(logger klog.Logger, resourceSliceLister resourceSliceListe continue } if model[structured.NodeName] == nil { - model[structured.NodeName] = make(map[string]ResourceModels) + model[structured.NodeName] = make(map[string]Resources) } - resource := model[structured.NodeName][handle.DriverName] + resources := model[structured.NodeName][handle.DriverName] for _, result := range structured.Results { - // Call AddAllocation for each known model. Each call itself needs to check for nil. - namedresourcesmodel.AddAllocation(&resource.NamedResources, result.NamedResources) + // Same as above: if we don't know the allocation result model, ignore it. + if result.NamedResources == nil { + continue + } + instanceName := result.NamedResources.Name + for i := range resources.Instances { + if resources.Instances[i].NamedResourcesInstance.Name == instanceName { + resources.Instances[i].Allocated = true + break + } + } + // It could be that we don't know the instance. That's okay, + // we simply ignore the allocation result. } } } diff --git a/plugin/pkg/admission/noderestriction/admission.go b/plugin/pkg/admission/noderestriction/admission.go index 11fc19a22d5..cb1aacb35d9 100644 --- a/plugin/pkg/admission/noderestriction/admission.go +++ b/plugin/pkg/admission/noderestriction/admission.go @@ -663,7 +663,7 @@ func (p *Plugin) admitResourceSlice(nodeName string, a admission.Attributes) err return admission.NewForbidden(a, fmt.Errorf("unexpected type %T", a.GetObject())) } - if slice.NodeName != nodeName { + if slice.Spec.NodeName != nodeName { return admission.NewForbidden(a, errors.New("can only create ResourceSlice with the same NodeName as the requesting node")) } case admission.Delete: @@ -672,7 +672,7 @@ func (p *Plugin) admitResourceSlice(nodeName string, a admission.Attributes) err return admission.NewForbidden(a, fmt.Errorf("unexpected type %T", a.GetOldObject())) } - if slice.NodeName != nodeName { + if slice.Spec.NodeName != nodeName { return admission.NewForbidden(a, errors.New("can only delete ResourceSlice with the same NodeName as the requesting node")) } } diff --git a/plugin/pkg/admission/noderestriction/admission_test.go b/plugin/pkg/admission/noderestriction/admission_test.go index 28b9d8341e4..e90b1fbcc1c 100644 --- a/plugin/pkg/admission/noderestriction/admission_test.go +++ b/plugin/pkg/admission/noderestriction/admission_test.go @@ -1687,13 +1687,25 @@ func TestAdmitResourceSlice(t *testing.T) { ObjectMeta: metav1.ObjectMeta{ Name: "something", }, - NodeName: nodename, + Spec: resourceapi.ResourceSliceSpec{ + NodeName: nodename, + }, } sliceOtherNode := &resourceapi.ResourceSlice{ ObjectMeta: metav1.ObjectMeta{ Name: "something", }, - NodeName: nodename + "-other", + Spec: resourceapi.ResourceSliceSpec{ + NodeName: nodename + "-other", + }, + } + sliceNoNode := &resourceapi.ResourceSlice{ + ObjectMeta: metav1.ObjectMeta{ + Name: "something", + }, + Spec: resourceapi.ResourceSliceSpec{ + NodeName: "", + }, } tests := map[string]struct { @@ -1717,6 +1729,13 @@ func TestAdmitResourceSlice(t *testing.T) { featureEnabled: true, expectError: createErr, }, + "create disallowed, no node name, enabled": { + operation: admission.Create, + options: &metav1.CreateOptions{}, + obj: sliceNoNode, + featureEnabled: true, + expectError: createErr, + }, "create allowed, disabled": { operation: admission.Create, options: &metav1.CreateOptions{}, @@ -1731,6 +1750,13 @@ func TestAdmitResourceSlice(t *testing.T) { featureEnabled: false, expectError: createErr, }, + "create disallowed, no node name, disabled": { + operation: admission.Create, + options: &metav1.CreateOptions{}, + obj: sliceNoNode, + featureEnabled: false, + expectError: createErr, + }, "update allowed, same node": { operation: admission.Update, options: &metav1.UpdateOptions{}, @@ -1745,6 +1771,13 @@ func TestAdmitResourceSlice(t *testing.T) { featureEnabled: true, expectError: "", }, + "update allowed, no node": { + operation: admission.Update, + options: &metav1.UpdateOptions{}, + obj: sliceNoNode, + featureEnabled: true, + expectError: "", + }, "delete allowed, enabled": { operation: admission.Delete, options: &metav1.DeleteOptions{}, @@ -1759,6 +1792,13 @@ func TestAdmitResourceSlice(t *testing.T) { featureEnabled: true, expectError: deleteErr, }, + "delete disallowed, no node name, enabled": { + operation: admission.Delete, + options: &metav1.DeleteOptions{}, + oldObj: sliceNoNode, + featureEnabled: true, + expectError: deleteErr, + }, "delete allowed, disabled": { operation: admission.Delete, options: &metav1.DeleteOptions{}, @@ -1773,6 +1813,13 @@ func TestAdmitResourceSlice(t *testing.T) { featureEnabled: false, expectError: deleteErr, }, + "delete disallowed, no node name, disabled": { + operation: admission.Delete, + options: &metav1.DeleteOptions{}, + oldObj: sliceNoNode, + featureEnabled: false, + expectError: deleteErr, + }, } for name, test := range tests { diff --git a/plugin/pkg/auth/authorizer/node/graph_populator.go b/plugin/pkg/auth/authorizer/node/graph_populator.go index 0fcff59bd96..e0b3c056e83 100644 --- a/plugin/pkg/auth/authorizer/node/graph_populator.go +++ b/plugin/pkg/auth/authorizer/node/graph_populator.go @@ -206,7 +206,7 @@ func (g *graphPopulator) addResourceSlice(obj interface{}) { klog.Infof("unexpected type %T", obj) return } - g.graph.AddResourceSlice(slice.Name, slice.NodeName) + g.graph.AddResourceSlice(slice.Name, slice.Spec.NodeName) } func (g *graphPopulator) deleteResourceSlice(obj interface{}) { diff --git a/plugin/pkg/auth/authorizer/node/node_authorizer.go b/plugin/pkg/auth/authorizer/node/node_authorizer.go index aac48afb026..322df0f6108 100644 --- a/plugin/pkg/auth/authorizer/node/node_authorizer.go +++ b/plugin/pkg/auth/authorizer/node/node_authorizer.go @@ -338,7 +338,7 @@ func (r *NodeAuthorizer) authorizeResourceSlice(nodeName string, attrs authorize // only allow a scoped fieldSelector reqs, _ := attrs.GetFieldSelector() for _, req := range reqs { - if req.Field == "nodeName" && req.Operator == selection.Equals && req.Value == nodeName { + if req.Field == resourceapi.ResourceSliceSelectorNodeName && req.Operator == selection.Equals && req.Value == nodeName { return authorizer.DecisionAllow, "", nil } } diff --git a/plugin/pkg/auth/authorizer/node/node_authorizer_test.go b/plugin/pkg/auth/authorizer/node/node_authorizer_test.go index 3430fb5e8cf..c1fcbea89c8 100644 --- a/plugin/pkg/auth/authorizer/node/node_authorizer_test.go +++ b/plugin/pkg/auth/authorizer/node/node_authorizer_test.go @@ -60,7 +60,7 @@ func TestNodeAuthorizer(t *testing.T) { uniqueResourceClaimsPerPod: 1, uniqueResourceClaimTemplatesPerPod: 1, uniqueResourceClaimTemplatesWithClaimPerPod: 1, - nodeResourceCapacitiesPerNode: 2, + nodeResourceSlicesPerNode: 2, } nodes, pods, pvs, attachments, slices := generate(opts) populate(g, nodes, pods, pvs, attachments, slices) @@ -386,7 +386,7 @@ func TestNodeAuthorizer(t *testing.T) { }, { name: "allowed filtered list ResourceSlices", - attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "list", Resource: "resourceslices", APIGroup: "resource.k8s.io", FieldSelectorRequirements: mustParseFields("nodeName==node0")}, + attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "list", Resource: "resourceslices", APIGroup: "resource.k8s.io", FieldSelectorRequirements: mustParseFields("spec.nodeName==node0")}, expect: authorizer.DecisionAllow, }, { @@ -403,7 +403,7 @@ func TestNodeAuthorizer(t *testing.T) { }, { name: "allowed filtered watch ResourceSlices", - attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "watch", Resource: "resourceslices", APIGroup: "resource.k8s.io", FieldSelectorRequirements: mustParseFields("nodeName==node0")}, + attrs: authorizer.AttributesRecord{User: node0, ResourceRequest: true, Verb: "watch", Resource: "resourceslices", APIGroup: "resource.k8s.io", FieldSelectorRequirements: mustParseFields("spec.nodeName==node0")}, expect: authorizer.DecisionAllow, }, { @@ -880,7 +880,7 @@ type sampleDataOpts struct { uniqueResourceClaimTemplatesPerPod int uniqueResourceClaimTemplatesWithClaimPerPod int - nodeResourceCapacitiesPerNode int + nodeResourceSlicesPerNode int } func mustParseFields(s string) fields.Requirements { @@ -1191,7 +1191,7 @@ func generate(opts *sampleDataOpts) ([]*corev1.Node, []*corev1.Pod, []*corev1.Pe pods := make([]*corev1.Pod, 0, opts.nodes*opts.podsPerNode) pvs := make([]*corev1.PersistentVolume, 0, (opts.nodes*opts.podsPerNode*opts.uniquePVCsPerPod)+(opts.sharedPVCsPerPod*opts.namespaces)) attachments := make([]*storagev1.VolumeAttachment, 0, opts.nodes*opts.attachmentsPerNode) - slices := make([]*resourceapi.ResourceSlice, 0, opts.nodes*opts.nodeResourceCapacitiesPerNode) + slices := make([]*resourceapi.ResourceSlice, 0, opts.nodes*opts.nodeResourceSlicesPerNode) rand.Seed(12345) @@ -1218,11 +1218,13 @@ func generate(opts *sampleDataOpts) ([]*corev1.Node, []*corev1.Pod, []*corev1.Pe Spec: corev1.NodeSpec{}, }) - for p := 0; p <= opts.nodeResourceCapacitiesPerNode; p++ { + for p := 0; p <= opts.nodeResourceSlicesPerNode; p++ { name := fmt.Sprintf("slice%d-%s", p, nodeName) slice := &resourceapi.ResourceSlice{ ObjectMeta: metav1.ObjectMeta{Name: name}, - NodeName: nodeName, + Spec: resourceapi.ResourceSliceSpec{ + NodeName: nodeName, + }, } slices = append(slices, slice) } diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go index 1e523352d3f..849591bcbbe 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go @@ -578,13 +578,13 @@ func ClusterRoles() []rbacv1.ClusterRole { // Needed for dynamic resource allocation. if utilfeature.DefaultFeatureGate.Enabled(features.DynamicResourceAllocation) { kubeSchedulerRules = append(kubeSchedulerRules, - rbacv1helpers.NewRule(Read...).Groups(resourceGroup).Resources("resourceclasses").RuleOrDie(), + rbacv1helpers.NewRule(Read...).Groups(resourceGroup).Resources("deviceclasses").RuleOrDie(), rbacv1helpers.NewRule(ReadUpdate...).Groups(resourceGroup).Resources("resourceclaims").RuleOrDie(), rbacv1helpers.NewRule(ReadUpdate...).Groups(resourceGroup).Resources("resourceclaims/status").RuleOrDie(), rbacv1helpers.NewRule(ReadWrite...).Groups(resourceGroup).Resources("podschedulingcontexts").RuleOrDie(), rbacv1helpers.NewRule(Read...).Groups(resourceGroup).Resources("podschedulingcontexts/status").RuleOrDie(), rbacv1helpers.NewRule(ReadUpdate...).Groups(legacyGroup).Resources("pods/finalizers").RuleOrDie(), - rbacv1helpers.NewRule(Read...).Groups(resourceGroup).Resources("resourceslices", "resourceclassparameters", "resourceclaimparameters").RuleOrDie(), + rbacv1helpers.NewRule(Read...).Groups(resourceGroup).Resources("resourceslices").RuleOrDie(), ) } roles = append(roles, rbacv1.ClusterRole{ diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index 0b6b8bdf4b9..5f5df875658 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -6700,1002 +6700,1003 @@ func init() { } var fileDescriptor_6c07b07c062484ab = []byte{ - // 15918 bytes of a gzipped FileDescriptorProto + // 15927 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x90, 0x1c, 0xc9, - 0x79, 0x28, 0xc6, 0xea, 0x9e, 0xf3, 0x9b, 0x3b, 0x07, 0xc0, 0x0e, 0x66, 0x01, 0x34, 0xb6, 0x76, - 0x17, 0x8b, 0xbd, 0x06, 0xc4, 0x1e, 0x5c, 0x70, 0x77, 0xb9, 0xe2, 0x9c, 0x40, 0x2f, 0x30, 0x83, - 0xde, 0xec, 0x01, 0x40, 0x2e, 0x97, 0x14, 0x0b, 0xdd, 0x39, 0x33, 0xc5, 0xe9, 0xae, 0xea, 0xad, - 0xaa, 0x1e, 0x60, 0x60, 0x2a, 0x24, 0x51, 0x16, 0x25, 0x52, 0x72, 0x04, 0xc3, 0x21, 0x1f, 0x41, - 0x29, 0x14, 0x0e, 0x59, 0xd6, 0x61, 0x5a, 0xb2, 0x69, 0xca, 0x92, 0x2c, 0xea, 0xf2, 0x15, 0x21, - 0xd9, 0x0e, 0x59, 0x56, 0x84, 0x49, 0x85, 0x15, 0x6f, 0xf4, 0x38, 0x7a, 0x11, 0x0a, 0xfd, 0x78, - 0x92, 0x42, 0xef, 0xfd, 0x78, 0x6f, 0x42, 0xef, 0xe9, 0x45, 0x9e, 0x95, 0x59, 0x47, 0x77, 0x0f, - 0x16, 0x18, 0x2e, 0x19, 0xfb, 0xaf, 0x3b, 0xbf, 0x2f, 0xbf, 0xcc, 0xca, 0xf3, 0xcb, 0xef, 0x04, - 0x7b, 0xfb, 0x52, 0x38, 0xe7, 0xfa, 0x17, 0x9c, 0x96, 0x7b, 0xa1, 0xe6, 0x07, 0xe4, 0xc2, 0xce, - 0xc5, 0x0b, 0x9b, 0xc4, 0x23, 0x81, 0x13, 0x91, 0xfa, 0x5c, 0x2b, 0xf0, 0x23, 0x1f, 0x21, 0x8e, - 0x33, 0xe7, 0xb4, 0xdc, 0x39, 0x8a, 0x33, 0xb7, 0x73, 0x71, 0xf6, 0xf9, 0x4d, 0x37, 0xda, 0x6a, - 0xdf, 0x9e, 0xab, 0xf9, 0xcd, 0x0b, 0x9b, 0xfe, 0xa6, 0x7f, 0x81, 0xa1, 0xde, 0x6e, 0x6f, 0xb0, - 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x49, 0xcc, 0xbe, 0x14, 0x37, 0xd3, 0x74, 0x6a, 0x5b, 0xae, 0x47, - 0x82, 0xdd, 0x0b, 0xad, 0xed, 0x4d, 0xd6, 0x6e, 0x40, 0x42, 0xbf, 0x1d, 0xd4, 0x48, 0xb2, 0xe1, - 0x8e, 0xb5, 0xc2, 0x0b, 0x4d, 0x12, 0x39, 0x19, 0xdd, 0x9d, 0xbd, 0x90, 0x57, 0x2b, 0x68, 0x7b, - 0x91, 0xdb, 0x4c, 0x37, 0xf3, 0x91, 0x6e, 0x15, 0xc2, 0xda, 0x16, 0x69, 0x3a, 0xa9, 0x7a, 0x2f, - 0xe6, 0xd5, 0x6b, 0x47, 0x6e, 0xe3, 0x82, 0xeb, 0x45, 0x61, 0x14, 0x24, 0x2b, 0xd9, 0xdf, 0xb6, - 0xe0, 0xec, 0xfc, 0xad, 0xea, 0x72, 0xc3, 0x09, 0x23, 0xb7, 0xb6, 0xd0, 0xf0, 0x6b, 0xdb, 0xd5, - 0xc8, 0x0f, 0xc8, 0x4d, 0xbf, 0xd1, 0x6e, 0x92, 0x2a, 0x1b, 0x08, 0xf4, 0x1c, 0x0c, 0xed, 0xb0, - 0xff, 0xe5, 0xa5, 0x19, 0xeb, 0xac, 0x75, 0x7e, 0x78, 0x61, 0xf2, 0x8f, 0xf6, 0x4a, 0x1f, 0xda, - 0xdf, 0x2b, 0x0d, 0xdd, 0x14, 0xe5, 0x58, 0x61, 0xa0, 0x73, 0x30, 0xb0, 0x11, 0xae, 0xef, 0xb6, - 0xc8, 0x4c, 0x81, 0xe1, 0x8e, 0x0b, 0xdc, 0x81, 0x95, 0x2a, 0x2d, 0xc5, 0x02, 0x8a, 0x2e, 0xc0, - 0x70, 0xcb, 0x09, 0x22, 0x37, 0x72, 0x7d, 0x6f, 0xa6, 0x78, 0xd6, 0x3a, 0xdf, 0xbf, 0x30, 0x25, - 0x50, 0x87, 0x2b, 0x12, 0x80, 0x63, 0x1c, 0xda, 0x8d, 0x80, 0x38, 0xf5, 0xeb, 0x5e, 0x63, 0x77, - 0xa6, 0xef, 0xac, 0x75, 0x7e, 0x28, 0xee, 0x06, 0x16, 0xe5, 0x58, 0x61, 0xd8, 0x5f, 0x2d, 0xc0, - 0xd0, 0xfc, 0xc6, 0x86, 0xeb, 0xb9, 0xd1, 0x2e, 0xba, 0x09, 0xa3, 0x9e, 0x5f, 0x27, 0xf2, 0x3f, - 0xfb, 0x8a, 0x91, 0x17, 0xce, 0xce, 0xa5, 0x97, 0xd2, 0xdc, 0x9a, 0x86, 0xb7, 0x30, 0xb9, 0xbf, - 0x57, 0x1a, 0xd5, 0x4b, 0xb0, 0x41, 0x07, 0x61, 0x18, 0x69, 0xf9, 0x75, 0x45, 0xb6, 0xc0, 0xc8, - 0x96, 0xb2, 0xc8, 0x56, 0x62, 0xb4, 0x85, 0x89, 0xfd, 0xbd, 0xd2, 0x88, 0x56, 0x80, 0x75, 0x22, - 0xe8, 0x36, 0x4c, 0xd0, 0xbf, 0x5e, 0xe4, 0x2a, 0xba, 0x45, 0x46, 0xf7, 0xf1, 0x3c, 0xba, 0x1a, - 0xea, 0xc2, 0xf4, 0xfe, 0x5e, 0x69, 0x22, 0x51, 0x88, 0x93, 0x04, 0xed, 0x9f, 0xb6, 0x60, 0x62, - 0xbe, 0xd5, 0x9a, 0x0f, 0x9a, 0x7e, 0x50, 0x09, 0xfc, 0x0d, 0xb7, 0x41, 0xd0, 0x2b, 0xd0, 0x17, - 0xd1, 0x59, 0xe3, 0x33, 0xfc, 0xb8, 0x18, 0xda, 0x3e, 0x3a, 0x57, 0x07, 0x7b, 0xa5, 0xe9, 0x04, - 0x3a, 0x9b, 0x4a, 0x56, 0x01, 0x7d, 0x1c, 0x26, 0x1b, 0x7e, 0xcd, 0x69, 0x6c, 0xf9, 0x61, 0x24, - 0xa0, 0x62, 0xea, 0x8f, 0xed, 0xef, 0x95, 0x26, 0xaf, 0x25, 0x60, 0x38, 0x85, 0x6d, 0xdf, 0x83, - 0xf1, 0xf9, 0x28, 0x72, 0x6a, 0x5b, 0xa4, 0xce, 0x17, 0x14, 0x7a, 0x09, 0xfa, 0x3c, 0xa7, 0x29, - 0x3b, 0x73, 0x56, 0x76, 0x66, 0xcd, 0x69, 0xd2, 0xce, 0x4c, 0xde, 0xf0, 0xdc, 0x77, 0xdb, 0x62, - 0x91, 0xd2, 0x32, 0xcc, 0xb0, 0xd1, 0x0b, 0x00, 0x75, 0xb2, 0xe3, 0xd6, 0x48, 0xc5, 0x89, 0xb6, - 0x44, 0x1f, 0x90, 0xa8, 0x0b, 0x4b, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x2e, 0x0c, 0xcf, 0xef, 0xf8, - 0x6e, 0xbd, 0xe2, 0xd7, 0x43, 0xb4, 0x0d, 0x13, 0xad, 0x80, 0x6c, 0x90, 0x40, 0x15, 0xcd, 0x58, - 0x67, 0x8b, 0xe7, 0x47, 0x5e, 0x38, 0x9f, 0x39, 0xf6, 0x26, 0xea, 0xb2, 0x17, 0x05, 0xbb, 0x0b, - 0x8f, 0x88, 0xf6, 0x26, 0x12, 0x50, 0x9c, 0xa4, 0x6c, 0xff, 0xef, 0x05, 0x38, 0x3e, 0x7f, 0xaf, - 0x1d, 0x90, 0x25, 0x37, 0xdc, 0x4e, 0x6e, 0xb8, 0xba, 0x1b, 0x6e, 0xaf, 0xc5, 0x23, 0xa0, 0x56, - 0xfa, 0x92, 0x28, 0xc7, 0x0a, 0x03, 0x3d, 0x0f, 0x83, 0xf4, 0xf7, 0x0d, 0x5c, 0x16, 0x9f, 0x3c, - 0x2d, 0x90, 0x47, 0x96, 0x9c, 0xc8, 0x59, 0xe2, 0x20, 0x2c, 0x71, 0xd0, 0x2a, 0x8c, 0xd4, 0xd8, - 0xf9, 0xb0, 0xb9, 0xea, 0xd7, 0x09, 0x5b, 0x5b, 0xc3, 0x0b, 0xcf, 0x52, 0xf4, 0xc5, 0xb8, 0xf8, - 0x60, 0xaf, 0x34, 0xc3, 0xfb, 0x26, 0x48, 0x68, 0x30, 0xac, 0xd7, 0x47, 0xb6, 0xda, 0xee, 0x7d, - 0x8c, 0x12, 0x64, 0x6c, 0xf5, 0xf3, 0xda, 0xce, 0xed, 0x67, 0x3b, 0x77, 0x34, 0x7b, 0xd7, 0xa2, - 0x8b, 0xd0, 0xb7, 0xed, 0x7a, 0xf5, 0x99, 0x01, 0x46, 0xeb, 0x34, 0x9d, 0xf3, 0xab, 0xae, 0x57, - 0x3f, 0xd8, 0x2b, 0x4d, 0x19, 0xdd, 0xa1, 0x85, 0x98, 0xa1, 0xda, 0xff, 0xca, 0x82, 0x12, 0x83, - 0xad, 0xb8, 0x0d, 0x52, 0x21, 0x41, 0xe8, 0x86, 0x11, 0xf1, 0x22, 0x63, 0x40, 0x5f, 0x00, 0x08, - 0x49, 0x2d, 0x20, 0x91, 0x36, 0xa4, 0x6a, 0x61, 0x54, 0x15, 0x04, 0x6b, 0x58, 0xf4, 0x7c, 0x0a, - 0xb7, 0x9c, 0x80, 0xad, 0x2f, 0x31, 0xb0, 0xea, 0x7c, 0xaa, 0x4a, 0x00, 0x8e, 0x71, 0x8c, 0xf3, - 0xa9, 0xd8, 0xed, 0x7c, 0x42, 0x1f, 0x83, 0x89, 0xb8, 0xb1, 0xb0, 0xe5, 0xd4, 0xe4, 0x00, 0xb2, - 0x1d, 0x5c, 0x35, 0x41, 0x38, 0x89, 0x6b, 0xff, 0xb7, 0x96, 0x58, 0x3c, 0xf4, 0xab, 0xdf, 0xe7, - 0xdf, 0x6a, 0xff, 0xb6, 0x05, 0x83, 0x0b, 0xae, 0x57, 0x77, 0xbd, 0x4d, 0xf4, 0x59, 0x18, 0xa2, - 0x57, 0x65, 0xdd, 0x89, 0x1c, 0x71, 0x0c, 0x7f, 0x58, 0xdb, 0x5b, 0xea, 0xe6, 0x9a, 0x6b, 0x6d, - 0x6f, 0xd2, 0x82, 0x70, 0x8e, 0x62, 0xd3, 0xdd, 0x76, 0xfd, 0xf6, 0xe7, 0x48, 0x2d, 0x5a, 0x25, - 0x91, 0x13, 0x7f, 0x4e, 0x5c, 0x86, 0x15, 0x55, 0x74, 0x15, 0x06, 0x22, 0x27, 0xd8, 0x24, 0x91, - 0x38, 0x8f, 0x33, 0xcf, 0x4d, 0x5e, 0x13, 0xd3, 0x1d, 0x49, 0xbc, 0x1a, 0x89, 0x6f, 0xa9, 0x75, - 0x56, 0x15, 0x0b, 0x12, 0xf6, 0xbf, 0x1b, 0x84, 0x93, 0x8b, 0xd5, 0x72, 0xce, 0xba, 0x3a, 0x07, - 0x03, 0xf5, 0xc0, 0xdd, 0x21, 0x81, 0x18, 0x67, 0x45, 0x65, 0x89, 0x95, 0x62, 0x01, 0x45, 0x97, - 0x60, 0x94, 0xdf, 0x8f, 0x57, 0x1c, 0xaf, 0x1e, 0x1f, 0x8f, 0x02, 0x7b, 0xf4, 0xa6, 0x06, 0xc3, - 0x06, 0xe6, 0x21, 0x17, 0xd5, 0xb9, 0xc4, 0x66, 0xcc, 0xbb, 0x7b, 0xbf, 0x64, 0xc1, 0x24, 0x6f, - 0x66, 0x3e, 0x8a, 0x02, 0xf7, 0x76, 0x3b, 0x22, 0xe1, 0x4c, 0x3f, 0x3b, 0xe9, 0x16, 0xb3, 0x46, - 0x2b, 0x77, 0x04, 0xe6, 0x6e, 0x26, 0xa8, 0xf0, 0x43, 0x70, 0x46, 0xb4, 0x3b, 0x99, 0x04, 0xe3, - 0x54, 0xb3, 0xe8, 0xc7, 0x2c, 0x98, 0xad, 0xf9, 0x5e, 0x14, 0xf8, 0x8d, 0x06, 0x09, 0x2a, 0xed, - 0xdb, 0x0d, 0x37, 0xdc, 0xe2, 0xeb, 0x14, 0x93, 0x0d, 0x76, 0x12, 0xe4, 0xcc, 0xa1, 0x42, 0x12, - 0x73, 0x78, 0x66, 0x7f, 0xaf, 0x34, 0xbb, 0x98, 0x4b, 0x0a, 0x77, 0x68, 0x06, 0x6d, 0x03, 0xa2, - 0x37, 0x7b, 0x35, 0x72, 0x36, 0x49, 0xdc, 0xf8, 0x60, 0xef, 0x8d, 0x9f, 0xd8, 0xdf, 0x2b, 0xa1, - 0xb5, 0x14, 0x09, 0x9c, 0x41, 0x16, 0xbd, 0x0b, 0xc7, 0x68, 0x69, 0xea, 0x5b, 0x87, 0x7a, 0x6f, - 0x6e, 0x66, 0x7f, 0xaf, 0x74, 0x6c, 0x2d, 0x83, 0x08, 0xce, 0x24, 0x8d, 0x7e, 0xc4, 0x82, 0x93, - 0xf1, 0xe7, 0x2f, 0xdf, 0x6d, 0x39, 0x5e, 0x3d, 0x6e, 0x78, 0xb8, 0xf7, 0x86, 0xe9, 0x99, 0x7c, - 0x72, 0x31, 0x8f, 0x12, 0xce, 0x6f, 0x04, 0x79, 0x30, 0x4d, 0xbb, 0x96, 0x6c, 0x1b, 0x7a, 0x6f, - 0xfb, 0x91, 0xfd, 0xbd, 0xd2, 0xf4, 0x5a, 0x9a, 0x06, 0xce, 0x22, 0x3c, 0xbb, 0x08, 0xc7, 0x33, - 0x57, 0x27, 0x9a, 0x84, 0xe2, 0x36, 0xe1, 0x4c, 0xe0, 0x30, 0xa6, 0x3f, 0xd1, 0x31, 0xe8, 0xdf, - 0x71, 0x1a, 0x6d, 0xb1, 0x31, 0x31, 0xff, 0xf3, 0x6a, 0xe1, 0x92, 0x65, 0xff, 0x1f, 0x45, 0x98, - 0x58, 0xac, 0x96, 0xef, 0x6b, 0xd7, 0xeb, 0xd7, 0x5e, 0xa1, 0xe3, 0xb5, 0x17, 0x5f, 0xa2, 0xc5, - 0xdc, 0x4b, 0xf4, 0x87, 0x33, 0xb6, 0x6c, 0x1f, 0xdb, 0xb2, 0x1f, 0xcd, 0xd9, 0xb2, 0x0f, 0x78, - 0xa3, 0xee, 0xe4, 0xac, 0xda, 0x7e, 0x36, 0x81, 0x99, 0x1c, 0x12, 0xe3, 0xfd, 0x92, 0x47, 0xed, - 0x21, 0x97, 0xee, 0x83, 0x99, 0xc7, 0x1a, 0x8c, 0x2e, 0x3a, 0x2d, 0xe7, 0xb6, 0xdb, 0x70, 0x23, - 0x97, 0x84, 0xe8, 0x29, 0x28, 0x3a, 0xf5, 0x3a, 0xe3, 0xee, 0x86, 0x17, 0x8e, 0xef, 0xef, 0x95, - 0x8a, 0xf3, 0x75, 0xca, 0x66, 0x80, 0xc2, 0xda, 0xc5, 0x14, 0x03, 0x3d, 0x03, 0x7d, 0xf5, 0xc0, - 0x6f, 0xcd, 0x14, 0x18, 0x26, 0xdd, 0xe5, 0x7d, 0x4b, 0x81, 0xdf, 0x4a, 0xa0, 0x32, 0x1c, 0xfb, - 0x0f, 0x0b, 0x70, 0x6a, 0x91, 0xb4, 0xb6, 0x56, 0xaa, 0x39, 0xf7, 0xc5, 0x79, 0x18, 0x6a, 0xfa, - 0x9e, 0x1b, 0xf9, 0x41, 0x28, 0x9a, 0x66, 0x2b, 0x62, 0x55, 0x94, 0x61, 0x05, 0x45, 0x67, 0xa1, - 0xaf, 0x15, 0x33, 0xb1, 0xa3, 0x92, 0x01, 0x66, 0xec, 0x2b, 0x83, 0x50, 0x8c, 0x76, 0x48, 0x02, - 0xb1, 0x62, 0x14, 0xc6, 0x8d, 0x90, 0x04, 0x98, 0x41, 0x62, 0x4e, 0x80, 0xf2, 0x08, 0xe2, 0x46, - 0x48, 0x70, 0x02, 0x14, 0x82, 0x35, 0x2c, 0x54, 0x81, 0xe1, 0x30, 0x31, 0xb3, 0x3d, 0x6d, 0xcd, - 0x31, 0xc6, 0x2a, 0xa8, 0x99, 0x8c, 0x89, 0x18, 0x37, 0xd8, 0x40, 0x57, 0x56, 0xe1, 0x9b, 0x05, - 0x40, 0x7c, 0x08, 0xbf, 0xc7, 0x06, 0xee, 0x46, 0x7a, 0xe0, 0x7a, 0xdf, 0x12, 0x0f, 0x6a, 0xf4, - 0xfe, 0xb5, 0x05, 0xa7, 0x16, 0x5d, 0xaf, 0x4e, 0x82, 0x9c, 0x05, 0xf8, 0x70, 0x9e, 0xf2, 0x87, - 0x63, 0x52, 0x8c, 0x25, 0xd6, 0xf7, 0x00, 0x96, 0x98, 0xfd, 0x77, 0x16, 0x20, 0xfe, 0xd9, 0xef, - 0xbb, 0x8f, 0xbd, 0x91, 0xfe, 0xd8, 0x07, 0xb0, 0x2c, 0xec, 0x6b, 0x30, 0xbe, 0xd8, 0x70, 0x89, - 0x17, 0x95, 0x2b, 0x8b, 0xbe, 0xb7, 0xe1, 0x6e, 0xa2, 0x57, 0x61, 0x3c, 0x72, 0x9b, 0xc4, 0x6f, - 0x47, 0x55, 0x52, 0xf3, 0x3d, 0xf6, 0x72, 0xb5, 0xce, 0xf7, 0x2f, 0xa0, 0xfd, 0xbd, 0xd2, 0xf8, - 0xba, 0x01, 0xc1, 0x09, 0x4c, 0xfb, 0x97, 0xe8, 0xb9, 0xd5, 0x68, 0x87, 0x11, 0x09, 0xd6, 0x83, - 0x76, 0x18, 0x2d, 0xb4, 0x29, 0xef, 0x59, 0x09, 0x7c, 0xda, 0x1d, 0xd7, 0xf7, 0xd0, 0x29, 0xe3, - 0x39, 0x3e, 0x24, 0x9f, 0xe2, 0xe2, 0xd9, 0x3d, 0x07, 0x10, 0xba, 0x9b, 0x1e, 0x09, 0xb4, 0xe7, - 0xc3, 0x38, 0xdb, 0x2a, 0xaa, 0x14, 0x6b, 0x18, 0xa8, 0x01, 0x63, 0x0d, 0xe7, 0x36, 0x69, 0x54, - 0x49, 0x83, 0xd4, 0x22, 0x3f, 0x10, 0xf2, 0x8d, 0x17, 0x7b, 0x7b, 0x07, 0x5c, 0xd3, 0xab, 0x2e, - 0x4c, 0xed, 0xef, 0x95, 0xc6, 0x8c, 0x22, 0x6c, 0x12, 0xa7, 0x47, 0x87, 0xdf, 0xa2, 0x5f, 0xe1, - 0x34, 0xf4, 0xc7, 0xe7, 0x75, 0x51, 0x86, 0x15, 0x54, 0x1d, 0x1d, 0x7d, 0x79, 0x47, 0x87, 0xfd, - 0x17, 0x74, 0xa1, 0xf9, 0xcd, 0x96, 0xef, 0x11, 0x2f, 0x5a, 0xf4, 0xbd, 0x3a, 0x97, 0x4c, 0xbd, - 0x6a, 0x88, 0x4e, 0xce, 0x25, 0x44, 0x27, 0x27, 0xd2, 0x35, 0x34, 0xe9, 0xc9, 0x47, 0x61, 0x20, - 0x8c, 0x9c, 0xa8, 0x1d, 0x8a, 0x81, 0x7b, 0x4c, 0x2e, 0xbb, 0x2a, 0x2b, 0x3d, 0xd8, 0x2b, 0x4d, - 0xa8, 0x6a, 0xbc, 0x08, 0x8b, 0x0a, 0xe8, 0x69, 0x18, 0x6c, 0x92, 0x30, 0x74, 0x36, 0x25, 0xdb, - 0x30, 0x21, 0xea, 0x0e, 0xae, 0xf2, 0x62, 0x2c, 0xe1, 0xe8, 0x71, 0xe8, 0x27, 0x41, 0xe0, 0x07, - 0xe2, 0xdb, 0xc6, 0x04, 0x62, 0xff, 0x32, 0x2d, 0xc4, 0x1c, 0x66, 0xff, 0x3f, 0x16, 0x4c, 0xa8, - 0xbe, 0xf2, 0xb6, 0x8e, 0xe0, 0xb9, 0xf6, 0x36, 0x40, 0x4d, 0x7e, 0x60, 0xc8, 0xae, 0xd9, 0x91, - 0x17, 0xce, 0x65, 0x72, 0x34, 0xa9, 0x61, 0x8c, 0x29, 0xab, 0xa2, 0x10, 0x6b, 0xd4, 0xec, 0xdf, - 0xb3, 0x60, 0x3a, 0xf1, 0x45, 0xd7, 0xdc, 0x30, 0x42, 0xef, 0xa4, 0xbe, 0x6a, 0xae, 0xc7, 0xc5, - 0xe7, 0x86, 0xfc, 0x9b, 0xd4, 0x9e, 0x97, 0x25, 0xda, 0x17, 0x5d, 0x81, 0x7e, 0x37, 0x22, 0x4d, - 0xf9, 0x31, 0x8f, 0x77, 0xfc, 0x18, 0xde, 0xab, 0x78, 0x46, 0xca, 0xb4, 0x26, 0xe6, 0x04, 0xec, - 0x3f, 0x2c, 0xc2, 0x30, 0xdf, 0xdf, 0xab, 0x4e, 0xeb, 0x08, 0xe6, 0xe2, 0x59, 0x18, 0x76, 0x9b, - 0xcd, 0x76, 0xe4, 0xdc, 0x16, 0xf7, 0xde, 0x10, 0x3f, 0x83, 0xca, 0xb2, 0x10, 0xc7, 0x70, 0x54, - 0x86, 0x3e, 0xd6, 0x15, 0xfe, 0x95, 0x4f, 0x65, 0x7f, 0xa5, 0xe8, 0xfb, 0xdc, 0x92, 0x13, 0x39, - 0x9c, 0xe5, 0x54, 0xfb, 0x8a, 0x16, 0x61, 0x46, 0x02, 0x39, 0x00, 0xb7, 0x5d, 0xcf, 0x09, 0x76, - 0x69, 0xd9, 0x4c, 0x91, 0x11, 0x7c, 0xbe, 0x33, 0xc1, 0x05, 0x85, 0xcf, 0xc9, 0xaa, 0x0f, 0x8b, - 0x01, 0x58, 0x23, 0x3a, 0xfb, 0x0a, 0x0c, 0x2b, 0xe4, 0xc3, 0x70, 0x8e, 0xb3, 0x1f, 0x83, 0x89, - 0x44, 0x5b, 0xdd, 0xaa, 0x8f, 0xea, 0x8c, 0xe7, 0xef, 0xb0, 0x23, 0x43, 0xf4, 0x7a, 0xd9, 0xdb, - 0x11, 0x77, 0xd3, 0x3d, 0x38, 0xd6, 0xc8, 0x38, 0xf2, 0xc5, 0xbc, 0xf6, 0x7e, 0x45, 0x9c, 0x12, - 0x9f, 0x7d, 0x2c, 0x0b, 0x8a, 0x33, 0xdb, 0x30, 0x4e, 0xc4, 0x42, 0xa7, 0x13, 0x91, 0x9e, 0x77, - 0xc7, 0x54, 0xe7, 0xaf, 0x92, 0x5d, 0x75, 0xa8, 0x7e, 0x37, 0xbb, 0x7f, 0x9a, 0x8f, 0x3e, 0x3f, - 0x2e, 0x47, 0x04, 0x81, 0xe2, 0x55, 0xb2, 0xcb, 0xa7, 0x42, 0xff, 0xba, 0x62, 0xc7, 0xaf, 0xfb, - 0xba, 0x05, 0x63, 0xea, 0xeb, 0x8e, 0xe0, 0x5c, 0x58, 0x30, 0xcf, 0x85, 0xd3, 0x1d, 0x17, 0x78, - 0xce, 0x89, 0xf0, 0xcd, 0x02, 0x9c, 0x54, 0x38, 0xf4, 0x11, 0xc5, 0xff, 0x88, 0x55, 0x75, 0x01, - 0x86, 0x3d, 0x25, 0x4e, 0xb4, 0x4c, 0x39, 0x5e, 0x2c, 0x4c, 0x8c, 0x71, 0xe8, 0x95, 0xe7, 0xc5, - 0x97, 0xf6, 0xa8, 0x2e, 0x67, 0x17, 0x97, 0xfb, 0x02, 0x14, 0xdb, 0x6e, 0x5d, 0x5c, 0x30, 0x1f, - 0x96, 0xa3, 0x7d, 0xa3, 0xbc, 0x74, 0xb0, 0x57, 0x7a, 0x2c, 0x4f, 0xe5, 0x44, 0x6f, 0xb6, 0x70, - 0xee, 0x46, 0x79, 0x09, 0xd3, 0xca, 0x68, 0x1e, 0x26, 0xa4, 0x56, 0xed, 0x26, 0xe5, 0x4b, 0x7d, - 0x4f, 0xdc, 0x43, 0x4a, 0x58, 0x8e, 0x4d, 0x30, 0x4e, 0xe2, 0xa3, 0x25, 0x98, 0xdc, 0x6e, 0xdf, - 0x26, 0x0d, 0x12, 0xf1, 0x0f, 0xbe, 0x4a, 0xb8, 0x28, 0x79, 0x38, 0x7e, 0xc2, 0x5e, 0x4d, 0xc0, - 0x71, 0xaa, 0x86, 0xfd, 0x4f, 0xec, 0x3e, 0x10, 0xa3, 0xa7, 0xf1, 0x37, 0xdf, 0xcd, 0xe5, 0xdc, - 0xcb, 0xaa, 0xb8, 0x4a, 0x76, 0xd7, 0x7d, 0xca, 0x87, 0x64, 0xaf, 0x0a, 0x63, 0xcd, 0xf7, 0x75, - 0x5c, 0xf3, 0xbf, 0x51, 0x80, 0xe3, 0x6a, 0x04, 0x0c, 0x6e, 0xf9, 0x7b, 0x7d, 0x0c, 0x2e, 0xc2, - 0x48, 0x9d, 0x6c, 0x38, 0xed, 0x46, 0xa4, 0xf4, 0x1a, 0xfd, 0x5c, 0xd5, 0xb6, 0x14, 0x17, 0x63, - 0x1d, 0xe7, 0x10, 0xc3, 0xf6, 0x6b, 0x63, 0xec, 0x22, 0x8e, 0x1c, 0xba, 0xc6, 0xd5, 0xae, 0xb1, - 0x72, 0x77, 0xcd, 0xe3, 0xd0, 0xef, 0x36, 0x29, 0x63, 0x56, 0x30, 0xf9, 0xad, 0x32, 0x2d, 0xc4, - 0x1c, 0x86, 0x9e, 0x84, 0xc1, 0x9a, 0xdf, 0x6c, 0x3a, 0x5e, 0x9d, 0x5d, 0x79, 0xc3, 0x0b, 0x23, - 0x94, 0x77, 0x5b, 0xe4, 0x45, 0x58, 0xc2, 0x28, 0xf3, 0xed, 0x04, 0x9b, 0x5c, 0xd8, 0x23, 0x98, - 0xef, 0xf9, 0x60, 0x33, 0xc4, 0xac, 0x94, 0xbe, 0x55, 0xef, 0xf8, 0xc1, 0xb6, 0xeb, 0x6d, 0x2e, - 0xb9, 0x81, 0xd8, 0x12, 0xea, 0x2e, 0xbc, 0xa5, 0x20, 0x58, 0xc3, 0x42, 0x2b, 0xd0, 0xdf, 0xf2, - 0x83, 0x28, 0x9c, 0x19, 0x60, 0xc3, 0xfd, 0x58, 0xce, 0x41, 0xc4, 0xbf, 0xb6, 0xe2, 0x07, 0x51, - 0xfc, 0x01, 0xf4, 0x5f, 0x88, 0x79, 0x75, 0x74, 0x0d, 0x06, 0x89, 0xb7, 0xb3, 0x12, 0xf8, 0xcd, - 0x99, 0xe9, 0x7c, 0x4a, 0xcb, 0x1c, 0x85, 0x2f, 0xb3, 0x98, 0x47, 0x15, 0xc5, 0x58, 0x92, 0x40, - 0x1f, 0x85, 0x22, 0xf1, 0x76, 0x66, 0x06, 0x19, 0xa5, 0xd9, 0x1c, 0x4a, 0x37, 0x9d, 0x20, 0x3e, - 0xf3, 0x97, 0xbd, 0x1d, 0x4c, 0xeb, 0xa0, 0x4f, 0xc2, 0xb0, 0x3c, 0x30, 0x42, 0x21, 0x45, 0xcd, - 0x5c, 0xb0, 0xf2, 0x98, 0xc1, 0xe4, 0xdd, 0xb6, 0x1b, 0x90, 0x26, 0xf1, 0xa2, 0x30, 0x3e, 0x21, - 0x25, 0x34, 0xc4, 0x31, 0x35, 0x54, 0x83, 0xd1, 0x80, 0x84, 0xee, 0x3d, 0x52, 0xf1, 0x1b, 0x6e, - 0x6d, 0x77, 0xe6, 0x11, 0xd6, 0xbd, 0xa7, 0x3b, 0x0e, 0x19, 0xd6, 0x2a, 0xc4, 0x52, 0x7e, 0xbd, - 0x14, 0x1b, 0x44, 0xd1, 0x5b, 0x30, 0x16, 0x90, 0x30, 0x72, 0x82, 0x48, 0xb4, 0x32, 0xa3, 0xb4, - 0x72, 0x63, 0x58, 0x07, 0xf0, 0xe7, 0x44, 0xdc, 0x4c, 0x0c, 0xc1, 0x26, 0x05, 0xf4, 0x49, 0xa9, - 0x72, 0x58, 0xf5, 0xdb, 0x5e, 0x14, 0xce, 0x0c, 0xb3, 0x7e, 0x67, 0xea, 0xa6, 0x6f, 0xc6, 0x78, - 0x49, 0x9d, 0x04, 0xaf, 0x8c, 0x0d, 0x52, 0xe8, 0xd3, 0x30, 0xc6, 0xff, 0x73, 0x95, 0x6a, 0x38, - 0x73, 0x9c, 0xd1, 0x3e, 0x9b, 0x4f, 0x9b, 0x23, 0x2e, 0x1c, 0x17, 0xc4, 0xc7, 0xf4, 0xd2, 0x10, - 0x9b, 0xd4, 0x10, 0x86, 0xb1, 0x86, 0xbb, 0x43, 0x3c, 0x12, 0x86, 0x95, 0xc0, 0xbf, 0x4d, 0x84, - 0x84, 0xf8, 0x64, 0xb6, 0x0a, 0xd6, 0xbf, 0x4d, 0xc4, 0x23, 0x50, 0xaf, 0x83, 0x4d, 0x12, 0xe8, - 0x06, 0x8c, 0xd3, 0x27, 0xb9, 0x1b, 0x13, 0x1d, 0xe9, 0x46, 0x94, 0x3d, 0x9c, 0xb1, 0x51, 0x09, - 0x27, 0x88, 0xa0, 0xeb, 0x30, 0xca, 0xc6, 0xbc, 0xdd, 0xe2, 0x44, 0x4f, 0x74, 0x23, 0xca, 0x0c, - 0x0a, 0xaa, 0x5a, 0x15, 0x6c, 0x10, 0x40, 0x6f, 0xc2, 0x70, 0xc3, 0xdd, 0x20, 0xb5, 0xdd, 0x5a, - 0x83, 0xcc, 0x8c, 0x32, 0x6a, 0x99, 0x87, 0xe1, 0x35, 0x89, 0xc4, 0xf9, 0x73, 0xf5, 0x17, 0xc7, - 0xd5, 0xd1, 0x4d, 0x38, 0x11, 0x91, 0xa0, 0xe9, 0x7a, 0x0e, 0x3d, 0xc4, 0xc4, 0x93, 0x90, 0x69, - 0xc6, 0xc7, 0xd8, 0xea, 0x3a, 0x23, 0x66, 0xe3, 0xc4, 0x7a, 0x26, 0x16, 0xce, 0xa9, 0x8d, 0xee, - 0xc2, 0x4c, 0x06, 0x84, 0xaf, 0xdb, 0x63, 0x8c, 0xf2, 0xeb, 0x82, 0xf2, 0xcc, 0x7a, 0x0e, 0xde, - 0x41, 0x07, 0x18, 0xce, 0xa5, 0x8e, 0xae, 0xc3, 0x04, 0x3b, 0x39, 0x2b, 0xed, 0x46, 0x43, 0x34, - 0x38, 0xce, 0x1a, 0x7c, 0x52, 0xf2, 0x11, 0x65, 0x13, 0x7c, 0xb0, 0x57, 0x82, 0xf8, 0x1f, 0x4e, - 0xd6, 0x46, 0xb7, 0x99, 0x12, 0xb6, 0x1d, 0xb8, 0xd1, 0x2e, 0xdd, 0x55, 0xe4, 0x6e, 0x34, 0x33, - 0xd1, 0x51, 0x20, 0xa5, 0xa3, 0x2a, 0x4d, 0xad, 0x5e, 0x88, 0x93, 0x04, 0xe9, 0x55, 0x10, 0x46, - 0x75, 0xd7, 0x9b, 0x99, 0xe4, 0xef, 0x29, 0x79, 0x92, 0x56, 0x69, 0x21, 0xe6, 0x30, 0xa6, 0x80, - 0xa5, 0x3f, 0xae, 0xd3, 0x1b, 0x77, 0x8a, 0x21, 0xc6, 0x0a, 0x58, 0x09, 0xc0, 0x31, 0x0e, 0x65, - 0x82, 0xa3, 0x68, 0x77, 0x06, 0x31, 0x54, 0x75, 0x20, 0xae, 0xaf, 0x7f, 0x12, 0xd3, 0x72, 0xfb, - 0x36, 0x8c, 0xab, 0x63, 0x82, 0x8d, 0x09, 0x2a, 0x41, 0x3f, 0x63, 0xfb, 0x84, 0xf8, 0x74, 0x98, - 0x76, 0x81, 0xb1, 0x84, 0x98, 0x97, 0xb3, 0x2e, 0xb8, 0xf7, 0xc8, 0xc2, 0x6e, 0x44, 0xb8, 0x2c, - 0xa2, 0xa8, 0x75, 0x41, 0x02, 0x70, 0x8c, 0x63, 0xff, 0x7b, 0xce, 0x3e, 0xc7, 0xb7, 0x44, 0x0f, - 0xf7, 0xe2, 0x73, 0x30, 0xc4, 0x0c, 0x3f, 0xfc, 0x80, 0x6b, 0x67, 0xfb, 0x63, 0x86, 0xf9, 0x8a, - 0x28, 0xc7, 0x0a, 0x03, 0xbd, 0x06, 0x63, 0x35, 0xbd, 0x01, 0x71, 0xa9, 0xab, 0x63, 0xc4, 0x68, - 0x1d, 0x9b, 0xb8, 0xe8, 0x12, 0x0c, 0x31, 0x1b, 0xa7, 0x9a, 0xdf, 0x10, 0xdc, 0xa6, 0xe4, 0x4c, - 0x86, 0x2a, 0xa2, 0xfc, 0x40, 0xfb, 0x8d, 0x15, 0x36, 0x3a, 0x07, 0x03, 0xb4, 0x0b, 0xe5, 0x8a, - 0xb8, 0x4e, 0x95, 0x24, 0xf0, 0x0a, 0x2b, 0xc5, 0x02, 0x6a, 0xff, 0x9e, 0xc5, 0x78, 0xa9, 0xf4, - 0x99, 0x8f, 0xae, 0xb0, 0x4b, 0x83, 0xdd, 0x20, 0x9a, 0x16, 0xfe, 0x09, 0xed, 0x26, 0x50, 0xb0, - 0x83, 0xc4, 0x7f, 0x6c, 0xd4, 0x44, 0x6f, 0x27, 0x6f, 0x06, 0xce, 0x50, 0xbc, 0x24, 0x87, 0x20, - 0x79, 0x3b, 0x3c, 0x1a, 0x5f, 0x71, 0xb4, 0x3f, 0x9d, 0xae, 0x08, 0xfb, 0x3f, 0x2d, 0x68, 0xab, - 0xa4, 0x1a, 0x39, 0x11, 0x41, 0x15, 0x18, 0xbc, 0xe3, 0xb8, 0x91, 0xeb, 0x6d, 0x0a, 0xbe, 0xaf, - 0xf3, 0x45, 0xc7, 0x2a, 0xdd, 0xe2, 0x15, 0x38, 0xf7, 0x22, 0xfe, 0x60, 0x49, 0x86, 0x52, 0x0c, - 0xda, 0x9e, 0x47, 0x29, 0x16, 0x7a, 0xa5, 0x88, 0x79, 0x05, 0x4e, 0x51, 0xfc, 0xc1, 0x92, 0x0c, - 0x7a, 0x07, 0x40, 0x9e, 0x10, 0xa4, 0x2e, 0x64, 0x87, 0xcf, 0x75, 0x27, 0xba, 0xae, 0xea, 0x70, - 0xe1, 0x64, 0xfc, 0x1f, 0x6b, 0xf4, 0xec, 0x48, 0x9b, 0x53, 0xbd, 0x33, 0xe8, 0x53, 0x74, 0x8b, - 0x3a, 0x41, 0x44, 0xea, 0xf3, 0x91, 0x18, 0x9c, 0x67, 0x7a, 0x7b, 0x1c, 0xae, 0xbb, 0x4d, 0xa2, - 0x6f, 0x67, 0x41, 0x04, 0xc7, 0xf4, 0xec, 0xdf, 0x2a, 0xc2, 0x4c, 0x5e, 0x77, 0xe9, 0xa6, 0x21, - 0x77, 0xdd, 0x68, 0x91, 0xb2, 0xb5, 0x96, 0xb9, 0x69, 0x96, 0x45, 0x39, 0x56, 0x18, 0x74, 0xf5, - 0x86, 0xee, 0xa6, 0x7c, 0xdb, 0xf7, 0xc7, 0xab, 0xb7, 0xca, 0x4a, 0xb1, 0x80, 0x52, 0xbc, 0x80, - 0x38, 0xa1, 0x30, 0xbe, 0xd3, 0x56, 0x39, 0x66, 0xa5, 0x58, 0x40, 0x75, 0x29, 0x63, 0x5f, 0x17, - 0x29, 0xa3, 0x31, 0x44, 0xfd, 0x0f, 0x76, 0x88, 0xd0, 0x67, 0x00, 0x36, 0x5c, 0xcf, 0x0d, 0xb7, - 0x18, 0xf5, 0x81, 0x43, 0x53, 0x57, 0x4c, 0xf1, 0x8a, 0xa2, 0x82, 0x35, 0x8a, 0xe8, 0x65, 0x18, - 0x51, 0x07, 0x48, 0x79, 0x89, 0xa9, 0xfe, 0x35, 0x53, 0xaa, 0xf8, 0x34, 0x5d, 0xc2, 0x3a, 0x9e, - 0xfd, 0xb9, 0xe4, 0x7a, 0x11, 0x3b, 0x40, 0x1b, 0x5f, 0xab, 0xd7, 0xf1, 0x2d, 0x74, 0x1e, 0x5f, - 0xfb, 0x67, 0x86, 0x60, 0xc2, 0x68, 0xac, 0x1d, 0xf6, 0x70, 0xe6, 0x5e, 0xa6, 0x17, 0x90, 0x13, - 0x11, 0xb1, 0xff, 0xec, 0xee, 0x5b, 0x45, 0xbf, 0xa4, 0xe8, 0x0e, 0xe0, 0xf5, 0xd1, 0x67, 0x60, - 0xb8, 0xe1, 0x84, 0x4c, 0x62, 0x49, 0xc4, 0xbe, 0xeb, 0x85, 0x58, 0xfc, 0x20, 0x74, 0xc2, 0x48, - 0xbb, 0xf5, 0x39, 0xed, 0x98, 0x24, 0xbd, 0x29, 0x29, 0x7f, 0x25, 0xad, 0x3b, 0x55, 0x27, 0x28, - 0x13, 0xb6, 0x8b, 0x39, 0x0c, 0x5d, 0x62, 0x47, 0x2b, 0x5d, 0x15, 0x8b, 0x94, 0x1b, 0x65, 0xcb, - 0xac, 0xdf, 0x60, 0xb2, 0x15, 0x0c, 0x1b, 0x98, 0xf1, 0x9b, 0x6c, 0xa0, 0xc3, 0x9b, 0xec, 0x69, - 0x18, 0x64, 0x3f, 0xd4, 0x0a, 0x50, 0xb3, 0x51, 0xe6, 0xc5, 0x58, 0xc2, 0x93, 0x0b, 0x66, 0xa8, - 0xb7, 0x05, 0x43, 0x5f, 0x7d, 0x62, 0x51, 0x33, 0xb3, 0x8b, 0x21, 0x7e, 0xca, 0x89, 0x25, 0x8f, - 0x25, 0x0c, 0xfd, 0xb2, 0x05, 0xc8, 0x69, 0xd0, 0xd7, 0x32, 0x2d, 0x56, 0x8f, 0x1b, 0x60, 0xac, - 0xf6, 0x6b, 0x5d, 0x87, 0xbd, 0x1d, 0xce, 0xcd, 0xa7, 0x6a, 0x73, 0x49, 0xe9, 0xab, 0xa2, 0x8b, - 0x28, 0x8d, 0xa0, 0x5f, 0x46, 0xd7, 0xdc, 0x30, 0xfa, 0xc2, 0x5f, 0x26, 0x2e, 0xa7, 0x8c, 0x2e, - 0xa1, 0x1b, 0xfa, 0xe3, 0x6b, 0xe4, 0x90, 0x8f, 0xaf, 0xb1, 0xdc, 0x87, 0xd7, 0x0f, 0x26, 0x1e, - 0x30, 0xa3, 0xec, 0xcb, 0x9f, 0xec, 0xf2, 0x80, 0x11, 0xe2, 0xf4, 0x5e, 0x9e, 0x31, 0x15, 0xa1, - 0x07, 0x1e, 0x63, 0x5d, 0xee, 0xfc, 0x08, 0xbe, 0x11, 0x92, 0x60, 0xe1, 0xa4, 0x54, 0x13, 0x1f, - 0xe8, 0xbc, 0x47, 0xac, 0x37, 0x9e, 0x6d, 0xc3, 0x23, 0x39, 0x83, 0x9e, 0x21, 0x32, 0x5e, 0xd2, - 0x45, 0xc6, 0x5d, 0x04, 0x8d, 0x73, 0x72, 0x58, 0xe6, 0xde, 0x6a, 0x3b, 0x5e, 0xe4, 0x46, 0xbb, - 0xba, 0x88, 0xd9, 0x03, 0xb3, 0x37, 0xe8, 0xd3, 0xd0, 0xdf, 0x70, 0xbd, 0xf6, 0x5d, 0x71, 0x4d, - 0x9d, 0xcb, 0x7e, 0x41, 0x78, 0xed, 0xbb, 0xe6, 0xf7, 0x95, 0xe8, 0x6e, 0x60, 0xe5, 0x07, 0x7b, - 0x25, 0x94, 0x46, 0xc0, 0x9c, 0xaa, 0xfd, 0x0c, 0x8c, 0x2f, 0x39, 0xa4, 0xe9, 0x7b, 0xcb, 0x5e, - 0xbd, 0xe5, 0xbb, 0x5e, 0x84, 0x66, 0xa0, 0x8f, 0xf1, 0x67, 0xfc, 0x76, 0xea, 0xa3, 0x83, 0x8f, - 0x59, 0x89, 0xbd, 0x09, 0xc7, 0x97, 0xfc, 0x3b, 0xde, 0x1d, 0x27, 0xa8, 0xcf, 0x57, 0xca, 0x9a, - 0xc8, 0x6d, 0x4d, 0x8a, 0x7c, 0xac, 0xfc, 0x07, 0xb5, 0x56, 0x93, 0xcf, 0xe3, 0x8a, 0xdb, 0x20, - 0x39, 0x82, 0xd1, 0xff, 0xa2, 0x60, 0xb4, 0x14, 0xe3, 0x2b, 0xb5, 0x9e, 0x95, 0x6b, 0x11, 0xf0, - 0x16, 0x0c, 0x6d, 0xb8, 0xa4, 0x51, 0xc7, 0x64, 0x43, 0xcc, 0xc6, 0x53, 0xf9, 0x36, 0x83, 0x2b, - 0x14, 0x53, 0xe9, 0x1f, 0x99, 0xc0, 0x68, 0x45, 0x54, 0xc6, 0x8a, 0x0c, 0xda, 0x86, 0x49, 0x39, - 0x67, 0x12, 0x2a, 0x8e, 0xcc, 0xa7, 0x3b, 0xed, 0x0d, 0x93, 0x38, 0xb3, 0x9f, 0xc6, 0x09, 0x32, - 0x38, 0x45, 0x18, 0x9d, 0x82, 0xbe, 0x26, 0x65, 0x0e, 0xfa, 0xd8, 0xf0, 0x33, 0x09, 0x11, 0x13, - 0x76, 0xb1, 0x52, 0xfb, 0xe7, 0x2c, 0x78, 0x24, 0x35, 0x32, 0x42, 0xe8, 0xf7, 0x80, 0x67, 0x21, - 0x29, 0x84, 0x2b, 0x74, 0x17, 0xc2, 0xd9, 0xff, 0x9d, 0x05, 0xc7, 0x96, 0x9b, 0xad, 0x68, 0x77, - 0xc9, 0x35, 0xd5, 0xf7, 0xaf, 0xc0, 0x40, 0x93, 0xd4, 0xdd, 0x76, 0x53, 0xcc, 0x5c, 0x49, 0x5e, - 0xa0, 0xab, 0xac, 0x94, 0x6e, 0xc2, 0x6a, 0xe4, 0x07, 0xce, 0x26, 0xe1, 0x05, 0x58, 0xa0, 0x33, - 0x36, 0xc4, 0xbd, 0x47, 0xae, 0xb9, 0x4d, 0x37, 0xba, 0xbf, 0xdd, 0x25, 0x34, 0xef, 0x92, 0x08, - 0x8e, 0xe9, 0xd9, 0xdf, 0xb6, 0x60, 0x42, 0xae, 0xfb, 0xf9, 0x7a, 0x3d, 0x20, 0x61, 0x88, 0x66, - 0xa1, 0xe0, 0xb6, 0x44, 0x2f, 0x41, 0xf4, 0xb2, 0x50, 0xae, 0xe0, 0x82, 0xdb, 0x92, 0x2f, 0x1e, - 0x76, 0x47, 0x17, 0x4d, 0x23, 0x84, 0x2b, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x1e, 0x86, 0x3c, 0xbf, - 0xce, 0x1f, 0x0d, 0x42, 0x0d, 0x4d, 0x31, 0xd7, 0x44, 0x19, 0x56, 0x50, 0x54, 0x81, 0x61, 0x6e, - 0xa2, 0x1a, 0x2f, 0xda, 0x9e, 0x0c, 0x5d, 0xd9, 0x97, 0xad, 0xcb, 0x9a, 0x38, 0x26, 0x62, 0xff, - 0x81, 0x05, 0xa3, 0xf2, 0xcb, 0x7a, 0x7c, 0xce, 0xd1, 0xad, 0x15, 0x3f, 0xe5, 0xe2, 0xad, 0x45, - 0x9f, 0x63, 0x0c, 0x62, 0xbc, 0xc2, 0x8a, 0x87, 0x7a, 0x85, 0x5d, 0x84, 0x11, 0xa7, 0xd5, 0xaa, - 0x98, 0x4f, 0x38, 0xb6, 0x94, 0xe6, 0xe3, 0x62, 0xac, 0xe3, 0xd8, 0x3f, 0x5b, 0x80, 0x71, 0xf9, - 0x05, 0xd5, 0xf6, 0xed, 0x90, 0x44, 0x68, 0x1d, 0x86, 0x1d, 0x3e, 0x4b, 0x44, 0x2e, 0xf2, 0xc7, - 0xb3, 0x45, 0x8b, 0xc6, 0x94, 0xc6, 0xbc, 0xe8, 0xbc, 0xac, 0x8d, 0x63, 0x42, 0xa8, 0x01, 0x53, - 0x9e, 0x1f, 0x31, 0xbe, 0x44, 0xc1, 0x3b, 0x69, 0x7b, 0x93, 0xd4, 0x4f, 0x0a, 0xea, 0x53, 0x6b, - 0x49, 0x2a, 0x38, 0x4d, 0x18, 0x2d, 0x4b, 0x71, 0x6d, 0x31, 0x5f, 0xce, 0xa6, 0x4f, 0x5c, 0xb6, - 0xb4, 0xd6, 0xfe, 0x5d, 0x0b, 0x86, 0x25, 0xda, 0x51, 0x28, 0xf6, 0x57, 0x61, 0x30, 0x64, 0x93, - 0x20, 0x87, 0xc6, 0xee, 0xd4, 0x71, 0x3e, 0x5f, 0x31, 0xbb, 0xc5, 0xff, 0x87, 0x58, 0xd2, 0x60, - 0xda, 0x3a, 0xd5, 0xfd, 0xf7, 0x89, 0xb6, 0x4e, 0xf5, 0x27, 0xe7, 0x52, 0xfa, 0x6b, 0xd6, 0x67, - 0x4d, 0xfc, 0x4d, 0x5f, 0x05, 0xad, 0x80, 0x6c, 0xb8, 0x77, 0x93, 0xaf, 0x82, 0x0a, 0x2b, 0xc5, - 0x02, 0x8a, 0xde, 0x81, 0xd1, 0x9a, 0x54, 0xd3, 0xc4, 0x3b, 0xfc, 0x5c, 0x47, 0x95, 0xa1, 0xd2, - 0x2e, 0x73, 0x31, 0xe3, 0xa2, 0x56, 0x1f, 0x1b, 0xd4, 0x4c, 0x13, 0xac, 0x62, 0x37, 0x13, 0xac, - 0x98, 0x6e, 0xbe, 0x41, 0xd2, 0xcf, 0x5b, 0x30, 0xc0, 0xc5, 0xf3, 0xbd, 0x69, 0x47, 0x34, 0x65, - 0x7b, 0x3c, 0x76, 0x37, 0x69, 0xa1, 0xe0, 0x6c, 0xd0, 0x2a, 0x0c, 0xb3, 0x1f, 0x4c, 0xbd, 0x50, - 0xcc, 0x77, 0xd8, 0xe2, 0xad, 0xea, 0x1d, 0xbc, 0x29, 0xab, 0xe1, 0x98, 0x82, 0xfd, 0x33, 0x45, - 0x7a, 0xba, 0xc5, 0xa8, 0xc6, 0xa5, 0x6f, 0x3d, 0xbc, 0x4b, 0xbf, 0xf0, 0xb0, 0x2e, 0xfd, 0x4d, - 0x98, 0xa8, 0x69, 0xaa, 0xf9, 0x78, 0x26, 0xcf, 0x77, 0x5c, 0x24, 0x9a, 0x16, 0x9f, 0x0b, 0x30, - 0x17, 0x4d, 0x22, 0x38, 0x49, 0x15, 0x7d, 0x0a, 0x46, 0xf9, 0x3c, 0x8b, 0x56, 0xb8, 0x15, 0xdb, - 0x93, 0xf9, 0xeb, 0x45, 0x6f, 0x82, 0x0b, 0xbc, 0xb5, 0xea, 0xd8, 0x20, 0x66, 0xff, 0xbd, 0x05, - 0x68, 0xb9, 0xb5, 0x45, 0x9a, 0x24, 0x70, 0x1a, 0xb1, 0x86, 0xed, 0xcb, 0x16, 0xcc, 0x90, 0x54, - 0xf1, 0xa2, 0xdf, 0x6c, 0x8a, 0xf7, 0x74, 0x8e, 0xc8, 0x67, 0x39, 0xa7, 0x8e, 0x72, 0x21, 0x9b, - 0xc9, 0xc3, 0xc0, 0xb9, 0xed, 0xa1, 0x55, 0x98, 0xe6, 0xb7, 0xa4, 0x02, 0x68, 0x86, 0x6e, 0x8f, - 0x0a, 0xc2, 0xd3, 0xeb, 0x69, 0x14, 0x9c, 0x55, 0xcf, 0xfe, 0xdd, 0x31, 0xc8, 0xed, 0xc5, 0x07, - 0xaa, 0xc5, 0x0f, 0x54, 0x8b, 0x1f, 0xa8, 0x16, 0x3f, 0x50, 0x2d, 0x7e, 0xa0, 0x5a, 0xfc, 0x40, - 0xb5, 0xf8, 0x3e, 0x55, 0x2d, 0xfe, 0x67, 0x16, 0x1c, 0x57, 0xd7, 0x97, 0xf1, 0x60, 0xff, 0x3c, - 0x4c, 0xf3, 0xed, 0xb6, 0xd8, 0x70, 0xdc, 0xe6, 0x3a, 0x69, 0xb6, 0x1a, 0x4e, 0x24, 0x0d, 0x88, - 0x2e, 0x66, 0xae, 0xdc, 0x84, 0x97, 0x82, 0x51, 0x91, 0xbb, 0x7b, 0x65, 0x00, 0x70, 0x56, 0x33, - 0xf6, 0x6f, 0x0d, 0x41, 0xff, 0xf2, 0x0e, 0xf1, 0xa2, 0x23, 0x78, 0xda, 0xd4, 0x60, 0xdc, 0xf5, - 0x76, 0xfc, 0xc6, 0x0e, 0xa9, 0x73, 0xf8, 0x61, 0x5e, 0xe0, 0x27, 0x04, 0xe9, 0xf1, 0xb2, 0x41, - 0x02, 0x27, 0x48, 0x3e, 0x0c, 0x05, 0xcd, 0x65, 0x18, 0xe0, 0x97, 0x8f, 0xd0, 0xce, 0x64, 0x9e, - 0xd9, 0x6c, 0x10, 0xc5, 0x95, 0x1a, 0x2b, 0x8f, 0xf8, 0xe5, 0x26, 0xaa, 0xa3, 0xcf, 0xc1, 0xf8, - 0x86, 0x1b, 0x84, 0xd1, 0xba, 0xdb, 0xa4, 0x57, 0x43, 0xb3, 0x75, 0x1f, 0x0a, 0x19, 0x35, 0x0e, - 0x2b, 0x06, 0x25, 0x9c, 0xa0, 0x8c, 0x36, 0x61, 0xac, 0xe1, 0xe8, 0x4d, 0x0d, 0x1e, 0xba, 0x29, - 0x75, 0x3b, 0x5c, 0xd3, 0x09, 0x61, 0x93, 0x2e, 0xdd, 0x4e, 0x35, 0xa6, 0x53, 0x18, 0x62, 0xe2, - 0x0c, 0xb5, 0x9d, 0xb8, 0x32, 0x81, 0xc3, 0x28, 0x83, 0xc6, 0x6c, 0xfd, 0x87, 0x4d, 0x06, 0x4d, - 0xb3, 0xe8, 0xff, 0x2c, 0x0c, 0x13, 0x3a, 0x84, 0x94, 0xb0, 0xb8, 0x60, 0x2e, 0xf4, 0xd6, 0xd7, - 0x55, 0xb7, 0x16, 0xf8, 0xa6, 0x2a, 0x6c, 0x59, 0x52, 0xc2, 0x31, 0x51, 0xb4, 0x08, 0x03, 0x21, - 0x09, 0x5c, 0x25, 0x6e, 0xef, 0x30, 0x8d, 0x0c, 0x8d, 0xfb, 0x13, 0xf2, 0xdf, 0x58, 0x54, 0xa5, - 0xcb, 0xcb, 0x61, 0xa2, 0x58, 0x76, 0x19, 0x68, 0xcb, 0x6b, 0x9e, 0x95, 0x62, 0x01, 0x45, 0x6f, - 0xc2, 0x60, 0x40, 0x1a, 0x4c, 0xd7, 0x3a, 0xd6, 0xfb, 0x22, 0xe7, 0xaa, 0x5b, 0x5e, 0x0f, 0x4b, - 0x02, 0xe8, 0x2a, 0xa0, 0x80, 0x50, 0x06, 0xcf, 0xf5, 0x36, 0x95, 0x05, 0xbc, 0x38, 0x68, 0x15, - 0x23, 0x8d, 0x63, 0x0c, 0xe9, 0x4a, 0x8a, 0x33, 0xaa, 0xa1, 0xcb, 0x30, 0xa5, 0x4a, 0xcb, 0x5e, - 0x18, 0x39, 0xf4, 0x80, 0x9b, 0x60, 0xb4, 0x94, 0x7c, 0x05, 0x27, 0x11, 0x70, 0xba, 0x8e, 0xfd, - 0xab, 0x16, 0xf0, 0x71, 0x3e, 0x02, 0xa9, 0xc2, 0x1b, 0xa6, 0x54, 0xe1, 0x64, 0xee, 0xcc, 0xe5, - 0x48, 0x14, 0x7e, 0xd5, 0x82, 0x11, 0x6d, 0x66, 0xe3, 0x35, 0x6b, 0x75, 0x58, 0xb3, 0x6d, 0x98, - 0xa4, 0x2b, 0xfd, 0xfa, 0xed, 0x90, 0x04, 0x3b, 0xa4, 0xce, 0x16, 0x66, 0xe1, 0xfe, 0x16, 0xa6, - 0xb2, 0xb6, 0xbd, 0x96, 0x20, 0x88, 0x53, 0x4d, 0xd8, 0x9f, 0x95, 0x5d, 0x55, 0xc6, 0xc9, 0x35, - 0x35, 0xe7, 0x09, 0xe3, 0x64, 0x35, 0xab, 0x38, 0xc6, 0xa1, 0x5b, 0x6d, 0xcb, 0x0f, 0xa3, 0xa4, - 0x71, 0xf2, 0x15, 0x3f, 0x8c, 0x30, 0x83, 0xd8, 0x2f, 0x02, 0x2c, 0xdf, 0x25, 0x35, 0xbe, 0x62, - 0xf5, 0x47, 0x8f, 0x95, 0xff, 0xe8, 0xb1, 0xff, 0xcc, 0x82, 0xf1, 0x95, 0x45, 0xe3, 0xe6, 0x9a, - 0x03, 0xe0, 0x2f, 0xb5, 0x5b, 0xb7, 0xd6, 0xa4, 0x85, 0x0c, 0x37, 0x12, 0x50, 0xa5, 0x58, 0xc3, - 0x40, 0x27, 0xa1, 0xd8, 0x68, 0x7b, 0x42, 0xec, 0x39, 0x48, 0xaf, 0xc7, 0x6b, 0x6d, 0x0f, 0xd3, - 0x32, 0xcd, 0x8d, 0xac, 0xd8, 0xb3, 0x1b, 0x59, 0xd7, 0x68, 0x36, 0xa8, 0x04, 0xfd, 0x77, 0xee, - 0xb8, 0x75, 0xee, 0xa4, 0x2f, 0xac, 0x77, 0x6e, 0xdd, 0x2a, 0x2f, 0x85, 0x98, 0x97, 0xdb, 0x5f, - 0x29, 0xc2, 0xec, 0x4a, 0x83, 0xdc, 0x7d, 0x8f, 0x81, 0x0a, 0x7a, 0x75, 0x82, 0x3b, 0x9c, 0x00, - 0xe9, 0xb0, 0x8e, 0x8e, 0xdd, 0xc7, 0x63, 0x03, 0x06, 0xb9, 0x6d, 0xae, 0x0c, 0x5b, 0x90, 0xa9, - 0x11, 0xcd, 0x1f, 0x90, 0x39, 0x6e, 0xe3, 0x2b, 0x34, 0xa2, 0xea, 0xc2, 0x14, 0xa5, 0x58, 0x12, - 0x9f, 0x7d, 0x15, 0x46, 0x75, 0xcc, 0x43, 0xb9, 0x1c, 0xff, 0x68, 0x11, 0x26, 0x69, 0x0f, 0x1e, - 0xea, 0x44, 0xdc, 0x48, 0x4f, 0xc4, 0x83, 0x76, 0x3b, 0xed, 0x3e, 0x1b, 0xef, 0x24, 0x67, 0xe3, - 0x62, 0xde, 0x6c, 0x1c, 0xf5, 0x1c, 0xfc, 0x98, 0x05, 0xd3, 0x2b, 0x0d, 0xbf, 0xb6, 0x9d, 0x70, - 0x0d, 0x7d, 0x19, 0x46, 0xe8, 0x71, 0x1c, 0x1a, 0x51, 0x52, 0x8c, 0xb8, 0x39, 0x02, 0x84, 0x75, - 0x3c, 0xad, 0xda, 0x8d, 0x1b, 0xe5, 0xa5, 0xac, 0x70, 0x3b, 0x02, 0x84, 0x75, 0x3c, 0xfb, 0x4f, - 0x2c, 0x38, 0x7d, 0x79, 0x71, 0x39, 0x5e, 0x8a, 0xa9, 0x88, 0x3f, 0xe7, 0x60, 0xa0, 0x55, 0xd7, - 0xba, 0x12, 0x8b, 0x85, 0x97, 0x58, 0x2f, 0x04, 0xf4, 0xfd, 0x12, 0x5c, 0xeb, 0x06, 0xc0, 0x65, - 0x5c, 0x59, 0x14, 0xe7, 0xae, 0xd4, 0x02, 0x59, 0xb9, 0x5a, 0xa0, 0x27, 0x61, 0x90, 0xde, 0x0b, - 0x6e, 0x4d, 0xf6, 0x9b, 0xdb, 0x3c, 0xf0, 0x22, 0x2c, 0x61, 0xf6, 0xaf, 0x58, 0x30, 0x7d, 0xd9, - 0x8d, 0xe8, 0xa5, 0x9d, 0x0c, 0x69, 0x43, 0x6f, 0xed, 0xd0, 0x8d, 0xfc, 0x60, 0x37, 0x19, 0xd2, - 0x06, 0x2b, 0x08, 0xd6, 0xb0, 0xf8, 0x07, 0xed, 0xb8, 0xcc, 0xd9, 0xa4, 0x60, 0xea, 0xdd, 0xb0, - 0x28, 0xc7, 0x0a, 0x83, 0x8e, 0x57, 0xdd, 0x0d, 0x98, 0xc8, 0x72, 0x57, 0x1c, 0xdc, 0x6a, 0xbc, - 0x96, 0x24, 0x00, 0xc7, 0x38, 0xf6, 0xdf, 0x5a, 0x50, 0xba, 0xcc, 0x5d, 0x66, 0x37, 0xc2, 0x9c, - 0x43, 0xf7, 0x45, 0x18, 0x26, 0x52, 0x41, 0x20, 0x7a, 0xad, 0x18, 0x51, 0xa5, 0x39, 0xe0, 0x91, - 0x75, 0x14, 0x5e, 0x0f, 0xfe, 0xeb, 0x87, 0x73, 0x40, 0x5e, 0x01, 0x44, 0xf4, 0xb6, 0xf4, 0x50, - 0x43, 0x2c, 0x66, 0xc9, 0x72, 0x0a, 0x8a, 0x33, 0x6a, 0xd8, 0x3f, 0x67, 0xc1, 0x71, 0xf5, 0xc1, - 0xef, 0xbb, 0xcf, 0xb4, 0xbf, 0x51, 0x80, 0xb1, 0x2b, 0xeb, 0xeb, 0x95, 0xcb, 0x24, 0xd2, 0x56, - 0x65, 0x67, 0xb5, 0x3f, 0xd6, 0xb4, 0x97, 0x9d, 0xde, 0x88, 0xed, 0xc8, 0x6d, 0xcc, 0xf1, 0x00, - 0x7a, 0x73, 0x65, 0x2f, 0xba, 0x1e, 0x54, 0xa3, 0xc0, 0xf5, 0x36, 0x33, 0x57, 0xba, 0xe4, 0x59, - 0x8a, 0x79, 0x3c, 0x0b, 0x7a, 0x11, 0x06, 0x58, 0x04, 0x3f, 0x39, 0x09, 0x8f, 0xaa, 0x27, 0x16, - 0x2b, 0x3d, 0xd8, 0x2b, 0x0d, 0xdf, 0xc0, 0x65, 0xfe, 0x07, 0x0b, 0x54, 0x74, 0x03, 0x46, 0xb6, - 0xa2, 0xa8, 0x75, 0x85, 0x38, 0x75, 0x12, 0xc8, 0x53, 0xf6, 0x4c, 0xd6, 0x29, 0x4b, 0x07, 0x81, - 0xa3, 0xc5, 0x07, 0x53, 0x5c, 0x16, 0x62, 0x9d, 0x8e, 0x5d, 0x05, 0x88, 0x61, 0x0f, 0x48, 0x71, - 0x63, 0xaf, 0xc3, 0x30, 0xfd, 0xdc, 0xf9, 0x86, 0xeb, 0x74, 0x56, 0x8d, 0x3f, 0x0b, 0xc3, 0x52, - 0xf1, 0x1d, 0x8a, 0xf8, 0x1a, 0xec, 0x46, 0x92, 0x7a, 0xf1, 0x10, 0xc7, 0x70, 0xfb, 0x09, 0x10, - 0xe6, 0xb7, 0x9d, 0x48, 0xda, 0x1b, 0x70, 0x8c, 0xd9, 0x11, 0x3b, 0xd1, 0x96, 0xb1, 0x46, 0xbb, - 0x2f, 0x86, 0xe7, 0xc4, 0xbb, 0x8e, 0x7f, 0xd9, 0x8c, 0xe6, 0xbf, 0x3d, 0x2a, 0x29, 0xc6, 0x6f, - 0x3c, 0xfb, 0x6f, 0xfa, 0xe0, 0xd1, 0x72, 0x35, 0x3f, 0x30, 0xd4, 0x25, 0x18, 0xe5, 0xec, 0x22, - 0x5d, 0x1a, 0x4e, 0x43, 0xb4, 0xab, 0x24, 0xa0, 0xeb, 0x1a, 0x0c, 0x1b, 0x98, 0xe8, 0x34, 0x14, - 0xdd, 0x77, 0xbd, 0xa4, 0x77, 0x63, 0xf9, 0xad, 0x35, 0x4c, 0xcb, 0x29, 0x98, 0x72, 0x9e, 0xfc, - 0x48, 0x57, 0x60, 0xc5, 0x7d, 0xbe, 0x01, 0xe3, 0x6e, 0x58, 0x0b, 0xdd, 0xb2, 0x47, 0xf7, 0xa9, - 0xb6, 0xd3, 0x95, 0xcc, 0x81, 0x76, 0x5a, 0x41, 0x71, 0x02, 0x5b, 0xbb, 0x5f, 0xfa, 0x7b, 0xe6, - 0x5e, 0xbb, 0x86, 0xa5, 0xa0, 0xc7, 0x7f, 0x8b, 0x7d, 0x5d, 0xc8, 0x44, 0xf0, 0xe2, 0xf8, 0xe7, - 0x1f, 0x1c, 0x62, 0x09, 0xa3, 0x0f, 0xba, 0xda, 0x96, 0xd3, 0x9a, 0x6f, 0x47, 0x5b, 0x4b, 0x6e, - 0x58, 0xf3, 0x77, 0x48, 0xb0, 0xcb, 0xde, 0xe2, 0x43, 0xf1, 0x83, 0x4e, 0x01, 0x16, 0xaf, 0xcc, - 0x57, 0x28, 0x26, 0x4e, 0xd7, 0x41, 0xf3, 0x30, 0x21, 0x0b, 0xab, 0x24, 0x64, 0x57, 0xc0, 0x08, - 0x23, 0xa3, 0xfc, 0x0d, 0x45, 0xb1, 0x22, 0x92, 0xc4, 0x37, 0x19, 0x5c, 0x78, 0x10, 0x0c, 0xee, - 0x2b, 0x30, 0xe6, 0x7a, 0x6e, 0xe4, 0x3a, 0x91, 0xcf, 0xf5, 0x47, 0xfc, 0xd9, 0xcd, 0x04, 0xcc, - 0x65, 0x1d, 0x80, 0x4d, 0x3c, 0xfb, 0x5f, 0xf4, 0xc1, 0x14, 0x9b, 0xb6, 0x0f, 0x56, 0xd8, 0xf7, - 0xd3, 0x0a, 0xbb, 0x91, 0x5e, 0x61, 0x0f, 0x82, 0x73, 0xbf, 0xef, 0x65, 0xf6, 0x45, 0x0b, 0xa6, - 0x98, 0x8c, 0xdb, 0x58, 0x66, 0x17, 0x60, 0x38, 0x30, 0x5c, 0x41, 0x87, 0x75, 0xa5, 0x96, 0xf4, - 0xea, 0x8c, 0x71, 0xd0, 0xc7, 0x01, 0x5a, 0xb1, 0x0c, 0xbd, 0x60, 0xc4, 0xef, 0x84, 0x5c, 0xf1, - 0xb9, 0x56, 0xc7, 0xfe, 0x1c, 0x0c, 0x2b, 0x5f, 0x4f, 0xe9, 0xec, 0x6d, 0xe5, 0x38, 0x7b, 0x77, - 0x67, 0x23, 0xa4, 0x6d, 0x5c, 0x31, 0xd3, 0x36, 0xee, 0x6b, 0x16, 0xc4, 0x1a, 0x0e, 0xf4, 0x16, - 0x0c, 0xb7, 0x7c, 0x66, 0x8d, 0x1c, 0x48, 0x13, 0xff, 0x27, 0x3a, 0xaa, 0x48, 0x78, 0x90, 0xbe, - 0x80, 0x4f, 0x47, 0x45, 0x56, 0xc5, 0x31, 0x15, 0x74, 0x15, 0x06, 0x5b, 0x01, 0xa9, 0x46, 0x2c, - 0x82, 0x54, 0xef, 0x04, 0xf9, 0xf2, 0xe5, 0x15, 0xb1, 0xa4, 0x60, 0xff, 0x7a, 0x01, 0x26, 0x93, - 0xa8, 0xe8, 0x75, 0xe8, 0x23, 0x77, 0x49, 0x4d, 0xf4, 0x37, 0x93, 0x27, 0x88, 0x65, 0x24, 0x7c, - 0x00, 0xe8, 0x7f, 0xcc, 0x6a, 0xa1, 0x2b, 0x30, 0x48, 0x19, 0x82, 0xcb, 0x2a, 0x5a, 0xe2, 0x63, - 0x79, 0x4c, 0x85, 0xe2, 0xac, 0x78, 0xe7, 0x44, 0x11, 0x96, 0xd5, 0x99, 0x41, 0x5a, 0xad, 0x55, - 0xa5, 0x6f, 0xad, 0xa8, 0x93, 0x48, 0x60, 0x7d, 0xb1, 0xc2, 0x91, 0x04, 0x35, 0x6e, 0x90, 0x26, - 0x0b, 0x71, 0x4c, 0x04, 0x7d, 0x1c, 0xfa, 0xc3, 0x06, 0x21, 0x2d, 0x61, 0x71, 0x90, 0x29, 0xe5, - 0xac, 0x52, 0x04, 0x41, 0x89, 0x49, 0x45, 0x58, 0x01, 0xe6, 0x15, 0xed, 0xdf, 0xb0, 0x00, 0xb8, - 0x05, 0x9f, 0xe3, 0x6d, 0x92, 0x23, 0x50, 0x0c, 0x2c, 0x41, 0x5f, 0xd8, 0x22, 0xb5, 0x4e, 0xa6, - 0xf6, 0x71, 0x7f, 0xaa, 0x2d, 0x52, 0x8b, 0xd7, 0x2c, 0xfd, 0x87, 0x59, 0x6d, 0xfb, 0xc7, 0x01, - 0xc6, 0x63, 0xb4, 0x72, 0x44, 0x9a, 0xe8, 0x79, 0x23, 0xc4, 0xcc, 0xc9, 0x44, 0x88, 0x99, 0x61, - 0x86, 0xad, 0xc9, 0xa0, 0x3f, 0x07, 0xc5, 0xa6, 0x73, 0x57, 0x08, 0x19, 0x9f, 0xed, 0xdc, 0x0d, - 0x4a, 0x7f, 0x6e, 0xd5, 0xb9, 0xcb, 0xdf, 0xe1, 0xcf, 0xca, 0x3d, 0xb6, 0xea, 0xdc, 0xed, 0x6a, - 0x0e, 0x4e, 0x1b, 0x61, 0x6d, 0xb9, 0x9e, 0x30, 0x4e, 0xeb, 0xa9, 0x2d, 0xd7, 0x4b, 0xb6, 0xe5, - 0x7a, 0x3d, 0xb4, 0xe5, 0x7a, 0xe8, 0x1e, 0x0c, 0x0a, 0xdb, 0x51, 0x11, 0xfb, 0xee, 0x42, 0x0f, - 0xed, 0x09, 0xd3, 0x53, 0xde, 0xe6, 0x05, 0x29, 0x67, 0x10, 0xa5, 0x5d, 0xdb, 0x95, 0x0d, 0xa2, - 0xff, 0xdc, 0x82, 0x71, 0xf1, 0x1b, 0x93, 0x77, 0xdb, 0x24, 0x8c, 0x04, 0x1f, 0xfe, 0x91, 0xde, - 0xfb, 0x20, 0x2a, 0xf2, 0xae, 0x7c, 0x44, 0x5e, 0x99, 0x26, 0xb0, 0x6b, 0x8f, 0x12, 0xbd, 0x40, - 0xbf, 0x6e, 0xc1, 0xb1, 0xa6, 0x73, 0x97, 0xb7, 0xc8, 0xcb, 0xb0, 0x13, 0xb9, 0xbe, 0xb0, 0xc1, - 0x78, 0xbd, 0xb7, 0xe9, 0x4f, 0x55, 0xe7, 0x9d, 0x94, 0x0a, 0xd7, 0x63, 0x59, 0x28, 0x5d, 0xbb, - 0x9a, 0xd9, 0xaf, 0xd9, 0x0d, 0x18, 0x92, 0xeb, 0xed, 0x61, 0x1a, 0xc6, 0xb3, 0x76, 0xc4, 0x5a, - 0x7b, 0xa8, 0xed, 0x7c, 0x0e, 0x46, 0xf5, 0x35, 0xf6, 0x50, 0xdb, 0x7a, 0x17, 0xa6, 0x33, 0xd6, - 0xd2, 0x43, 0x6d, 0xf2, 0x0e, 0x9c, 0xcc, 0x5d, 0x1f, 0x0f, 0xd5, 0xb1, 0xe1, 0x1b, 0x96, 0x7e, - 0x0e, 0x1e, 0x81, 0x76, 0x66, 0xd1, 0xd4, 0xce, 0x9c, 0xe9, 0xbc, 0x73, 0x72, 0x54, 0x34, 0xef, - 0xe8, 0x9d, 0xa6, 0xa7, 0x3a, 0x7a, 0x13, 0x06, 0x1a, 0xb4, 0x44, 0x5a, 0x20, 0xdb, 0xdd, 0x77, - 0x64, 0xcc, 0x17, 0xb3, 0xf2, 0x10, 0x0b, 0x0a, 0xf6, 0x57, 0x2d, 0xc8, 0x70, 0xcd, 0xa0, 0x7c, - 0x52, 0xdb, 0xad, 0xb3, 0x21, 0x29, 0xc6, 0x7c, 0x92, 0x8a, 0xc0, 0x72, 0x1a, 0x8a, 0x9b, 0x6e, - 0x5d, 0xb8, 0xf5, 0x2a, 0xf0, 0x65, 0x0a, 0xde, 0x74, 0xeb, 0x68, 0x05, 0x50, 0xd8, 0x6e, 0xb5, - 0x1a, 0xcc, 0x6c, 0xc9, 0x69, 0x5c, 0x0e, 0xfc, 0x76, 0x8b, 0x9b, 0x1b, 0x17, 0xb9, 0x90, 0xa8, - 0x9a, 0x82, 0xe2, 0x8c, 0x1a, 0xf6, 0x6f, 0x5b, 0xd0, 0x77, 0x04, 0xd3, 0x84, 0xcd, 0x69, 0x7a, - 0x3e, 0x97, 0xb4, 0x48, 0x99, 0x30, 0x87, 0x9d, 0x3b, 0xcb, 0x77, 0x23, 0xe2, 0x85, 0x8c, 0xe1, - 0xc8, 0x9c, 0xb5, 0x3d, 0x0b, 0xa6, 0xaf, 0xf9, 0x4e, 0x7d, 0xc1, 0x69, 0x38, 0x5e, 0x8d, 0x04, - 0x65, 0x6f, 0xf3, 0x50, 0xb6, 0xfd, 0x85, 0xae, 0xb6, 0xfd, 0x97, 0x60, 0xc0, 0x6d, 0x69, 0x31, - 0xd7, 0xcf, 0xd2, 0xd9, 0x2d, 0x57, 0x44, 0xb8, 0x75, 0x64, 0x34, 0xce, 0x4a, 0xb1, 0xc0, 0xa7, - 0xcb, 0x92, 0x1b, 0xd5, 0xf5, 0xe5, 0x2f, 0x4b, 0xfa, 0xd6, 0x49, 0xc6, 0x12, 0x33, 0xcc, 0xbf, - 0xb7, 0xc0, 0x68, 0x42, 0xb8, 0x0f, 0x62, 0x18, 0x74, 0xf9, 0x97, 0x8a, 0xb5, 0xf9, 0x54, 0xf6, - 0x1b, 0x24, 0x35, 0x30, 0x9a, 0x63, 0x1c, 0x2f, 0xc0, 0x92, 0x90, 0x7d, 0x09, 0x32, 0x63, 0xbf, - 0x74, 0x97, 0x2f, 0xd9, 0x9f, 0x84, 0x29, 0x56, 0xf3, 0x90, 0xb2, 0x1b, 0x3b, 0x21, 0x15, 0xcf, - 0x08, 0x9f, 0x6b, 0xff, 0xff, 0x16, 0xa0, 0x55, 0xbf, 0xee, 0x6e, 0xec, 0x0a, 0xe2, 0xfc, 0xfb, - 0xdf, 0x85, 0x12, 0x7f, 0x1c, 0x27, 0x43, 0xcc, 0x2e, 0x36, 0x9c, 0x30, 0xd4, 0x24, 0xf2, 0x4f, - 0x89, 0x76, 0x4b, 0xeb, 0x9d, 0xd1, 0x71, 0x37, 0x7a, 0xe8, 0xad, 0x44, 0xc4, 0xbf, 0x8f, 0xa6, - 0x22, 0xfe, 0x3d, 0x95, 0x69, 0x17, 0x93, 0xee, 0xbd, 0x8c, 0x04, 0x68, 0x7f, 0xc9, 0x82, 0x89, - 0xb5, 0x44, 0xc8, 0xd4, 0x73, 0xcc, 0x48, 0x20, 0x43, 0xd3, 0x54, 0x65, 0xa5, 0x58, 0x40, 0x1f, - 0xb8, 0x24, 0xf6, 0x9f, 0x2c, 0x88, 0x63, 0x4d, 0x1d, 0x01, 0xcb, 0xbd, 0x68, 0xb0, 0xdc, 0x99, - 0xcf, 0x17, 0xd5, 0x9d, 0x3c, 0x8e, 0x1b, 0x5d, 0x55, 0x73, 0xd2, 0xe1, 0xe5, 0x12, 0x93, 0xe1, - 0xfb, 0x6c, 0xdc, 0x9c, 0x38, 0x35, 0x1b, 0xdf, 0x2a, 0x00, 0x52, 0xb8, 0x3d, 0x47, 0x89, 0x4c, - 0xd7, 0x78, 0x30, 0x51, 0x22, 0x77, 0x00, 0x31, 0x33, 0x97, 0xc0, 0xf1, 0x42, 0x4e, 0xd6, 0x15, - 0xb2, 0xe7, 0xc3, 0xd9, 0xd0, 0xcc, 0x4a, 0xb7, 0xd1, 0x6b, 0x29, 0x6a, 0x38, 0xa3, 0x05, 0xcd, - 0x7c, 0xa9, 0xbf, 0x57, 0xf3, 0xa5, 0x81, 0x2e, 0xfe, 0xcf, 0x5f, 0xb7, 0x60, 0x4c, 0x0d, 0xd3, - 0xfb, 0xc4, 0x05, 0x44, 0xf5, 0x27, 0xe7, 0x5e, 0xa9, 0x68, 0x5d, 0x66, 0xcc, 0xc0, 0x0f, 0x30, - 0x3f, 0x76, 0xa7, 0xe1, 0xde, 0x23, 0x2a, 0x98, 0x71, 0x49, 0xf8, 0xa5, 0x8b, 0xd2, 0x83, 0xbd, - 0xd2, 0x98, 0xfa, 0xc7, 0xc3, 0xa7, 0xc6, 0x55, 0xec, 0x5f, 0xa4, 0x9b, 0xdd, 0x5c, 0x8a, 0xe8, - 0x65, 0xe8, 0x6f, 0x6d, 0x39, 0x21, 0x49, 0xb8, 0xca, 0xf5, 0x57, 0x68, 0xe1, 0xc1, 0x5e, 0x69, - 0x5c, 0x55, 0x60, 0x25, 0x98, 0x63, 0xf7, 0x1e, 0x7b, 0x33, 0xbd, 0x38, 0xbb, 0xc6, 0xde, 0xfc, - 0x7b, 0x0b, 0xfa, 0xd6, 0xe8, 0xed, 0xf5, 0xf0, 0x8f, 0x80, 0x37, 0x8c, 0x23, 0xe0, 0x54, 0x5e, - 0x5a, 0x9f, 0xdc, 0xdd, 0xbf, 0x92, 0xd8, 0xfd, 0x67, 0x72, 0x29, 0x74, 0xde, 0xf8, 0x4d, 0x18, - 0x61, 0xc9, 0x82, 0x84, 0x5b, 0xe0, 0x8b, 0xc6, 0x86, 0x2f, 0x25, 0x36, 0xfc, 0x84, 0x86, 0xaa, - 0xed, 0xf4, 0xa7, 0x61, 0x50, 0xf8, 0x99, 0x25, 0xc3, 0x01, 0x08, 0x5c, 0x2c, 0xe1, 0xf6, 0xcf, - 0x17, 0xc1, 0x48, 0x4e, 0x84, 0x7e, 0xd7, 0x82, 0xb9, 0x80, 0xdb, 0x9f, 0xd7, 0x97, 0xda, 0x81, - 0xeb, 0x6d, 0x56, 0x6b, 0x5b, 0xa4, 0xde, 0x6e, 0xb8, 0xde, 0x66, 0x79, 0xd3, 0xf3, 0x55, 0xf1, - 0xf2, 0x5d, 0x52, 0x6b, 0x33, 0xdd, 0x70, 0x97, 0x4c, 0x48, 0xca, 0x8f, 0xe3, 0x85, 0xfd, 0xbd, - 0xd2, 0x1c, 0x3e, 0x14, 0x6d, 0x7c, 0xc8, 0xbe, 0xa0, 0x3f, 0xb1, 0xe0, 0x02, 0x4f, 0x92, 0xd3, - 0x7b, 0xff, 0x3b, 0x48, 0x38, 0x2a, 0x92, 0x54, 0x4c, 0x64, 0x9d, 0x04, 0xcd, 0x85, 0x57, 0xc4, - 0x80, 0x5e, 0xa8, 0x1c, 0xae, 0x2d, 0x7c, 0xd8, 0xce, 0xd9, 0xff, 0x4b, 0x11, 0xc6, 0x44, 0x8c, - 0x46, 0x71, 0x07, 0xbc, 0x6c, 0x2c, 0x89, 0xc7, 0x12, 0x4b, 0x62, 0xca, 0x40, 0x7e, 0x30, 0xc7, - 0x7f, 0x08, 0x53, 0xf4, 0x70, 0xbe, 0x42, 0x9c, 0x20, 0xba, 0x4d, 0x1c, 0x6e, 0x95, 0x58, 0x3c, - 0xf4, 0xe9, 0xaf, 0xc4, 0xe3, 0xd7, 0x92, 0xc4, 0x70, 0x9a, 0xfe, 0xf7, 0xd3, 0x9d, 0xe3, 0xc1, - 0x64, 0x2a, 0xcc, 0xe6, 0xdb, 0x30, 0xac, 0x9c, 0xa4, 0xc4, 0xa1, 0xd3, 0x39, 0x5a, 0x6d, 0x92, - 0x02, 0x17, 0x7a, 0xc6, 0x0e, 0x7a, 0x31, 0x39, 0xfb, 0x7f, 0x28, 0x18, 0x0d, 0xf2, 0x49, 0x5c, - 0x83, 0x21, 0x27, 0x64, 0x11, 0xb4, 0xeb, 0x9d, 0xe4, 0xd2, 0xa9, 0x66, 0x98, 0xa3, 0xda, 0xbc, - 0xa8, 0x89, 0x15, 0x0d, 0x74, 0x85, 0xdb, 0x7e, 0xee, 0x90, 0x4e, 0x42, 0xe9, 0x14, 0x35, 0x90, - 0xd6, 0xa1, 0x3b, 0x04, 0x8b, 0xfa, 0xe8, 0xd3, 0xdc, 0x38, 0xf7, 0xaa, 0xe7, 0xdf, 0xf1, 0x2e, - 0xfb, 0xbe, 0x8c, 0xc7, 0xd3, 0x1b, 0xc1, 0x29, 0x69, 0x92, 0xab, 0xaa, 0x63, 0x93, 0x5a, 0x6f, - 0x71, 0xab, 0x3f, 0x0f, 0x2c, 0x29, 0x88, 0x19, 0x93, 0x20, 0x44, 0x04, 0x26, 0x44, 0x00, 0x50, - 0x59, 0x26, 0xc6, 0x2e, 0xf3, 0xf9, 0x6d, 0xd6, 0x8e, 0xf5, 0x38, 0x57, 0x4d, 0x12, 0x38, 0x49, - 0xd3, 0xde, 0xe2, 0x87, 0xf0, 0x0a, 0x71, 0xa2, 0x76, 0x40, 0x42, 0xf4, 0x09, 0x98, 0x49, 0xbf, - 0x8c, 0x85, 0x3a, 0xc4, 0x62, 0xdc, 0xf3, 0xa9, 0xfd, 0xbd, 0xd2, 0x4c, 0x35, 0x07, 0x07, 0xe7, - 0xd6, 0xb6, 0x7f, 0xd9, 0x02, 0xe6, 0x09, 0x7e, 0x04, 0x9c, 0xcf, 0xc7, 0x4c, 0xce, 0x67, 0x26, - 0x6f, 0x3a, 0x73, 0x98, 0x9e, 0x97, 0xf8, 0x1a, 0xae, 0x04, 0xfe, 0xdd, 0x5d, 0x61, 0xbb, 0xd5, - 0xfd, 0x19, 0x67, 0x7f, 0xc5, 0x02, 0x96, 0x41, 0x07, 0xf3, 0x57, 0xbb, 0x54, 0x70, 0x74, 0x37, - 0x4b, 0xf8, 0x04, 0x0c, 0x6d, 0x88, 0xe1, 0xcf, 0x10, 0x3a, 0x19, 0x1d, 0x36, 0x69, 0xcb, 0x49, - 0x13, 0x1e, 0x9d, 0xe2, 0x1f, 0x56, 0xd4, 0xec, 0xff, 0xde, 0x82, 0xd9, 0xfc, 0x6a, 0xe8, 0x06, - 0x3c, 0x12, 0x90, 0x5a, 0x3b, 0x08, 0xe9, 0x96, 0x10, 0x0f, 0x20, 0xe1, 0x14, 0xc5, 0xa7, 0xfa, - 0xd1, 0xfd, 0xbd, 0xd2, 0x23, 0x38, 0x1b, 0x05, 0xe7, 0xd5, 0x45, 0xaf, 0xc2, 0x78, 0x3b, 0xe4, - 0x9c, 0x1f, 0x63, 0xba, 0x42, 0x11, 0xa6, 0x99, 0xf9, 0x0d, 0xdd, 0x30, 0x20, 0x38, 0x81, 0x69, - 0xff, 0x10, 0x5f, 0x8e, 0x2a, 0x52, 0x73, 0x13, 0xa6, 0x3c, 0xed, 0x3f, 0xbd, 0x01, 0xe5, 0x53, - 0xff, 0x89, 0x6e, 0xb7, 0x3e, 0xbb, 0x2e, 0x35, 0x5f, 0xf5, 0x04, 0x19, 0x9c, 0xa6, 0x6c, 0xff, - 0x82, 0x05, 0x8f, 0xe8, 0x88, 0x9a, 0x3b, 0x5c, 0x37, 0x5d, 0xde, 0x12, 0x0c, 0xf9, 0x2d, 0x12, - 0x38, 0x91, 0x1f, 0x88, 0x6b, 0xee, 0xbc, 0x5c, 0xa1, 0xd7, 0x45, 0xf9, 0x81, 0xc8, 0x1c, 0x23, - 0xa9, 0xcb, 0x72, 0xac, 0x6a, 0x22, 0x1b, 0x06, 0x98, 0x00, 0x31, 0x14, 0x8e, 0x8f, 0xec, 0xd0, - 0x62, 0xf6, 0x29, 0x21, 0x16, 0x10, 0xfb, 0x6f, 0x2c, 0xbe, 0x3e, 0xf5, 0xae, 0xa3, 0x77, 0x61, - 0xb2, 0xe9, 0x44, 0xb5, 0xad, 0xe5, 0xbb, 0xad, 0x80, 0xab, 0x68, 0xe5, 0x38, 0x3d, 0xdb, 0x6d, - 0x9c, 0xb4, 0x8f, 0x8c, 0x0d, 0xa4, 0x57, 0x13, 0xc4, 0x70, 0x8a, 0x3c, 0xba, 0x0d, 0x23, 0xac, - 0x8c, 0xf9, 0xf4, 0x86, 0x9d, 0x78, 0x99, 0xbc, 0xd6, 0x94, 0x89, 0xcf, 0x6a, 0x4c, 0x07, 0xeb, - 0x44, 0xed, 0xaf, 0x15, 0xf9, 0xa1, 0xc1, 0xde, 0x1e, 0x4f, 0xc3, 0x60, 0xcb, 0xaf, 0x2f, 0x96, - 0x97, 0xb0, 0x98, 0x05, 0x75, 0xef, 0x55, 0x78, 0x31, 0x96, 0x70, 0x74, 0x1e, 0x86, 0xc4, 0x4f, - 0xa9, 0x52, 0x67, 0x7b, 0x44, 0xe0, 0x85, 0x58, 0x41, 0xd1, 0x0b, 0x00, 0xad, 0xc0, 0xdf, 0x71, - 0xeb, 0x2c, 0x0c, 0x52, 0xd1, 0xb4, 0xce, 0xab, 0x28, 0x08, 0xd6, 0xb0, 0xd0, 0x6b, 0x30, 0xd6, - 0xf6, 0x42, 0xce, 0x3f, 0x69, 0xc1, 0xe6, 0x95, 0xdd, 0xd8, 0x0d, 0x1d, 0x88, 0x4d, 0x5c, 0x34, - 0x0f, 0x03, 0x91, 0xc3, 0xac, 0xcd, 0xfa, 0xf3, 0x8d, 0xe8, 0xd7, 0x29, 0x86, 0x9e, 0xd6, 0x8d, - 0x56, 0xc0, 0xa2, 0x22, 0x7a, 0x5b, 0xba, 0xd7, 0xf3, 0x9b, 0x48, 0x78, 0xaf, 0xf4, 0x76, 0x6b, - 0x69, 0xce, 0xf5, 0xc2, 0x2b, 0xc6, 0xa0, 0x85, 0x5e, 0x05, 0x20, 0x77, 0x23, 0x12, 0x78, 0x4e, - 0x43, 0xd9, 0x88, 0x2a, 0x46, 0x66, 0xc9, 0x5f, 0xf3, 0xa3, 0x1b, 0x21, 0x59, 0x56, 0x18, 0x58, - 0xc3, 0xb6, 0x7f, 0x7c, 0x04, 0x20, 0x7e, 0x68, 0xa0, 0x7b, 0x30, 0x54, 0x73, 0x5a, 0x4e, 0x8d, - 0xe7, 0x2c, 0x2d, 0xe6, 0x79, 0x3d, 0xc7, 0x35, 0xe6, 0x16, 0x05, 0x3a, 0x57, 0xde, 0xc8, 0x78, - 0xdd, 0x43, 0xb2, 0xb8, 0xab, 0xc2, 0x46, 0xb5, 0x87, 0xbe, 0x68, 0xc1, 0x88, 0x88, 0xf6, 0xc4, - 0x66, 0xa8, 0x90, 0xaf, 0x6f, 0xd3, 0xda, 0x9f, 0x8f, 0x6b, 0xf0, 0x2e, 0xbc, 0x28, 0x57, 0xa8, - 0x06, 0xe9, 0xda, 0x0b, 0xbd, 0x61, 0xf4, 0x61, 0xf9, 0xb6, 0x2d, 0x1a, 0x43, 0xa9, 0xde, 0xb6, - 0xc3, 0xec, 0xaa, 0xd1, 0x9f, 0xb5, 0x37, 0x8c, 0x67, 0x6d, 0x5f, 0xbe, 0xff, 0xb0, 0xc1, 0x6f, - 0x77, 0x7b, 0xd1, 0xa2, 0x8a, 0x1e, 0x4b, 0xa4, 0x3f, 0xdf, 0xe9, 0x55, 0x7b, 0xd8, 0x75, 0x89, - 0x23, 0xf2, 0x39, 0x98, 0xa8, 0x9b, 0x5c, 0x8b, 0x58, 0x89, 0x4f, 0xe5, 0xd1, 0x4d, 0x30, 0x39, - 0x31, 0x9f, 0x92, 0x00, 0xe0, 0x24, 0x61, 0x54, 0xe1, 0xa1, 0x65, 0xca, 0xde, 0x86, 0x2f, 0x3c, - 0xa8, 0xec, 0xdc, 0xb9, 0xdc, 0x0d, 0x23, 0xd2, 0xa4, 0x98, 0x31, 0x93, 0xb0, 0x26, 0xea, 0x62, - 0x45, 0x05, 0xbd, 0x09, 0x03, 0xcc, 0xeb, 0x31, 0x9c, 0x19, 0xca, 0x57, 0x6b, 0x98, 0x61, 0x48, - 0xe3, 0x0d, 0xc9, 0xfe, 0x86, 0x58, 0x50, 0x40, 0x57, 0xa4, 0x4f, 0x71, 0x58, 0xf6, 0x6e, 0x84, - 0x84, 0xf9, 0x14, 0x0f, 0x2f, 0x3c, 0x11, 0xbb, 0x0b, 0xf3, 0xf2, 0xcc, 0xe4, 0xaf, 0x46, 0x4d, - 0xca, 0xf6, 0x89, 0xff, 0x32, 0xa7, 0xac, 0x08, 0x9a, 0x96, 0xd9, 0x3d, 0x33, 0xef, 0x6c, 0x3c, - 0x9c, 0x37, 0x4d, 0x12, 0x38, 0x49, 0x93, 0xb2, 0xd0, 0x7c, 0xd7, 0x0b, 0x1f, 0xac, 0x6e, 0x67, - 0x07, 0x97, 0x1c, 0xb0, 0xdb, 0x88, 0x97, 0x60, 0x51, 0x1f, 0xb9, 0x30, 0x11, 0x18, 0xec, 0x85, - 0x8c, 0x75, 0x76, 0xae, 0x37, 0x26, 0x46, 0x8b, 0xa2, 0x6f, 0x92, 0xc1, 0x49, 0xba, 0xe8, 0x4d, - 0x8d, 0x51, 0x1a, 0xeb, 0xfc, 0xf2, 0xef, 0xc6, 0x1a, 0xcd, 0x6e, 0xc3, 0x98, 0x71, 0xd8, 0x3c, - 0x54, 0x15, 0xa4, 0x07, 0x93, 0xc9, 0x93, 0xe5, 0xa1, 0x6a, 0x1e, 0xff, 0xaa, 0x0f, 0xc6, 0xcd, - 0x9d, 0x80, 0x2e, 0xc0, 0xb0, 0x20, 0xa2, 0xd2, 0x49, 0xa9, 0xcd, 0xbd, 0x2a, 0x01, 0x38, 0xc6, - 0x61, 0x59, 0xc4, 0x58, 0x75, 0xcd, 0x57, 0x20, 0xce, 0x22, 0xa6, 0x20, 0x58, 0xc3, 0xa2, 0x0f, - 0xd8, 0xdb, 0xbe, 0x1f, 0xa9, 0x7b, 0x54, 0x6d, 0x97, 0x05, 0x56, 0x8a, 0x05, 0x94, 0xde, 0x9f, - 0xdb, 0x24, 0xf0, 0x48, 0xc3, 0xcc, 0xa7, 0xa0, 0xee, 0xcf, 0xab, 0x3a, 0x10, 0x9b, 0xb8, 0x94, - 0x0b, 0xf0, 0x43, 0xb6, 0xff, 0xc4, 0x33, 0x39, 0xf6, 0xbd, 0xa8, 0xf2, 0x28, 0x12, 0x12, 0x8e, - 0x3e, 0x09, 0x8f, 0xa8, 0xd8, 0x85, 0x62, 0x75, 0xc9, 0x16, 0x07, 0x0c, 0xa9, 0xd6, 0x23, 0x8b, - 0xd9, 0x68, 0x38, 0xaf, 0x3e, 0x7a, 0x03, 0xc6, 0xc5, 0x53, 0x4a, 0x52, 0x1c, 0x34, 0x0d, 0x09, - 0xaf, 0x1a, 0x50, 0x9c, 0xc0, 0x96, 0x19, 0x21, 0xd8, 0x1b, 0x43, 0x52, 0x18, 0x4a, 0x67, 0x84, - 0xd0, 0xe1, 0x38, 0x55, 0x03, 0xcd, 0xc3, 0x04, 0x67, 0x1d, 0x5d, 0x6f, 0x93, 0xcf, 0x89, 0xf0, - 0xec, 0x54, 0x9b, 0xea, 0xba, 0x09, 0xc6, 0x49, 0x7c, 0x74, 0x09, 0x46, 0x9d, 0xa0, 0xb6, 0xe5, - 0x46, 0xa4, 0x46, 0x77, 0x06, 0xb3, 0xe5, 0xd3, 0x2c, 0x31, 0xe7, 0x35, 0x18, 0x36, 0x30, 0xed, - 0x7b, 0x30, 0x9d, 0x11, 0x5e, 0x86, 0x2e, 0x1c, 0xa7, 0xe5, 0xca, 0x6f, 0x4a, 0xb8, 0x3b, 0xcc, - 0x57, 0xca, 0xf2, 0x6b, 0x34, 0x2c, 0xba, 0x3a, 0x59, 0x18, 0x1a, 0x2d, 0xf3, 0xb5, 0x5a, 0x9d, - 0x2b, 0x12, 0x80, 0x63, 0x1c, 0xfb, 0x1f, 0x0a, 0x30, 0x91, 0xa1, 0xa0, 0x63, 0xd9, 0x97, 0x13, - 0x2f, 0xad, 0x38, 0xd9, 0xb2, 0x99, 0x60, 0xa4, 0x70, 0x88, 0x04, 0x23, 0xc5, 0x6e, 0x09, 0x46, - 0xfa, 0xde, 0x4b, 0x82, 0x11, 0x73, 0xc4, 0xfa, 0x7b, 0x1a, 0xb1, 0x8c, 0xa4, 0x24, 0x03, 0x87, - 0x4c, 0x4a, 0x62, 0x0c, 0xfa, 0x60, 0x0f, 0x83, 0xfe, 0x33, 0x05, 0x98, 0x4c, 0xea, 0xf6, 0x8e, - 0x40, 0x3e, 0xfe, 0xa6, 0x21, 0x1f, 0x3f, 0xdf, 0x8b, 0x27, 0x7e, 0xae, 0xac, 0x1c, 0x27, 0x64, - 0xe5, 0xcf, 0xf4, 0x44, 0xad, 0xb3, 0xdc, 0xfc, 0xbf, 0x2e, 0xc0, 0xf1, 0x4c, 0x95, 0xe7, 0x11, - 0x8c, 0xcd, 0x75, 0x63, 0x6c, 0x9e, 0xef, 0x39, 0x4a, 0x41, 0xee, 0x00, 0xdd, 0x4a, 0x0c, 0xd0, - 0x85, 0xde, 0x49, 0x76, 0x1e, 0xa5, 0x6f, 0x17, 0xe1, 0x4c, 0x66, 0xbd, 0x58, 0xbc, 0xbc, 0x62, - 0x88, 0x97, 0x5f, 0x48, 0x88, 0x97, 0xed, 0xce, 0xb5, 0x1f, 0x8c, 0xbc, 0x59, 0x78, 0xeb, 0xb3, - 0x98, 0x23, 0xf7, 0x29, 0x6b, 0x36, 0xbc, 0xf5, 0x15, 0x21, 0x6c, 0xd2, 0xfd, 0x7e, 0x92, 0x31, - 0xff, 0xb1, 0x05, 0x27, 0x33, 0xe7, 0xe6, 0x08, 0x24, 0x7d, 0x6b, 0xa6, 0xa4, 0xef, 0xe9, 0x9e, - 0x57, 0x6b, 0x8e, 0xe8, 0xef, 0x4b, 0x03, 0x39, 0xdf, 0xc2, 0x04, 0x10, 0xd7, 0x61, 0xc4, 0xa9, - 0xd5, 0x48, 0x18, 0xae, 0xfa, 0x75, 0x95, 0x8b, 0xe0, 0x79, 0xf6, 0x3c, 0x8c, 0x8b, 0x0f, 0xf6, - 0x4a, 0xb3, 0x49, 0x12, 0x31, 0x18, 0xeb, 0x14, 0xd0, 0xa7, 0x61, 0x28, 0x94, 0x69, 0x24, 0xfb, - 0xee, 0x3f, 0x8d, 0x24, 0x63, 0x72, 0x95, 0x80, 0x45, 0x91, 0x44, 0x3f, 0xa8, 0x47, 0x7f, 0xea, - 0x20, 0x5a, 0xe4, 0x9d, 0xbc, 0x8f, 0x18, 0x50, 0x2f, 0x00, 0xec, 0xa8, 0x97, 0x4c, 0x52, 0x78, - 0xa2, 0xbd, 0x71, 0x34, 0x2c, 0xf4, 0x71, 0x98, 0x0c, 0x79, 0xe0, 0xd3, 0xd8, 0x48, 0x85, 0xaf, - 0x45, 0x16, 0x3b, 0xae, 0x9a, 0x80, 0xe1, 0x14, 0x36, 0x5a, 0x91, 0xad, 0x32, 0x73, 0x24, 0xbe, - 0x3c, 0xcf, 0xc5, 0x2d, 0x0a, 0x93, 0xa4, 0x63, 0xc9, 0x49, 0x60, 0xc3, 0xaf, 0xd5, 0x44, 0x9f, - 0x06, 0xa0, 0x8b, 0x48, 0x08, 0x51, 0x06, 0xf3, 0x8f, 0x50, 0x7a, 0xb6, 0xd4, 0x33, 0x3d, 0x19, - 0x98, 0x9b, 0xfd, 0x92, 0x22, 0x82, 0x35, 0x82, 0xc8, 0x81, 0xb1, 0xf8, 0x5f, 0x9c, 0x20, 0xfd, - 0x7c, 0x6e, 0x0b, 0x49, 0xe2, 0x4c, 0xc1, 0xb0, 0xa4, 0x93, 0xc0, 0x26, 0x45, 0xf4, 0x29, 0x38, - 0xb9, 0x93, 0x6b, 0xf9, 0xc3, 0x39, 0x41, 0x96, 0xf1, 0x3c, 0xdf, 0xde, 0x27, 0xbf, 0xbe, 0xfd, - 0x7f, 0x02, 0x3c, 0xda, 0xe1, 0xa4, 0x47, 0xf3, 0xa6, 0xd6, 0xfe, 0xd9, 0xa4, 0x64, 0x63, 0x36, - 0xb3, 0xb2, 0x21, 0xea, 0x48, 0x6c, 0xa8, 0xc2, 0x7b, 0xde, 0x50, 0x3f, 0x65, 0x69, 0x32, 0x27, - 0x6e, 0xd3, 0xfd, 0xb1, 0x43, 0xde, 0x60, 0x0f, 0x50, 0x08, 0xb5, 0x91, 0x21, 0xc9, 0x79, 0xa1, - 0xe7, 0xee, 0xf4, 0x2e, 0xda, 0xf9, 0x46, 0x76, 0xb4, 0x75, 0x2e, 0xe4, 0xb9, 0x7c, 0xd8, 0xef, - 0x3f, 0xaa, 0xc8, 0xeb, 0xdf, 0xb2, 0xe0, 0x64, 0xaa, 0x98, 0xf7, 0x81, 0x84, 0x22, 0xda, 0xdd, - 0xda, 0x7b, 0xee, 0xbc, 0x24, 0xc8, 0xbf, 0xe1, 0x8a, 0xf8, 0x86, 0x93, 0xb9, 0x78, 0xc9, 0xae, - 0x7f, 0xf9, 0x2f, 0x4b, 0xd3, 0xac, 0x01, 0x13, 0x11, 0xe7, 0x77, 0x1d, 0xb5, 0xe0, 0x6c, 0xad, - 0x1d, 0x04, 0xf1, 0x62, 0xcd, 0xd8, 0x9c, 0xfc, 0xad, 0xf7, 0xc4, 0xfe, 0x5e, 0xe9, 0xec, 0x62, - 0x17, 0x5c, 0xdc, 0x95, 0x1a, 0xf2, 0x00, 0x35, 0x53, 0xf6, 0x75, 0xec, 0x00, 0xc8, 0x91, 0xc3, - 0xa4, 0xad, 0xf1, 0xb8, 0xa5, 0x6c, 0x86, 0x95, 0x5e, 0x06, 0xe5, 0xa3, 0x95, 0x9e, 0x7c, 0x77, - 0xe2, 0xd2, 0xcf, 0x5e, 0x83, 0x33, 0x9d, 0x17, 0xd3, 0xa1, 0x42, 0x39, 0xfc, 0x99, 0x05, 0xa7, - 0x3b, 0xc6, 0x0b, 0xfb, 0x1e, 0x7c, 0x2c, 0xd8, 0x5f, 0xb0, 0xe0, 0xb1, 0xcc, 0x1a, 0x49, 0x27, - 0xbc, 0x1a, 0x2d, 0xd4, 0xcc, 0x51, 0xe3, 0xc8, 0x39, 0x12, 0x80, 0x63, 0x1c, 0xc3, 0x62, 0xb3, - 0xd0, 0xd5, 0x62, 0xf3, 0x0f, 0x2c, 0x48, 0x5d, 0xf5, 0x47, 0xc0, 0x79, 0x96, 0x4d, 0xce, 0xf3, - 0x89, 0x5e, 0x46, 0x33, 0x87, 0xe9, 0xfc, 0xbb, 0x09, 0x38, 0x91, 0xe3, 0x89, 0xbd, 0x03, 0x53, - 0x9b, 0x35, 0x62, 0x86, 0xde, 0xe8, 0x14, 0x92, 0xae, 0x63, 0x9c, 0x8e, 0x85, 0xe3, 0xfb, 0x7b, - 0xa5, 0xa9, 0x14, 0x0a, 0x4e, 0x37, 0x81, 0xbe, 0x60, 0xc1, 0x31, 0xe7, 0x4e, 0xb8, 0x4c, 0x5f, - 0x10, 0x6e, 0x6d, 0xa1, 0xe1, 0xd7, 0xb6, 0x29, 0x63, 0x26, 0xb7, 0xd5, 0x4b, 0x99, 0xc2, 0xe8, - 0x5b, 0xd5, 0x14, 0xbe, 0xd1, 0xfc, 0xcc, 0xfe, 0x5e, 0xe9, 0x58, 0x16, 0x16, 0xce, 0x6c, 0x0b, - 0x61, 0x91, 0x6e, 0xcb, 0x89, 0xb6, 0x3a, 0x05, 0x87, 0xc9, 0x72, 0x99, 0xe7, 0x2c, 0xb1, 0x84, - 0x60, 0x45, 0x07, 0x7d, 0x16, 0x86, 0x37, 0x65, 0x1c, 0x88, 0x0c, 0x96, 0x3b, 0x1e, 0xc8, 0xce, - 0xd1, 0x31, 0xb8, 0x09, 0x8c, 0x42, 0xc2, 0x31, 0x51, 0xf4, 0x06, 0x14, 0xbd, 0x8d, 0x50, 0x84, - 0xa8, 0xcb, 0xb6, 0xc4, 0x35, 0x6d, 0x9d, 0x79, 0x08, 0xa6, 0xb5, 0x95, 0x2a, 0xa6, 0x15, 0xd1, - 0x15, 0x28, 0x06, 0xb7, 0xeb, 0x42, 0x93, 0x92, 0xb9, 0x49, 0xf1, 0xc2, 0x52, 0x4e, 0xaf, 0x18, - 0x25, 0xbc, 0xb0, 0x84, 0x29, 0x09, 0x54, 0x81, 0x7e, 0xe6, 0xbe, 0x2c, 0x58, 0xdb, 0xcc, 0xa7, - 0x7c, 0x87, 0x30, 0x00, 0xdc, 0x23, 0x91, 0x21, 0x60, 0x4e, 0x08, 0xad, 0xc3, 0x40, 0xcd, 0xf5, - 0xea, 0x24, 0x10, 0xbc, 0xec, 0x87, 0x33, 0x75, 0x26, 0x0c, 0x23, 0x87, 0x26, 0x57, 0x21, 0x30, - 0x0c, 0x2c, 0x68, 0x31, 0xaa, 0xa4, 0xb5, 0xb5, 0x21, 0x6f, 0xac, 0x6c, 0xaa, 0xa4, 0xb5, 0xb5, - 0x52, 0xed, 0x48, 0x95, 0x61, 0x60, 0x41, 0x0b, 0xbd, 0x0a, 0x85, 0x8d, 0x9a, 0x70, 0x4d, 0xce, - 0x54, 0x9e, 0x98, 0x51, 0xb4, 0x16, 0x06, 0xf6, 0xf7, 0x4a, 0x85, 0x95, 0x45, 0x5c, 0xd8, 0xa8, - 0xa1, 0x35, 0x18, 0xdc, 0xe0, 0x71, 0x77, 0x84, 0x7e, 0xe4, 0xa9, 0xec, 0x90, 0x40, 0xa9, 0xd0, - 0x3c, 0xdc, 0xbb, 0x54, 0x00, 0xb0, 0x24, 0xc2, 0xb2, 0x3f, 0xa9, 0xf8, 0x41, 0x22, 0x7c, 0xe9, - 0xdc, 0xe1, 0x62, 0x3e, 0xf1, 0xa7, 0x46, 0x1c, 0x85, 0x08, 0x6b, 0x14, 0xe9, 0xaa, 0x76, 0xee, - 0xb5, 0x03, 0x96, 0xdb, 0x42, 0xa8, 0x46, 0x32, 0x57, 0xf5, 0xbc, 0x44, 0xea, 0xb4, 0xaa, 0x15, - 0x12, 0x8e, 0x89, 0xa2, 0x6d, 0x18, 0xdb, 0x09, 0x5b, 0x5b, 0x44, 0x6e, 0x69, 0x16, 0xf6, 0x2e, - 0x87, 0x9b, 0xbd, 0x29, 0x10, 0xdd, 0x20, 0x6a, 0x3b, 0x8d, 0xd4, 0x29, 0xc4, 0x9e, 0x35, 0x37, - 0x75, 0x62, 0xd8, 0xa4, 0x4d, 0x87, 0xff, 0xdd, 0xb6, 0x7f, 0x7b, 0x37, 0x22, 0x22, 0xea, 0x68, - 0xe6, 0xf0, 0xbf, 0xc5, 0x51, 0xd2, 0xc3, 0x2f, 0x00, 0x58, 0x12, 0x41, 0x37, 0xc5, 0xf0, 0xb0, - 0xd3, 0x73, 0x32, 0x3f, 0xa4, 0xf9, 0xbc, 0x44, 0xca, 0x19, 0x14, 0x76, 0x5a, 0xc6, 0xa4, 0xd8, - 0x29, 0xd9, 0xda, 0xf2, 0x23, 0xdf, 0x4b, 0x9c, 0xd0, 0x53, 0xf9, 0xa7, 0x64, 0x25, 0x03, 0x3f, - 0x7d, 0x4a, 0x66, 0x61, 0xe1, 0xcc, 0xb6, 0x50, 0x1d, 0xc6, 0x5b, 0x7e, 0x10, 0xdd, 0xf1, 0x03, - 0xb9, 0xbe, 0x50, 0x07, 0x41, 0xa9, 0x81, 0x29, 0x5a, 0x64, 0x86, 0x39, 0x26, 0x04, 0x27, 0x68, - 0xa2, 0x4f, 0xc0, 0x60, 0x58, 0x73, 0x1a, 0xa4, 0x7c, 0x7d, 0x66, 0x3a, 0xff, 0xfa, 0xa9, 0x72, - 0x94, 0x9c, 0xd5, 0xc5, 0xc3, 0x26, 0x71, 0x14, 0x2c, 0xc9, 0xa1, 0x15, 0xe8, 0x67, 0x59, 0x95, - 0x59, 0x88, 0xdc, 0x9c, 0xc8, 0xec, 0x29, 0xb7, 0x1a, 0x7e, 0x36, 0xb1, 0x62, 0xcc, 0xab, 0xd3, - 0x3d, 0x20, 0x24, 0x05, 0x7e, 0x38, 0x73, 0x3c, 0x7f, 0x0f, 0x08, 0x01, 0xc3, 0xf5, 0x6a, 0xa7, - 0x3d, 0xa0, 0x90, 0x70, 0x4c, 0x94, 0x9e, 0xcc, 0xf4, 0x34, 0x3d, 0xd1, 0xc1, 0x64, 0x32, 0xf7, - 0x2c, 0x65, 0x27, 0x33, 0x3d, 0x49, 0x29, 0x09, 0xfb, 0xf7, 0x86, 0xd2, 0x3c, 0x0b, 0x93, 0x30, - 0xfd, 0xc7, 0x56, 0xca, 0x66, 0xe2, 0x23, 0xbd, 0x0a, 0xbc, 0x1f, 0xe0, 0xc3, 0xf5, 0x0b, 0x16, - 0x9c, 0x68, 0x65, 0x7e, 0x88, 0x60, 0x00, 0x7a, 0x93, 0x9b, 0xf3, 0x4f, 0x57, 0xe1, 0x94, 0xb3, - 0xe1, 0x38, 0xa7, 0xa5, 0xa4, 0x70, 0xa0, 0xf8, 0x9e, 0x85, 0x03, 0xab, 0x30, 0x54, 0xe3, 0x2f, - 0x39, 0x99, 0x06, 0xa0, 0xa7, 0x60, 0xa0, 0x8c, 0x95, 0x10, 0x4f, 0xc0, 0x0d, 0xac, 0x48, 0xa0, - 0x9f, 0xb6, 0xe0, 0x74, 0xb2, 0xeb, 0x98, 0x30, 0xb0, 0x30, 0x98, 0xe4, 0x62, 0xad, 0x15, 0xf1, - 0xfd, 0x29, 0xfe, 0xdf, 0x40, 0x3e, 0xe8, 0x86, 0x80, 0x3b, 0x37, 0x86, 0x96, 0x32, 0xe4, 0x6a, - 0x03, 0xa6, 0x46, 0xb1, 0x07, 0xd9, 0xda, 0x4b, 0x30, 0xda, 0xf4, 0xdb, 0x5e, 0x24, 0xec, 0x1e, - 0x85, 0xf1, 0x14, 0x33, 0x1a, 0x5a, 0xd5, 0xca, 0xb1, 0x81, 0x95, 0x90, 0xc8, 0x0d, 0xdd, 0xb7, - 0x44, 0xee, 0x1d, 0x18, 0xf5, 0x34, 0x97, 0x80, 0x4e, 0x2f, 0x58, 0x21, 0x5d, 0xd4, 0xb0, 0x79, - 0x2f, 0xf5, 0x12, 0x6c, 0x50, 0xeb, 0x2c, 0x2d, 0x83, 0xf7, 0x26, 0x2d, 0x3b, 0xd2, 0x27, 0xb1, - 0xfd, 0x6b, 0x85, 0x8c, 0x17, 0x03, 0x97, 0xca, 0xbd, 0x6e, 0x4a, 0xe5, 0xce, 0x25, 0xa5, 0x72, - 0x29, 0x55, 0x95, 0x21, 0x90, 0xeb, 0x3d, 0x9d, 0x63, 0xcf, 0x01, 0x9e, 0x7f, 0xd4, 0x82, 0x47, - 0x98, 0xee, 0x83, 0x36, 0xf0, 0x9e, 0xf5, 0x1d, 0xcc, 0x24, 0xf5, 0x5a, 0x36, 0x39, 0x9c, 0xd7, - 0x8e, 0xdd, 0x80, 0xb3, 0xdd, 0xee, 0x5d, 0x66, 0xe1, 0x5b, 0x57, 0xc6, 0x11, 0xb1, 0x85, 0x6f, - 0xbd, 0xbc, 0x84, 0x19, 0xa4, 0xd7, 0xf0, 0x85, 0xf6, 0xbf, 0xb4, 0xa0, 0x58, 0xf1, 0xeb, 0x47, - 0xf0, 0xa2, 0xff, 0x98, 0xf1, 0xa2, 0x7f, 0x34, 0xfb, 0xc6, 0xaf, 0xe7, 0x2a, 0xfb, 0x96, 0x13, - 0xca, 0xbe, 0xd3, 0x79, 0x04, 0x3a, 0xab, 0xf6, 0x7e, 0xb1, 0x08, 0x23, 0x15, 0xbf, 0xae, 0xf6, - 0xd9, 0xff, 0x76, 0x3f, 0x8e, 0x3c, 0xb9, 0xd9, 0xa7, 0x34, 0xca, 0xcc, 0xa2, 0x57, 0xc6, 0x9d, - 0xf8, 0x1e, 0xf3, 0xe7, 0xb9, 0x45, 0xdc, 0xcd, 0xad, 0x88, 0xd4, 0x93, 0x9f, 0x73, 0x74, 0xfe, - 0x3c, 0xdf, 0x29, 0xc2, 0x44, 0xa2, 0x75, 0xd4, 0x80, 0xb1, 0x86, 0xae, 0x4a, 0x12, 0xeb, 0xf4, - 0xbe, 0xb4, 0x50, 0xc2, 0x1f, 0x42, 0x2b, 0xc2, 0x26, 0x71, 0x34, 0x07, 0xe0, 0xe9, 0x56, 0xe1, - 0x2a, 0x50, 0xb1, 0x66, 0x11, 0xae, 0x61, 0xa0, 0x97, 0x61, 0x24, 0xf2, 0x5b, 0x7e, 0xc3, 0xdf, - 0xdc, 0xbd, 0x4a, 0x64, 0x64, 0x4b, 0x65, 0x34, 0xbc, 0x1e, 0x83, 0xb0, 0x8e, 0x87, 0xee, 0xc2, - 0x94, 0x22, 0x52, 0x7d, 0x00, 0xea, 0x35, 0x26, 0x36, 0x59, 0x4b, 0x52, 0xc4, 0xe9, 0x46, 0xd0, - 0xab, 0x30, 0xce, 0xac, 0x97, 0x59, 0xfd, 0xab, 0x64, 0x57, 0x46, 0x3c, 0x66, 0x1c, 0xf6, 0xaa, - 0x01, 0xc1, 0x09, 0x4c, 0xb4, 0x08, 0x53, 0x4d, 0x37, 0x4c, 0x54, 0x1f, 0x60, 0xd5, 0x59, 0x07, - 0x56, 0x93, 0x40, 0x9c, 0xc6, 0xb7, 0x7f, 0x45, 0xcc, 0xb1, 0x17, 0xb9, 0x1f, 0x6c, 0xc7, 0xf7, - 0xf7, 0x76, 0xfc, 0xb6, 0x05, 0x93, 0xb4, 0x75, 0x66, 0x92, 0x29, 0x19, 0x29, 0x95, 0x13, 0xc3, - 0xea, 0x90, 0x13, 0xe3, 0x1c, 0x3d, 0xb6, 0xeb, 0x7e, 0x3b, 0x12, 0xd2, 0x51, 0xed, 0x5c, 0xa6, - 0xa5, 0x58, 0x40, 0x05, 0x1e, 0x09, 0x02, 0xe1, 0xf7, 0xae, 0xe3, 0x91, 0x20, 0xc0, 0x02, 0x2a, - 0x53, 0x66, 0xf4, 0x65, 0xa7, 0xcc, 0xe0, 0x91, 0xcf, 0x85, 0x15, 0x9c, 0x60, 0x69, 0xb5, 0xc8, - 0xe7, 0xd2, 0x3c, 0x2e, 0xc6, 0xb1, 0xbf, 0x51, 0x84, 0xd1, 0x8a, 0x5f, 0x8f, 0x0d, 0x3b, 0x5e, - 0x32, 0x0c, 0x3b, 0xce, 0x26, 0x0c, 0x3b, 0x26, 0x75, 0xdc, 0x0f, 0xcc, 0x38, 0xbe, 0x5b, 0x66, - 0x1c, 0xbf, 0x6f, 0xb1, 0x59, 0x5b, 0x5a, 0xab, 0x72, 0x0b, 0x5f, 0x74, 0x11, 0x46, 0xd8, 0x09, - 0xc7, 0x02, 0x2d, 0x48, 0x6b, 0x07, 0x96, 0xc2, 0x72, 0x2d, 0x2e, 0xc6, 0x3a, 0x0e, 0x3a, 0x0f, - 0x43, 0x21, 0x71, 0x82, 0xda, 0x96, 0x3a, 0xde, 0x85, 0x69, 0x02, 0x2f, 0xc3, 0x0a, 0x8a, 0xde, - 0x8a, 0x83, 0x6e, 0x17, 0xf3, 0xcd, 0x85, 0xf5, 0xfe, 0xf0, 0x2d, 0x92, 0x1f, 0x69, 0xdb, 0xbe, - 0x05, 0x28, 0x8d, 0xdf, 0x83, 0xff, 0x55, 0xc9, 0x0c, 0x0b, 0x3b, 0x9c, 0x0a, 0x09, 0xfb, 0x8f, - 0x16, 0x8c, 0x57, 0xfc, 0x3a, 0xdd, 0xba, 0xdf, 0x4f, 0xfb, 0x54, 0xcf, 0x38, 0x30, 0xd0, 0x21, - 0xe3, 0xc0, 0xe3, 0xd0, 0x5f, 0xf1, 0xeb, 0x5d, 0x42, 0xd7, 0xfe, 0x37, 0x16, 0x0c, 0x56, 0xfc, - 0xfa, 0x11, 0x28, 0x5e, 0x5e, 0x37, 0x15, 0x2f, 0x8f, 0xe4, 0xac, 0x9b, 0x1c, 0x5d, 0xcb, 0x7f, - 0xd5, 0x07, 0x63, 0xb4, 0x9f, 0xfe, 0xa6, 0x9c, 0x4a, 0x63, 0xd8, 0xac, 0x1e, 0x86, 0x8d, 0x3e, - 0x03, 0xfc, 0x46, 0xc3, 0xbf, 0x93, 0x9c, 0xd6, 0x15, 0x56, 0x8a, 0x05, 0x14, 0x3d, 0x07, 0x43, - 0xad, 0x80, 0xec, 0xb8, 0xbe, 0xe0, 0xaf, 0x35, 0x35, 0x56, 0x45, 0x94, 0x63, 0x85, 0x41, 0x1f, - 0xde, 0xa1, 0xeb, 0x51, 0x5e, 0xa2, 0xe6, 0x7b, 0x75, 0xae, 0x9b, 0x28, 0x8a, 0xb4, 0x58, 0x5a, - 0x39, 0x36, 0xb0, 0xd0, 0x2d, 0x18, 0x66, 0xff, 0xd9, 0xb1, 0xd3, 0x7f, 0xe8, 0x63, 0x47, 0x24, - 0x0a, 0x16, 0x04, 0x70, 0x4c, 0x0b, 0xbd, 0x00, 0x10, 0xc9, 0xd4, 0x32, 0xa1, 0x08, 0x61, 0xaa, - 0xde, 0x22, 0x2a, 0xe9, 0x4c, 0x88, 0x35, 0x2c, 0xf4, 0x2c, 0x0c, 0x47, 0x8e, 0xdb, 0xb8, 0xe6, - 0x7a, 0x4c, 0x7f, 0x4f, 0xfb, 0x2f, 0xf2, 0xf5, 0x8a, 0x42, 0x1c, 0xc3, 0x29, 0x2f, 0xc8, 0x62, - 0x42, 0x2d, 0xec, 0x46, 0x22, 0x35, 0x5d, 0x91, 0xf3, 0x82, 0xd7, 0x54, 0x29, 0xd6, 0x30, 0xd0, - 0x16, 0x9c, 0x72, 0x3d, 0x96, 0x42, 0x8a, 0x54, 0xb7, 0xdd, 0xd6, 0xfa, 0xb5, 0xea, 0x4d, 0x12, - 0xb8, 0x1b, 0xbb, 0x0b, 0x4e, 0x6d, 0x9b, 0x78, 0x32, 0x1b, 0xfd, 0x13, 0xa2, 0x8b, 0xa7, 0xca, - 0x1d, 0x70, 0x71, 0x47, 0x4a, 0xf6, 0x8b, 0x6c, 0xbd, 0x5f, 0xaf, 0xa2, 0x67, 0x8c, 0xa3, 0xe3, - 0x84, 0x7e, 0x74, 0x1c, 0xec, 0x95, 0x06, 0xae, 0x57, 0xb5, 0xd8, 0x3f, 0x97, 0xe0, 0x78, 0xc5, - 0xaf, 0x57, 0xfc, 0x20, 0x5a, 0xf1, 0x83, 0x3b, 0x4e, 0x50, 0x97, 0xcb, 0xab, 0x24, 0xa3, 0x1f, - 0xd1, 0xf3, 0xb3, 0x9f, 0x9f, 0x2e, 0x46, 0x64, 0xa3, 0x17, 0x19, 0xc7, 0x76, 0x48, 0x67, 0xd3, - 0x1a, 0xe3, 0x1d, 0x54, 0x12, 0xb6, 0xcb, 0x4e, 0x44, 0xd0, 0x75, 0x18, 0xab, 0xe9, 0xd7, 0xa8, - 0xa8, 0xfe, 0xb4, 0xbc, 0xc8, 0x8c, 0x3b, 0x36, 0xf3, 0xde, 0x35, 0xeb, 0xdb, 0xdf, 0xb2, 0x44, - 0x2b, 0x5c, 0x12, 0xc1, 0x6d, 0x5a, 0xbb, 0x9f, 0xa7, 0x8b, 0x30, 0x15, 0xe8, 0x55, 0x34, 0xdb, - 0xb0, 0xe3, 0x3c, 0xab, 0x4d, 0x02, 0x88, 0xd3, 0xf8, 0xe8, 0x53, 0x70, 0xd2, 0x28, 0x94, 0x6a, - 0x72, 0x2d, 0xb7, 0x34, 0x93, 0xd5, 0xe0, 0x3c, 0x24, 0x9c, 0x5f, 0xdf, 0xfe, 0x61, 0x38, 0x91, - 0xfc, 0x2e, 0x21, 0x3d, 0xb9, 0xcf, 0xaf, 0x2b, 0x1c, 0xee, 0xeb, 0xec, 0x97, 0x61, 0x8a, 0x3e, - 0xab, 0x15, 0x8b, 0xc8, 0xe6, 0xaf, 0x7b, 0x80, 0xa9, 0xff, 0x6b, 0x90, 0x5d, 0x71, 0x89, 0xcc, - 0x6a, 0xe8, 0x33, 0x30, 0x1e, 0x12, 0x16, 0x55, 0x4d, 0x4a, 0xed, 0x3a, 0x78, 0x8a, 0x57, 0x97, - 0x75, 0x4c, 0xfe, 0x32, 0x31, 0xcb, 0x70, 0x82, 0x1a, 0x6a, 0xc2, 0xf8, 0x1d, 0xd7, 0xab, 0xfb, - 0x77, 0x42, 0x49, 0x7f, 0x28, 0x5f, 0x05, 0x70, 0x8b, 0x63, 0x26, 0xfa, 0x68, 0x34, 0x77, 0xcb, - 0x20, 0x86, 0x13, 0xc4, 0xe9, 0x31, 0x12, 0xb4, 0xbd, 0xf9, 0xf0, 0x46, 0x48, 0x02, 0x11, 0xf3, - 0x8d, 0x1d, 0x23, 0x58, 0x16, 0xe2, 0x18, 0x4e, 0x8f, 0x11, 0xf6, 0x87, 0xb9, 0x9a, 0xb3, 0x73, - 0x4a, 0x1c, 0x23, 0x58, 0x95, 0x62, 0x0d, 0x83, 0x1e, 0xb3, 0xec, 0xdf, 0x9a, 0xef, 0x61, 0xdf, - 0x8f, 0xe4, 0xc1, 0xcc, 0xd2, 0x50, 0x6a, 0xe5, 0xd8, 0xc0, 0xca, 0x89, 0x30, 0xd7, 0x77, 0xd8, - 0x08, 0x73, 0x28, 0xea, 0xe0, 0x5d, 0xcf, 0x23, 0x1d, 0x5f, 0xea, 0xe4, 0x5d, 0x7f, 0x70, 0x5f, - 0x9e, 0xf7, 0xf4, 0x9e, 0xdf, 0x10, 0x03, 0xd4, 0xcf, 0x43, 0xe8, 0x31, 0x25, 0x65, 0x95, 0x8f, - 0x8e, 0x84, 0xa1, 0x65, 0x18, 0x0c, 0x77, 0xc3, 0x5a, 0xd4, 0x08, 0x3b, 0xa5, 0x1a, 0xad, 0x32, - 0x14, 0x2d, 0xd3, 0x35, 0xaf, 0x82, 0x65, 0x5d, 0x54, 0x83, 0x69, 0x41, 0x71, 0x71, 0xcb, 0xf1, - 0x54, 0x02, 0x44, 0x6e, 0x8d, 0x78, 0x71, 0x7f, 0xaf, 0x34, 0x2d, 0x5a, 0xd6, 0xc1, 0x07, 0x7b, - 0x25, 0xba, 0x25, 0x33, 0x20, 0x38, 0x8b, 0x1a, 0x5f, 0xf2, 0xb5, 0x9a, 0xdf, 0x6c, 0x55, 0x02, - 0x7f, 0xc3, 0x6d, 0x90, 0x4e, 0x8a, 0xde, 0xaa, 0x81, 0x29, 0x96, 0xbc, 0x51, 0x86, 0x13, 0xd4, - 0xd0, 0x6d, 0x98, 0x70, 0x5a, 0xad, 0xf9, 0xa0, 0xe9, 0x07, 0xb2, 0x81, 0x91, 0x7c, 0x8d, 0xc1, - 0xbc, 0x89, 0xca, 0xf3, 0x1f, 0x26, 0x0a, 0x71, 0x92, 0xa0, 0xfd, 0x43, 0x8c, 0xdf, 0xae, 0xba, - 0x9b, 0x1e, 0xf3, 0x49, 0x43, 0x4d, 0x18, 0x6b, 0xb1, 0x13, 0x59, 0xa4, 0x0d, 0x13, 0xbb, 0xf8, - 0xa5, 0x1e, 0x65, 0x86, 0x77, 0x58, 0xe2, 0x53, 0xc3, 0x76, 0xb4, 0xa2, 0x93, 0xc3, 0x26, 0x75, - 0xfb, 0xff, 0x3e, 0xc9, 0x38, 0xb6, 0x2a, 0x17, 0x04, 0x0e, 0x0a, 0x0f, 0x41, 0xf1, 0xf4, 0x9f, - 0xcd, 0x17, 0xb9, 0xc7, 0x53, 0x2f, 0xbc, 0x0c, 0xb1, 0xac, 0x8b, 0x3e, 0x0d, 0xe3, 0xf4, 0x25, - 0xad, 0xb8, 0xa6, 0x70, 0xe6, 0x58, 0x7e, 0xe8, 0x29, 0x85, 0xa5, 0xa7, 0x14, 0xd4, 0x2b, 0xe3, - 0x04, 0x31, 0xf4, 0x16, 0x33, 0xa7, 0x94, 0xa4, 0x0b, 0xbd, 0x90, 0xd6, 0x2d, 0x27, 0x25, 0x59, - 0x8d, 0x08, 0x6a, 0xc3, 0x74, 0x3a, 0x71, 0x72, 0x38, 0x63, 0xe7, 0x3f, 0x49, 0xd2, 0xb9, 0x8f, - 0xe3, 0xdc, 0x6f, 0x69, 0x58, 0x88, 0xb3, 0xe8, 0xa3, 0x6b, 0xc9, 0xb4, 0xb6, 0x45, 0x43, 0x58, - 0x9f, 0x4a, 0x6d, 0x3b, 0xd6, 0x31, 0xa3, 0xed, 0x26, 0x9c, 0xd6, 0x32, 0x83, 0x5e, 0x0e, 0x1c, - 0x66, 0xce, 0xe3, 0xb2, 0x8b, 0x42, 0xe3, 0x25, 0x1f, 0xdb, 0xdf, 0x2b, 0x9d, 0x5e, 0xef, 0x84, - 0x88, 0x3b, 0xd3, 0x41, 0xd7, 0xe1, 0x38, 0x0f, 0x9c, 0xb2, 0x44, 0x9c, 0x7a, 0xc3, 0xf5, 0x14, - 0xb3, 0xca, 0x8f, 0x95, 0x93, 0xfb, 0x7b, 0xa5, 0xe3, 0xf3, 0x59, 0x08, 0x38, 0xbb, 0x1e, 0x7a, - 0x1d, 0x86, 0xeb, 0x9e, 0x3c, 0x00, 0x07, 0x8c, 0xe4, 0xab, 0xc3, 0x4b, 0x6b, 0x55, 0xf5, 0xfd, - 0xf1, 0x1f, 0x1c, 0x57, 0x40, 0x9b, 0x5c, 0x5b, 0xa4, 0x44, 0x7c, 0x83, 0xa9, 0x78, 0x9a, 0x49, - 0x29, 0xb8, 0x11, 0x89, 0x80, 0xab, 0x49, 0x95, 0xa7, 0x9b, 0x11, 0xa4, 0xc0, 0x20, 0x8c, 0xde, - 0x04, 0x24, 0x92, 0xfc, 0xcc, 0xd7, 0x58, 0x4e, 0x3a, 0xcd, 0x84, 0x53, 0xbd, 0xdc, 0xab, 0x29, - 0x0c, 0x9c, 0x51, 0x0b, 0x5d, 0xa1, 0x27, 0x97, 0x5e, 0x2a, 0x4e, 0x46, 0x95, 0xe2, 0x7b, 0x89, - 0xb4, 0x02, 0xc2, 0xac, 0x0e, 0x4d, 0x8a, 0x38, 0x51, 0x0f, 0xd5, 0xe1, 0x94, 0xd3, 0x8e, 0x7c, - 0xa6, 0x88, 0x33, 0x51, 0xd7, 0xfd, 0x6d, 0xe2, 0x31, 0x1d, 0xf8, 0x10, 0x8b, 0xd3, 0x79, 0x6a, - 0xbe, 0x03, 0x1e, 0xee, 0x48, 0x85, 0xbe, 0x62, 0xe8, 0x58, 0x68, 0x3a, 0x32, 0xc3, 0xa9, 0x9a, - 0x2b, 0x8e, 0x25, 0x06, 0x7a, 0x19, 0x46, 0xb6, 0xfc, 0x30, 0x5a, 0x23, 0xd1, 0x1d, 0x3f, 0xd8, - 0x16, 0x59, 0x05, 0xe2, 0x4c, 0x2e, 0x31, 0x08, 0xeb, 0x78, 0xe8, 0x69, 0x18, 0x64, 0x16, 0x5a, - 0xe5, 0x25, 0x76, 0x0d, 0x0e, 0xc5, 0x67, 0xcc, 0x15, 0x5e, 0x8c, 0x25, 0x5c, 0xa2, 0x96, 0x2b, - 0x8b, 0xcc, 0xd0, 0x25, 0x81, 0x5a, 0xae, 0x2c, 0x62, 0x09, 0xa7, 0xcb, 0x35, 0xdc, 0x72, 0x02, - 0x52, 0x09, 0xfc, 0x1a, 0x09, 0xb5, 0xfc, 0x41, 0x8f, 0xf2, 0x9c, 0x09, 0x74, 0xb9, 0x56, 0xb3, - 0x10, 0x70, 0x76, 0x3d, 0x44, 0xd2, 0x59, 0x71, 0xc7, 0xf3, 0x35, 0x94, 0x69, 0x4e, 0xad, 0xc7, - 0xc4, 0xb8, 0x1e, 0x4c, 0xaa, 0x7c, 0xbc, 0x3c, 0x4b, 0x42, 0x38, 0x33, 0xc1, 0xd6, 0x76, 0xef, - 0x29, 0x16, 0x94, 0xce, 0xb7, 0x9c, 0xa0, 0x84, 0x53, 0xb4, 0x8d, 0x40, 0xb0, 0x93, 0x5d, 0x03, - 0xc1, 0x5e, 0x80, 0xe1, 0xb0, 0x7d, 0xbb, 0xee, 0x37, 0x1d, 0xd7, 0x63, 0x86, 0x2e, 0xda, 0x7b, - 0xb9, 0x2a, 0x01, 0x38, 0xc6, 0x41, 0x2b, 0x30, 0xe4, 0x48, 0x85, 0x2e, 0xca, 0x8f, 0x71, 0xa7, - 0xd4, 0xb8, 0x3c, 0xec, 0x93, 0x54, 0xe1, 0xaa, 0xba, 0xe8, 0x35, 0x18, 0x13, 0x71, 0x34, 0x44, - 0x0a, 0xfb, 0x69, 0xd3, 0x6b, 0xb8, 0xaa, 0x03, 0xb1, 0x89, 0x8b, 0x6e, 0xc0, 0x48, 0xe4, 0x37, - 0x98, 0xeb, 0x2b, 0x65, 0x60, 0x4f, 0xe4, 0x87, 0xa2, 0x5d, 0x57, 0x68, 0xba, 0xaa, 0x41, 0x55, - 0xc5, 0x3a, 0x1d, 0xb4, 0xce, 0xd7, 0x3b, 0xcb, 0x16, 0x44, 0x42, 0x91, 0x03, 0xfd, 0x74, 0x9e, - 0x95, 0x22, 0x43, 0x33, 0xb7, 0x83, 0xa8, 0x89, 0x75, 0x32, 0xe8, 0x32, 0x4c, 0xb5, 0x02, 0xd7, - 0x67, 0x6b, 0x42, 0x29, 0xa8, 0x67, 0xcc, 0xdc, 0xa0, 0x95, 0x24, 0x02, 0x4e, 0xd7, 0x61, 0x61, - 0x50, 0x44, 0xe1, 0xcc, 0x49, 0x9e, 0xdf, 0x8c, 0x8b, 0x1f, 0x78, 0x19, 0x56, 0x50, 0xb4, 0xca, - 0x4e, 0x62, 0x2e, 0x39, 0x9b, 0x99, 0xcd, 0x77, 0xae, 0xd7, 0x25, 0x6c, 0x9c, 0x2d, 0x57, 0x7f, - 0x71, 0x4c, 0x01, 0xd5, 0xb5, 0xb4, 0xe2, 0xf4, 0x71, 0x13, 0xce, 0x9c, 0xea, 0x60, 0x26, 0x9b, - 0x78, 0xc9, 0xc6, 0x0c, 0x81, 0x51, 0x1c, 0xe2, 0x04, 0x4d, 0xf4, 0x71, 0x98, 0x14, 0x31, 0x02, - 0xe2, 0x61, 0x3a, 0x1d, 0xbb, 0x12, 0xe1, 0x04, 0x0c, 0xa7, 0xb0, 0x79, 0x7e, 0x31, 0xe7, 0x76, - 0x83, 0x88, 0xa3, 0xef, 0x9a, 0xeb, 0x6d, 0x87, 0x33, 0x67, 0xd8, 0xf9, 0x20, 0xf2, 0x8b, 0x25, - 0xa1, 0x38, 0xa3, 0x06, 0x5a, 0x87, 0xc9, 0x56, 0x40, 0x48, 0x93, 0x3d, 0x61, 0xc4, 0x7d, 0x56, - 0xe2, 0x51, 0x80, 0x68, 0x4f, 0x2a, 0x09, 0xd8, 0x41, 0x46, 0x19, 0x4e, 0x51, 0x40, 0x77, 0x60, - 0xc8, 0xdf, 0x21, 0xc1, 0x16, 0x71, 0xea, 0x33, 0x67, 0x3b, 0x38, 0xb8, 0x89, 0xcb, 0xed, 0xba, - 0xc0, 0x4d, 0xd8, 0xff, 0xc8, 0xe2, 0xee, 0xf6, 0x3f, 0xb2, 0x31, 0xf4, 0x9f, 0x58, 0x70, 0x52, - 0x6a, 0xd4, 0xaa, 0x2d, 0x3a, 0xea, 0x8b, 0xbe, 0x17, 0x46, 0x01, 0x8f, 0x5b, 0xf3, 0x58, 0x7e, - 0x2c, 0x97, 0xf5, 0x9c, 0x4a, 0x4a, 0x78, 0x7f, 0x32, 0x0f, 0x23, 0xc4, 0xf9, 0x2d, 0xd2, 0x47, - 0x77, 0x48, 0x22, 0x79, 0x18, 0xcd, 0x87, 0x2b, 0x6f, 0x2d, 0xad, 0xcd, 0x3c, 0xce, 0x83, 0xee, - 0xd0, 0xcd, 0x50, 0x4d, 0x02, 0x71, 0x1a, 0x1f, 0x5d, 0x84, 0x82, 0x1f, 0xce, 0x3c, 0xd1, 0x21, - 0x13, 0xbd, 0x5f, 0xbf, 0x5e, 0xe5, 0x76, 0xa0, 0xd7, 0xab, 0xb8, 0xe0, 0x87, 0x32, 0xc7, 0x17, - 0x7d, 0x69, 0x86, 0x33, 0x4f, 0x72, 0x51, 0xaf, 0xcc, 0xf1, 0xc5, 0x0a, 0x71, 0x0c, 0x47, 0x5b, - 0x30, 0x11, 0x1a, 0x2f, 0xfa, 0x70, 0xe6, 0x1c, 0x1b, 0xa9, 0x27, 0xf3, 0x26, 0xcd, 0xc0, 0xd6, - 0x92, 0xef, 0x98, 0x54, 0x70, 0x92, 0x2c, 0xdf, 0x5d, 0x9a, 0x4c, 0x21, 0x9c, 0x79, 0xaa, 0xcb, - 0xee, 0xd2, 0x90, 0xf5, 0xdd, 0xa5, 0xd3, 0xc0, 0x09, 0x9a, 0xb3, 0x3f, 0x00, 0x53, 0x29, 0x76, - 0xe9, 0x30, 0x3e, 0x0f, 0xb3, 0xdb, 0x30, 0x66, 0x2c, 0xc9, 0x87, 0x6a, 0x12, 0xf3, 0xc7, 0xc3, - 0x30, 0xac, 0x4c, 0x15, 0xd0, 0x05, 0xd3, 0x0a, 0xe6, 0x64, 0xd2, 0x0a, 0x66, 0xa8, 0xe2, 0xd7, - 0x0d, 0xc3, 0x97, 0xf5, 0x8c, 0x58, 0xb2, 0x79, 0x07, 0x60, 0xef, 0x8e, 0x59, 0x9a, 0xfa, 0xa5, - 0xd8, 0xb3, 0x39, 0x4d, 0x5f, 0x47, 0x8d, 0xce, 0x65, 0x98, 0xf2, 0x7c, 0xc6, 0xa3, 0x93, 0xba, - 0x64, 0xc0, 0x18, 0x9f, 0x35, 0xac, 0xc7, 0x3a, 0x4b, 0x20, 0xe0, 0x74, 0x1d, 0xda, 0x20, 0x67, - 0x94, 0x92, 0x2a, 0x24, 0xce, 0x47, 0x61, 0x01, 0xa5, 0x6f, 0x43, 0xfe, 0x2b, 0x9c, 0x99, 0xcc, - 0x7f, 0x1b, 0xf2, 0x4a, 0x49, 0x66, 0x2c, 0x94, 0xcc, 0x18, 0xd3, 0x98, 0xb4, 0xfc, 0x7a, 0xb9, - 0x22, 0xd8, 0x7c, 0x2d, 0xca, 0x7b, 0xbd, 0x5c, 0xc1, 0x1c, 0x86, 0xe6, 0x61, 0x80, 0xfd, 0x90, - 0x31, 0x64, 0xf2, 0xb6, 0x69, 0xb9, 0xa2, 0xe5, 0x18, 0x65, 0x15, 0xb0, 0xa8, 0xc8, 0x24, 0xe2, - 0xf4, 0x6d, 0xc4, 0x24, 0xe2, 0x83, 0xf7, 0x29, 0x11, 0x97, 0x04, 0x70, 0x4c, 0x0b, 0xdd, 0x85, - 0xe3, 0xc6, 0x7b, 0x54, 0x79, 0xaa, 0x41, 0xbe, 0xb2, 0x3c, 0x81, 0xbc, 0x70, 0x5a, 0x74, 0xfa, - 0x78, 0x39, 0x8b, 0x12, 0xce, 0x6e, 0x00, 0x35, 0x60, 0xaa, 0x96, 0x6a, 0x75, 0xa8, 0xf7, 0x56, - 0xd5, 0xba, 0x48, 0xb7, 0x98, 0x26, 0x8c, 0x5e, 0x83, 0xa1, 0x77, 0x7d, 0x6e, 0xd8, 0x26, 0x9e, - 0x26, 0x32, 0x4a, 0xca, 0xd0, 0x5b, 0xd7, 0xab, 0xac, 0xfc, 0x60, 0xaf, 0x34, 0x52, 0xf1, 0xeb, - 0xf2, 0x2f, 0x56, 0x15, 0xd0, 0x4f, 0x58, 0x30, 0x9b, 0x7e, 0xf0, 0xaa, 0x4e, 0x8f, 0xf5, 0xde, - 0x69, 0x5b, 0x34, 0x3a, 0xbb, 0x9c, 0x4b, 0x0e, 0x77, 0x68, 0x0a, 0x7d, 0x94, 0xee, 0xa7, 0xd0, - 0xbd, 0x47, 0x44, 0x82, 0xf6, 0xc7, 0xe2, 0xfd, 0x44, 0x4b, 0x0f, 0xf6, 0x4a, 0x13, 0xfc, 0x64, - 0x74, 0xef, 0xa9, 0x78, 0xf4, 0xbc, 0x02, 0xfa, 0x61, 0x38, 0x1e, 0xa4, 0x65, 0xc3, 0x44, 0x32, - 0xe1, 0xcf, 0xf4, 0x72, 0xca, 0x26, 0x27, 0x1c, 0x67, 0x11, 0xc4, 0xd9, 0xed, 0xd8, 0xbf, 0x63, - 0x31, 0x9d, 0x80, 0xe8, 0x16, 0x09, 0xdb, 0x8d, 0xe8, 0x08, 0x8c, 0xc9, 0x96, 0x0d, 0x7d, 0xfb, - 0x7d, 0x5b, 0x83, 0xfd, 0xaf, 0x16, 0xb3, 0x06, 0x3b, 0x42, 0xbf, 0xb6, 0xb7, 0x60, 0x28, 0x12, - 0xad, 0x89, 0xae, 0xe7, 0x59, 0xae, 0xc8, 0x4e, 0x31, 0x8b, 0x38, 0xf5, 0xc8, 0x91, 0xa5, 0x58, - 0x91, 0xb1, 0xff, 0x27, 0x3e, 0x03, 0x12, 0x72, 0x04, 0x6a, 0xcd, 0x25, 0x53, 0xad, 0x59, 0xea, - 0xf2, 0x05, 0x39, 0xea, 0xcd, 0xff, 0xd1, 0xec, 0x37, 0x13, 0xee, 0xbd, 0xdf, 0xcd, 0x10, 0xed, - 0x2f, 0x59, 0x00, 0x71, 0x02, 0x90, 0x1e, 0x12, 0x32, 0x5f, 0xa2, 0xcf, 0x1a, 0x3f, 0xf2, 0x6b, - 0x7e, 0x43, 0xa8, 0x5e, 0x4e, 0xc5, 0x9a, 0x55, 0x5e, 0x7e, 0xa0, 0xfd, 0xc6, 0x0a, 0x1b, 0x95, - 0x64, 0x44, 0xde, 0x62, 0xac, 0xeb, 0x37, 0xa2, 0xf1, 0x7e, 0xd5, 0x82, 0x63, 0x59, 0x4e, 0x12, - 0xf4, 0x91, 0xcc, 0xc5, 0x9c, 0xca, 0x44, 0x54, 0xcd, 0xe6, 0x4d, 0x51, 0x8e, 0x15, 0x46, 0xcf, - 0x99, 0xae, 0x0f, 0x97, 0x9c, 0xe2, 0x3a, 0x8c, 0x55, 0x02, 0xa2, 0xf1, 0x17, 0x6f, 0xc4, 0x79, - 0x73, 0x86, 0x17, 0x9e, 0x3b, 0x74, 0xe4, 0x21, 0xfb, 0x6b, 0x05, 0x38, 0xc6, 0x0d, 0x9d, 0xe6, - 0x77, 0x7c, 0xb7, 0x5e, 0xf1, 0xeb, 0xc2, 0xb5, 0xf5, 0x6d, 0x18, 0x6d, 0x69, 0xb2, 0xe9, 0x4e, - 0x81, 0xd6, 0x75, 0x19, 0x76, 0x2c, 0x4d, 0xd3, 0x4b, 0xb1, 0x41, 0x0b, 0xd5, 0x61, 0x94, 0xec, - 0xb8, 0x35, 0x65, 0x2d, 0x53, 0x38, 0xf4, 0x25, 0xad, 0x5a, 0x59, 0xd6, 0xe8, 0x60, 0x83, 0x6a, - 0xcf, 0xe6, 0xc9, 0x1a, 0x8b, 0xd6, 0xd7, 0xc5, 0x42, 0xe6, 0x67, 0x2d, 0x78, 0x24, 0x27, 0x2c, - 0x3b, 0x6d, 0xee, 0x0e, 0x33, 0x29, 0x13, 0xcb, 0x56, 0x35, 0xc7, 0x0d, 0xcd, 0xb0, 0x80, 0xa2, - 0x4f, 0x00, 0xb4, 0xe2, 0x94, 0x94, 0x5d, 0xe2, 0x57, 0x1b, 0x91, 0x6c, 0xb5, 0xa0, 0xa4, 0x2a, - 0x73, 0xa5, 0x46, 0xcb, 0xfe, 0x6a, 0x1f, 0xf4, 0x33, 0xc3, 0x24, 0x54, 0x81, 0xc1, 0x2d, 0x1e, - 0x33, 0xaf, 0xe3, 0xbc, 0x51, 0x5c, 0x19, 0x84, 0x2f, 0x9e, 0x37, 0xad, 0x14, 0x4b, 0x32, 0x68, - 0x15, 0xa6, 0x79, 0xba, 0xcd, 0xc6, 0x12, 0x69, 0x38, 0xbb, 0x52, 0xec, 0x5b, 0x60, 0x9f, 0xaa, - 0xc4, 0xdf, 0xe5, 0x34, 0x0a, 0xce, 0xaa, 0x87, 0xde, 0x80, 0x71, 0xfa, 0x0c, 0xf7, 0xdb, 0x91, - 0xa4, 0xc4, 0xf3, 0x5b, 0xaa, 0x97, 0xc9, 0xba, 0x01, 0xc5, 0x09, 0x6c, 0xf4, 0x1a, 0x8c, 0xb5, - 0x52, 0x02, 0xee, 0xfe, 0x58, 0x12, 0x64, 0x0a, 0xb5, 0x4d, 0x5c, 0xe6, 0x27, 0xd1, 0x66, 0x5e, - 0x21, 0xeb, 0x5b, 0x01, 0x09, 0xb7, 0xfc, 0x46, 0x9d, 0x71, 0xc0, 0xfd, 0x9a, 0x9f, 0x44, 0x02, - 0x8e, 0x53, 0x35, 0x28, 0x95, 0x0d, 0xc7, 0x6d, 0xb4, 0x03, 0x12, 0x53, 0x19, 0x30, 0xa9, 0xac, - 0x24, 0xe0, 0x38, 0x55, 0xa3, 0xbb, 0xe4, 0x7e, 0xf0, 0xc1, 0x48, 0xee, 0xed, 0x5f, 0x2a, 0x80, - 0x31, 0xb5, 0xdf, 0xc7, 0x79, 0x37, 0x5f, 0x87, 0xbe, 0xcd, 0xa0, 0x55, 0x13, 0x46, 0x78, 0x99, - 0x5f, 0x16, 0x67, 0xff, 0xe7, 0x5f, 0x46, 0xff, 0x63, 0x56, 0x8b, 0xee, 0xf1, 0xe3, 0x95, 0xc0, - 0xa7, 0x97, 0x9c, 0x0c, 0xab, 0xa9, 0xdc, 0x91, 0x06, 0x65, 0x60, 0x8d, 0x0e, 0x01, 0xa8, 0x85, - 0x4f, 0x05, 0xa7, 0x60, 0xd8, 0xab, 0x55, 0x45, 0xf8, 0x1c, 0x49, 0x05, 0x5d, 0x84, 0x11, 0x91, - 0x0a, 0x91, 0x79, 0xcd, 0xf0, 0xcd, 0xc4, 0xec, 0xeb, 0x96, 0xe2, 0x62, 0xac, 0xe3, 0xd8, 0x3f, - 0x59, 0x80, 0xe9, 0x0c, 0xb7, 0x47, 0x7e, 0x8d, 0x6c, 0xba, 0x61, 0x14, 0xec, 0x26, 0x2f, 0x27, - 0x2c, 0xca, 0xb1, 0xc2, 0xa0, 0x67, 0x15, 0xbf, 0xa8, 0x92, 0x97, 0x93, 0x70, 0x2b, 0x12, 0xd0, - 0x43, 0xa6, 0xea, 0x3f, 0x0b, 0x7d, 0xed, 0x90, 0xc8, 0x58, 0xf7, 0xea, 0xda, 0x66, 0x0a, 0x7b, - 0x06, 0xa1, 0x4f, 0xc0, 0x4d, 0xa5, 0x85, 0xd6, 0x9e, 0x80, 0x5c, 0x0f, 0xcd, 0x61, 0xb4, 0x73, - 0x11, 0xf1, 0x1c, 0x2f, 0x12, 0x0f, 0xc5, 0x38, 0x06, 0x32, 0x2b, 0xc5, 0x02, 0x6a, 0x7f, 0xa5, - 0x08, 0x27, 0x73, 0x1d, 0xa1, 0x69, 0xd7, 0x9b, 0xbe, 0xe7, 0x46, 0xbe, 0x32, 0x5c, 0xe4, 0x71, - 0x8f, 0x49, 0x6b, 0x6b, 0x55, 0x94, 0x63, 0x85, 0x81, 0xce, 0x41, 0x3f, 0x13, 0x8a, 0x27, 0xd3, - 0xa0, 0xe1, 0x85, 0x25, 0x1e, 0x51, 0x92, 0x83, 0xb5, 0x5b, 0xbd, 0xd8, 0xf1, 0x56, 0x7f, 0x9c, - 0x72, 0x30, 0x7e, 0x23, 0x79, 0xa1, 0xd0, 0xee, 0xfa, 0x7e, 0x03, 0x33, 0x20, 0x7a, 0x52, 0x8c, - 0x57, 0xc2, 0x52, 0x0f, 0x3b, 0x75, 0x3f, 0xd4, 0x06, 0xed, 0x69, 0x18, 0xdc, 0x26, 0xbb, 0x81, - 0xeb, 0x6d, 0x26, 0x2d, 0x38, 0xaf, 0xf2, 0x62, 0x2c, 0xe1, 0x66, 0xd6, 0xef, 0xc1, 0x07, 0x91, - 0xf5, 0x5b, 0x5f, 0x01, 0x43, 0x5d, 0xd9, 0x93, 0x9f, 0x2a, 0xc2, 0x04, 0x5e, 0x58, 0xfa, 0x60, - 0x22, 0x6e, 0xa4, 0x27, 0xe2, 0x41, 0x24, 0xc7, 0x3e, 0xdc, 0x6c, 0xfc, 0xa6, 0x05, 0x13, 0x2c, - 0x21, 0xa3, 0x88, 0x62, 0xe2, 0xfa, 0xde, 0x11, 0x3c, 0x05, 0x1e, 0x87, 0xfe, 0x80, 0x36, 0x2a, - 0x66, 0x50, 0xed, 0x71, 0xd6, 0x13, 0xcc, 0x61, 0xe8, 0x14, 0xf4, 0xb1, 0x2e, 0xd0, 0xc9, 0x1b, - 0xe5, 0x47, 0xf0, 0x92, 0x13, 0x39, 0x98, 0x95, 0xb2, 0x78, 0x8a, 0x98, 0xb4, 0x1a, 0x2e, 0xef, - 0x74, 0x6c, 0xb2, 0xf0, 0xfe, 0x08, 0x91, 0x92, 0xd9, 0xb5, 0xf7, 0x16, 0x4f, 0x31, 0x9b, 0x64, - 0xe7, 0x67, 0xf6, 0xdf, 0x16, 0xe0, 0x4c, 0x66, 0xbd, 0x9e, 0xe3, 0x29, 0x76, 0xae, 0xfd, 0x30, - 0xd3, 0xb7, 0x15, 0x8f, 0xd0, 0x3e, 0xbe, 0xaf, 0x57, 0xee, 0xbf, 0xbf, 0x87, 0x30, 0x87, 0x99, - 0x43, 0xf6, 0x3e, 0x09, 0x73, 0x98, 0xd9, 0xb7, 0x1c, 0x31, 0xc1, 0x3f, 0x15, 0x72, 0xbe, 0x85, - 0x09, 0x0c, 0xce, 0xd3, 0x73, 0x86, 0x01, 0x43, 0xf9, 0x08, 0xe7, 0x67, 0x0c, 0x2f, 0xc3, 0x0a, - 0x8a, 0xe6, 0x61, 0xa2, 0xe9, 0x7a, 0xf4, 0xf0, 0xd9, 0x35, 0x59, 0x71, 0xa5, 0xcb, 0x58, 0x35, - 0xc1, 0x38, 0x89, 0x8f, 0x5c, 0x2d, 0x04, 0x22, 0xff, 0xba, 0xd7, 0x0e, 0xb5, 0xeb, 0xe6, 0x4c, - 0x73, 0x0e, 0x35, 0x8a, 0x19, 0xe1, 0x10, 0x57, 0x35, 0x39, 0x51, 0xb1, 0x77, 0x39, 0xd1, 0x68, - 0xb6, 0x8c, 0x68, 0xf6, 0x35, 0x18, 0xbb, 0x6f, 0xdd, 0x88, 0xfd, 0xed, 0x22, 0x3c, 0xda, 0x61, - 0xdb, 0xf3, 0xb3, 0xde, 0x98, 0x03, 0xed, 0xac, 0x4f, 0xcd, 0x43, 0x05, 0x8e, 0x6d, 0xb4, 0x1b, - 0x8d, 0x5d, 0xe6, 0x08, 0x46, 0xea, 0x12, 0x43, 0xf0, 0x94, 0x52, 0x38, 0x72, 0x6c, 0x25, 0x03, - 0x07, 0x67, 0xd6, 0xa4, 0x4f, 0x2c, 0x7a, 0x93, 0xec, 0x2a, 0x52, 0x89, 0x27, 0x16, 0xd6, 0x81, - 0xd8, 0xc4, 0x45, 0x97, 0x61, 0xca, 0xd9, 0x71, 0x5c, 0x9e, 0xfe, 0x42, 0x12, 0xe0, 0x6f, 0x2c, - 0x25, 0x8b, 0x9e, 0x4f, 0x22, 0xe0, 0x74, 0x1d, 0xf4, 0x26, 0x20, 0xff, 0x36, 0x73, 0x2e, 0xa9, - 0x5f, 0x26, 0x9e, 0xd0, 0xba, 0xb3, 0xb9, 0x2b, 0xc6, 0x47, 0xc2, 0xf5, 0x14, 0x06, 0xce, 0xa8, - 0x95, 0x08, 0xc6, 0x37, 0x90, 0x1f, 0x8c, 0xaf, 0xf3, 0xb9, 0xd8, 0x35, 0x73, 0xe0, 0x45, 0x18, - 0x3b, 0xa4, 0xc5, 0xb4, 0xfd, 0xcf, 0x2c, 0x50, 0x02, 0x62, 0x33, 0x98, 0xf6, 0x6b, 0xcc, 0xa6, - 0x9b, 0x8b, 0xb6, 0xb5, 0xf8, 0x59, 0xc7, 0x35, 0x9b, 0xee, 0x18, 0x88, 0x4d, 0x5c, 0xbe, 0x86, - 0xc2, 0x38, 0x6c, 0x83, 0xf1, 0x2a, 0x10, 0xb1, 0x3e, 0x15, 0x06, 0xfa, 0x24, 0x0c, 0xd6, 0xdd, - 0x1d, 0x37, 0x14, 0xc2, 0xb1, 0x43, 0x2b, 0xe3, 0xe2, 0xa3, 0x73, 0x89, 0x93, 0xc1, 0x92, 0x9e, - 0xfd, 0x53, 0x85, 0x78, 0x4c, 0xde, 0x6a, 0xfb, 0x91, 0x73, 0x04, 0x37, 0xf9, 0x65, 0xe3, 0x26, - 0x7f, 0x32, 0x7b, 0xa2, 0xb5, 0x2e, 0xe5, 0xde, 0xe0, 0xd7, 0x13, 0x37, 0xf8, 0x53, 0xdd, 0x49, - 0x75, 0xbe, 0xb9, 0xff, 0x67, 0x0b, 0xa6, 0x0c, 0xfc, 0x23, 0xb8, 0x40, 0x56, 0xcc, 0x0b, 0xe4, - 0xb1, 0xae, 0xdf, 0x90, 0x73, 0x71, 0xfc, 0x78, 0x31, 0xd1, 0x77, 0x76, 0x61, 0xbc, 0x0b, 0x7d, - 0x5b, 0x4e, 0x50, 0x17, 0xef, 0xe2, 0x0b, 0x3d, 0x8d, 0xf5, 0xdc, 0x15, 0x27, 0x10, 0x96, 0x0a, - 0xcf, 0xc9, 0x51, 0xa7, 0x45, 0x5d, 0xad, 0x14, 0x58, 0x53, 0xe8, 0x12, 0x0c, 0x84, 0x35, 0xbf, - 0xa5, 0xfc, 0xcc, 0x58, 0x3a, 0xea, 0x2a, 0x2b, 0x39, 0xd8, 0x2b, 0x21, 0xb3, 0x39, 0x5a, 0x8c, - 0x05, 0x3e, 0x7a, 0x1b, 0xc6, 0xd8, 0x2f, 0x65, 0x36, 0x58, 0xcc, 0x97, 0x60, 0x54, 0x75, 0x44, - 0x6e, 0x53, 0x6b, 0x14, 0x61, 0x93, 0xd4, 0xec, 0x26, 0x0c, 0xab, 0xcf, 0x7a, 0xa8, 0xda, 0xee, - 0xff, 0xb7, 0x08, 0xd3, 0x19, 0x6b, 0x0e, 0x85, 0xc6, 0x4c, 0x5c, 0xec, 0x71, 0xa9, 0xbe, 0xc7, - 0xb9, 0x08, 0xd9, 0x03, 0xaa, 0x2e, 0xd6, 0x56, 0xcf, 0x8d, 0xde, 0x08, 0x49, 0xb2, 0x51, 0x5a, - 0xd4, 0xbd, 0x51, 0xda, 0xd8, 0x91, 0x0d, 0x35, 0x6d, 0x48, 0xf5, 0xf4, 0xa1, 0xce, 0xe9, 0xef, - 0xf7, 0xc1, 0xb1, 0xac, 0x18, 0xcc, 0xe8, 0xf3, 0x89, 0x04, 0xfc, 0x2f, 0x75, 0x1a, 0x61, 0xbd, - 0x26, 0xcf, 0xca, 0x2f, 0x42, 0x9f, 0xce, 0x99, 0x29, 0xf9, 0xbb, 0x0e, 0xb3, 0x68, 0x93, 0x85, - 0x24, 0x0a, 0xc8, 0xbb, 0x6d, 0x12, 0x46, 0xf2, 0xf8, 0xf8, 0x48, 0xcf, 0x1d, 0xc0, 0xa2, 0x62, - 0xc2, 0x24, 0x49, 0x16, 0x77, 0x37, 0x49, 0x92, 0x2d, 0xa3, 0x32, 0x0c, 0xd4, 0xb8, 0xad, 0x4b, - 0xb1, 0xfb, 0x11, 0xc6, 0x0d, 0x5d, 0xd4, 0x01, 0x2c, 0x0c, 0x5c, 0x04, 0x81, 0x59, 0x17, 0x46, - 0xb4, 0x81, 0x79, 0xa8, 0x8b, 0x67, 0x9b, 0x5e, 0x7c, 0xda, 0x10, 0x3c, 0xd4, 0x05, 0xf4, 0xb3, - 0x16, 0x24, 0x5c, 0x79, 0x94, 0x50, 0xce, 0xca, 0x15, 0xca, 0x9d, 0x85, 0xbe, 0xc0, 0x6f, 0x90, - 0x64, 0x02, 0x75, 0xec, 0x37, 0x08, 0x66, 0x10, 0x8a, 0x11, 0xc5, 0xa2, 0x96, 0x51, 0xfd, 0x19, - 0x29, 0x1e, 0x88, 0x8f, 0x43, 0x7f, 0x83, 0xec, 0x90, 0x46, 0x32, 0xcf, 0xe5, 0x35, 0x5a, 0x88, - 0x39, 0xcc, 0xfe, 0xcd, 0x3e, 0x38, 0xdd, 0x31, 0x3e, 0x18, 0x7d, 0x8c, 0x6d, 0x3a, 0x11, 0xb9, - 0xe3, 0xec, 0x26, 0xf3, 0xbb, 0x5d, 0xe6, 0xc5, 0x58, 0xc2, 0x99, 0xcb, 0x2c, 0xcf, 0x77, 0x92, - 0x10, 0x61, 0x8a, 0x34, 0x27, 0x02, 0x6a, 0x8a, 0xc4, 0x8a, 0x0f, 0x42, 0x24, 0xf6, 0x02, 0x40, - 0x18, 0x36, 0xb8, 0x59, 0x60, 0x5d, 0xf8, 0xe2, 0xc6, 0x79, 0x71, 0xaa, 0xd7, 0x04, 0x04, 0x6b, - 0x58, 0x68, 0x09, 0x26, 0x5b, 0x81, 0x1f, 0x71, 0x89, 0xf0, 0x12, 0xb7, 0x9c, 0xed, 0x37, 0x43, - 0x33, 0x55, 0x12, 0x70, 0x9c, 0xaa, 0x81, 0x5e, 0x86, 0x11, 0x11, 0xae, 0xa9, 0xe2, 0xfb, 0x0d, - 0x21, 0x84, 0x52, 0xc6, 0xa4, 0xd5, 0x18, 0x84, 0x75, 0x3c, 0xad, 0x1a, 0x13, 0x33, 0x0f, 0x66, - 0x56, 0xe3, 0xa2, 0x66, 0x0d, 0x2f, 0x11, 0xda, 0x7d, 0xa8, 0xa7, 0xd0, 0xee, 0xb1, 0x58, 0x6e, - 0xb8, 0x67, 0xad, 0x27, 0x74, 0x15, 0x64, 0x7d, 0xbd, 0x0f, 0xa6, 0xc5, 0xc2, 0x79, 0xd8, 0xcb, - 0xe5, 0x46, 0x7a, 0xb9, 0x3c, 0x08, 0xc1, 0xdd, 0x07, 0x6b, 0xe6, 0xa8, 0xd7, 0xcc, 0x4f, 0x5b, - 0x60, 0x72, 0x6a, 0xe8, 0x3f, 0xca, 0x4d, 0x90, 0xf9, 0x72, 0x2e, 0xe7, 0x17, 0xc7, 0x7d, 0x7e, - 0x6f, 0xa9, 0x32, 0xed, 0xff, 0xcf, 0x82, 0xc7, 0xba, 0x52, 0x44, 0xcb, 0x30, 0xcc, 0xd8, 0x49, - 0xed, 0xa1, 0xf7, 0x94, 0xb2, 0xac, 0x97, 0x80, 0x1c, 0xee, 0x36, 0xae, 0x89, 0x96, 0x53, 0x99, - 0x48, 0x9f, 0xce, 0xc8, 0x44, 0x7a, 0xdc, 0x18, 0x9e, 0xfb, 0x4c, 0x45, 0xfa, 0x65, 0x7a, 0xe3, - 0x98, 0x9e, 0x73, 0x1f, 0x31, 0x84, 0x8e, 0x76, 0x42, 0xe8, 0x88, 0x4c, 0x6c, 0xed, 0x0e, 0xf9, - 0x38, 0x4c, 0xb2, 0x38, 0x8e, 0xcc, 0xcf, 0x43, 0xb8, 0xdc, 0x15, 0x62, 0x5b, 0xee, 0x6b, 0x09, - 0x18, 0x4e, 0x61, 0xdb, 0x7f, 0x5d, 0x84, 0x01, 0xbe, 0xfd, 0x8e, 0xe0, 0x79, 0xf9, 0x2c, 0x0c, - 0xbb, 0xcd, 0x66, 0x9b, 0x27, 0x97, 0xec, 0x8f, 0x2d, 0x83, 0xcb, 0xb2, 0x10, 0xc7, 0x70, 0xb4, - 0x22, 0xe4, 0xdd, 0x1d, 0x42, 0x45, 0xf3, 0x8e, 0xcf, 0x2d, 0x39, 0x91, 0xc3, 0x79, 0x25, 0x75, - 0xcf, 0xc6, 0x92, 0x71, 0xf4, 0x19, 0x80, 0x30, 0x0a, 0x5c, 0x6f, 0x93, 0x96, 0x89, 0x7c, 0x02, - 0xcf, 0x74, 0xa0, 0x56, 0x55, 0xc8, 0x9c, 0x66, 0x7c, 0xe6, 0x28, 0x00, 0xd6, 0x28, 0xa2, 0x39, - 0xe3, 0xa6, 0x9f, 0x4d, 0xcc, 0x1d, 0x70, 0xaa, 0xf1, 0x9c, 0xcd, 0xbe, 0x02, 0xc3, 0x8a, 0x78, - 0x37, 0xe9, 0xd7, 0xa8, 0xce, 0x16, 0x7d, 0x0c, 0x26, 0x12, 0x7d, 0x3b, 0x94, 0xf0, 0xec, 0xb7, - 0x2c, 0x98, 0xe0, 0x9d, 0x59, 0xf6, 0x76, 0xc4, 0x6d, 0x70, 0x0f, 0x8e, 0x35, 0x32, 0x4e, 0x65, - 0x31, 0xfd, 0xbd, 0x9f, 0xe2, 0x4a, 0x58, 0x96, 0x05, 0xc5, 0x99, 0x6d, 0xa0, 0xf3, 0x74, 0xc7, - 0xd1, 0x53, 0xd7, 0x69, 0x88, 0x98, 0x10, 0xa3, 0x7c, 0xb7, 0xf1, 0x32, 0xac, 0xa0, 0xf6, 0x9f, - 0x5b, 0x30, 0xc5, 0x7b, 0x7e, 0x95, 0xec, 0xaa, 0xb3, 0xe9, 0xbb, 0xd9, 0x77, 0x91, 0xd6, 0xb8, - 0x90, 0x93, 0xd6, 0x58, 0xff, 0xb4, 0x62, 0xc7, 0x4f, 0xfb, 0x9a, 0x05, 0x62, 0x85, 0x1c, 0x81, - 0x3c, 0xe3, 0x07, 0x4c, 0x79, 0xc6, 0x6c, 0xfe, 0x26, 0xc8, 0x11, 0x64, 0xfc, 0xa3, 0x05, 0x93, - 0x1c, 0x21, 0xd6, 0xd5, 0x7f, 0x57, 0xe7, 0x61, 0xc1, 0xfc, 0xa2, 0x4c, 0xe3, 0xcb, 0xab, 0x64, - 0x77, 0xdd, 0xaf, 0x38, 0xd1, 0x56, 0xf6, 0x47, 0x19, 0x93, 0xd5, 0xd7, 0x71, 0xb2, 0xea, 0x72, - 0x03, 0x19, 0xe9, 0xf3, 0xba, 0x84, 0x3e, 0x38, 0x6c, 0xfa, 0x3c, 0xfb, 0x6f, 0x2c, 0x40, 0xbc, - 0x19, 0x83, 0x71, 0xa3, 0xec, 0x10, 0x2b, 0xd5, 0x2e, 0xba, 0xf8, 0x68, 0x52, 0x10, 0xac, 0x61, - 0x3d, 0x90, 0xe1, 0x49, 0x18, 0x5c, 0x14, 0xbb, 0x1b, 0x5c, 0x1c, 0x62, 0x44, 0xbf, 0x36, 0x08, - 0x49, 0xcf, 0x3e, 0x74, 0x13, 0x46, 0x6b, 0x4e, 0xcb, 0xb9, 0xed, 0x36, 0xdc, 0xc8, 0x25, 0x61, - 0x27, 0x6b, 0xac, 0x45, 0x0d, 0x4f, 0xa8, 0xc8, 0xb5, 0x12, 0x6c, 0xd0, 0x41, 0x73, 0x00, 0xad, - 0xc0, 0xdd, 0x71, 0x1b, 0x64, 0x93, 0x89, 0x5d, 0x58, 0x14, 0x1a, 0x6e, 0x1a, 0x26, 0x4b, 0xb1, - 0x86, 0x91, 0x11, 0x20, 0xa2, 0xf8, 0x90, 0x03, 0x44, 0xc0, 0x91, 0x05, 0x88, 0xe8, 0x3b, 0x54, - 0x80, 0x88, 0xa1, 0x43, 0x07, 0x88, 0xe8, 0xef, 0x29, 0x40, 0x04, 0x86, 0x13, 0x92, 0xf7, 0xa4, - 0xff, 0x57, 0xdc, 0x06, 0x11, 0x0f, 0x0e, 0x1e, 0x3a, 0x67, 0x76, 0x7f, 0xaf, 0x74, 0x02, 0x67, - 0x62, 0xe0, 0x9c, 0x9a, 0xe8, 0x13, 0x30, 0xe3, 0x34, 0x1a, 0xfe, 0x1d, 0x35, 0xa9, 0xcb, 0x61, - 0xcd, 0x69, 0x70, 0x15, 0xc8, 0x20, 0xa3, 0x7a, 0x6a, 0x7f, 0xaf, 0x34, 0x33, 0x9f, 0x83, 0x83, - 0x73, 0x6b, 0xa3, 0xd7, 0x61, 0xb8, 0x15, 0xf8, 0xb5, 0x55, 0xcd, 0xfd, 0xf8, 0x0c, 0x1d, 0xc0, - 0x8a, 0x2c, 0x3c, 0xd8, 0x2b, 0x8d, 0xa9, 0x3f, 0xec, 0xc2, 0x8f, 0x2b, 0x64, 0xc4, 0x5e, 0x18, - 0x79, 0xd8, 0xb1, 0x17, 0x46, 0x1f, 0x74, 0xec, 0x85, 0x6d, 0x98, 0xae, 0x92, 0xc0, 0x75, 0x1a, - 0xee, 0x3d, 0xca, 0x93, 0xcb, 0x33, 0x70, 0x1d, 0x86, 0x83, 0xc4, 0xa9, 0xdf, 0x53, 0x88, 0x68, - 0x2d, 0x4b, 0x9a, 0x3c, 0xe5, 0x63, 0x42, 0xf6, 0xbf, 0xb5, 0x60, 0x50, 0x78, 0x0b, 0x1e, 0x01, - 0x67, 0x3a, 0x6f, 0x28, 0x3e, 0x4a, 0xd9, 0x93, 0xc2, 0x3a, 0x93, 0xab, 0xf2, 0x28, 0x27, 0x54, - 0x1e, 0x8f, 0x75, 0x22, 0xd2, 0x59, 0xd9, 0xf1, 0x5f, 0x16, 0xe9, 0x0b, 0xc1, 0xf0, 0x5b, 0x7f, - 0xf8, 0x43, 0xb0, 0x06, 0x83, 0xa1, 0xf0, 0x9b, 0x2e, 0xe4, 0x7b, 0x9c, 0x24, 0x27, 0x31, 0xb6, - 0xd4, 0x13, 0x9e, 0xd2, 0x92, 0x48, 0xa6, 0x43, 0x76, 0xf1, 0x21, 0x3a, 0x64, 0x77, 0xf3, 0xec, - 0xef, 0x7b, 0x10, 0x9e, 0xfd, 0xf6, 0x37, 0xd9, 0xed, 0xac, 0x97, 0x1f, 0x01, 0xe3, 0x76, 0xd9, - 0xbc, 0xc7, 0xed, 0x0e, 0x2b, 0x4b, 0x74, 0x2a, 0x87, 0x81, 0xfb, 0x0d, 0x0b, 0x4e, 0x67, 0x7c, - 0x95, 0xc6, 0xcd, 0x3d, 0x07, 0x43, 0x4e, 0xbb, 0xee, 0xaa, 0xbd, 0xac, 0xa9, 0x3f, 0xe7, 0x45, - 0x39, 0x56, 0x18, 0x68, 0x11, 0xa6, 0xc8, 0xdd, 0x96, 0xcb, 0x95, 0xc5, 0xba, 0x81, 0x73, 0x91, - 0xbb, 0x98, 0x2e, 0x27, 0x81, 0x38, 0x8d, 0xaf, 0x02, 0x77, 0x15, 0x73, 0x03, 0x77, 0xfd, 0x9a, - 0x05, 0x23, 0xca, 0x73, 0xf8, 0xa1, 0x8f, 0xf6, 0xc7, 0xcd, 0xd1, 0x7e, 0xb4, 0xc3, 0x68, 0xe7, - 0x0c, 0xf3, 0x9f, 0x15, 0x54, 0x7f, 0x2b, 0x7e, 0x10, 0xf5, 0xc0, 0x25, 0xde, 0xbf, 0x73, 0xc6, - 0x45, 0x18, 0x71, 0x5a, 0x2d, 0x09, 0x90, 0x56, 0x76, 0x2c, 0xe0, 0x7f, 0x5c, 0x8c, 0x75, 0x1c, - 0xe5, 0x2b, 0x52, 0xcc, 0xf5, 0x15, 0xa9, 0x03, 0x44, 0x4e, 0xb0, 0x49, 0x22, 0x5a, 0x26, 0x8c, - 0x82, 0xf3, 0xcf, 0x9b, 0x76, 0xe4, 0x36, 0xe6, 0x5c, 0x2f, 0x0a, 0xa3, 0x60, 0xae, 0xec, 0x45, - 0xd7, 0x03, 0xfe, 0x4c, 0xd5, 0x42, 0xdf, 0x29, 0x5a, 0x58, 0xa3, 0x2b, 0xa3, 0x64, 0xb0, 0x36, - 0xfa, 0x4d, 0x73, 0x8d, 0x35, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x0a, 0xbb, 0x7d, 0xd8, 0x98, 0x1e, - 0x2e, 0xec, 0xdb, 0xdf, 0x8e, 0xaa, 0xd9, 0x60, 0x8a, 0xd7, 0x25, 0x3d, 0xb8, 0x5c, 0xe7, 0xc3, - 0x9e, 0x36, 0xac, 0x7b, 0x5d, 0xc6, 0x11, 0xe8, 0xd0, 0xa7, 0x52, 0x26, 0x38, 0xcf, 0x77, 0xb9, - 0x35, 0x0e, 0x61, 0x74, 0xc3, 0xb2, 0x7f, 0xb1, 0xdc, 0x48, 0xe5, 0x8a, 0xd8, 0x17, 0x5a, 0xf6, - 0x2f, 0x01, 0xc0, 0x31, 0x0e, 0x65, 0xd8, 0xd4, 0x9f, 0x70, 0x06, 0xc5, 0x41, 0xa2, 0x15, 0x76, - 0x88, 0x35, 0x0c, 0x74, 0x41, 0x08, 0x2d, 0xb8, 0xee, 0xe1, 0xd1, 0x84, 0xd0, 0x42, 0x0e, 0x97, - 0x26, 0x69, 0xba, 0x08, 0x23, 0xe4, 0x6e, 0x44, 0x02, 0xcf, 0x69, 0xd0, 0x16, 0xfa, 0xe3, 0xb8, - 0xa6, 0xcb, 0x71, 0x31, 0xd6, 0x71, 0xd0, 0x3a, 0x4c, 0x84, 0x5c, 0x96, 0xa7, 0x52, 0x13, 0x70, - 0x99, 0xe8, 0x33, 0xca, 0x67, 0xdb, 0x04, 0x1f, 0xb0, 0x22, 0x7e, 0x3a, 0xc9, 0x48, 0x16, 0x49, - 0x12, 0xe8, 0x0d, 0x18, 0x6f, 0xf8, 0x4e, 0x7d, 0xc1, 0x69, 0x38, 0x5e, 0x8d, 0x8d, 0xcf, 0x90, - 0x99, 0x43, 0xfe, 0x9a, 0x01, 0xc5, 0x09, 0x6c, 0xca, 0x20, 0xea, 0x25, 0x22, 0x9d, 0x86, 0xe3, - 0x6d, 0x92, 0x70, 0x66, 0x98, 0x7d, 0x15, 0x63, 0x10, 0xaf, 0xe5, 0xe0, 0xe0, 0xdc, 0xda, 0xe8, - 0x12, 0x8c, 0xca, 0xcf, 0xd7, 0x02, 0xbf, 0xc4, 0x6e, 0x37, 0x1a, 0x0c, 0x1b, 0x98, 0x28, 0x84, - 0xe3, 0xf2, 0xff, 0x7a, 0xe0, 0x6c, 0x6c, 0xb8, 0x35, 0x11, 0x0d, 0x81, 0xbb, 0x28, 0x7f, 0x4c, - 0xfa, 0x43, 0x2e, 0x67, 0x21, 0x1d, 0xec, 0x95, 0x4e, 0x89, 0x51, 0xcb, 0x84, 0xe3, 0x6c, 0xda, - 0x68, 0x15, 0xa6, 0xb7, 0x88, 0xd3, 0x88, 0xb6, 0x16, 0xb7, 0x48, 0x6d, 0x5b, 0x6e, 0x38, 0xc6, - 0x35, 0x6a, 0xee, 0x29, 0x57, 0xd2, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x07, 0x66, 0x5a, 0xed, 0xdb, - 0x0d, 0x37, 0xdc, 0x5a, 0xf3, 0x23, 0x66, 0xe8, 0x34, 0x5f, 0xaf, 0x07, 0x24, 0xe4, 0x1e, 0xac, - 0xec, 0xea, 0x95, 0xc1, 0x7a, 0x2a, 0x39, 0x78, 0x38, 0x97, 0x02, 0xba, 0x07, 0xc7, 0x13, 0x0b, - 0x41, 0x44, 0xdd, 0x18, 0xcf, 0x4f, 0x4c, 0x54, 0xcd, 0xaa, 0x20, 0x02, 0xd8, 0x64, 0x81, 0x70, - 0x76, 0x13, 0xe8, 0x55, 0x00, 0xb7, 0xb5, 0xe2, 0x34, 0xdd, 0x06, 0x7d, 0x8e, 0x4e, 0xb3, 0x35, - 0x42, 0x9f, 0x26, 0x50, 0xae, 0xc8, 0x52, 0x7a, 0x36, 0x8b, 0x7f, 0xbb, 0x58, 0xc3, 0x46, 0xd7, - 0x60, 0x5c, 0xfc, 0xdb, 0x15, 0x53, 0x3a, 0xa5, 0x72, 0x58, 0x8e, 0xcb, 0x1a, 0x6a, 0x1e, 0x13, - 0x25, 0x38, 0x51, 0x17, 0x6d, 0xc2, 0x69, 0x99, 0x40, 0x53, 0x5f, 0x9f, 0x72, 0x0e, 0x42, 0x96, - 0x0d, 0x68, 0x88, 0x7b, 0xbe, 0xcc, 0x77, 0x42, 0xc4, 0x9d, 0xe9, 0xd0, 0x7b, 0x5d, 0x5f, 0xe6, - 0xdc, 0xaf, 0xf9, 0x78, 0x1c, 0xaf, 0xf1, 0x5a, 0x12, 0x88, 0xd3, 0xf8, 0xc8, 0x87, 0xe3, 0xae, - 0x97, 0xb5, 0xaa, 0x4f, 0x30, 0x42, 0x1f, 0xe5, 0x2e, 0xdd, 0x9d, 0x57, 0x74, 0x26, 0x1c, 0x67, - 0xd3, 0x45, 0x65, 0x98, 0x8e, 0x78, 0xc1, 0x92, 0x1b, 0xf2, 0x64, 0x23, 0xf4, 0xd9, 0xf7, 0x08, - 0x4f, 0xf1, 0x4f, 0x57, 0xf3, 0x7a, 0x1a, 0x8c, 0xb3, 0xea, 0xbc, 0x37, 0x33, 0xc5, 0x6f, 0x59, - 0xb4, 0xb6, 0xc6, 0xe8, 0xa3, 0xcf, 0xc2, 0xa8, 0x3e, 0x3e, 0x82, 0x69, 0x39, 0x97, 0xcd, 0x07, - 0x6b, 0xc7, 0x0b, 0x7f, 0x26, 0xa8, 0x23, 0x44, 0x87, 0x61, 0x83, 0x22, 0xaa, 0x65, 0x84, 0x62, - 0xb8, 0xd0, 0x1b, 0x53, 0xd4, 0xbb, 0x95, 0x1e, 0x81, 0xec, 0x9d, 0x83, 0xae, 0xc1, 0x50, 0xad, - 0xe1, 0x12, 0x2f, 0x2a, 0x57, 0x3a, 0x85, 0xd1, 0x5c, 0x14, 0x38, 0x62, 0x2b, 0x8a, 0x1c, 0x41, - 0xbc, 0x0c, 0x2b, 0x0a, 0xf6, 0x25, 0x18, 0xa9, 0x36, 0x08, 0x69, 0x71, 0x6f, 0x23, 0xf4, 0x34, - 0x7b, 0x98, 0x30, 0xd6, 0xd2, 0x62, 0xac, 0xa5, 0xfe, 0xe6, 0x60, 0x4c, 0xa5, 0x84, 0xdb, 0x7f, - 0x58, 0x80, 0x52, 0x97, 0x54, 0x55, 0x09, 0x7d, 0x9b, 0xd5, 0x93, 0xbe, 0x6d, 0x1e, 0x26, 0xe2, - 0x7f, 0xba, 0x28, 0x4f, 0x99, 0xec, 0xde, 0x34, 0xc1, 0x38, 0x89, 0xdf, 0xb3, 0xf7, 0x85, 0xae, - 0xb2, 0xeb, 0xeb, 0xea, 0x3f, 0x64, 0xa8, 0xea, 0xfb, 0x7b, 0x7f, 0x7b, 0xe7, 0xaa, 0x5d, 0xed, - 0x6f, 0x16, 0xe0, 0xb8, 0x1a, 0xc2, 0xef, 0xdf, 0x81, 0xbb, 0x91, 0x1e, 0xb8, 0x07, 0xa0, 0xb4, - 0xb6, 0xaf, 0xc3, 0x00, 0x8f, 0xed, 0xd9, 0x03, 0xcf, 0xff, 0xb8, 0x19, 0x42, 0x5d, 0xb1, 0x99, - 0x46, 0x18, 0xf5, 0x9f, 0xb0, 0x60, 0x22, 0xe1, 0xc6, 0x87, 0xb0, 0xe6, 0xeb, 0x7d, 0x3f, 0x7c, - 0x79, 0x16, 0xc7, 0x7f, 0x16, 0xfa, 0xb6, 0xfc, 0x30, 0x4a, 0x5a, 0xb4, 0x5c, 0xf1, 0xc3, 0x08, - 0x33, 0x88, 0xfd, 0x17, 0x16, 0xf4, 0xaf, 0x3b, 0xae, 0x17, 0x49, 0xed, 0x87, 0x95, 0xa3, 0xfd, - 0xe8, 0xe5, 0xbb, 0xd0, 0xcb, 0x30, 0x40, 0x36, 0x36, 0x48, 0x2d, 0x12, 0xb3, 0x2a, 0x63, 0x3e, - 0x0c, 0x2c, 0xb3, 0x52, 0xca, 0x84, 0xb2, 0xc6, 0xf8, 0x5f, 0x2c, 0x90, 0xd1, 0x2d, 0x18, 0x8e, - 0xdc, 0x26, 0x99, 0xaf, 0xd7, 0x85, 0x4d, 0xc0, 0x7d, 0x04, 0x2a, 0x59, 0x97, 0x04, 0x70, 0x4c, - 0xcb, 0xfe, 0x4a, 0x01, 0x20, 0x0e, 0x58, 0xd6, 0xed, 0x13, 0x17, 0x52, 0xda, 0xe2, 0x73, 0x19, - 0xda, 0x62, 0x14, 0x13, 0xcc, 0x50, 0x15, 0xab, 0x61, 0x2a, 0xf6, 0x34, 0x4c, 0x7d, 0x87, 0x19, - 0xa6, 0x45, 0x98, 0x8a, 0x03, 0xae, 0x99, 0xf1, 0x26, 0xd9, 0xfd, 0xbd, 0x9e, 0x04, 0xe2, 0x34, - 0xbe, 0x4d, 0xe0, 0xac, 0x8a, 0x3b, 0x25, 0xee, 0x42, 0x66, 0xf0, 0xae, 0x6b, 0xdf, 0xbb, 0x8c, - 0x53, 0xac, 0x0e, 0x2f, 0xe4, 0xaa, 0xc3, 0x7f, 0xc1, 0x82, 0x63, 0xc9, 0x76, 0x98, 0x77, 0xf8, - 0x97, 0x2c, 0x38, 0x1e, 0x67, 0x6a, 0x49, 0x9b, 0x20, 0xbc, 0xd4, 0x31, 0x96, 0x56, 0x4e, 0x8f, - 0xe3, 0xe0, 0x22, 0xab, 0x59, 0xa4, 0x71, 0x76, 0x8b, 0xf6, 0xbf, 0xe9, 0x83, 0x99, 0xbc, 0x20, - 0x5c, 0xcc, 0x1f, 0xc6, 0xb9, 0x5b, 0xdd, 0x26, 0x77, 0x84, 0xd7, 0x41, 0xec, 0x0f, 0xc3, 0x8b, - 0xb1, 0x84, 0x27, 0x93, 0xf3, 0x14, 0x7a, 0x4c, 0xce, 0xb3, 0x05, 0x53, 0x77, 0xb6, 0x88, 0x77, - 0xc3, 0x0b, 0x9d, 0xc8, 0x0d, 0x37, 0x5c, 0xa6, 0x40, 0xe7, 0xeb, 0x46, 0x26, 0x98, 0x9f, 0xba, - 0x95, 0x44, 0x38, 0xd8, 0x2b, 0x9d, 0x36, 0x0a, 0xe2, 0x2e, 0xf3, 0x83, 0x04, 0xa7, 0x89, 0xa6, - 0x73, 0x1b, 0xf5, 0x3d, 0xe4, 0xdc, 0x46, 0x4d, 0x57, 0x98, 0xdd, 0x48, 0x67, 0x07, 0xf6, 0x6c, - 0x5d, 0x55, 0xa5, 0x58, 0xc3, 0x40, 0x9f, 0x06, 0xa4, 0x27, 0xa7, 0x33, 0x62, 0xa0, 0x3e, 0xbf, - 0xbf, 0x57, 0x42, 0x6b, 0x29, 0xe8, 0xc1, 0x5e, 0x69, 0x9a, 0x96, 0x96, 0x3d, 0xfa, 0xfc, 0x8d, - 0x03, 0xc7, 0x65, 0x10, 0x42, 0xb7, 0x60, 0x92, 0x96, 0xb2, 0x1d, 0x25, 0x03, 0xac, 0xf2, 0x27, - 0xeb, 0xb3, 0xfb, 0x7b, 0xa5, 0xc9, 0xb5, 0x04, 0x2c, 0x8f, 0x74, 0x8a, 0x48, 0x46, 0x8a, 0xa3, - 0xa1, 0x5e, 0x53, 0x1c, 0xd9, 0x5f, 0xb2, 0xe0, 0x24, 0xbd, 0xe0, 0xea, 0xd7, 0x72, 0xb4, 0xe8, - 0x4e, 0xcb, 0xe5, 0x7a, 0x1a, 0x71, 0xd5, 0x30, 0x59, 0x5d, 0xa5, 0xcc, 0xb5, 0x34, 0x0a, 0x4a, - 0x4f, 0xf8, 0x6d, 0xd7, 0xab, 0x27, 0x4f, 0xf8, 0xab, 0xae, 0x57, 0xc7, 0x0c, 0xa2, 0xae, 0xac, - 0x62, 0xae, 0xcf, 0xc5, 0xd7, 0xe9, 0x5e, 0xa5, 0x7d, 0xf9, 0xae, 0x76, 0x03, 0x3d, 0xab, 0xeb, - 0x54, 0x85, 0xf9, 0x64, 0xae, 0x3e, 0xf5, 0x8b, 0x16, 0x08, 0x1f, 0xed, 0x1e, 0xee, 0xe4, 0xb7, - 0x61, 0x74, 0x27, 0x9d, 0xb8, 0xf3, 0x6c, 0xbe, 0xd3, 0xba, 0x48, 0xd7, 0xa9, 0x58, 0x74, 0x23, - 0x49, 0xa7, 0x41, 0xcb, 0xae, 0x83, 0x80, 0x2e, 0x11, 0xa6, 0xd5, 0xe8, 0xde, 0x9b, 0x17, 0x00, - 0xea, 0x0c, 0x97, 0x65, 0xf3, 0x2e, 0x98, 0x1c, 0xd7, 0x92, 0x82, 0x60, 0x0d, 0xcb, 0xfe, 0x95, - 0x22, 0x8c, 0xc8, 0x44, 0x91, 0x6d, 0xaf, 0x17, 0xd9, 0xe3, 0xa1, 0x32, 0xc7, 0xa3, 0x77, 0x60, - 0x2a, 0x20, 0xb5, 0x76, 0x10, 0xba, 0x3b, 0x44, 0x82, 0xc5, 0x26, 0x99, 0xe3, 0xa1, 0xfc, 0x13, - 0xc0, 0x03, 0x16, 0xc8, 0x29, 0x51, 0xc8, 0x94, 0xc6, 0x69, 0x42, 0xe8, 0x02, 0x0c, 0x33, 0xd1, - 0x7b, 0x25, 0x16, 0x08, 0x2b, 0xc1, 0xd7, 0xaa, 0x04, 0xe0, 0x18, 0x87, 0x3d, 0x0e, 0xda, 0xb7, - 0x19, 0x7a, 0xc2, 0x5f, 0xb9, 0xca, 0x8b, 0xb1, 0x84, 0xa3, 0x4f, 0xc0, 0x24, 0xaf, 0x17, 0xf8, - 0x2d, 0x67, 0x93, 0xab, 0x04, 0xfb, 0x55, 0x10, 0x98, 0xc9, 0xd5, 0x04, 0xec, 0x60, 0xaf, 0x74, - 0x2c, 0x59, 0xc6, 0xba, 0x9d, 0xa2, 0xc2, 0x2c, 0xff, 0x78, 0x23, 0xf4, 0xce, 0x48, 0x19, 0x0c, - 0xc6, 0x20, 0xac, 0xe3, 0xd9, 0xff, 0x60, 0xc1, 0x94, 0x36, 0x55, 0x3d, 0x67, 0x53, 0x30, 0x06, - 0xa9, 0xd0, 0xc3, 0x20, 0x1d, 0x2e, 0x26, 0x41, 0xe6, 0x0c, 0xf7, 0x3d, 0xa0, 0x19, 0xb6, 0x3f, - 0x0b, 0x28, 0x9d, 0x85, 0x14, 0xbd, 0xc9, 0xcd, 0xe5, 0xdd, 0x80, 0xd4, 0x3b, 0x29, 0xfc, 0xf5, - 0xf8, 0x2e, 0xd2, 0xbf, 0x92, 0xd7, 0xc2, 0xaa, 0xbe, 0xfd, 0x93, 0x7d, 0x30, 0x99, 0x8c, 0x28, - 0x81, 0xae, 0xc0, 0x00, 0xe7, 0xd2, 0x05, 0xf9, 0x0e, 0xf6, 0x64, 0x5a, 0x1c, 0x0a, 0xc6, 0xaf, - 0x08, 0x46, 0x5f, 0xd4, 0x47, 0xef, 0xc0, 0x48, 0xdd, 0xbf, 0xe3, 0xdd, 0x71, 0x82, 0xfa, 0x7c, - 0xa5, 0x2c, 0x4e, 0x88, 0x4c, 0x01, 0xd4, 0x52, 0x8c, 0xa6, 0xc7, 0xb6, 0x60, 0xb6, 0x13, 0x31, - 0x08, 0xeb, 0xe4, 0xd0, 0x3a, 0x4b, 0xac, 0xb3, 0xe1, 0x6e, 0xae, 0x3a, 0xad, 0x4e, 0xbe, 0x53, - 0x8b, 0x12, 0x49, 0xa3, 0x3c, 0x26, 0xb2, 0xef, 0x70, 0x00, 0x8e, 0x09, 0xa1, 0xcf, 0xc3, 0x74, - 0x98, 0xa3, 0x12, 0xcb, 0x4b, 0x4a, 0xdd, 0x49, 0x4b, 0xc4, 0x85, 0x29, 0x59, 0xca, 0xb3, 0xac, - 0x66, 0xd0, 0x5d, 0x40, 0x42, 0xf4, 0xbc, 0x1e, 0xb4, 0xc3, 0x68, 0xa1, 0xed, 0xd5, 0x1b, 0x32, - 0xf1, 0x4e, 0x76, 0xda, 0xfa, 0x14, 0xb6, 0xd6, 0x36, 0x8b, 0x30, 0x9b, 0xc6, 0xc0, 0x19, 0x6d, - 0xd8, 0x5f, 0xec, 0x83, 0x59, 0x99, 0xf6, 0x37, 0xc3, 0x47, 0xe4, 0x0b, 0x56, 0xc2, 0x49, 0xe4, - 0xd5, 0xfc, 0x83, 0xfe, 0xa1, 0xb9, 0x8a, 0x7c, 0x39, 0xed, 0x2a, 0xf2, 0xfa, 0x21, 0xbb, 0xf1, - 0xc0, 0x1c, 0x46, 0xbe, 0x6f, 0xbd, 0x3c, 0xf6, 0x8f, 0x81, 0x71, 0x35, 0x23, 0xcc, 0xc3, 0x77, - 0x57, 0xa4, 0xea, 0x28, 0xe7, 0xf9, 0x7f, 0x45, 0xe0, 0x18, 0x97, 0xfd, 0xa8, 0x0c, 0xf2, 0xcd, - 0xce, 0x59, 0x45, 0x87, 0xd2, 0x24, 0xcd, 0x56, 0xb4, 0xbb, 0xe4, 0x06, 0xa2, 0xc7, 0x99, 0x34, - 0x97, 0x05, 0x4e, 0x9a, 0xa6, 0x84, 0x60, 0x45, 0x07, 0xed, 0xc0, 0xd4, 0x26, 0x8b, 0x4b, 0xa4, - 0x67, 0xca, 0x2f, 0xe6, 0xef, 0xdb, 0xcb, 0x8b, 0xcb, 0x1d, 0xd2, 0xe4, 0xb3, 0xc7, 0x5f, 0x0a, - 0x05, 0xa7, 0x9b, 0x60, 0x59, 0xfa, 0x9d, 0x3b, 0xe1, 0x72, 0xc3, 0x09, 0x23, 0xb7, 0xb6, 0xd0, - 0xf0, 0x6b, 0xdb, 0xd5, 0xc8, 0x0f, 0x64, 0x9a, 0xbe, 0xcc, 0xb7, 0xd7, 0xfc, 0xad, 0x6a, 0x0a, - 0x3f, 0x9d, 0xa5, 0x3f, 0x0b, 0x0b, 0x67, 0xb6, 0x85, 0xd6, 0x60, 0x70, 0xd3, 0x8d, 0x30, 0x69, - 0xf9, 0xe2, 0xb4, 0xc8, 0x3c, 0x0a, 0x2f, 0x73, 0x94, 0x74, 0xd6, 0x7c, 0x01, 0xc0, 0x92, 0x08, - 0x7a, 0x53, 0x5d, 0x02, 0x03, 0xf9, 0x02, 0xd8, 0xb4, 0xed, 0x5d, 0xe6, 0x35, 0xf0, 0x06, 0x14, - 0xbd, 0x8d, 0xb0, 0x53, 0xc4, 0x98, 0xb5, 0x95, 0x6a, 0x3a, 0x9b, 0xfd, 0xda, 0x4a, 0x15, 0xd3, - 0x8a, 0xcc, 0xb9, 0x34, 0xac, 0x85, 0xae, 0x48, 0x0b, 0x94, 0xe9, 0x6b, 0x5b, 0xae, 0x2e, 0x56, - 0xcb, 0xe9, 0x0c, 0xfe, 0xac, 0x18, 0xf3, 0xea, 0xe8, 0x26, 0x0c, 0x6f, 0xf2, 0x83, 0x6f, 0x23, - 0x14, 0xa9, 0xbf, 0x33, 0x2f, 0xa3, 0xcb, 0x12, 0x29, 0x9d, 0xb7, 0x5f, 0x81, 0x70, 0x4c, 0x0a, - 0x7d, 0xd1, 0x82, 0xe3, 0xc9, 0xdc, 0xe9, 0xcc, 0x25, 0x4c, 0x98, 0xa9, 0xbd, 0xdc, 0x4b, 0x32, - 0x7b, 0x56, 0xc1, 0x68, 0x90, 0xa9, 0x5f, 0x32, 0xd1, 0x70, 0x76, 0x73, 0x74, 0xa0, 0x83, 0xdb, - 0xf5, 0x4e, 0x99, 0x64, 0x12, 0xe1, 0x73, 0xf8, 0x40, 0xe3, 0x85, 0x25, 0x4c, 0x2b, 0xa2, 0x75, - 0x80, 0x8d, 0x06, 0x11, 0x71, 0x09, 0x85, 0x51, 0x54, 0xe6, 0xed, 0xbf, 0xa2, 0xb0, 0x04, 0x1d, - 0xf6, 0x12, 0x8d, 0x4b, 0xb1, 0x46, 0x87, 0x2e, 0xa5, 0x9a, 0xeb, 0xd5, 0x49, 0xc0, 0x94, 0x5b, - 0x39, 0x4b, 0x69, 0x91, 0x61, 0xa4, 0x97, 0x12, 0x2f, 0xc7, 0x82, 0x02, 0xa3, 0x45, 0x5a, 0x5b, - 0x1b, 0x61, 0xa7, 0xc4, 0x08, 0x8b, 0xa4, 0xb5, 0x95, 0x58, 0x50, 0x9c, 0x16, 0x2b, 0xc7, 0x82, - 0x02, 0xdd, 0x32, 0x1b, 0x74, 0x03, 0x91, 0x60, 0x66, 0x22, 0x7f, 0xcb, 0xac, 0x70, 0x94, 0xf4, - 0x96, 0x11, 0x00, 0x2c, 0x89, 0xa0, 0xcf, 0x98, 0xdc, 0xce, 0x24, 0xa3, 0xf9, 0x6c, 0x17, 0x6e, - 0xc7, 0xa0, 0xdb, 0x99, 0xdf, 0x79, 0x15, 0x0a, 0x1b, 0x35, 0xa6, 0x14, 0xcb, 0xd1, 0x19, 0xac, - 0x2c, 0x1a, 0xd4, 0x58, 0xa0, 0xf1, 0x95, 0x45, 0x5c, 0xd8, 0xa8, 0xd1, 0xa5, 0xef, 0xdc, 0x6b, - 0x07, 0x64, 0xc5, 0x6d, 0x10, 0x91, 0x24, 0x21, 0x73, 0xe9, 0xcf, 0x4b, 0xa4, 0xf4, 0xd2, 0x57, - 0x20, 0x1c, 0x93, 0xa2, 0x74, 0x63, 0x1e, 0x6c, 0x3a, 0x9f, 0xae, 0x62, 0xb5, 0xd2, 0x74, 0x33, - 0xb9, 0xb0, 0x6d, 0x18, 0xdb, 0x09, 0x5b, 0x5b, 0x44, 0x9e, 0x8a, 0x4c, 0x5d, 0x97, 0x13, 0x4f, - 0xe1, 0xa6, 0x40, 0x74, 0x83, 0xa8, 0xed, 0x34, 0x52, 0x07, 0x39, 0x13, 0xad, 0xdc, 0xd4, 0x89, - 0x61, 0x93, 0x36, 0x5d, 0x08, 0xef, 0xf2, 0xa0, 0x67, 0x4c, 0x71, 0x97, 0xb3, 0x10, 0x32, 0xe2, - 0xa2, 0xf1, 0x85, 0x20, 0x00, 0x58, 0x12, 0x51, 0x83, 0xcd, 0x2e, 0xa0, 0x13, 0x5d, 0x06, 0x3b, - 0xd5, 0xdf, 0x78, 0xb0, 0xd9, 0x85, 0x13, 0x93, 0x62, 0x17, 0x4d, 0x2b, 0x23, 0xcd, 0x3c, 0x53, - 0xdb, 0xe5, 0x5c, 0x34, 0xdd, 0xd2, 0xd2, 0xf3, 0x8b, 0x26, 0x0b, 0x0b, 0x67, 0xb6, 0x45, 0x3f, - 0xae, 0x25, 0xe3, 0xd7, 0x89, 0x44, 0x0e, 0x4f, 0xe7, 0x84, 0x7f, 0x4c, 0x07, 0xb9, 0xe3, 0x1f, - 0xa7, 0x40, 0x38, 0x26, 0x85, 0xea, 0x30, 0xde, 0x32, 0xe2, 0xa2, 0xb2, 0x84, 0x14, 0x39, 0x7c, - 0x41, 0x56, 0x04, 0x55, 0x2e, 0x21, 0x32, 0x21, 0x38, 0x41, 0x93, 0x59, 0xee, 0x71, 0x57, 0x3f, - 0x96, 0xaf, 0x22, 0x67, 0xaa, 0x33, 0xbc, 0x01, 0xf9, 0x54, 0x0b, 0x00, 0x96, 0x44, 0xe8, 0x68, - 0x08, 0x07, 0x35, 0x3f, 0x64, 0x69, 0x5f, 0xf2, 0x14, 0xec, 0x59, 0x6a, 0x22, 0x19, 0x0c, 0x5c, - 0x80, 0x70, 0x4c, 0x8a, 0x9e, 0xe4, 0xf4, 0xc2, 0x3b, 0x95, 0x7f, 0x92, 0x27, 0xaf, 0x3b, 0x76, - 0x92, 0xd3, 0xcb, 0xae, 0x28, 0xae, 0x3a, 0x15, 0xbb, 0x9a, 0xa5, 0xac, 0xc8, 0xe9, 0x97, 0x0a, - 0x7e, 0x9d, 0xee, 0x97, 0x02, 0xe1, 0x98, 0x14, 0xbb, 0x8a, 0x59, 0x00, 0xb5, 0x33, 0x1d, 0xae, - 0x62, 0x8a, 0x90, 0x71, 0x15, 0x6b, 0x01, 0xd6, 0xec, 0x9f, 0x2c, 0xc0, 0x99, 0xce, 0xfb, 0x36, - 0xd6, 0xa1, 0x55, 0x62, 0x9b, 0xa5, 0x84, 0x0e, 0x8d, 0x4b, 0x74, 0x62, 0xac, 0x9e, 0xc3, 0xe2, - 0x5e, 0x86, 0x29, 0xe5, 0x8e, 0xd8, 0x70, 0x6b, 0xbb, 0x5a, 0x0a, 0x49, 0x15, 0x40, 0xa6, 0x9a, - 0x44, 0xc0, 0xe9, 0x3a, 0x68, 0x1e, 0x26, 0x8c, 0xc2, 0xf2, 0x92, 0x78, 0xfe, 0xc7, 0xc9, 0x16, - 0x4c, 0x30, 0x4e, 0xe2, 0xdb, 0xbf, 0x6a, 0xc1, 0x23, 0x39, 0xd9, 0xc2, 0x7b, 0x8e, 0xfa, 0xba, - 0x01, 0x13, 0x2d, 0xb3, 0x6a, 0x97, 0x40, 0xd5, 0x46, 0x4e, 0x72, 0xd5, 0xd7, 0x04, 0x00, 0x27, - 0x89, 0xda, 0xbf, 0x5c, 0x80, 0xd3, 0x1d, 0xed, 0xeb, 0x11, 0x86, 0x13, 0x9b, 0xcd, 0xd0, 0x59, - 0x0c, 0x48, 0x9d, 0x78, 0x91, 0xeb, 0x34, 0xaa, 0x2d, 0x52, 0xd3, 0xb4, 0xa0, 0xcc, 0x50, 0xfd, - 0xf2, 0x6a, 0x75, 0x3e, 0x8d, 0x81, 0x73, 0x6a, 0xa2, 0x15, 0x40, 0x69, 0x88, 0x98, 0x61, 0xf6, - 0xc4, 0x4d, 0xd3, 0xc3, 0x19, 0x35, 0xd0, 0x2b, 0x30, 0xa6, 0xec, 0xf6, 0xb5, 0x19, 0x67, 0x17, - 0x04, 0xd6, 0x01, 0xd8, 0xc4, 0x43, 0x17, 0x79, 0x16, 0x1e, 0x91, 0xaf, 0x49, 0xa8, 0x4c, 0x27, - 0x64, 0x8a, 0x1d, 0x51, 0x8c, 0x75, 0x9c, 0x85, 0x4b, 0x7f, 0xf4, 0x9d, 0x33, 0x1f, 0xfa, 0xd3, - 0xef, 0x9c, 0xf9, 0xd0, 0x9f, 0x7f, 0xe7, 0xcc, 0x87, 0x7e, 0x64, 0xff, 0x8c, 0xf5, 0x47, 0xfb, - 0x67, 0xac, 0x3f, 0xdd, 0x3f, 0x63, 0xfd, 0xf9, 0xfe, 0x19, 0xeb, 0x9f, 0xef, 0x9f, 0xb1, 0xbe, - 0xf2, 0x57, 0x67, 0x3e, 0xf4, 0x36, 0x8a, 0xe3, 0x28, 0x5f, 0xa0, 0xb3, 0x73, 0x61, 0xe7, 0xe2, - 0x7f, 0x08, 0x00, 0x00, 0xff, 0xff, 0xb0, 0x62, 0xd3, 0x72, 0xe6, 0x21, 0x01, 0x00, + 0x75, 0x30, 0xc6, 0xea, 0x9e, 0xf3, 0xcd, 0x9d, 0x83, 0x63, 0x30, 0x0b, 0xa0, 0xb1, 0xb5, 0xbb, + 0x58, 0xec, 0x35, 0x20, 0xf6, 0xe0, 0x82, 0xbb, 0xcb, 0x15, 0xe7, 0x04, 0x7a, 0x81, 0x19, 0xf4, + 0x66, 0x0f, 0x00, 0x72, 0xb9, 0xe4, 0xc7, 0x42, 0x77, 0xce, 0x4c, 0x71, 0xba, 0xab, 0x7a, 0xab, + 0xaa, 0x07, 0x18, 0x98, 0x5f, 0xe8, 0x13, 0x65, 0x51, 0x22, 0x25, 0x47, 0x30, 0x1c, 0xf2, 0x11, + 0x94, 0x42, 0xe1, 0x90, 0x65, 0x1d, 0xa6, 0x25, 0x9b, 0xa6, 0x2c, 0xc9, 0xa2, 0x2e, 0x5f, 0x11, + 0x92, 0xed, 0x90, 0x65, 0x45, 0x98, 0x54, 0x58, 0xe1, 0x91, 0x39, 0x72, 0x84, 0x42, 0x3f, 0x2c, + 0x29, 0x64, 0xff, 0xb0, 0x27, 0x64, 0xeb, 0x8b, 0x3c, 0x2b, 0xb3, 0x8e, 0xee, 0x1e, 0x2c, 0x30, + 0x5c, 0x32, 0xf6, 0x5f, 0x77, 0xbe, 0x97, 0x2f, 0xb3, 0xf2, 0x7c, 0xf9, 0x4e, 0xb0, 0xb7, 0x2f, + 0x87, 0x73, 0xae, 0x7f, 0xd1, 0x69, 0xb9, 0x17, 0x6b, 0x7e, 0x40, 0x2e, 0xee, 0x5c, 0xba, 0xb8, + 0x49, 0x3c, 0x12, 0x38, 0x11, 0xa9, 0xcf, 0xb5, 0x02, 0x3f, 0xf2, 0x11, 0xe2, 0x38, 0x73, 0x4e, + 0xcb, 0x9d, 0xa3, 0x38, 0x73, 0x3b, 0x97, 0x66, 0x5f, 0xd8, 0x74, 0xa3, 0xad, 0xf6, 0x9d, 0xb9, + 0x9a, 0xdf, 0xbc, 0xb8, 0xe9, 0x6f, 0xfa, 0x17, 0x19, 0xea, 0x9d, 0xf6, 0x06, 0xfb, 0xc7, 0xfe, + 0xb0, 0x5f, 0x9c, 0xc4, 0xec, 0xcb, 0x71, 0x33, 0x4d, 0xa7, 0xb6, 0xe5, 0x7a, 0x24, 0xd8, 0xbd, + 0xd8, 0xda, 0xde, 0x64, 0xed, 0x06, 0x24, 0xf4, 0xdb, 0x41, 0x8d, 0x24, 0x1b, 0xee, 0x58, 0x2b, + 0xbc, 0xd8, 0x24, 0x91, 0x93, 0xd1, 0xdd, 0xd9, 0x8b, 0x79, 0xb5, 0x82, 0xb6, 0x17, 0xb9, 0xcd, + 0x74, 0x33, 0x1f, 0xeb, 0x56, 0x21, 0xac, 0x6d, 0x91, 0xa6, 0x93, 0xaa, 0xf7, 0x52, 0x5e, 0xbd, + 0x76, 0xe4, 0x36, 0x2e, 0xba, 0x5e, 0x14, 0x46, 0x41, 0xb2, 0x92, 0xfd, 0x5d, 0x0b, 0xce, 0xcd, + 0xdf, 0xae, 0x2e, 0x37, 0x9c, 0x30, 0x72, 0x6b, 0x0b, 0x0d, 0xbf, 0xb6, 0x5d, 0x8d, 0xfc, 0x80, + 0xdc, 0xf2, 0x1b, 0xed, 0x26, 0xa9, 0xb2, 0x81, 0x40, 0xcf, 0xc3, 0xd0, 0x0e, 0xfb, 0x5f, 0x5e, + 0x9a, 0xb1, 0xce, 0x59, 0x17, 0x86, 0x17, 0x26, 0xff, 0x78, 0xaf, 0xf4, 0x91, 0xfd, 0xbd, 0xd2, + 0xd0, 0x2d, 0x51, 0x8e, 0x15, 0x06, 0x3a, 0x0f, 0x03, 0x1b, 0xe1, 0xfa, 0x6e, 0x8b, 0xcc, 0x14, + 0x18, 0xee, 0xb8, 0xc0, 0x1d, 0x58, 0xa9, 0xd2, 0x52, 0x2c, 0xa0, 0xe8, 0x22, 0x0c, 0xb7, 0x9c, + 0x20, 0x72, 0x23, 0xd7, 0xf7, 0x66, 0x8a, 0xe7, 0xac, 0x0b, 0xfd, 0x0b, 0x53, 0x02, 0x75, 0xb8, + 0x22, 0x01, 0x38, 0xc6, 0xa1, 0xdd, 0x08, 0x88, 0x53, 0xbf, 0xe1, 0x35, 0x76, 0x67, 0xfa, 0xce, + 0x59, 0x17, 0x86, 0xe2, 0x6e, 0x60, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0xf5, 0x02, 0x0c, 0xcd, 0x6f, + 0x6c, 0xb8, 0x9e, 0x1b, 0xed, 0xa2, 0x5b, 0x30, 0xea, 0xf9, 0x75, 0x22, 0xff, 0xb3, 0xaf, 0x18, + 0x79, 0xf1, 0xdc, 0x5c, 0x7a, 0x29, 0xcd, 0xad, 0x69, 0x78, 0x0b, 0x93, 0xfb, 0x7b, 0xa5, 0x51, + 0xbd, 0x04, 0x1b, 0x74, 0x10, 0x86, 0x91, 0x96, 0x5f, 0x57, 0x64, 0x0b, 0x8c, 0x6c, 0x29, 0x8b, + 0x6c, 0x25, 0x46, 0x5b, 0x98, 0xd8, 0xdf, 0x2b, 0x8d, 0x68, 0x05, 0x58, 0x27, 0x82, 0xee, 0xc0, + 0x04, 0xfd, 0xeb, 0x45, 0xae, 0xa2, 0x5b, 0x64, 0x74, 0x9f, 0xc8, 0xa3, 0xab, 0xa1, 0x2e, 0x4c, + 0xef, 0xef, 0x95, 0x26, 0x12, 0x85, 0x38, 0x49, 0xd0, 0xfe, 0x19, 0x0b, 0x26, 0xe6, 0x5b, 0xad, + 0xf9, 0xa0, 0xe9, 0x07, 0x95, 0xc0, 0xdf, 0x70, 0x1b, 0x04, 0xbd, 0x0a, 0x7d, 0x11, 0x9d, 0x35, + 0x3e, 0xc3, 0x4f, 0x88, 0xa1, 0xed, 0xa3, 0x73, 0x75, 0xb0, 0x57, 0x9a, 0x4e, 0xa0, 0xb3, 0xa9, + 0x64, 0x15, 0xd0, 0x27, 0x61, 0xb2, 0xe1, 0xd7, 0x9c, 0xc6, 0x96, 0x1f, 0x46, 0x02, 0x2a, 0xa6, + 0xfe, 0xd8, 0xfe, 0x5e, 0x69, 0xf2, 0x7a, 0x02, 0x86, 0x53, 0xd8, 0xf6, 0x7d, 0x18, 0x9f, 0x8f, + 0x22, 0xa7, 0xb6, 0x45, 0xea, 0x7c, 0x41, 0xa1, 0x97, 0xa1, 0xcf, 0x73, 0x9a, 0xb2, 0x33, 0xe7, + 0x64, 0x67, 0xd6, 0x9c, 0x26, 0xed, 0xcc, 0xe4, 0x4d, 0xcf, 0x7d, 0xaf, 0x2d, 0x16, 0x29, 0x2d, + 0xc3, 0x0c, 0x1b, 0xbd, 0x08, 0x50, 0x27, 0x3b, 0x6e, 0x8d, 0x54, 0x9c, 0x68, 0x4b, 0xf4, 0x01, + 0x89, 0xba, 0xb0, 0xa4, 0x20, 0x58, 0xc3, 0xb2, 0xef, 0xc1, 0xf0, 0xfc, 0x8e, 0xef, 0xd6, 0x2b, + 0x7e, 0x3d, 0x44, 0xdb, 0x30, 0xd1, 0x0a, 0xc8, 0x06, 0x09, 0x54, 0xd1, 0x8c, 0x75, 0xae, 0x78, + 0x61, 0xe4, 0xc5, 0x0b, 0x99, 0x63, 0x6f, 0xa2, 0x2e, 0x7b, 0x51, 0xb0, 0xbb, 0x70, 0x52, 0xb4, + 0x37, 0x91, 0x80, 0xe2, 0x24, 0x65, 0xfb, 0xbf, 0x2d, 0xc0, 0xf1, 0xf9, 0xfb, 0xed, 0x80, 0x2c, + 0xb9, 0xe1, 0x76, 0x72, 0xc3, 0xd5, 0xdd, 0x70, 0x7b, 0x2d, 0x1e, 0x01, 0xb5, 0xd2, 0x97, 0x44, + 0x39, 0x56, 0x18, 0xe8, 0x05, 0x18, 0xa4, 0xbf, 0x6f, 0xe2, 0xb2, 0xf8, 0xe4, 0x69, 0x81, 0x3c, + 0xb2, 0xe4, 0x44, 0xce, 0x12, 0x07, 0x61, 0x89, 0x83, 0x56, 0x61, 0xa4, 0xc6, 0xce, 0x87, 0xcd, + 0x55, 0xbf, 0x4e, 0xd8, 0xda, 0x1a, 0x5e, 0x78, 0x8e, 0xa2, 0x2f, 0xc6, 0xc5, 0x07, 0x7b, 0xa5, + 0x19, 0xde, 0x37, 0x41, 0x42, 0x83, 0x61, 0xbd, 0x3e, 0xb2, 0xd5, 0x76, 0xef, 0x63, 0x94, 0x20, + 0x63, 0xab, 0x5f, 0xd0, 0x76, 0x6e, 0x3f, 0xdb, 0xb9, 0xa3, 0xd9, 0xbb, 0x16, 0x5d, 0x82, 0xbe, + 0x6d, 0xd7, 0xab, 0xcf, 0x0c, 0x30, 0x5a, 0x67, 0xe8, 0x9c, 0x5f, 0x73, 0xbd, 0xfa, 0xc1, 0x5e, + 0x69, 0xca, 0xe8, 0x0e, 0x2d, 0xc4, 0x0c, 0xd5, 0xfe, 0xbf, 0x2c, 0x28, 0x31, 0xd8, 0x8a, 0xdb, + 0x20, 0x15, 0x12, 0x84, 0x6e, 0x18, 0x11, 0x2f, 0x32, 0x06, 0xf4, 0x45, 0x80, 0x90, 0xd4, 0x02, + 0x12, 0x69, 0x43, 0xaa, 0x16, 0x46, 0x55, 0x41, 0xb0, 0x86, 0x45, 0xcf, 0xa7, 0x70, 0xcb, 0x09, + 0xd8, 0xfa, 0x12, 0x03, 0xab, 0xce, 0xa7, 0xaa, 0x04, 0xe0, 0x18, 0xc7, 0x38, 0x9f, 0x8a, 0xdd, + 0xce, 0x27, 0xf4, 0x09, 0x98, 0x88, 0x1b, 0x0b, 0x5b, 0x4e, 0x4d, 0x0e, 0x20, 0xdb, 0xc1, 0x55, + 0x13, 0x84, 0x93, 0xb8, 0xf6, 0x7f, 0x6c, 0x89, 0xc5, 0x43, 0xbf, 0xfa, 0x03, 0xfe, 0xad, 0xf6, + 0xef, 0x58, 0x30, 0xb8, 0xe0, 0x7a, 0x75, 0xd7, 0xdb, 0x44, 0x9f, 0x87, 0x21, 0x7a, 0x55, 0xd6, + 0x9d, 0xc8, 0x11, 0xc7, 0xf0, 0x47, 0xb5, 0xbd, 0xa5, 0x6e, 0xae, 0xb9, 0xd6, 0xf6, 0x26, 0x2d, + 0x08, 0xe7, 0x28, 0x36, 0xdd, 0x6d, 0x37, 0xee, 0x7c, 0x81, 0xd4, 0xa2, 0x55, 0x12, 0x39, 0xf1, + 0xe7, 0xc4, 0x65, 0x58, 0x51, 0x45, 0xd7, 0x60, 0x20, 0x72, 0x82, 0x4d, 0x12, 0x89, 0xf3, 0x38, + 0xf3, 0xdc, 0xe4, 0x35, 0x31, 0xdd, 0x91, 0xc4, 0xab, 0x91, 0xf8, 0x96, 0x5a, 0x67, 0x55, 0xb1, + 0x20, 0x61, 0xff, 0x7f, 0x83, 0x70, 0x6a, 0xb1, 0x5a, 0xce, 0x59, 0x57, 0xe7, 0x61, 0xa0, 0x1e, + 0xb8, 0x3b, 0x24, 0x10, 0xe3, 0xac, 0xa8, 0x2c, 0xb1, 0x52, 0x2c, 0xa0, 0xe8, 0x32, 0x8c, 0xf2, + 0xfb, 0xf1, 0xaa, 0xe3, 0xd5, 0xe3, 0xe3, 0x51, 0x60, 0x8f, 0xde, 0xd2, 0x60, 0xd8, 0xc0, 0x3c, + 0xe4, 0xa2, 0x3a, 0x9f, 0xd8, 0x8c, 0x79, 0x77, 0xef, 0x57, 0x2c, 0x98, 0xe4, 0xcd, 0xcc, 0x47, + 0x51, 0xe0, 0xde, 0x69, 0x47, 0x24, 0x9c, 0xe9, 0x67, 0x27, 0xdd, 0x62, 0xd6, 0x68, 0xe5, 0x8e, + 0xc0, 0xdc, 0xad, 0x04, 0x15, 0x7e, 0x08, 0xce, 0x88, 0x76, 0x27, 0x93, 0x60, 0x9c, 0x6a, 0x16, + 0xfd, 0xb8, 0x05, 0xb3, 0x35, 0xdf, 0x8b, 0x02, 0xbf, 0xd1, 0x20, 0x41, 0xa5, 0x7d, 0xa7, 0xe1, + 0x86, 0x5b, 0x7c, 0x9d, 0x62, 0xb2, 0xc1, 0x4e, 0x82, 0x9c, 0x39, 0x54, 0x48, 0x62, 0x0e, 0xcf, + 0xee, 0xef, 0x95, 0x66, 0x17, 0x73, 0x49, 0xe1, 0x0e, 0xcd, 0xa0, 0x6d, 0x40, 0xf4, 0x66, 0xaf, + 0x46, 0xce, 0x26, 0x89, 0x1b, 0x1f, 0xec, 0xbd, 0xf1, 0x13, 0xfb, 0x7b, 0x25, 0xb4, 0x96, 0x22, + 0x81, 0x33, 0xc8, 0xa2, 0xf7, 0xe0, 0x18, 0x2d, 0x4d, 0x7d, 0xeb, 0x50, 0xef, 0xcd, 0xcd, 0xec, + 0xef, 0x95, 0x8e, 0xad, 0x65, 0x10, 0xc1, 0x99, 0xa4, 0xd1, 0xbf, 0xb2, 0xe0, 0x54, 0xfc, 0xf9, + 0xcb, 0xf7, 0x5a, 0x8e, 0x57, 0x8f, 0x1b, 0x1e, 0xee, 0xbd, 0x61, 0x7a, 0x26, 0x9f, 0x5a, 0xcc, + 0xa3, 0x84, 0xf3, 0x1b, 0x41, 0x1e, 0x4c, 0xd3, 0xae, 0x25, 0xdb, 0x86, 0xde, 0xdb, 0x3e, 0xb9, + 0xbf, 0x57, 0x9a, 0x5e, 0x4b, 0xd3, 0xc0, 0x59, 0x84, 0x67, 0x17, 0xe1, 0x78, 0xe6, 0xea, 0x44, + 0x93, 0x50, 0xdc, 0x26, 0x9c, 0x09, 0x1c, 0xc6, 0xf4, 0x27, 0x3a, 0x06, 0xfd, 0x3b, 0x4e, 0xa3, + 0x2d, 0x36, 0x26, 0xe6, 0x7f, 0x5e, 0x2b, 0x5c, 0xb6, 0xec, 0xff, 0xae, 0x08, 0x13, 0x8b, 0xd5, + 0xf2, 0x03, 0xed, 0x7a, 0xfd, 0xda, 0x2b, 0x74, 0xbc, 0xf6, 0xe2, 0x4b, 0xb4, 0x98, 0x7b, 0x89, + 0xfe, 0x68, 0xc6, 0x96, 0xed, 0x63, 0x5b, 0xf6, 0xe3, 0x39, 0x5b, 0xf6, 0x21, 0x6f, 0xd4, 0x9d, + 0x9c, 0x55, 0xdb, 0xcf, 0x26, 0x30, 0x93, 0x43, 0x62, 0xbc, 0x5f, 0xf2, 0xa8, 0x3d, 0xe4, 0xd2, + 0x7d, 0x38, 0xf3, 0x58, 0x83, 0xd1, 0x45, 0xa7, 0xe5, 0xdc, 0x71, 0x1b, 0x6e, 0xe4, 0x92, 0x10, + 0x3d, 0x0d, 0x45, 0xa7, 0x5e, 0x67, 0xdc, 0xdd, 0xf0, 0xc2, 0xf1, 0xfd, 0xbd, 0x52, 0x71, 0xbe, + 0x4e, 0xd9, 0x0c, 0x50, 0x58, 0xbb, 0x98, 0x62, 0xa0, 0x67, 0xa1, 0xaf, 0x1e, 0xf8, 0xad, 0x99, + 0x02, 0xc3, 0xa4, 0xbb, 0xbc, 0x6f, 0x29, 0xf0, 0x5b, 0x09, 0x54, 0x86, 0x63, 0xff, 0x51, 0x01, + 0x4e, 0x2f, 0x92, 0xd6, 0xd6, 0x4a, 0x35, 0xe7, 0xbe, 0xb8, 0x00, 0x43, 0x4d, 0xdf, 0x73, 0x23, + 0x3f, 0x08, 0x45, 0xd3, 0x6c, 0x45, 0xac, 0x8a, 0x32, 0xac, 0xa0, 0xe8, 0x1c, 0xf4, 0xb5, 0x62, + 0x26, 0x76, 0x54, 0x32, 0xc0, 0x8c, 0x7d, 0x65, 0x10, 0x8a, 0xd1, 0x0e, 0x49, 0x20, 0x56, 0x8c, + 0xc2, 0xb8, 0x19, 0x92, 0x00, 0x33, 0x48, 0xcc, 0x09, 0x50, 0x1e, 0x41, 0xdc, 0x08, 0x09, 0x4e, + 0x80, 0x42, 0xb0, 0x86, 0x85, 0x2a, 0x30, 0x1c, 0x26, 0x66, 0xb6, 0xa7, 0xad, 0x39, 0xc6, 0x58, + 0x05, 0x35, 0x93, 0x31, 0x11, 0xe3, 0x06, 0x1b, 0xe8, 0xca, 0x2a, 0x7c, 0xbb, 0x00, 0x88, 0x0f, + 0xe1, 0x0f, 0xd8, 0xc0, 0xdd, 0x4c, 0x0f, 0x5c, 0xef, 0x5b, 0xe2, 0x61, 0x8d, 0xde, 0xff, 0x6d, + 0xc1, 0xe9, 0x45, 0xd7, 0xab, 0x93, 0x20, 0x67, 0x01, 0x3e, 0x9a, 0xa7, 0xfc, 0xe1, 0x98, 0x14, + 0x63, 0x89, 0xf5, 0x3d, 0x84, 0x25, 0x66, 0xff, 0xbd, 0x05, 0x88, 0x7f, 0xf6, 0x07, 0xee, 0x63, + 0x6f, 0xa6, 0x3f, 0xf6, 0x21, 0x2c, 0x0b, 0xfb, 0x3a, 0x8c, 0x2f, 0x36, 0x5c, 0xe2, 0x45, 0xe5, + 0xca, 0xa2, 0xef, 0x6d, 0xb8, 0x9b, 0xe8, 0x35, 0x18, 0x8f, 0xdc, 0x26, 0xf1, 0xdb, 0x51, 0x95, + 0xd4, 0x7c, 0x8f, 0xbd, 0x5c, 0xad, 0x0b, 0xfd, 0x0b, 0x68, 0x7f, 0xaf, 0x34, 0xbe, 0x6e, 0x40, + 0x70, 0x02, 0xd3, 0xfe, 0x65, 0x7a, 0x6e, 0x35, 0xda, 0x61, 0x44, 0x82, 0xf5, 0xa0, 0x1d, 0x46, + 0x0b, 0x6d, 0xca, 0x7b, 0x56, 0x02, 0x9f, 0x76, 0xc7, 0xf5, 0x3d, 0x74, 0xda, 0x78, 0x8e, 0x0f, + 0xc9, 0xa7, 0xb8, 0x78, 0x76, 0xcf, 0x01, 0x84, 0xee, 0xa6, 0x47, 0x02, 0xed, 0xf9, 0x30, 0xce, + 0xb6, 0x8a, 0x2a, 0xc5, 0x1a, 0x06, 0x6a, 0xc0, 0x58, 0xc3, 0xb9, 0x43, 0x1a, 0x55, 0xd2, 0x20, + 0xb5, 0xc8, 0x0f, 0x84, 0x7c, 0xe3, 0xa5, 0xde, 0xde, 0x01, 0xd7, 0xf5, 0xaa, 0x0b, 0x53, 0xfb, + 0x7b, 0xa5, 0x31, 0xa3, 0x08, 0x9b, 0xc4, 0xe9, 0xd1, 0xe1, 0xb7, 0xe8, 0x57, 0x38, 0x0d, 0xfd, + 0xf1, 0x79, 0x43, 0x94, 0x61, 0x05, 0x55, 0x47, 0x47, 0x5f, 0xde, 0xd1, 0x61, 0xff, 0x25, 0x5d, + 0x68, 0x7e, 0xb3, 0xe5, 0x7b, 0xc4, 0x8b, 0x16, 0x7d, 0xaf, 0xce, 0x25, 0x53, 0xaf, 0x19, 0xa2, + 0x93, 0xf3, 0x09, 0xd1, 0xc9, 0x89, 0x74, 0x0d, 0x4d, 0x7a, 0xf2, 0x71, 0x18, 0x08, 0x23, 0x27, + 0x6a, 0x87, 0x62, 0xe0, 0x1e, 0x97, 0xcb, 0xae, 0xca, 0x4a, 0x0f, 0xf6, 0x4a, 0x13, 0xaa, 0x1a, + 0x2f, 0xc2, 0xa2, 0x02, 0x7a, 0x06, 0x06, 0x9b, 0x24, 0x0c, 0x9d, 0x4d, 0xc9, 0x36, 0x4c, 0x88, + 0xba, 0x83, 0xab, 0xbc, 0x18, 0x4b, 0x38, 0x7a, 0x02, 0xfa, 0x49, 0x10, 0xf8, 0x81, 0xf8, 0xb6, + 0x31, 0x81, 0xd8, 0xbf, 0x4c, 0x0b, 0x31, 0x87, 0xd9, 0xff, 0x93, 0x05, 0x13, 0xaa, 0xaf, 0xbc, + 0xad, 0x23, 0x78, 0xae, 0xbd, 0x03, 0x50, 0x93, 0x1f, 0x18, 0xb2, 0x6b, 0x76, 0xe4, 0xc5, 0xf3, + 0x99, 0x1c, 0x4d, 0x6a, 0x18, 0x63, 0xca, 0xaa, 0x28, 0xc4, 0x1a, 0x35, 0xfb, 0xf7, 0x2d, 0x98, + 0x4e, 0x7c, 0xd1, 0x75, 0x37, 0x8c, 0xd0, 0xbb, 0xa9, 0xaf, 0x9a, 0xeb, 0x71, 0xf1, 0xb9, 0x21, + 0xff, 0x26, 0xb5, 0xe7, 0x65, 0x89, 0xf6, 0x45, 0x57, 0xa1, 0xdf, 0x8d, 0x48, 0x53, 0x7e, 0xcc, + 0x13, 0x1d, 0x3f, 0x86, 0xf7, 0x2a, 0x9e, 0x91, 0x32, 0xad, 0x89, 0x39, 0x01, 0xfb, 0x8f, 0x8a, + 0x30, 0xcc, 0xf7, 0xf7, 0xaa, 0xd3, 0x3a, 0x82, 0xb9, 0x78, 0x0e, 0x86, 0xdd, 0x66, 0xb3, 0x1d, + 0x39, 0x77, 0xc4, 0xbd, 0x37, 0xc4, 0xcf, 0xa0, 0xb2, 0x2c, 0xc4, 0x31, 0x1c, 0x95, 0xa1, 0x8f, + 0x75, 0x85, 0x7f, 0xe5, 0xd3, 0xd9, 0x5f, 0x29, 0xfa, 0x3e, 0xb7, 0xe4, 0x44, 0x0e, 0x67, 0x39, + 0xd5, 0xbe, 0xa2, 0x45, 0x98, 0x91, 0x40, 0x0e, 0xc0, 0x1d, 0xd7, 0x73, 0x82, 0x5d, 0x5a, 0x36, + 0x53, 0x64, 0x04, 0x5f, 0xe8, 0x4c, 0x70, 0x41, 0xe1, 0x73, 0xb2, 0xea, 0xc3, 0x62, 0x00, 0xd6, + 0x88, 0xce, 0xbe, 0x0a, 0xc3, 0x0a, 0xf9, 0x30, 0x9c, 0xe3, 0xec, 0x27, 0x60, 0x22, 0xd1, 0x56, + 0xb7, 0xea, 0xa3, 0x3a, 0xe3, 0xf9, 0xbb, 0xec, 0xc8, 0x10, 0xbd, 0x5e, 0xf6, 0x76, 0xc4, 0xdd, + 0x74, 0x1f, 0x8e, 0x35, 0x32, 0x8e, 0x7c, 0x31, 0xaf, 0xbd, 0x5f, 0x11, 0xa7, 0xc5, 0x67, 0x1f, + 0xcb, 0x82, 0xe2, 0xcc, 0x36, 0x8c, 0x13, 0xb1, 0xd0, 0xe9, 0x44, 0xa4, 0xe7, 0xdd, 0x31, 0xd5, + 0xf9, 0x6b, 0x64, 0x57, 0x1d, 0xaa, 0xdf, 0xcf, 0xee, 0x9f, 0xe1, 0xa3, 0xcf, 0x8f, 0xcb, 0x11, + 0x41, 0xa0, 0x78, 0x8d, 0xec, 0xf2, 0xa9, 0xd0, 0xbf, 0xae, 0xd8, 0xf1, 0xeb, 0xbe, 0x69, 0xc1, + 0x98, 0xfa, 0xba, 0x23, 0x38, 0x17, 0x16, 0xcc, 0x73, 0xe1, 0x4c, 0xc7, 0x05, 0x9e, 0x73, 0x22, + 0x7c, 0xbb, 0x00, 0xa7, 0x14, 0x0e, 0x7d, 0x44, 0xf1, 0x3f, 0x62, 0x55, 0x5d, 0x84, 0x61, 0x4f, + 0x89, 0x13, 0x2d, 0x53, 0x8e, 0x17, 0x0b, 0x13, 0x63, 0x1c, 0x7a, 0xe5, 0x79, 0xf1, 0xa5, 0x3d, + 0xaa, 0xcb, 0xd9, 0xc5, 0xe5, 0xbe, 0x00, 0xc5, 0xb6, 0x5b, 0x17, 0x17, 0xcc, 0x47, 0xe5, 0x68, + 0xdf, 0x2c, 0x2f, 0x1d, 0xec, 0x95, 0x1e, 0xcf, 0x53, 0x39, 0xd1, 0x9b, 0x2d, 0x9c, 0xbb, 0x59, + 0x5e, 0xc2, 0xb4, 0x32, 0x9a, 0x87, 0x09, 0xa9, 0x55, 0xbb, 0x45, 0xf9, 0x52, 0xdf, 0x13, 0xf7, + 0x90, 0x12, 0x96, 0x63, 0x13, 0x8c, 0x93, 0xf8, 0x68, 0x09, 0x26, 0xb7, 0xdb, 0x77, 0x48, 0x83, + 0x44, 0xfc, 0x83, 0xaf, 0x11, 0x2e, 0x4a, 0x1e, 0x8e, 0x9f, 0xb0, 0xd7, 0x12, 0x70, 0x9c, 0xaa, + 0x61, 0xff, 0x33, 0xbb, 0x0f, 0xc4, 0xe8, 0x69, 0xfc, 0xcd, 0xf7, 0x73, 0x39, 0xf7, 0xb2, 0x2a, + 0xae, 0x91, 0xdd, 0x75, 0x9f, 0xf2, 0x21, 0xd9, 0xab, 0xc2, 0x58, 0xf3, 0x7d, 0x1d, 0xd7, 0xfc, + 0x6f, 0x16, 0xe0, 0xb8, 0x1a, 0x01, 0x83, 0x5b, 0xfe, 0x41, 0x1f, 0x83, 0x4b, 0x30, 0x52, 0x27, + 0x1b, 0x4e, 0xbb, 0x11, 0x29, 0xbd, 0x46, 0x3f, 0x57, 0xb5, 0x2d, 0xc5, 0xc5, 0x58, 0xc7, 0x39, + 0xc4, 0xb0, 0xfd, 0xfa, 0x18, 0xbb, 0x88, 0x23, 0x87, 0xae, 0x71, 0xb5, 0x6b, 0xac, 0xdc, 0x5d, + 0xf3, 0x04, 0xf4, 0xbb, 0x4d, 0xca, 0x98, 0x15, 0x4c, 0x7e, 0xab, 0x4c, 0x0b, 0x31, 0x87, 0xa1, + 0xa7, 0x60, 0xb0, 0xe6, 0x37, 0x9b, 0x8e, 0x57, 0x67, 0x57, 0xde, 0xf0, 0xc2, 0x08, 0xe5, 0xdd, + 0x16, 0x79, 0x11, 0x96, 0x30, 0xca, 0x7c, 0x3b, 0xc1, 0x26, 0x17, 0xf6, 0x08, 0xe6, 0x7b, 0x3e, + 0xd8, 0x0c, 0x31, 0x2b, 0xa5, 0x6f, 0xd5, 0xbb, 0x7e, 0xb0, 0xed, 0x7a, 0x9b, 0x4b, 0x6e, 0x20, + 0xb6, 0x84, 0xba, 0x0b, 0x6f, 0x2b, 0x08, 0xd6, 0xb0, 0xd0, 0x0a, 0xf4, 0xb7, 0xfc, 0x20, 0x0a, + 0x67, 0x06, 0xd8, 0x70, 0x3f, 0x9e, 0x73, 0x10, 0xf1, 0xaf, 0xad, 0xf8, 0x41, 0x14, 0x7f, 0x00, + 0xfd, 0x17, 0x62, 0x5e, 0x1d, 0x5d, 0x87, 0x41, 0xe2, 0xed, 0xac, 0x04, 0x7e, 0x73, 0x66, 0x3a, + 0x9f, 0xd2, 0x32, 0x47, 0xe1, 0xcb, 0x2c, 0xe6, 0x51, 0x45, 0x31, 0x96, 0x24, 0xd0, 0xc7, 0xa1, + 0x48, 0xbc, 0x9d, 0x99, 0x41, 0x46, 0x69, 0x36, 0x87, 0xd2, 0x2d, 0x27, 0x88, 0xcf, 0xfc, 0x65, + 0x6f, 0x07, 0xd3, 0x3a, 0xe8, 0xd3, 0x30, 0x2c, 0x0f, 0x8c, 0x50, 0x48, 0x51, 0x33, 0x17, 0xac, + 0x3c, 0x66, 0x30, 0x79, 0xaf, 0xed, 0x06, 0xa4, 0x49, 0xbc, 0x28, 0x8c, 0x4f, 0x48, 0x09, 0x0d, + 0x71, 0x4c, 0x0d, 0xd5, 0x60, 0x34, 0x20, 0xa1, 0x7b, 0x9f, 0x54, 0xfc, 0x86, 0x5b, 0xdb, 0x9d, + 0x39, 0xc9, 0xba, 0xf7, 0x4c, 0xc7, 0x21, 0xc3, 0x5a, 0x85, 0x58, 0xca, 0xaf, 0x97, 0x62, 0x83, + 0x28, 0x7a, 0x1b, 0xc6, 0x02, 0x12, 0x46, 0x4e, 0x10, 0x89, 0x56, 0x66, 0x94, 0x56, 0x6e, 0x0c, + 0xeb, 0x00, 0xfe, 0x9c, 0x88, 0x9b, 0x89, 0x21, 0xd8, 0xa4, 0x80, 0x3e, 0x2d, 0x55, 0x0e, 0xab, + 0x7e, 0xdb, 0x8b, 0xc2, 0x99, 0x61, 0xd6, 0xef, 0x4c, 0xdd, 0xf4, 0xad, 0x18, 0x2f, 0xa9, 0x93, + 0xe0, 0x95, 0xb1, 0x41, 0x0a, 0x7d, 0x16, 0xc6, 0xf8, 0x7f, 0xae, 0x52, 0x0d, 0x67, 0x8e, 0x33, + 0xda, 0xe7, 0xf2, 0x69, 0x73, 0xc4, 0x85, 0xe3, 0x82, 0xf8, 0x98, 0x5e, 0x1a, 0x62, 0x93, 0x1a, + 0xc2, 0x30, 0xd6, 0x70, 0x77, 0x88, 0x47, 0xc2, 0xb0, 0x12, 0xf8, 0x77, 0x88, 0x90, 0x10, 0x9f, + 0xca, 0x56, 0xc1, 0xfa, 0x77, 0x88, 0x78, 0x04, 0xea, 0x75, 0xb0, 0x49, 0x02, 0xdd, 0x84, 0x71, + 0xfa, 0x24, 0x77, 0x63, 0xa2, 0x23, 0xdd, 0x88, 0xb2, 0x87, 0x33, 0x36, 0x2a, 0xe1, 0x04, 0x11, + 0x74, 0x03, 0x46, 0xd9, 0x98, 0xb7, 0x5b, 0x9c, 0xe8, 0x89, 0x6e, 0x44, 0x99, 0x41, 0x41, 0x55, + 0xab, 0x82, 0x0d, 0x02, 0xe8, 0x2d, 0x18, 0x6e, 0xb8, 0x1b, 0xa4, 0xb6, 0x5b, 0x6b, 0x90, 0x99, + 0x51, 0x46, 0x2d, 0xf3, 0x30, 0xbc, 0x2e, 0x91, 0x38, 0x7f, 0xae, 0xfe, 0xe2, 0xb8, 0x3a, 0xba, + 0x05, 0x27, 0x22, 0x12, 0x34, 0x5d, 0xcf, 0xa1, 0x87, 0x98, 0x78, 0x12, 0x32, 0xcd, 0xf8, 0x18, + 0x5b, 0x5d, 0x67, 0xc5, 0x6c, 0x9c, 0x58, 0xcf, 0xc4, 0xc2, 0x39, 0xb5, 0xd1, 0x3d, 0x98, 0xc9, + 0x80, 0xf0, 0x75, 0x7b, 0x8c, 0x51, 0x7e, 0x43, 0x50, 0x9e, 0x59, 0xcf, 0xc1, 0x3b, 0xe8, 0x00, + 0xc3, 0xb9, 0xd4, 0xd1, 0x0d, 0x98, 0x60, 0x27, 0x67, 0xa5, 0xdd, 0x68, 0x88, 0x06, 0xc7, 0x59, + 0x83, 0x4f, 0x49, 0x3e, 0xa2, 0x6c, 0x82, 0x0f, 0xf6, 0x4a, 0x10, 0xff, 0xc3, 0xc9, 0xda, 0xe8, + 0x0e, 0x53, 0xc2, 0xb6, 0x03, 0x37, 0xda, 0xa5, 0xbb, 0x8a, 0xdc, 0x8b, 0x66, 0x26, 0x3a, 0x0a, + 0xa4, 0x74, 0x54, 0xa5, 0xa9, 0xd5, 0x0b, 0x71, 0x92, 0x20, 0xbd, 0x0a, 0xc2, 0xa8, 0xee, 0x7a, + 0x33, 0x93, 0xfc, 0x3d, 0x25, 0x4f, 0xd2, 0x2a, 0x2d, 0xc4, 0x1c, 0xc6, 0x14, 0xb0, 0xf4, 0xc7, + 0x0d, 0x7a, 0xe3, 0x4e, 0x31, 0xc4, 0x58, 0x01, 0x2b, 0x01, 0x38, 0xc6, 0xa1, 0x4c, 0x70, 0x14, + 0xed, 0xce, 0x20, 0x86, 0xaa, 0x0e, 0xc4, 0xf5, 0xf5, 0x4f, 0x63, 0x5a, 0x6e, 0xdf, 0x81, 0x71, + 0x75, 0x4c, 0xb0, 0x31, 0x41, 0x25, 0xe8, 0x67, 0x6c, 0x9f, 0x10, 0x9f, 0x0e, 0xd3, 0x2e, 0x30, + 0x96, 0x10, 0xf3, 0x72, 0xd6, 0x05, 0xf7, 0x3e, 0x59, 0xd8, 0x8d, 0x08, 0x97, 0x45, 0x14, 0xb5, + 0x2e, 0x48, 0x00, 0x8e, 0x71, 0xec, 0xff, 0x9f, 0xb3, 0xcf, 0xf1, 0x2d, 0xd1, 0xc3, 0xbd, 0xf8, + 0x3c, 0x0c, 0x31, 0xc3, 0x0f, 0x3f, 0xe0, 0xda, 0xd9, 0xfe, 0x98, 0x61, 0xbe, 0x2a, 0xca, 0xb1, + 0xc2, 0x40, 0xaf, 0xc3, 0x58, 0x4d, 0x6f, 0x40, 0x5c, 0xea, 0xea, 0x18, 0x31, 0x5a, 0xc7, 0x26, + 0x2e, 0xba, 0x0c, 0x43, 0xcc, 0xc6, 0xa9, 0xe6, 0x37, 0x04, 0xb7, 0x29, 0x39, 0x93, 0xa1, 0x8a, + 0x28, 0x3f, 0xd0, 0x7e, 0x63, 0x85, 0x8d, 0xce, 0xc3, 0x00, 0xed, 0x42, 0xb9, 0x22, 0xae, 0x53, + 0x25, 0x09, 0xbc, 0xca, 0x4a, 0xb1, 0x80, 0xda, 0xbf, 0x6f, 0x31, 0x5e, 0x2a, 0x7d, 0xe6, 0xa3, + 0xab, 0xec, 0xd2, 0x60, 0x37, 0x88, 0xa6, 0x85, 0x7f, 0x52, 0xbb, 0x09, 0x14, 0xec, 0x20, 0xf1, + 0x1f, 0x1b, 0x35, 0xd1, 0x3b, 0xc9, 0x9b, 0x81, 0x33, 0x14, 0x2f, 0xcb, 0x21, 0x48, 0xde, 0x0e, + 0x8f, 0xc5, 0x57, 0x1c, 0xed, 0x4f, 0xa7, 0x2b, 0xc2, 0xfe, 0xb7, 0x0b, 0xda, 0x2a, 0xa9, 0x46, + 0x4e, 0x44, 0x50, 0x05, 0x06, 0xef, 0x3a, 0x6e, 0xe4, 0x7a, 0x9b, 0x82, 0xef, 0xeb, 0x7c, 0xd1, + 0xb1, 0x4a, 0xb7, 0x79, 0x05, 0xce, 0xbd, 0x88, 0x3f, 0x58, 0x92, 0xa1, 0x14, 0x83, 0xb6, 0xe7, + 0x51, 0x8a, 0x85, 0x5e, 0x29, 0x62, 0x5e, 0x81, 0x53, 0x14, 0x7f, 0xb0, 0x24, 0x83, 0xde, 0x05, + 0x90, 0x27, 0x04, 0xa9, 0x0b, 0xd9, 0xe1, 0xf3, 0xdd, 0x89, 0xae, 0xab, 0x3a, 0x5c, 0x38, 0x19, + 0xff, 0xc7, 0x1a, 0x3d, 0x3b, 0xd2, 0xe6, 0x54, 0xef, 0x0c, 0xfa, 0x0c, 0xdd, 0xa2, 0x4e, 0x10, + 0x91, 0xfa, 0x7c, 0x24, 0x06, 0xe7, 0xd9, 0xde, 0x1e, 0x87, 0xeb, 0x6e, 0x93, 0xe8, 0xdb, 0x59, + 0x10, 0xc1, 0x31, 0x3d, 0xfb, 0xb7, 0x8b, 0x30, 0x93, 0xd7, 0x5d, 0xba, 0x69, 0xc8, 0x3d, 0x37, + 0x5a, 0xa4, 0x6c, 0xad, 0x65, 0x6e, 0x9a, 0x65, 0x51, 0x8e, 0x15, 0x06, 0x5d, 0xbd, 0xa1, 0xbb, + 0x29, 0xdf, 0xf6, 0xfd, 0xf1, 0xea, 0xad, 0xb2, 0x52, 0x2c, 0xa0, 0x14, 0x2f, 0x20, 0x4e, 0x28, + 0x8c, 0xef, 0xb4, 0x55, 0x8e, 0x59, 0x29, 0x16, 0x50, 0x5d, 0xca, 0xd8, 0xd7, 0x45, 0xca, 0x68, + 0x0c, 0x51, 0xff, 0xc3, 0x1d, 0x22, 0xf4, 0x39, 0x80, 0x0d, 0xd7, 0x73, 0xc3, 0x2d, 0x46, 0x7d, + 0xe0, 0xd0, 0xd4, 0x15, 0x53, 0xbc, 0xa2, 0xa8, 0x60, 0x8d, 0x22, 0x7a, 0x05, 0x46, 0xd4, 0x01, + 0x52, 0x5e, 0x62, 0xaa, 0x7f, 0xcd, 0x94, 0x2a, 0x3e, 0x4d, 0x97, 0xb0, 0x8e, 0x67, 0x7f, 0x21, + 0xb9, 0x5e, 0xc4, 0x0e, 0xd0, 0xc6, 0xd7, 0xea, 0x75, 0x7c, 0x0b, 0x9d, 0xc7, 0xd7, 0xfe, 0xd9, + 0x21, 0x98, 0x30, 0x1a, 0x6b, 0x87, 0x3d, 0x9c, 0xb9, 0x57, 0xe8, 0x05, 0xe4, 0x44, 0x44, 0xec, + 0x3f, 0xbb, 0xfb, 0x56, 0xd1, 0x2f, 0x29, 0xba, 0x03, 0x78, 0x7d, 0xf4, 0x39, 0x18, 0x6e, 0x38, + 0x21, 0x93, 0x58, 0x12, 0xb1, 0xef, 0x7a, 0x21, 0x16, 0x3f, 0x08, 0x9d, 0x30, 0xd2, 0x6e, 0x7d, + 0x4e, 0x3b, 0x26, 0x49, 0x6f, 0x4a, 0xca, 0x5f, 0x49, 0xeb, 0x4e, 0xd5, 0x09, 0xca, 0x84, 0xed, + 0x62, 0x0e, 0x43, 0x97, 0xd9, 0xd1, 0x4a, 0x57, 0xc5, 0x22, 0xe5, 0x46, 0xd9, 0x32, 0xeb, 0x37, + 0x98, 0x6c, 0x05, 0xc3, 0x06, 0x66, 0xfc, 0x26, 0x1b, 0xe8, 0xf0, 0x26, 0x7b, 0x06, 0x06, 0xd9, + 0x0f, 0xb5, 0x02, 0xd4, 0x6c, 0x94, 0x79, 0x31, 0x96, 0xf0, 0xe4, 0x82, 0x19, 0xea, 0x6d, 0xc1, + 0xd0, 0x57, 0x9f, 0x58, 0xd4, 0xcc, 0xec, 0x62, 0x88, 0x9f, 0x72, 0x62, 0xc9, 0x63, 0x09, 0x43, + 0xbf, 0x62, 0x01, 0x72, 0x1a, 0xf4, 0xb5, 0x4c, 0x8b, 0xd5, 0xe3, 0x06, 0x18, 0xab, 0xfd, 0x7a, + 0xd7, 0x61, 0x6f, 0x87, 0x73, 0xf3, 0xa9, 0xda, 0x5c, 0x52, 0xfa, 0x9a, 0xe8, 0x22, 0x4a, 0x23, + 0xe8, 0x97, 0xd1, 0x75, 0x37, 0x8c, 0xbe, 0xf4, 0x57, 0x89, 0xcb, 0x29, 0xa3, 0x4b, 0xe8, 0xa6, + 0xfe, 0xf8, 0x1a, 0x39, 0xe4, 0xe3, 0x6b, 0x2c, 0xf7, 0xe1, 0xf5, 0x2f, 0x12, 0x0f, 0x98, 0x51, + 0xf6, 0xe5, 0x4f, 0x75, 0x79, 0xc0, 0x08, 0x71, 0x7a, 0x2f, 0xcf, 0x98, 0x8a, 0xd0, 0x03, 0x8f, + 0xb1, 0x2e, 0x77, 0x7e, 0x04, 0xdf, 0x0c, 0x49, 0xb0, 0x70, 0x4a, 0xaa, 0x89, 0x0f, 0x74, 0xde, + 0x23, 0xd6, 0x1b, 0xcf, 0xb6, 0xe1, 0x64, 0xce, 0xa0, 0x67, 0x88, 0x8c, 0x97, 0x74, 0x91, 0x71, + 0x17, 0x41, 0xe3, 0x9c, 0x1c, 0x96, 0xb9, 0xb7, 0xdb, 0x8e, 0x17, 0xb9, 0xd1, 0xae, 0x2e, 0x62, + 0xf6, 0xc0, 0xec, 0x0d, 0xfa, 0x2c, 0xf4, 0x37, 0x5c, 0xaf, 0x7d, 0x4f, 0x5c, 0x53, 0xe7, 0xb3, + 0x5f, 0x10, 0x5e, 0xfb, 0x9e, 0xf9, 0x7d, 0x25, 0xba, 0x1b, 0x58, 0xf9, 0xc1, 0x5e, 0x09, 0xa5, + 0x11, 0x30, 0xa7, 0x6a, 0x3f, 0x0b, 0xe3, 0x4b, 0x0e, 0x69, 0xfa, 0xde, 0xb2, 0x57, 0x6f, 0xf9, + 0xae, 0x17, 0xa1, 0x19, 0xe8, 0x63, 0xfc, 0x19, 0xbf, 0x9d, 0xfa, 0xe8, 0xe0, 0x63, 0x56, 0x62, + 0x6f, 0xc2, 0xf1, 0x25, 0xff, 0xae, 0x77, 0xd7, 0x09, 0xea, 0xf3, 0x95, 0xb2, 0x26, 0x72, 0x5b, + 0x93, 0x22, 0x1f, 0x2b, 0xff, 0x41, 0xad, 0xd5, 0xe4, 0xf3, 0xb8, 0xe2, 0x36, 0x48, 0x8e, 0x60, + 0xf4, 0xdf, 0x2b, 0x18, 0x2d, 0xc5, 0xf8, 0x4a, 0xad, 0x67, 0xe5, 0x5a, 0x04, 0xbc, 0x0d, 0x43, + 0x1b, 0x2e, 0x69, 0xd4, 0x31, 0xd9, 0x10, 0xb3, 0xf1, 0x74, 0xbe, 0xcd, 0xe0, 0x0a, 0xc5, 0x54, + 0xfa, 0x47, 0x26, 0x30, 0x5a, 0x11, 0x95, 0xb1, 0x22, 0x83, 0xb6, 0x61, 0x52, 0xce, 0x99, 0x84, + 0x8a, 0x23, 0xf3, 0x99, 0x4e, 0x7b, 0xc3, 0x24, 0xce, 0xec, 0xa7, 0x71, 0x82, 0x0c, 0x4e, 0x11, + 0x46, 0xa7, 0xa1, 0xaf, 0x49, 0x99, 0x83, 0x3e, 0x36, 0xfc, 0x4c, 0x42, 0xc4, 0x84, 0x5d, 0xac, + 0xd4, 0xfe, 0x79, 0x0b, 0x4e, 0xa6, 0x46, 0x46, 0x08, 0xfd, 0x1e, 0xf2, 0x2c, 0x24, 0x85, 0x70, + 0x85, 0xee, 0x42, 0x38, 0xfb, 0x3f, 0xb1, 0xe0, 0xd8, 0x72, 0xb3, 0x15, 0xed, 0x2e, 0xb9, 0xa6, + 0xfa, 0xfe, 0x55, 0x18, 0x68, 0x92, 0xba, 0xdb, 0x6e, 0x8a, 0x99, 0x2b, 0xc9, 0x0b, 0x74, 0x95, + 0x95, 0xd2, 0x4d, 0x58, 0x8d, 0xfc, 0xc0, 0xd9, 0x24, 0xbc, 0x00, 0x0b, 0x74, 0xc6, 0x86, 0xb8, + 0xf7, 0xc9, 0x75, 0xb7, 0xe9, 0x46, 0x0f, 0xb6, 0xbb, 0x84, 0xe6, 0x5d, 0x12, 0xc1, 0x31, 0x3d, + 0xfb, 0xbb, 0x16, 0x4c, 0xc8, 0x75, 0x3f, 0x5f, 0xaf, 0x07, 0x24, 0x0c, 0xd1, 0x2c, 0x14, 0xdc, + 0x96, 0xe8, 0x25, 0x88, 0x5e, 0x16, 0xca, 0x15, 0x5c, 0x70, 0x5b, 0xf2, 0xc5, 0xc3, 0xee, 0xe8, + 0xa2, 0x69, 0x84, 0x70, 0x55, 0x94, 0x63, 0x85, 0x81, 0x2e, 0xc0, 0x90, 0xe7, 0xd7, 0xf9, 0xa3, + 0x41, 0xa8, 0xa1, 0x29, 0xe6, 0x9a, 0x28, 0xc3, 0x0a, 0x8a, 0x2a, 0x30, 0xcc, 0x4d, 0x54, 0xe3, + 0x45, 0xdb, 0x93, 0xa1, 0x2b, 0xfb, 0xb2, 0x75, 0x59, 0x13, 0xc7, 0x44, 0xec, 0x3f, 0xb4, 0x60, + 0x54, 0x7e, 0x59, 0x8f, 0xcf, 0x39, 0xba, 0xb5, 0xe2, 0xa7, 0x5c, 0xbc, 0xb5, 0xe8, 0x73, 0x8c, + 0x41, 0x8c, 0x57, 0x58, 0xf1, 0x50, 0xaf, 0xb0, 0x4b, 0x30, 0xe2, 0xb4, 0x5a, 0x15, 0xf3, 0x09, + 0xc7, 0x96, 0xd2, 0x7c, 0x5c, 0x8c, 0x75, 0x1c, 0xfb, 0xe7, 0x0a, 0x30, 0x2e, 0xbf, 0xa0, 0xda, + 0xbe, 0x13, 0x92, 0x08, 0xad, 0xc3, 0xb0, 0xc3, 0x67, 0x89, 0xc8, 0x45, 0xfe, 0x44, 0xb6, 0x68, + 0xd1, 0x98, 0xd2, 0x98, 0x17, 0x9d, 0x97, 0xb5, 0x71, 0x4c, 0x08, 0x35, 0x60, 0xca, 0xf3, 0x23, + 0xc6, 0x97, 0x28, 0x78, 0x27, 0x6d, 0x6f, 0x92, 0xfa, 0x29, 0x41, 0x7d, 0x6a, 0x2d, 0x49, 0x05, + 0xa7, 0x09, 0xa3, 0x65, 0x29, 0xae, 0x2d, 0xe6, 0xcb, 0xd9, 0xf4, 0x89, 0xcb, 0x96, 0xd6, 0xda, + 0xbf, 0x67, 0xc1, 0xb0, 0x44, 0x3b, 0x0a, 0xc5, 0xfe, 0x2a, 0x0c, 0x86, 0x6c, 0x12, 0xe4, 0xd0, + 0xd8, 0x9d, 0x3a, 0xce, 0xe7, 0x2b, 0x66, 0xb7, 0xf8, 0xff, 0x10, 0x4b, 0x1a, 0x4c, 0x5b, 0xa7, + 0xba, 0xff, 0x01, 0xd1, 0xd6, 0xa9, 0xfe, 0xe4, 0x5c, 0x4a, 0x7f, 0xc3, 0xfa, 0xac, 0x89, 0xbf, + 0xe9, 0xab, 0xa0, 0x15, 0x90, 0x0d, 0xf7, 0x5e, 0xf2, 0x55, 0x50, 0x61, 0xa5, 0x58, 0x40, 0xd1, + 0xbb, 0x30, 0x5a, 0x93, 0x6a, 0x9a, 0x78, 0x87, 0x9f, 0xef, 0xa8, 0x32, 0x54, 0xda, 0x65, 0x2e, + 0x66, 0x5c, 0xd4, 0xea, 0x63, 0x83, 0x9a, 0x69, 0x82, 0x55, 0xec, 0x66, 0x82, 0x15, 0xd3, 0xcd, + 0x37, 0x48, 0xfa, 0x05, 0x0b, 0x06, 0xb8, 0x78, 0xbe, 0x37, 0xed, 0x88, 0xa6, 0x6c, 0x8f, 0xc7, + 0xee, 0x16, 0x2d, 0x14, 0x9c, 0x0d, 0x5a, 0x85, 0x61, 0xf6, 0x83, 0xa9, 0x17, 0x8a, 0xf9, 0x0e, + 0x5b, 0xbc, 0x55, 0xbd, 0x83, 0xb7, 0x64, 0x35, 0x1c, 0x53, 0xb0, 0x7f, 0xb6, 0x48, 0x4f, 0xb7, + 0x18, 0xd5, 0xb8, 0xf4, 0xad, 0x47, 0x77, 0xe9, 0x17, 0x1e, 0xd5, 0xa5, 0xbf, 0x09, 0x13, 0x35, + 0x4d, 0x35, 0x1f, 0xcf, 0xe4, 0x85, 0x8e, 0x8b, 0x44, 0xd3, 0xe2, 0x73, 0x01, 0xe6, 0xa2, 0x49, + 0x04, 0x27, 0xa9, 0xa2, 0xcf, 0xc0, 0x28, 0x9f, 0x67, 0xd1, 0x0a, 0xb7, 0x62, 0x7b, 0x2a, 0x7f, + 0xbd, 0xe8, 0x4d, 0x70, 0x81, 0xb7, 0x56, 0x1d, 0x1b, 0xc4, 0xec, 0x7f, 0xb0, 0x00, 0x2d, 0xb7, + 0xb6, 0x48, 0x93, 0x04, 0x4e, 0x23, 0xd6, 0xb0, 0x7d, 0xd5, 0x82, 0x19, 0x92, 0x2a, 0x5e, 0xf4, + 0x9b, 0x4d, 0xf1, 0x9e, 0xce, 0x11, 0xf9, 0x2c, 0xe7, 0xd4, 0x51, 0x2e, 0x64, 0x33, 0x79, 0x18, + 0x38, 0xb7, 0x3d, 0xb4, 0x0a, 0xd3, 0xfc, 0x96, 0x54, 0x00, 0xcd, 0xd0, 0xed, 0x31, 0x41, 0x78, + 0x7a, 0x3d, 0x8d, 0x82, 0xb3, 0xea, 0xd9, 0xbf, 0x37, 0x06, 0xb9, 0xbd, 0xf8, 0x50, 0xb5, 0xf8, + 0xa1, 0x6a, 0xf1, 0x43, 0xd5, 0xe2, 0x87, 0xaa, 0xc5, 0x0f, 0x55, 0x8b, 0x1f, 0xaa, 0x16, 0x3f, + 0xa0, 0xaa, 0xc5, 0x7f, 0xc7, 0x82, 0xe3, 0xea, 0xfa, 0x32, 0x1e, 0xec, 0x5f, 0x84, 0x69, 0xbe, + 0xdd, 0x16, 0x1b, 0x8e, 0xdb, 0x5c, 0x27, 0xcd, 0x56, 0xc3, 0x89, 0xa4, 0x01, 0xd1, 0xa5, 0xcc, + 0x95, 0x9b, 0xf0, 0x52, 0x30, 0x2a, 0x72, 0x77, 0xaf, 0x0c, 0x00, 0xce, 0x6a, 0xc6, 0xfe, 0xed, + 0x21, 0xe8, 0x5f, 0xde, 0x21, 0x5e, 0x74, 0x04, 0x4f, 0x9b, 0x1a, 0x8c, 0xbb, 0xde, 0x8e, 0xdf, + 0xd8, 0x21, 0x75, 0x0e, 0x3f, 0xcc, 0x0b, 0xfc, 0x84, 0x20, 0x3d, 0x5e, 0x36, 0x48, 0xe0, 0x04, + 0xc9, 0x47, 0xa1, 0xa0, 0xb9, 0x02, 0x03, 0xfc, 0xf2, 0x11, 0xda, 0x99, 0xcc, 0x33, 0x9b, 0x0d, + 0xa2, 0xb8, 0x52, 0x63, 0xe5, 0x11, 0xbf, 0xdc, 0x44, 0x75, 0xf4, 0x05, 0x18, 0xdf, 0x70, 0x83, + 0x30, 0x5a, 0x77, 0x9b, 0xf4, 0x6a, 0x68, 0xb6, 0x1e, 0x40, 0x21, 0xa3, 0xc6, 0x61, 0xc5, 0xa0, + 0x84, 0x13, 0x94, 0xd1, 0x26, 0x8c, 0x35, 0x1c, 0xbd, 0xa9, 0xc1, 0x43, 0x37, 0xa5, 0x6e, 0x87, + 0xeb, 0x3a, 0x21, 0x6c, 0xd2, 0xa5, 0xdb, 0xa9, 0xc6, 0x74, 0x0a, 0x43, 0x4c, 0x9c, 0xa1, 0xb6, + 0x13, 0x57, 0x26, 0x70, 0x18, 0x65, 0xd0, 0x98, 0xad, 0xff, 0xb0, 0xc9, 0xa0, 0x69, 0x16, 0xfd, + 0x9f, 0x87, 0x61, 0x42, 0x87, 0x90, 0x12, 0x16, 0x17, 0xcc, 0xc5, 0xde, 0xfa, 0xba, 0xea, 0xd6, + 0x02, 0xdf, 0x54, 0x85, 0x2d, 0x4b, 0x4a, 0x38, 0x26, 0x8a, 0x16, 0x61, 0x20, 0x24, 0x81, 0xab, + 0xc4, 0xed, 0x1d, 0xa6, 0x91, 0xa1, 0x71, 0x7f, 0x42, 0xfe, 0x1b, 0x8b, 0xaa, 0x74, 0x79, 0x39, + 0x4c, 0x14, 0xcb, 0x2e, 0x03, 0x6d, 0x79, 0xcd, 0xb3, 0x52, 0x2c, 0xa0, 0xe8, 0x2d, 0x18, 0x0c, + 0x48, 0x83, 0xe9, 0x5a, 0xc7, 0x7a, 0x5f, 0xe4, 0x5c, 0x75, 0xcb, 0xeb, 0x61, 0x49, 0x00, 0x5d, + 0x03, 0x14, 0x10, 0xca, 0xe0, 0xb9, 0xde, 0xa6, 0xb2, 0x80, 0x17, 0x07, 0xad, 0x62, 0xa4, 0x71, + 0x8c, 0x21, 0x5d, 0x49, 0x71, 0x46, 0x35, 0x74, 0x05, 0xa6, 0x54, 0x69, 0xd9, 0x0b, 0x23, 0x87, + 0x1e, 0x70, 0x13, 0x8c, 0x96, 0x92, 0xaf, 0xe0, 0x24, 0x02, 0x4e, 0xd7, 0xb1, 0x7f, 0xcd, 0x02, + 0x3e, 0xce, 0x47, 0x20, 0x55, 0x78, 0xd3, 0x94, 0x2a, 0x9c, 0xca, 0x9d, 0xb9, 0x1c, 0x89, 0xc2, + 0xaf, 0x59, 0x30, 0xa2, 0xcd, 0x6c, 0xbc, 0x66, 0xad, 0x0e, 0x6b, 0xb6, 0x0d, 0x93, 0x74, 0xa5, + 0xdf, 0xb8, 0x13, 0x92, 0x60, 0x87, 0xd4, 0xd9, 0xc2, 0x2c, 0x3c, 0xd8, 0xc2, 0x54, 0xd6, 0xb6, + 0xd7, 0x13, 0x04, 0x71, 0xaa, 0x09, 0xfb, 0xf3, 0xb2, 0xab, 0xca, 0x38, 0xb9, 0xa6, 0xe6, 0x3c, + 0x61, 0x9c, 0xac, 0x66, 0x15, 0xc7, 0x38, 0x74, 0xab, 0x6d, 0xf9, 0x61, 0x94, 0x34, 0x4e, 0xbe, + 0xea, 0x87, 0x11, 0x66, 0x10, 0xfb, 0x25, 0x80, 0xe5, 0x7b, 0xa4, 0xc6, 0x57, 0xac, 0xfe, 0xe8, + 0xb1, 0xf2, 0x1f, 0x3d, 0xf6, 0x9f, 0x5b, 0x30, 0xbe, 0xb2, 0x68, 0xdc, 0x5c, 0x73, 0x00, 0xfc, + 0xa5, 0x76, 0xfb, 0xf6, 0x9a, 0xb4, 0x90, 0xe1, 0x46, 0x02, 0xaa, 0x14, 0x6b, 0x18, 0xe8, 0x14, + 0x14, 0x1b, 0x6d, 0x4f, 0x88, 0x3d, 0x07, 0xe9, 0xf5, 0x78, 0xbd, 0xed, 0x61, 0x5a, 0xa6, 0xb9, + 0x91, 0x15, 0x7b, 0x76, 0x23, 0xeb, 0x1a, 0xcd, 0x06, 0x95, 0xa0, 0xff, 0xee, 0x5d, 0xb7, 0xce, + 0x9d, 0xf4, 0x85, 0xf5, 0xce, 0xed, 0xdb, 0xe5, 0xa5, 0x10, 0xf3, 0x72, 0xfb, 0x6b, 0x45, 0x98, + 0x5d, 0x69, 0x90, 0x7b, 0xef, 0x33, 0x50, 0x41, 0xaf, 0x4e, 0x70, 0x87, 0x13, 0x20, 0x1d, 0xd6, + 0xd1, 0xb1, 0xfb, 0x78, 0x6c, 0xc0, 0x20, 0xb7, 0xcd, 0x95, 0x61, 0x0b, 0x32, 0x35, 0xa2, 0xf9, + 0x03, 0x32, 0xc7, 0x6d, 0x7c, 0x85, 0x46, 0x54, 0x5d, 0x98, 0xa2, 0x14, 0x4b, 0xe2, 0xb3, 0xaf, + 0xc1, 0xa8, 0x8e, 0x79, 0x28, 0x97, 0xe3, 0x1f, 0x2b, 0xc2, 0x24, 0xed, 0xc1, 0x23, 0x9d, 0x88, + 0x9b, 0xe9, 0x89, 0x78, 0xd8, 0x6e, 0xa7, 0xdd, 0x67, 0xe3, 0xdd, 0xe4, 0x6c, 0x5c, 0xca, 0x9b, + 0x8d, 0xa3, 0x9e, 0x83, 0x1f, 0xb7, 0x60, 0x7a, 0xa5, 0xe1, 0xd7, 0xb6, 0x13, 0xae, 0xa1, 0xaf, + 0xc0, 0x08, 0x3d, 0x8e, 0x43, 0x23, 0x4a, 0x8a, 0x11, 0x37, 0x47, 0x80, 0xb0, 0x8e, 0xa7, 0x55, + 0xbb, 0x79, 0xb3, 0xbc, 0x94, 0x15, 0x6e, 0x47, 0x80, 0xb0, 0x8e, 0x67, 0xff, 0xa9, 0x05, 0x67, + 0xae, 0x2c, 0x2e, 0xc7, 0x4b, 0x31, 0x15, 0xf1, 0xe7, 0x3c, 0x0c, 0xb4, 0xea, 0x5a, 0x57, 0x62, + 0xb1, 0xf0, 0x12, 0xeb, 0x85, 0x80, 0x7e, 0x50, 0x82, 0x6b, 0xdd, 0x04, 0xb8, 0x82, 0x2b, 0x8b, + 0xe2, 0xdc, 0x95, 0x5a, 0x20, 0x2b, 0x57, 0x0b, 0xf4, 0x14, 0x0c, 0xd2, 0x7b, 0xc1, 0xad, 0xc9, + 0x7e, 0x73, 0x9b, 0x07, 0x5e, 0x84, 0x25, 0xcc, 0xfe, 0x55, 0x0b, 0xa6, 0xaf, 0xb8, 0x11, 0xbd, + 0xb4, 0x93, 0x21, 0x6d, 0xe8, 0xad, 0x1d, 0xba, 0x91, 0x1f, 0xec, 0x26, 0x43, 0xda, 0x60, 0x05, + 0xc1, 0x1a, 0x16, 0xff, 0xa0, 0x1d, 0x97, 0x39, 0x9b, 0x14, 0x4c, 0xbd, 0x1b, 0x16, 0xe5, 0x58, + 0x61, 0xd0, 0xf1, 0xaa, 0xbb, 0x01, 0x13, 0x59, 0xee, 0x8a, 0x83, 0x5b, 0x8d, 0xd7, 0x92, 0x04, + 0xe0, 0x18, 0xc7, 0xfe, 0x3b, 0x0b, 0x4a, 0x57, 0xb8, 0xcb, 0xec, 0x46, 0x98, 0x73, 0xe8, 0xbe, + 0x04, 0xc3, 0x44, 0x2a, 0x08, 0x44, 0xaf, 0x15, 0x23, 0xaa, 0x34, 0x07, 0x3c, 0xb2, 0x8e, 0xc2, + 0xeb, 0xc1, 0x7f, 0xfd, 0x70, 0x0e, 0xc8, 0x2b, 0x80, 0x88, 0xde, 0x96, 0x1e, 0x6a, 0x88, 0xc5, + 0x2c, 0x59, 0x4e, 0x41, 0x71, 0x46, 0x0d, 0xfb, 0xe7, 0x2d, 0x38, 0xae, 0x3e, 0xf8, 0x03, 0xf7, + 0x99, 0xf6, 0xb7, 0x0a, 0x30, 0x76, 0x75, 0x7d, 0xbd, 0x72, 0x85, 0x44, 0xda, 0xaa, 0xec, 0xac, + 0xf6, 0xc7, 0x9a, 0xf6, 0xb2, 0xd3, 0x1b, 0xb1, 0x1d, 0xb9, 0x8d, 0x39, 0x1e, 0x40, 0x6f, 0xae, + 0xec, 0x45, 0x37, 0x82, 0x6a, 0x14, 0xb8, 0xde, 0x66, 0xe6, 0x4a, 0x97, 0x3c, 0x4b, 0x31, 0x8f, + 0x67, 0x41, 0x2f, 0xc1, 0x00, 0x8b, 0xe0, 0x27, 0x27, 0xe1, 0x31, 0xf5, 0xc4, 0x62, 0xa5, 0x07, + 0x7b, 0xa5, 0xe1, 0x9b, 0xb8, 0xcc, 0xff, 0x60, 0x81, 0x8a, 0x6e, 0xc2, 0xc8, 0x56, 0x14, 0xb5, + 0xae, 0x12, 0xa7, 0x4e, 0x02, 0x79, 0xca, 0x9e, 0xcd, 0x3a, 0x65, 0xe9, 0x20, 0x70, 0xb4, 0xf8, + 0x60, 0x8a, 0xcb, 0x42, 0xac, 0xd3, 0xb1, 0xab, 0x00, 0x31, 0xec, 0x21, 0x29, 0x6e, 0xec, 0x75, + 0x18, 0xa6, 0x9f, 0x3b, 0xdf, 0x70, 0x9d, 0xce, 0xaa, 0xf1, 0xe7, 0x60, 0x58, 0x2a, 0xbe, 0x43, + 0x11, 0x5f, 0x83, 0xdd, 0x48, 0x52, 0x2f, 0x1e, 0xe2, 0x18, 0x6e, 0x3f, 0x09, 0xc2, 0xfc, 0xb6, + 0x13, 0x49, 0x7b, 0x03, 0x8e, 0x31, 0x3b, 0x62, 0x27, 0xda, 0x32, 0xd6, 0x68, 0xf7, 0xc5, 0xf0, + 0xbc, 0x78, 0xd7, 0xf1, 0x2f, 0x9b, 0xd1, 0xfc, 0xb7, 0x47, 0x25, 0xc5, 0xf8, 0x8d, 0x67, 0xff, + 0x6d, 0x1f, 0x3c, 0x56, 0xae, 0xe6, 0x07, 0x86, 0xba, 0x0c, 0xa3, 0x9c, 0x5d, 0xa4, 0x4b, 0xc3, + 0x69, 0x88, 0x76, 0x95, 0x04, 0x74, 0x5d, 0x83, 0x61, 0x03, 0x13, 0x9d, 0x81, 0xa2, 0xfb, 0x9e, + 0x97, 0xf4, 0x6e, 0x2c, 0xbf, 0xbd, 0x86, 0x69, 0x39, 0x05, 0x53, 0xce, 0x93, 0x1f, 0xe9, 0x0a, + 0xac, 0xb8, 0xcf, 0x37, 0x61, 0xdc, 0x0d, 0x6b, 0xa1, 0x5b, 0xf6, 0xe8, 0x3e, 0xd5, 0x76, 0xba, + 0x92, 0x39, 0xd0, 0x4e, 0x2b, 0x28, 0x4e, 0x60, 0x6b, 0xf7, 0x4b, 0x7f, 0xcf, 0xdc, 0x6b, 0xd7, + 0xb0, 0x14, 0xf4, 0xf8, 0x6f, 0xb1, 0xaf, 0x0b, 0x99, 0x08, 0x5e, 0x1c, 0xff, 0xfc, 0x83, 0x43, + 0x2c, 0x61, 0xf4, 0x41, 0x57, 0xdb, 0x72, 0x5a, 0xf3, 0xed, 0x68, 0x6b, 0xc9, 0x0d, 0x6b, 0xfe, + 0x0e, 0x09, 0x76, 0xd9, 0x5b, 0x7c, 0x28, 0x7e, 0xd0, 0x29, 0xc0, 0xe2, 0xd5, 0xf9, 0x0a, 0xc5, + 0xc4, 0xe9, 0x3a, 0x68, 0x1e, 0x26, 0x64, 0x61, 0x95, 0x84, 0xec, 0x0a, 0x18, 0x61, 0x64, 0x94, + 0xbf, 0xa1, 0x28, 0x56, 0x44, 0x92, 0xf8, 0x26, 0x83, 0x0b, 0x0f, 0x83, 0xc1, 0x7d, 0x15, 0xc6, + 0x5c, 0xcf, 0x8d, 0x5c, 0x27, 0xf2, 0xb9, 0xfe, 0x88, 0x3f, 0xbb, 0x99, 0x80, 0xb9, 0xac, 0x03, + 0xb0, 0x89, 0x67, 0xff, 0x1f, 0x7d, 0x30, 0xc5, 0xa6, 0xed, 0xc3, 0x15, 0xf6, 0xc3, 0xb4, 0xc2, + 0x6e, 0xa6, 0x57, 0xd8, 0xc3, 0xe0, 0xdc, 0x1f, 0x78, 0x99, 0x7d, 0xd9, 0x82, 0x29, 0x26, 0xe3, + 0x36, 0x96, 0xd9, 0x45, 0x18, 0x0e, 0x0c, 0x57, 0xd0, 0x61, 0x5d, 0xa9, 0x25, 0xbd, 0x3a, 0x63, + 0x1c, 0xf4, 0x49, 0x80, 0x56, 0x2c, 0x43, 0x2f, 0x18, 0xf1, 0x3b, 0x21, 0x57, 0x7c, 0xae, 0xd5, + 0xb1, 0xbf, 0x00, 0xc3, 0xca, 0xd7, 0x53, 0x3a, 0x7b, 0x5b, 0x39, 0xce, 0xde, 0xdd, 0xd9, 0x08, + 0x69, 0x1b, 0x57, 0xcc, 0xb4, 0x8d, 0xfb, 0x86, 0x05, 0xb1, 0x86, 0x03, 0xbd, 0x0d, 0xc3, 0x2d, + 0x9f, 0x59, 0x23, 0x07, 0xd2, 0xc4, 0xff, 0xc9, 0x8e, 0x2a, 0x12, 0x1e, 0xa4, 0x2f, 0xe0, 0xd3, + 0x51, 0x91, 0x55, 0x71, 0x4c, 0x05, 0x5d, 0x83, 0xc1, 0x56, 0x40, 0xaa, 0x11, 0x8b, 0x20, 0xd5, + 0x3b, 0x41, 0xbe, 0x7c, 0x79, 0x45, 0x2c, 0x29, 0xd8, 0xbf, 0x51, 0x80, 0xc9, 0x24, 0x2a, 0x7a, + 0x03, 0xfa, 0xc8, 0x3d, 0x52, 0x13, 0xfd, 0xcd, 0xe4, 0x09, 0x62, 0x19, 0x09, 0x1f, 0x00, 0xfa, + 0x1f, 0xb3, 0x5a, 0xe8, 0x2a, 0x0c, 0x52, 0x86, 0xe0, 0x8a, 0x8a, 0x96, 0xf8, 0x78, 0x1e, 0x53, + 0xa1, 0x38, 0x2b, 0xde, 0x39, 0x51, 0x84, 0x65, 0x75, 0x66, 0x90, 0x56, 0x6b, 0x55, 0xe9, 0x5b, + 0x2b, 0xea, 0x24, 0x12, 0x58, 0x5f, 0xac, 0x70, 0x24, 0x41, 0x8d, 0x1b, 0xa4, 0xc9, 0x42, 0x1c, + 0x13, 0x41, 0x9f, 0x84, 0xfe, 0xb0, 0x41, 0x48, 0x4b, 0x58, 0x1c, 0x64, 0x4a, 0x39, 0xab, 0x14, + 0x41, 0x50, 0x62, 0x52, 0x11, 0x56, 0x80, 0x79, 0x45, 0xfb, 0x37, 0x2d, 0x00, 0x6e, 0xc1, 0xe7, + 0x78, 0x9b, 0xe4, 0x08, 0x14, 0x03, 0x4b, 0xd0, 0x17, 0xb6, 0x48, 0xad, 0x93, 0xa9, 0x7d, 0xdc, + 0x9f, 0x6a, 0x8b, 0xd4, 0xe2, 0x35, 0x4b, 0xff, 0x61, 0x56, 0xdb, 0xfe, 0x09, 0x80, 0xf1, 0x18, + 0xad, 0x1c, 0x91, 0x26, 0x7a, 0xc1, 0x08, 0x31, 0x73, 0x2a, 0x11, 0x62, 0x66, 0x98, 0x61, 0x6b, + 0x32, 0xe8, 0x2f, 0x40, 0xb1, 0xe9, 0xdc, 0x13, 0x42, 0xc6, 0xe7, 0x3a, 0x77, 0x83, 0xd2, 0x9f, + 0x5b, 0x75, 0xee, 0xf1, 0x77, 0xf8, 0x73, 0x72, 0x8f, 0xad, 0x3a, 0xf7, 0xba, 0x9a, 0x83, 0xd3, + 0x46, 0x58, 0x5b, 0xae, 0x27, 0x8c, 0xd3, 0x7a, 0x6a, 0xcb, 0xf5, 0x92, 0x6d, 0xb9, 0x5e, 0x0f, + 0x6d, 0xb9, 0x1e, 0xba, 0x0f, 0x83, 0xc2, 0x76, 0x54, 0xc4, 0xbe, 0xbb, 0xd8, 0x43, 0x7b, 0xc2, + 0xf4, 0x94, 0xb7, 0x79, 0x51, 0xca, 0x19, 0x44, 0x69, 0xd7, 0x76, 0x65, 0x83, 0xe8, 0xdf, 0xb5, + 0x60, 0x5c, 0xfc, 0xc6, 0xe4, 0xbd, 0x36, 0x09, 0x23, 0xc1, 0x87, 0x7f, 0xac, 0xf7, 0x3e, 0x88, + 0x8a, 0xbc, 0x2b, 0x1f, 0x93, 0x57, 0xa6, 0x09, 0xec, 0xda, 0xa3, 0x44, 0x2f, 0xd0, 0x6f, 0x58, + 0x70, 0xac, 0xe9, 0xdc, 0xe3, 0x2d, 0xf2, 0x32, 0xec, 0x44, 0xae, 0x2f, 0x6c, 0x30, 0xde, 0xe8, + 0x6d, 0xfa, 0x53, 0xd5, 0x79, 0x27, 0xa5, 0xc2, 0xf5, 0x58, 0x16, 0x4a, 0xd7, 0xae, 0x66, 0xf6, + 0x6b, 0x76, 0x03, 0x86, 0xe4, 0x7a, 0x7b, 0x94, 0x86, 0xf1, 0xac, 0x1d, 0xb1, 0xd6, 0x1e, 0x69, + 0x3b, 0x5f, 0x80, 0x51, 0x7d, 0x8d, 0x3d, 0xd2, 0xb6, 0xde, 0x83, 0xe9, 0x8c, 0xb5, 0xf4, 0x48, + 0x9b, 0xbc, 0x0b, 0xa7, 0x72, 0xd7, 0xc7, 0x23, 0x75, 0x6c, 0xf8, 0x96, 0xa5, 0x9f, 0x83, 0x47, + 0xa0, 0x9d, 0x59, 0x34, 0xb5, 0x33, 0x67, 0x3b, 0xef, 0x9c, 0x1c, 0x15, 0xcd, 0xbb, 0x7a, 0xa7, + 0xe9, 0xa9, 0x8e, 0xde, 0x82, 0x81, 0x06, 0x2d, 0x91, 0x16, 0xc8, 0x76, 0xf7, 0x1d, 0x19, 0xf3, + 0xc5, 0xac, 0x3c, 0xc4, 0x82, 0x82, 0xfd, 0x75, 0x0b, 0x32, 0x5c, 0x33, 0x28, 0x9f, 0xd4, 0x76, + 0xeb, 0x6c, 0x48, 0x8a, 0x31, 0x9f, 0xa4, 0x22, 0xb0, 0x9c, 0x81, 0xe2, 0xa6, 0x5b, 0x17, 0x6e, + 0xbd, 0x0a, 0x7c, 0x85, 0x82, 0x37, 0xdd, 0x3a, 0x5a, 0x01, 0x14, 0xb6, 0x5b, 0xad, 0x06, 0x33, + 0x5b, 0x72, 0x1a, 0x57, 0x02, 0xbf, 0xdd, 0xe2, 0xe6, 0xc6, 0x45, 0x2e, 0x24, 0xaa, 0xa6, 0xa0, + 0x38, 0xa3, 0x86, 0xfd, 0x3b, 0x16, 0xf4, 0x1d, 0xc1, 0x34, 0x61, 0x73, 0x9a, 0x5e, 0xc8, 0x25, + 0x2d, 0x52, 0x26, 0xcc, 0x61, 0xe7, 0xee, 0xf2, 0xbd, 0x88, 0x78, 0x21, 0x63, 0x38, 0x32, 0x67, + 0x6d, 0xcf, 0x82, 0xe9, 0xeb, 0xbe, 0x53, 0x5f, 0x70, 0x1a, 0x8e, 0x57, 0x23, 0x41, 0xd9, 0xdb, + 0x3c, 0x94, 0x6d, 0x7f, 0xa1, 0xab, 0x6d, 0xff, 0x65, 0x18, 0x70, 0x5b, 0x5a, 0xcc, 0xf5, 0x73, + 0x74, 0x76, 0xcb, 0x15, 0x11, 0x6e, 0x1d, 0x19, 0x8d, 0xb3, 0x52, 0x2c, 0xf0, 0xe9, 0xb2, 0xe4, + 0x46, 0x75, 0x7d, 0xf9, 0xcb, 0x92, 0xbe, 0x75, 0x92, 0xb1, 0xc4, 0x0c, 0xf3, 0xef, 0x2d, 0x30, + 0x9a, 0x10, 0xee, 0x83, 0x18, 0x06, 0x5d, 0xfe, 0xa5, 0x62, 0x6d, 0x3e, 0x9d, 0xfd, 0x06, 0x49, + 0x0d, 0x8c, 0xe6, 0x18, 0xc7, 0x0b, 0xb0, 0x24, 0x64, 0x5f, 0x86, 0xcc, 0xd8, 0x2f, 0xdd, 0xe5, + 0x4b, 0xf6, 0xa7, 0x61, 0x8a, 0xd5, 0x3c, 0xa4, 0xec, 0xc6, 0x4e, 0x48, 0xc5, 0x33, 0xc2, 0xe7, + 0xda, 0xff, 0xab, 0x05, 0x68, 0xd5, 0xaf, 0xbb, 0x1b, 0xbb, 0x82, 0x38, 0xff, 0xfe, 0xf7, 0xa0, + 0xc4, 0x1f, 0xc7, 0xc9, 0x10, 0xb3, 0x8b, 0x0d, 0x27, 0x0c, 0x35, 0x89, 0xfc, 0xd3, 0xa2, 0xdd, + 0xd2, 0x7a, 0x67, 0x74, 0xdc, 0x8d, 0x1e, 0x7a, 0x3b, 0x11, 0xf1, 0xef, 0xe3, 0xa9, 0x88, 0x7f, + 0x4f, 0x67, 0xda, 0xc5, 0xa4, 0x7b, 0x2f, 0x23, 0x01, 0xda, 0x5f, 0xb1, 0x60, 0x62, 0x2d, 0x11, + 0x32, 0xf5, 0x3c, 0x33, 0x12, 0xc8, 0xd0, 0x34, 0x55, 0x59, 0x29, 0x16, 0xd0, 0x87, 0x2e, 0x89, + 0xfd, 0x67, 0x0b, 0xe2, 0x58, 0x53, 0x47, 0xc0, 0x72, 0x2f, 0x1a, 0x2c, 0x77, 0xe6, 0xf3, 0x45, + 0x75, 0x27, 0x8f, 0xe3, 0x46, 0xd7, 0xd4, 0x9c, 0x74, 0x78, 0xb9, 0xc4, 0x64, 0xf8, 0x3e, 0x1b, + 0x37, 0x27, 0x4e, 0xcd, 0xc6, 0x77, 0x0a, 0x80, 0x14, 0x6e, 0xcf, 0x51, 0x22, 0xd3, 0x35, 0x1e, + 0x4e, 0x94, 0xc8, 0x1d, 0x40, 0xcc, 0xcc, 0x25, 0x70, 0xbc, 0x90, 0x93, 0x75, 0x85, 0xec, 0xf9, + 0x70, 0x36, 0x34, 0xb3, 0xd2, 0x6d, 0xf4, 0x7a, 0x8a, 0x1a, 0xce, 0x68, 0x41, 0x33, 0x5f, 0xea, + 0xef, 0xd5, 0x7c, 0x69, 0xa0, 0x8b, 0xff, 0xf3, 0x37, 0x2d, 0x18, 0x53, 0xc3, 0xf4, 0x01, 0x71, + 0x01, 0x51, 0xfd, 0xc9, 0xb9, 0x57, 0x2a, 0x5a, 0x97, 0x19, 0x33, 0xf0, 0x23, 0xcc, 0x8f, 0xdd, + 0x69, 0xb8, 0xf7, 0x89, 0x0a, 0x66, 0x5c, 0x12, 0x7e, 0xe9, 0xa2, 0xf4, 0x60, 0xaf, 0x34, 0xa6, + 0xfe, 0xf1, 0xf0, 0xa9, 0x71, 0x15, 0xfb, 0x97, 0xe8, 0x66, 0x37, 0x97, 0x22, 0x7a, 0x05, 0xfa, + 0x5b, 0x5b, 0x4e, 0x48, 0x12, 0xae, 0x72, 0xfd, 0x15, 0x5a, 0x78, 0xb0, 0x57, 0x1a, 0x57, 0x15, + 0x58, 0x09, 0xe6, 0xd8, 0xbd, 0xc7, 0xde, 0x4c, 0x2f, 0xce, 0xae, 0xb1, 0x37, 0xff, 0xc1, 0x82, + 0xbe, 0x35, 0x7a, 0x7b, 0x3d, 0xfa, 0x23, 0xe0, 0x4d, 0xe3, 0x08, 0x38, 0x9d, 0x97, 0xd6, 0x27, + 0x77, 0xf7, 0xaf, 0x24, 0x76, 0xff, 0xd9, 0x5c, 0x0a, 0x9d, 0x37, 0x7e, 0x13, 0x46, 0x58, 0xb2, + 0x20, 0xe1, 0x16, 0xf8, 0x92, 0xb1, 0xe1, 0x4b, 0x89, 0x0d, 0x3f, 0xa1, 0xa1, 0x6a, 0x3b, 0xfd, + 0x19, 0x18, 0x14, 0x7e, 0x66, 0xc9, 0x70, 0x00, 0x02, 0x17, 0x4b, 0xb8, 0xfd, 0x0b, 0x45, 0x30, + 0x92, 0x13, 0xa1, 0xdf, 0xb3, 0x60, 0x2e, 0xe0, 0xf6, 0xe7, 0xf5, 0xa5, 0x76, 0xe0, 0x7a, 0x9b, + 0xd5, 0xda, 0x16, 0xa9, 0xb7, 0x1b, 0xae, 0xb7, 0x59, 0xde, 0xf4, 0x7c, 0x55, 0xbc, 0x7c, 0x8f, + 0xd4, 0xda, 0x4c, 0x37, 0xdc, 0x25, 0x13, 0x92, 0xf2, 0xe3, 0x78, 0x71, 0x7f, 0xaf, 0x34, 0x87, + 0x0f, 0x45, 0x1b, 0x1f, 0xb2, 0x2f, 0xe8, 0x4f, 0x2d, 0xb8, 0xc8, 0x93, 0xe4, 0xf4, 0xde, 0xff, + 0x0e, 0x12, 0x8e, 0x8a, 0x24, 0x15, 0x13, 0x59, 0x27, 0x41, 0x73, 0xe1, 0x55, 0x31, 0xa0, 0x17, + 0x2b, 0x87, 0x6b, 0x0b, 0x1f, 0xb6, 0x73, 0xf6, 0x7f, 0x55, 0x84, 0x31, 0x11, 0xa3, 0x51, 0xdc, + 0x01, 0xaf, 0x18, 0x4b, 0xe2, 0xf1, 0xc4, 0x92, 0x98, 0x32, 0x90, 0x1f, 0xce, 0xf1, 0x1f, 0xc2, + 0x14, 0x3d, 0x9c, 0xaf, 0x12, 0x27, 0x88, 0xee, 0x10, 0x87, 0x5b, 0x25, 0x16, 0x0f, 0x7d, 0xfa, + 0x2b, 0xf1, 0xf8, 0xf5, 0x24, 0x31, 0x9c, 0xa6, 0xff, 0xc3, 0x74, 0xe7, 0x78, 0x30, 0x99, 0x0a, + 0xb3, 0xf9, 0x0e, 0x0c, 0x2b, 0x27, 0x29, 0x71, 0xe8, 0x74, 0x8e, 0x56, 0x9b, 0xa4, 0xc0, 0x85, + 0x9e, 0xb1, 0x83, 0x5e, 0x4c, 0xce, 0xfe, 0xcf, 0x0a, 0x46, 0x83, 0x7c, 0x12, 0xd7, 0x60, 0xc8, + 0x09, 0x59, 0x04, 0xed, 0x7a, 0x27, 0xb9, 0x74, 0xaa, 0x19, 0xe6, 0xa8, 0x36, 0x2f, 0x6a, 0x62, + 0x45, 0x03, 0x5d, 0xe5, 0xb6, 0x9f, 0x3b, 0xa4, 0x93, 0x50, 0x3a, 0x45, 0x0d, 0xa4, 0x75, 0xe8, + 0x0e, 0xc1, 0xa2, 0x3e, 0xfa, 0x2c, 0x37, 0xce, 0xbd, 0xe6, 0xf9, 0x77, 0xbd, 0x2b, 0xbe, 0x2f, + 0xe3, 0xf1, 0xf4, 0x46, 0x70, 0x4a, 0x9a, 0xe4, 0xaa, 0xea, 0xd8, 0xa4, 0xd6, 0x5b, 0xdc, 0xea, + 0x2f, 0x02, 0x4b, 0x0a, 0x62, 0xc6, 0x24, 0x08, 0x11, 0x81, 0x09, 0x11, 0x00, 0x54, 0x96, 0x89, + 0xb1, 0xcb, 0x7c, 0x7e, 0x9b, 0xb5, 0x63, 0x3d, 0xce, 0x35, 0x93, 0x04, 0x4e, 0xd2, 0xb4, 0xb7, + 0xf8, 0x21, 0xbc, 0x42, 0x9c, 0xa8, 0x1d, 0x90, 0x10, 0x7d, 0x0a, 0x66, 0xd2, 0x2f, 0x63, 0xa1, + 0x0e, 0xb1, 0x18, 0xf7, 0x7c, 0x7a, 0x7f, 0xaf, 0x34, 0x53, 0xcd, 0xc1, 0xc1, 0xb9, 0xb5, 0xed, + 0x5f, 0xb1, 0x80, 0x79, 0x82, 0x1f, 0x01, 0xe7, 0xf3, 0x09, 0x93, 0xf3, 0x99, 0xc9, 0x9b, 0xce, + 0x1c, 0xa6, 0xe7, 0x65, 0xbe, 0x86, 0x2b, 0x81, 0x7f, 0x6f, 0x57, 0xd8, 0x6e, 0x75, 0x7f, 0xc6, + 0xd9, 0x5f, 0xb3, 0x80, 0x65, 0xd0, 0xc1, 0xfc, 0xd5, 0x2e, 0x15, 0x1c, 0xdd, 0xcd, 0x12, 0x3e, + 0x05, 0x43, 0x1b, 0x62, 0xf8, 0x33, 0x84, 0x4e, 0x46, 0x87, 0x4d, 0xda, 0x72, 0xd2, 0x84, 0x47, + 0xa7, 0xf8, 0x87, 0x15, 0x35, 0xfb, 0x3f, 0xb5, 0x60, 0x36, 0xbf, 0x1a, 0xba, 0x09, 0x27, 0x03, + 0x52, 0x6b, 0x07, 0x21, 0xdd, 0x12, 0xe2, 0x01, 0x24, 0x9c, 0xa2, 0xf8, 0x54, 0x3f, 0xb6, 0xbf, + 0x57, 0x3a, 0x89, 0xb3, 0x51, 0x70, 0x5e, 0x5d, 0xf4, 0x1a, 0x8c, 0xb7, 0x43, 0xce, 0xf9, 0x31, + 0xa6, 0x2b, 0x14, 0x61, 0x9a, 0x99, 0xdf, 0xd0, 0x4d, 0x03, 0x82, 0x13, 0x98, 0xf6, 0xbf, 0xe4, + 0xcb, 0x51, 0x45, 0x6a, 0x6e, 0xc2, 0x94, 0xa7, 0xfd, 0xa7, 0x37, 0xa0, 0x7c, 0xea, 0x3f, 0xd9, + 0xed, 0xd6, 0x67, 0xd7, 0xa5, 0xe6, 0xab, 0x9e, 0x20, 0x83, 0xd3, 0x94, 0xed, 0x5f, 0xb4, 0xe0, + 0xa4, 0x8e, 0xa8, 0xb9, 0xc3, 0x75, 0xd3, 0xe5, 0x2d, 0xc1, 0x90, 0xdf, 0x22, 0x81, 0x13, 0xf9, + 0x81, 0xb8, 0xe6, 0x2e, 0xc8, 0x15, 0x7a, 0x43, 0x94, 0x1f, 0x88, 0xcc, 0x31, 0x92, 0xba, 0x2c, + 0xc7, 0xaa, 0x26, 0xb2, 0x61, 0x80, 0x09, 0x10, 0x43, 0xe1, 0xf8, 0xc8, 0x0e, 0x2d, 0x66, 0x9f, + 0x12, 0x62, 0x01, 0xb1, 0xff, 0xd6, 0xe2, 0xeb, 0x53, 0xef, 0x3a, 0x7a, 0x0f, 0x26, 0x9b, 0x4e, + 0x54, 0xdb, 0x5a, 0xbe, 0xd7, 0x0a, 0xb8, 0x8a, 0x56, 0x8e, 0xd3, 0x73, 0xdd, 0xc6, 0x49, 0xfb, + 0xc8, 0xd8, 0x40, 0x7a, 0x35, 0x41, 0x0c, 0xa7, 0xc8, 0xa3, 0x3b, 0x30, 0xc2, 0xca, 0x98, 0x4f, + 0x6f, 0xd8, 0x89, 0x97, 0xc9, 0x6b, 0x4d, 0x99, 0xf8, 0xac, 0xc6, 0x74, 0xb0, 0x4e, 0xd4, 0xfe, + 0x46, 0x91, 0x1f, 0x1a, 0xec, 0xed, 0xf1, 0x0c, 0x0c, 0xb6, 0xfc, 0xfa, 0x62, 0x79, 0x09, 0x8b, + 0x59, 0x50, 0xf7, 0x5e, 0x85, 0x17, 0x63, 0x09, 0x47, 0x17, 0x60, 0x48, 0xfc, 0x94, 0x2a, 0x75, + 0xb6, 0x47, 0x04, 0x5e, 0x88, 0x15, 0x14, 0xbd, 0x08, 0xd0, 0x0a, 0xfc, 0x1d, 0xb7, 0xce, 0xc2, + 0x20, 0x15, 0x4d, 0xeb, 0xbc, 0x8a, 0x82, 0x60, 0x0d, 0x0b, 0xbd, 0x0e, 0x63, 0x6d, 0x2f, 0xe4, + 0xfc, 0x93, 0x16, 0x6c, 0x5e, 0xd9, 0x8d, 0xdd, 0xd4, 0x81, 0xd8, 0xc4, 0x45, 0xf3, 0x30, 0x10, + 0x39, 0xcc, 0xda, 0xac, 0x3f, 0xdf, 0x88, 0x7e, 0x9d, 0x62, 0xe8, 0x69, 0xdd, 0x68, 0x05, 0x2c, + 0x2a, 0xa2, 0x77, 0xa4, 0x7b, 0x3d, 0xbf, 0x89, 0x84, 0xf7, 0x4a, 0x6f, 0xb7, 0x96, 0xe6, 0x5c, + 0x2f, 0xbc, 0x62, 0x0c, 0x5a, 0xe8, 0x35, 0x00, 0x72, 0x2f, 0x22, 0x81, 0xe7, 0x34, 0x94, 0x8d, + 0xa8, 0x62, 0x64, 0x96, 0xfc, 0x35, 0x3f, 0xba, 0x19, 0x92, 0x65, 0x85, 0x81, 0x35, 0x6c, 0xfb, + 0x27, 0x46, 0x00, 0xe2, 0x87, 0x06, 0xba, 0x0f, 0x43, 0x35, 0xa7, 0xe5, 0xd4, 0x78, 0xce, 0xd2, + 0x62, 0x9e, 0xd7, 0x73, 0x5c, 0x63, 0x6e, 0x51, 0xa0, 0x73, 0xe5, 0x8d, 0x8c, 0xd7, 0x3d, 0x24, + 0x8b, 0xbb, 0x2a, 0x6c, 0x54, 0x7b, 0xe8, 0xcb, 0x16, 0x8c, 0x88, 0x68, 0x4f, 0x6c, 0x86, 0x0a, + 0xf9, 0xfa, 0x36, 0xad, 0xfd, 0xf9, 0xb8, 0x06, 0xef, 0xc2, 0x4b, 0x72, 0x85, 0x6a, 0x90, 0xae, + 0xbd, 0xd0, 0x1b, 0x46, 0x1f, 0x95, 0x6f, 0xdb, 0xa2, 0x31, 0x94, 0xea, 0x6d, 0x3b, 0xcc, 0xae, + 0x1a, 0xfd, 0x59, 0x7b, 0xd3, 0x78, 0xd6, 0xf6, 0xe5, 0xfb, 0x0f, 0x1b, 0xfc, 0x76, 0xb7, 0x17, + 0x2d, 0xaa, 0xe8, 0xb1, 0x44, 0xfa, 0xf3, 0x9d, 0x5e, 0xb5, 0x87, 0x5d, 0x97, 0x38, 0x22, 0x5f, + 0x80, 0x89, 0xba, 0xc9, 0xb5, 0x88, 0x95, 0xf8, 0x74, 0x1e, 0xdd, 0x04, 0x93, 0x13, 0xf3, 0x29, + 0x09, 0x00, 0x4e, 0x12, 0x46, 0x15, 0x1e, 0x5a, 0xa6, 0xec, 0x6d, 0xf8, 0xc2, 0x83, 0xca, 0xce, + 0x9d, 0xcb, 0xdd, 0x30, 0x22, 0x4d, 0x8a, 0x19, 0x33, 0x09, 0x6b, 0xa2, 0x2e, 0x56, 0x54, 0xd0, + 0x5b, 0x30, 0xc0, 0xbc, 0x1e, 0xc3, 0x99, 0xa1, 0x7c, 0xb5, 0x86, 0x19, 0x86, 0x34, 0xde, 0x90, + 0xec, 0x6f, 0x88, 0x05, 0x05, 0x74, 0x55, 0xfa, 0x14, 0x87, 0x65, 0xef, 0x66, 0x48, 0x98, 0x4f, + 0xf1, 0xf0, 0xc2, 0x93, 0xb1, 0xbb, 0x30, 0x2f, 0xcf, 0x4c, 0xfe, 0x6a, 0xd4, 0xa4, 0x6c, 0x9f, + 0xf8, 0x2f, 0x73, 0xca, 0x8a, 0xa0, 0x69, 0x99, 0xdd, 0x33, 0xf3, 0xce, 0xc6, 0xc3, 0x79, 0xcb, + 0x24, 0x81, 0x93, 0x34, 0x29, 0x0b, 0xcd, 0x77, 0xbd, 0xf0, 0xc1, 0xea, 0x76, 0x76, 0x70, 0xc9, + 0x01, 0xbb, 0x8d, 0x78, 0x09, 0x16, 0xf5, 0x91, 0x0b, 0x13, 0x81, 0xc1, 0x5e, 0xc8, 0x58, 0x67, + 0xe7, 0x7b, 0x63, 0x62, 0xb4, 0x28, 0xfa, 0x26, 0x19, 0x9c, 0xa4, 0x8b, 0xde, 0xd2, 0x18, 0xa5, + 0xb1, 0xce, 0x2f, 0xff, 0x6e, 0xac, 0xd1, 0xec, 0x36, 0x8c, 0x19, 0x87, 0xcd, 0x23, 0x55, 0x41, + 0x7a, 0x30, 0x99, 0x3c, 0x59, 0x1e, 0xa9, 0xe6, 0xf1, 0xaf, 0xfb, 0x60, 0xdc, 0xdc, 0x09, 0xe8, + 0x22, 0x0c, 0x0b, 0x22, 0x2a, 0x9d, 0x94, 0xda, 0xdc, 0xab, 0x12, 0x80, 0x63, 0x1c, 0x96, 0x45, + 0x8c, 0x55, 0xd7, 0x7c, 0x05, 0xe2, 0x2c, 0x62, 0x0a, 0x82, 0x35, 0x2c, 0xfa, 0x80, 0xbd, 0xe3, + 0xfb, 0x91, 0xba, 0x47, 0xd5, 0x76, 0x59, 0x60, 0xa5, 0x58, 0x40, 0xe9, 0xfd, 0xb9, 0x4d, 0x02, + 0x8f, 0x34, 0xcc, 0x7c, 0x0a, 0xea, 0xfe, 0xbc, 0xa6, 0x03, 0xb1, 0x89, 0x4b, 0xb9, 0x00, 0x3f, + 0x64, 0xfb, 0x4f, 0x3c, 0x93, 0x63, 0xdf, 0x8b, 0x2a, 0x8f, 0x22, 0x21, 0xe1, 0xe8, 0xd3, 0x70, + 0x52, 0xc5, 0x2e, 0x14, 0xab, 0x4b, 0xb6, 0x38, 0x60, 0x48, 0xb5, 0x4e, 0x2e, 0x66, 0xa3, 0xe1, + 0xbc, 0xfa, 0xe8, 0x4d, 0x18, 0x17, 0x4f, 0x29, 0x49, 0x71, 0xd0, 0x34, 0x24, 0xbc, 0x66, 0x40, + 0x71, 0x02, 0x5b, 0x66, 0x84, 0x60, 0x6f, 0x0c, 0x49, 0x61, 0x28, 0x9d, 0x11, 0x42, 0x87, 0xe3, + 0x54, 0x0d, 0x34, 0x0f, 0x13, 0x9c, 0x75, 0x74, 0xbd, 0x4d, 0x3e, 0x27, 0xc2, 0xb3, 0x53, 0x6d, + 0xaa, 0x1b, 0x26, 0x18, 0x27, 0xf1, 0xd1, 0x65, 0x18, 0x75, 0x82, 0xda, 0x96, 0x1b, 0x91, 0x1a, + 0xdd, 0x19, 0xcc, 0x96, 0x4f, 0xb3, 0xc4, 0x9c, 0xd7, 0x60, 0xd8, 0xc0, 0xb4, 0xef, 0xc3, 0x74, + 0x46, 0x78, 0x19, 0xba, 0x70, 0x9c, 0x96, 0x2b, 0xbf, 0x29, 0xe1, 0xee, 0x30, 0x5f, 0x29, 0xcb, + 0xaf, 0xd1, 0xb0, 0xe8, 0xea, 0x64, 0x61, 0x68, 0xb4, 0xcc, 0xd7, 0x6a, 0x75, 0xae, 0x48, 0x00, + 0x8e, 0x71, 0xec, 0x7f, 0x2c, 0xc0, 0x44, 0x86, 0x82, 0x8e, 0x65, 0x5f, 0x4e, 0xbc, 0xb4, 0xe2, + 0x64, 0xcb, 0x66, 0x82, 0x91, 0xc2, 0x21, 0x12, 0x8c, 0x14, 0xbb, 0x25, 0x18, 0xe9, 0x7b, 0x3f, + 0x09, 0x46, 0xcc, 0x11, 0xeb, 0xef, 0x69, 0xc4, 0x32, 0x92, 0x92, 0x0c, 0x1c, 0x32, 0x29, 0x89, + 0x31, 0xe8, 0x83, 0x3d, 0x0c, 0xfa, 0xcf, 0x16, 0x60, 0x32, 0xa9, 0xdb, 0x3b, 0x02, 0xf9, 0xf8, + 0x5b, 0x86, 0x7c, 0xfc, 0x42, 0x2f, 0x9e, 0xf8, 0xb9, 0xb2, 0x72, 0x9c, 0x90, 0x95, 0x3f, 0xdb, + 0x13, 0xb5, 0xce, 0x72, 0xf3, 0xff, 0xb0, 0x00, 0xc7, 0x33, 0x55, 0x9e, 0x47, 0x30, 0x36, 0x37, + 0x8c, 0xb1, 0x79, 0xa1, 0xe7, 0x28, 0x05, 0xb9, 0x03, 0x74, 0x3b, 0x31, 0x40, 0x17, 0x7b, 0x27, + 0xd9, 0x79, 0x94, 0xbe, 0x5b, 0x84, 0xb3, 0x99, 0xf5, 0x62, 0xf1, 0xf2, 0x8a, 0x21, 0x5e, 0x7e, + 0x31, 0x21, 0x5e, 0xb6, 0x3b, 0xd7, 0x7e, 0x38, 0xf2, 0x66, 0xe1, 0xad, 0xcf, 0x62, 0x8e, 0x3c, + 0xa0, 0xac, 0xd9, 0xf0, 0xd6, 0x57, 0x84, 0xb0, 0x49, 0xf7, 0x87, 0x49, 0xc6, 0xfc, 0x27, 0x16, + 0x9c, 0xca, 0x9c, 0x9b, 0x23, 0x90, 0xf4, 0xad, 0x99, 0x92, 0xbe, 0x67, 0x7a, 0x5e, 0xad, 0x39, + 0xa2, 0xbf, 0xaf, 0x0c, 0xe4, 0x7c, 0x0b, 0x13, 0x40, 0xdc, 0x80, 0x11, 0xa7, 0x56, 0x23, 0x61, + 0xb8, 0xea, 0xd7, 0x55, 0x2e, 0x82, 0x17, 0xd8, 0xf3, 0x30, 0x2e, 0x3e, 0xd8, 0x2b, 0xcd, 0x26, + 0x49, 0xc4, 0x60, 0xac, 0x53, 0x40, 0x9f, 0x85, 0xa1, 0x50, 0xa6, 0x91, 0xec, 0x7b, 0xf0, 0x34, + 0x92, 0x8c, 0xc9, 0x55, 0x02, 0x16, 0x45, 0x12, 0xfd, 0x0b, 0x3d, 0xfa, 0x53, 0x07, 0xd1, 0x22, + 0xef, 0xe4, 0x03, 0xc4, 0x80, 0x7a, 0x11, 0x60, 0x47, 0xbd, 0x64, 0x92, 0xc2, 0x13, 0xed, 0x8d, + 0xa3, 0x61, 0xa1, 0x4f, 0xc2, 0x64, 0xc8, 0x03, 0x9f, 0xc6, 0x46, 0x2a, 0x7c, 0x2d, 0xb2, 0xd8, + 0x71, 0xd5, 0x04, 0x0c, 0xa7, 0xb0, 0xd1, 0x8a, 0x6c, 0x95, 0x99, 0x23, 0xf1, 0xe5, 0x79, 0x3e, + 0x6e, 0x51, 0x98, 0x24, 0x1d, 0x4b, 0x4e, 0x02, 0x1b, 0x7e, 0xad, 0x26, 0xfa, 0x2c, 0x00, 0x5d, + 0x44, 0x42, 0x88, 0x32, 0x98, 0x7f, 0x84, 0xd2, 0xb3, 0xa5, 0x9e, 0xe9, 0xc9, 0xc0, 0xdc, 0xec, + 0x97, 0x14, 0x11, 0xac, 0x11, 0x44, 0x0e, 0x8c, 0xc5, 0xff, 0xe2, 0x04, 0xe9, 0x17, 0x72, 0x5b, + 0x48, 0x12, 0x67, 0x0a, 0x86, 0x25, 0x9d, 0x04, 0x36, 0x29, 0xa2, 0xcf, 0xc0, 0xa9, 0x9d, 0x5c, + 0xcb, 0x1f, 0xce, 0x09, 0xb2, 0x8c, 0xe7, 0xf9, 0xf6, 0x3e, 0xf9, 0xf5, 0xed, 0xff, 0x1e, 0xe0, + 0xb1, 0x0e, 0x27, 0x3d, 0x9a, 0x37, 0xb5, 0xf6, 0xcf, 0x25, 0x25, 0x1b, 0xb3, 0x99, 0x95, 0x0d, + 0x51, 0x47, 0x62, 0x43, 0x15, 0xde, 0xf7, 0x86, 0xfa, 0x69, 0x4b, 0x93, 0x39, 0x71, 0x9b, 0xee, + 0x4f, 0x1c, 0xf2, 0x06, 0x7b, 0x88, 0x42, 0xa8, 0x8d, 0x0c, 0x49, 0xce, 0x8b, 0x3d, 0x77, 0xa7, + 0x77, 0xd1, 0xce, 0xb7, 0xb2, 0xa3, 0xad, 0x73, 0x21, 0xcf, 0x95, 0xc3, 0x7e, 0xff, 0x51, 0x45, + 0x5e, 0xff, 0x8e, 0x05, 0xa7, 0x52, 0xc5, 0xbc, 0x0f, 0x24, 0x14, 0xd1, 0xee, 0xd6, 0xde, 0x77, + 0xe7, 0x25, 0x41, 0xfe, 0x0d, 0x57, 0xc5, 0x37, 0x9c, 0xca, 0xc5, 0x4b, 0x76, 0xfd, 0xab, 0x7f, + 0x55, 0x9a, 0x66, 0x0d, 0x98, 0x88, 0x38, 0xbf, 0xeb, 0xa8, 0x05, 0xe7, 0x6a, 0xed, 0x20, 0x88, + 0x17, 0x6b, 0xc6, 0xe6, 0xe4, 0x6f, 0xbd, 0x27, 0xf7, 0xf7, 0x4a, 0xe7, 0x16, 0xbb, 0xe0, 0xe2, + 0xae, 0xd4, 0x90, 0x07, 0xa8, 0x99, 0xb2, 0xaf, 0x63, 0x07, 0x40, 0x8e, 0x1c, 0x26, 0x6d, 0x8d, + 0xc7, 0x2d, 0x65, 0x33, 0xac, 0xf4, 0x32, 0x28, 0x1f, 0xad, 0xf4, 0xe4, 0xfb, 0x13, 0x97, 0x7e, + 0xf6, 0x3a, 0x9c, 0xed, 0xbc, 0x98, 0x0e, 0x15, 0xca, 0xe1, 0xcf, 0x2d, 0x38, 0xd3, 0x31, 0x5e, + 0xd8, 0x0f, 0xe0, 0x63, 0xc1, 0xfe, 0x92, 0x05, 0x8f, 0x67, 0xd6, 0x48, 0x3a, 0xe1, 0xd5, 0x68, + 0xa1, 0x66, 0x8e, 0x1a, 0x47, 0xce, 0x91, 0x00, 0x1c, 0xe3, 0x18, 0x16, 0x9b, 0x85, 0xae, 0x16, + 0x9b, 0x7f, 0x68, 0x41, 0xea, 0xaa, 0x3f, 0x02, 0xce, 0xb3, 0x6c, 0x72, 0x9e, 0x4f, 0xf6, 0x32, + 0x9a, 0x39, 0x4c, 0xe7, 0xdf, 0x4f, 0xc0, 0x89, 0x1c, 0x4f, 0xec, 0x1d, 0x98, 0xda, 0xac, 0x11, + 0x33, 0xf4, 0x46, 0xa7, 0x90, 0x74, 0x1d, 0xe3, 0x74, 0x2c, 0x1c, 0xdf, 0xdf, 0x2b, 0x4d, 0xa5, + 0x50, 0x70, 0xba, 0x09, 0xf4, 0x25, 0x0b, 0x8e, 0x39, 0x77, 0xc3, 0x65, 0xfa, 0x82, 0x70, 0x6b, + 0x0b, 0x0d, 0xbf, 0xb6, 0x4d, 0x19, 0x33, 0xb9, 0xad, 0x5e, 0xce, 0x14, 0x46, 0xdf, 0xae, 0xa6, + 0xf0, 0x8d, 0xe6, 0x67, 0xf6, 0xf7, 0x4a, 0xc7, 0xb2, 0xb0, 0x70, 0x66, 0x5b, 0x08, 0x8b, 0x74, + 0x5b, 0x4e, 0xb4, 0xd5, 0x29, 0x38, 0x4c, 0x96, 0xcb, 0x3c, 0x67, 0x89, 0x25, 0x04, 0x2b, 0x3a, + 0xe8, 0xf3, 0x30, 0xbc, 0x29, 0xe3, 0x40, 0x64, 0xb0, 0xdc, 0xf1, 0x40, 0x76, 0x8e, 0x8e, 0xc1, + 0x4d, 0x60, 0x14, 0x12, 0x8e, 0x89, 0xa2, 0x37, 0xa1, 0xe8, 0x6d, 0x84, 0x22, 0x44, 0x5d, 0xb6, + 0x25, 0xae, 0x69, 0xeb, 0xcc, 0x43, 0x30, 0xad, 0xad, 0x54, 0x31, 0xad, 0x88, 0xae, 0x42, 0x31, + 0xb8, 0x53, 0x17, 0x9a, 0x94, 0xcc, 0x4d, 0x8a, 0x17, 0x96, 0x72, 0x7a, 0xc5, 0x28, 0xe1, 0x85, + 0x25, 0x4c, 0x49, 0xa0, 0x0a, 0xf4, 0x33, 0xf7, 0x65, 0xc1, 0xda, 0x66, 0x3e, 0xe5, 0x3b, 0x84, + 0x01, 0xe0, 0x1e, 0x89, 0x0c, 0x01, 0x73, 0x42, 0x68, 0x1d, 0x06, 0x6a, 0xae, 0x57, 0x27, 0x81, + 0xe0, 0x65, 0x3f, 0x9a, 0xa9, 0x33, 0x61, 0x18, 0x39, 0x34, 0xb9, 0x0a, 0x81, 0x61, 0x60, 0x41, + 0x8b, 0x51, 0x25, 0xad, 0xad, 0x0d, 0x79, 0x63, 0x65, 0x53, 0x25, 0xad, 0xad, 0x95, 0x6a, 0x47, + 0xaa, 0x0c, 0x03, 0x0b, 0x5a, 0xe8, 0x35, 0x28, 0x6c, 0xd4, 0x84, 0x6b, 0x72, 0xa6, 0xf2, 0xc4, + 0x8c, 0xa2, 0xb5, 0x30, 0xb0, 0xbf, 0x57, 0x2a, 0xac, 0x2c, 0xe2, 0xc2, 0x46, 0x0d, 0xad, 0xc1, + 0xe0, 0x06, 0x8f, 0xbb, 0x23, 0xf4, 0x23, 0x4f, 0x67, 0x87, 0x04, 0x4a, 0x85, 0xe6, 0xe1, 0xde, + 0xa5, 0x02, 0x80, 0x25, 0x11, 0x96, 0xfd, 0x49, 0xc5, 0x0f, 0x12, 0xe1, 0x4b, 0xe7, 0x0e, 0x17, + 0xf3, 0x89, 0x3f, 0x35, 0xe2, 0x28, 0x44, 0x58, 0xa3, 0x48, 0x57, 0xb5, 0x73, 0xbf, 0x1d, 0xb0, + 0xdc, 0x16, 0x42, 0x35, 0x92, 0xb9, 0xaa, 0xe7, 0x25, 0x52, 0xa7, 0x55, 0xad, 0x90, 0x70, 0x4c, + 0x14, 0x6d, 0xc3, 0xd8, 0x4e, 0xd8, 0xda, 0x22, 0x72, 0x4b, 0xb3, 0xb0, 0x77, 0x39, 0xdc, 0xec, + 0x2d, 0x81, 0xe8, 0x06, 0x51, 0xdb, 0x69, 0xa4, 0x4e, 0x21, 0xf6, 0xac, 0xb9, 0xa5, 0x13, 0xc3, + 0x26, 0x6d, 0x3a, 0xfc, 0xef, 0xb5, 0xfd, 0x3b, 0xbb, 0x11, 0x11, 0x51, 0x47, 0x33, 0x87, 0xff, + 0x6d, 0x8e, 0x92, 0x1e, 0x7e, 0x01, 0xc0, 0x92, 0x08, 0xba, 0x25, 0x86, 0x87, 0x9d, 0x9e, 0x93, + 0xf9, 0x21, 0xcd, 0xe7, 0x25, 0x52, 0xce, 0xa0, 0xb0, 0xd3, 0x32, 0x26, 0xc5, 0x4e, 0xc9, 0xd6, + 0x96, 0x1f, 0xf9, 0x5e, 0xe2, 0x84, 0x9e, 0xca, 0x3f, 0x25, 0x2b, 0x19, 0xf8, 0xe9, 0x53, 0x32, + 0x0b, 0x0b, 0x67, 0xb6, 0x85, 0xea, 0x30, 0xde, 0xf2, 0x83, 0xe8, 0xae, 0x1f, 0xc8, 0xf5, 0x85, + 0x3a, 0x08, 0x4a, 0x0d, 0x4c, 0xd1, 0x22, 0x33, 0xcc, 0x31, 0x21, 0x38, 0x41, 0x13, 0x7d, 0x0a, + 0x06, 0xc3, 0x9a, 0xd3, 0x20, 0xe5, 0x1b, 0x33, 0xd3, 0xf9, 0xd7, 0x4f, 0x95, 0xa3, 0xe4, 0xac, + 0x2e, 0x1e, 0x36, 0x89, 0xa3, 0x60, 0x49, 0x0e, 0xad, 0x40, 0x3f, 0xcb, 0xaa, 0xcc, 0x42, 0xe4, + 0xe6, 0x44, 0x66, 0x4f, 0xb9, 0xd5, 0xf0, 0xb3, 0x89, 0x15, 0x63, 0x5e, 0x9d, 0xee, 0x01, 0x21, + 0x29, 0xf0, 0xc3, 0x99, 0xe3, 0xf9, 0x7b, 0x40, 0x08, 0x18, 0x6e, 0x54, 0x3b, 0xed, 0x01, 0x85, + 0x84, 0x63, 0xa2, 0xf4, 0x64, 0xa6, 0xa7, 0xe9, 0x89, 0x0e, 0x26, 0x93, 0xb9, 0x67, 0x29, 0x3b, + 0x99, 0xe9, 0x49, 0x4a, 0x49, 0xd8, 0xbf, 0x3f, 0x94, 0xe6, 0x59, 0x98, 0x84, 0xe9, 0xdf, 0xb4, + 0x52, 0x36, 0x13, 0x1f, 0xeb, 0x55, 0xe0, 0xfd, 0x10, 0x1f, 0xae, 0x5f, 0xb2, 0xe0, 0x44, 0x2b, + 0xf3, 0x43, 0x04, 0x03, 0xd0, 0x9b, 0xdc, 0x9c, 0x7f, 0xba, 0x0a, 0xa7, 0x9c, 0x0d, 0xc7, 0x39, + 0x2d, 0x25, 0x85, 0x03, 0xc5, 0xf7, 0x2d, 0x1c, 0x58, 0x85, 0xa1, 0x1a, 0x7f, 0xc9, 0xc9, 0x34, + 0x00, 0x3d, 0x05, 0x03, 0x65, 0xac, 0x84, 0x78, 0x02, 0x6e, 0x60, 0x45, 0x02, 0xfd, 0x8c, 0x05, + 0x67, 0x92, 0x5d, 0xc7, 0x84, 0x81, 0x85, 0xc1, 0x24, 0x17, 0x6b, 0xad, 0x88, 0xef, 0x4f, 0xf1, + 0xff, 0x06, 0xf2, 0x41, 0x37, 0x04, 0xdc, 0xb9, 0x31, 0xb4, 0x94, 0x21, 0x57, 0x1b, 0x30, 0x35, + 0x8a, 0x3d, 0xc8, 0xd6, 0x5e, 0x86, 0xd1, 0xa6, 0xdf, 0xf6, 0x22, 0x61, 0xf7, 0x28, 0x8c, 0xa7, + 0x98, 0xd1, 0xd0, 0xaa, 0x56, 0x8e, 0x0d, 0xac, 0x84, 0x44, 0x6e, 0xe8, 0x81, 0x25, 0x72, 0xef, + 0xc2, 0xa8, 0xa7, 0xb9, 0x04, 0x74, 0x7a, 0xc1, 0x0a, 0xe9, 0xa2, 0x86, 0xcd, 0x7b, 0xa9, 0x97, + 0x60, 0x83, 0x5a, 0x67, 0x69, 0x19, 0xbc, 0x3f, 0x69, 0xd9, 0x91, 0x3e, 0x89, 0xed, 0x5f, 0x2f, + 0x64, 0xbc, 0x18, 0xb8, 0x54, 0xee, 0x0d, 0x53, 0x2a, 0x77, 0x3e, 0x29, 0x95, 0x4b, 0xa9, 0xaa, + 0x0c, 0x81, 0x5c, 0xef, 0xe9, 0x1c, 0x7b, 0x0e, 0xf0, 0xfc, 0x63, 0x16, 0x9c, 0x64, 0xba, 0x0f, + 0xda, 0xc0, 0xfb, 0xd6, 0x77, 0x30, 0x93, 0xd4, 0xeb, 0xd9, 0xe4, 0x70, 0x5e, 0x3b, 0x76, 0x03, + 0xce, 0x75, 0xbb, 0x77, 0x99, 0x85, 0x6f, 0x5d, 0x19, 0x47, 0xc4, 0x16, 0xbe, 0xf5, 0xf2, 0x12, + 0x66, 0x90, 0x5e, 0xc3, 0x17, 0xda, 0xff, 0xa7, 0x05, 0xc5, 0x8a, 0x5f, 0x3f, 0x82, 0x17, 0xfd, + 0x27, 0x8c, 0x17, 0xfd, 0x63, 0xd9, 0x37, 0x7e, 0x3d, 0x57, 0xd9, 0xb7, 0x9c, 0x50, 0xf6, 0x9d, + 0xc9, 0x23, 0xd0, 0x59, 0xb5, 0xf7, 0x4b, 0x45, 0x18, 0xa9, 0xf8, 0x75, 0xb5, 0xcf, 0xfe, 0x9b, + 0x07, 0x71, 0xe4, 0xc9, 0xcd, 0x3e, 0xa5, 0x51, 0x66, 0x16, 0xbd, 0x32, 0xee, 0xc4, 0x0f, 0x98, + 0x3f, 0xcf, 0x6d, 0xe2, 0x6e, 0x6e, 0x45, 0xa4, 0x9e, 0xfc, 0x9c, 0xa3, 0xf3, 0xe7, 0xf9, 0x5e, + 0x11, 0x26, 0x12, 0xad, 0xa3, 0x06, 0x8c, 0x35, 0x74, 0x55, 0x92, 0x58, 0xa7, 0x0f, 0xa4, 0x85, + 0x12, 0xfe, 0x10, 0x5a, 0x11, 0x36, 0x89, 0xa3, 0x39, 0x00, 0x4f, 0xb7, 0x0a, 0x57, 0x81, 0x8a, + 0x35, 0x8b, 0x70, 0x0d, 0x03, 0xbd, 0x02, 0x23, 0x91, 0xdf, 0xf2, 0x1b, 0xfe, 0xe6, 0xee, 0x35, + 0x22, 0x23, 0x5b, 0x2a, 0xa3, 0xe1, 0xf5, 0x18, 0x84, 0x75, 0x3c, 0x74, 0x0f, 0xa6, 0x14, 0x91, + 0xea, 0x43, 0x50, 0xaf, 0x31, 0xb1, 0xc9, 0x5a, 0x92, 0x22, 0x4e, 0x37, 0x82, 0x5e, 0x83, 0x71, + 0x66, 0xbd, 0xcc, 0xea, 0x5f, 0x23, 0xbb, 0x32, 0xe2, 0x31, 0xe3, 0xb0, 0x57, 0x0d, 0x08, 0x4e, + 0x60, 0xa2, 0x45, 0x98, 0x6a, 0xba, 0x61, 0xa2, 0xfa, 0x00, 0xab, 0xce, 0x3a, 0xb0, 0x9a, 0x04, + 0xe2, 0x34, 0xbe, 0xfd, 0xab, 0x62, 0x8e, 0xbd, 0xc8, 0xfd, 0x70, 0x3b, 0x7e, 0xb0, 0xb7, 0xe3, + 0x77, 0x2d, 0x98, 0xa4, 0xad, 0x33, 0x93, 0x4c, 0xc9, 0x48, 0xa9, 0x9c, 0x18, 0x56, 0x87, 0x9c, + 0x18, 0xe7, 0xe9, 0xb1, 0x5d, 0xf7, 0xdb, 0x91, 0x90, 0x8e, 0x6a, 0xe7, 0x32, 0x2d, 0xc5, 0x02, + 0x2a, 0xf0, 0x48, 0x10, 0x08, 0xbf, 0x77, 0x1d, 0x8f, 0x04, 0x01, 0x16, 0x50, 0x99, 0x32, 0xa3, + 0x2f, 0x3b, 0x65, 0x06, 0x8f, 0x7c, 0x2e, 0xac, 0xe0, 0x04, 0x4b, 0xab, 0x45, 0x3e, 0x97, 0xe6, + 0x71, 0x31, 0x8e, 0xfd, 0xad, 0x22, 0x8c, 0x56, 0xfc, 0x7a, 0x6c, 0xd8, 0xf1, 0xb2, 0x61, 0xd8, + 0x71, 0x2e, 0x61, 0xd8, 0x31, 0xa9, 0xe3, 0x7e, 0x68, 0xc6, 0xf1, 0xfd, 0x32, 0xe3, 0xf8, 0x03, + 0x8b, 0xcd, 0xda, 0xd2, 0x5a, 0x95, 0x5b, 0xf8, 0xa2, 0x4b, 0x30, 0xc2, 0x4e, 0x38, 0x16, 0x68, + 0x41, 0x5a, 0x3b, 0xb0, 0x14, 0x96, 0x6b, 0x71, 0x31, 0xd6, 0x71, 0xd0, 0x05, 0x18, 0x0a, 0x89, + 0x13, 0xd4, 0xb6, 0xd4, 0xf1, 0x2e, 0x4c, 0x13, 0x78, 0x19, 0x56, 0x50, 0xf4, 0x76, 0x1c, 0x74, + 0xbb, 0x98, 0x6f, 0x2e, 0xac, 0xf7, 0x87, 0x6f, 0x91, 0xfc, 0x48, 0xdb, 0xf6, 0x6d, 0x40, 0x69, + 0xfc, 0x1e, 0xfc, 0xaf, 0x4a, 0x66, 0x58, 0xd8, 0xe1, 0x54, 0x48, 0xd8, 0x7f, 0xb2, 0x60, 0xbc, + 0xe2, 0xd7, 0xe9, 0xd6, 0xfd, 0x61, 0xda, 0xa7, 0x7a, 0xc6, 0x81, 0x81, 0x0e, 0x19, 0x07, 0x9e, + 0x80, 0xfe, 0x8a, 0x5f, 0xef, 0x12, 0xba, 0xf6, 0x3f, 0xb2, 0x60, 0xb0, 0xe2, 0xd7, 0x8f, 0x40, + 0xf1, 0xf2, 0x86, 0xa9, 0x78, 0x39, 0x99, 0xb3, 0x6e, 0x72, 0x74, 0x2d, 0xff, 0x41, 0x1f, 0x8c, + 0xd1, 0x7e, 0xfa, 0x9b, 0x72, 0x2a, 0x8d, 0x61, 0xb3, 0x7a, 0x18, 0x36, 0xfa, 0x0c, 0xf0, 0x1b, + 0x0d, 0xff, 0x6e, 0x72, 0x5a, 0x57, 0x58, 0x29, 0x16, 0x50, 0xf4, 0x3c, 0x0c, 0xb5, 0x02, 0xb2, + 0xe3, 0xfa, 0x82, 0xbf, 0xd6, 0xd4, 0x58, 0x15, 0x51, 0x8e, 0x15, 0x06, 0x7d, 0x78, 0x87, 0xae, + 0x47, 0x79, 0x89, 0x9a, 0xef, 0xd5, 0xb9, 0x6e, 0xa2, 0x28, 0xd2, 0x62, 0x69, 0xe5, 0xd8, 0xc0, + 0x42, 0xb7, 0x61, 0x98, 0xfd, 0x67, 0xc7, 0x4e, 0xff, 0xa1, 0x8f, 0x1d, 0x91, 0x28, 0x58, 0x10, + 0xc0, 0x31, 0x2d, 0xf4, 0x22, 0x40, 0x24, 0x53, 0xcb, 0x84, 0x22, 0x84, 0xa9, 0x7a, 0x8b, 0xa8, + 0xa4, 0x33, 0x21, 0xd6, 0xb0, 0xd0, 0x73, 0x30, 0x1c, 0x39, 0x6e, 0xe3, 0xba, 0xeb, 0x31, 0xfd, + 0x3d, 0xed, 0xbf, 0xc8, 0xd7, 0x2b, 0x0a, 0x71, 0x0c, 0xa7, 0xbc, 0x20, 0x8b, 0x09, 0xb5, 0xb0, + 0x1b, 0x89, 0xd4, 0x74, 0x45, 0xce, 0x0b, 0x5e, 0x57, 0xa5, 0x58, 0xc3, 0x40, 0x5b, 0x70, 0xda, + 0xf5, 0x58, 0x0a, 0x29, 0x52, 0xdd, 0x76, 0x5b, 0xeb, 0xd7, 0xab, 0xb7, 0x48, 0xe0, 0x6e, 0xec, + 0x2e, 0x38, 0xb5, 0x6d, 0xe2, 0xc9, 0x6c, 0xf4, 0x4f, 0x8a, 0x2e, 0x9e, 0x2e, 0x77, 0xc0, 0xc5, + 0x1d, 0x29, 0xd9, 0x2f, 0xb1, 0xf5, 0x7e, 0xa3, 0x8a, 0x9e, 0x35, 0x8e, 0x8e, 0x13, 0xfa, 0xd1, + 0x71, 0xb0, 0x57, 0x1a, 0xb8, 0x51, 0xd5, 0x62, 0xff, 0x5c, 0x86, 0xe3, 0x15, 0xbf, 0x5e, 0xf1, + 0x83, 0x68, 0xc5, 0x0f, 0xee, 0x3a, 0x41, 0x5d, 0x2e, 0xaf, 0x92, 0x8c, 0x7e, 0x44, 0xcf, 0xcf, + 0x7e, 0x7e, 0xba, 0x18, 0x91, 0x8d, 0x5e, 0x62, 0x1c, 0xdb, 0x21, 0x9d, 0x4d, 0x6b, 0x8c, 0x77, + 0x50, 0x49, 0xd8, 0xae, 0x38, 0x11, 0x41, 0x37, 0x60, 0xac, 0xa6, 0x5f, 0xa3, 0xa2, 0xfa, 0x33, + 0xf2, 0x22, 0x33, 0xee, 0xd8, 0xcc, 0x7b, 0xd7, 0xac, 0x6f, 0x7f, 0xc7, 0x12, 0xad, 0x70, 0x49, + 0x04, 0xb7, 0x69, 0xed, 0x7e, 0x9e, 0x2e, 0xc2, 0x54, 0xa0, 0x57, 0xd1, 0x6c, 0xc3, 0x8e, 0xf3, + 0xac, 0x36, 0x09, 0x20, 0x4e, 0xe3, 0xa3, 0xcf, 0xc0, 0x29, 0xa3, 0x50, 0xaa, 0xc9, 0xb5, 0xdc, + 0xd2, 0x4c, 0x56, 0x83, 0xf3, 0x90, 0x70, 0x7e, 0x7d, 0xfb, 0x47, 0xe1, 0x44, 0xf2, 0xbb, 0x84, + 0xf4, 0xe4, 0x01, 0xbf, 0xae, 0x70, 0xb8, 0xaf, 0xb3, 0x5f, 0x81, 0x29, 0xfa, 0xac, 0x56, 0x2c, + 0x22, 0x9b, 0xbf, 0xee, 0x01, 0xa6, 0xfe, 0x87, 0x41, 0x76, 0xc5, 0x25, 0x32, 0xab, 0xa1, 0xcf, + 0xc1, 0x78, 0x48, 0x58, 0x54, 0x35, 0x29, 0xb5, 0xeb, 0xe0, 0x29, 0x5e, 0x5d, 0xd6, 0x31, 0xf9, + 0xcb, 0xc4, 0x2c, 0xc3, 0x09, 0x6a, 0xa8, 0x09, 0xe3, 0x77, 0x5d, 0xaf, 0xee, 0xdf, 0x0d, 0x25, + 0xfd, 0xa1, 0x7c, 0x15, 0xc0, 0x6d, 0x8e, 0x99, 0xe8, 0xa3, 0xd1, 0xdc, 0x6d, 0x83, 0x18, 0x4e, + 0x10, 0xa7, 0xc7, 0x48, 0xd0, 0xf6, 0xe6, 0xc3, 0x9b, 0x21, 0x09, 0x44, 0xcc, 0x37, 0x76, 0x8c, + 0x60, 0x59, 0x88, 0x63, 0x38, 0x3d, 0x46, 0xd8, 0x1f, 0xe6, 0x6a, 0xce, 0xce, 0x29, 0x71, 0x8c, + 0x60, 0x55, 0x8a, 0x35, 0x0c, 0x7a, 0xcc, 0xb2, 0x7f, 0x6b, 0xbe, 0x87, 0x7d, 0x3f, 0x92, 0x07, + 0x33, 0x4b, 0x43, 0xa9, 0x95, 0x63, 0x03, 0x2b, 0x27, 0xc2, 0x5c, 0xdf, 0x61, 0x23, 0xcc, 0xa1, + 0xa8, 0x83, 0x77, 0x3d, 0x8f, 0x74, 0x7c, 0xb9, 0x93, 0x77, 0xfd, 0xc1, 0x03, 0x79, 0xde, 0xd3, + 0x7b, 0x7e, 0x43, 0x0c, 0x50, 0x3f, 0x0f, 0xa1, 0xc7, 0x94, 0x94, 0x55, 0x3e, 0x3a, 0x12, 0x86, + 0x96, 0x61, 0x30, 0xdc, 0x0d, 0x6b, 0x51, 0x23, 0xec, 0x94, 0x6a, 0xb4, 0xca, 0x50, 0xb4, 0x4c, + 0xd7, 0xbc, 0x0a, 0x96, 0x75, 0x51, 0x0d, 0xa6, 0x05, 0xc5, 0xc5, 0x2d, 0xc7, 0x53, 0x09, 0x10, + 0xb9, 0x35, 0xe2, 0xa5, 0xfd, 0xbd, 0xd2, 0xb4, 0x68, 0x59, 0x07, 0x1f, 0xec, 0x95, 0xe8, 0x96, + 0xcc, 0x80, 0xe0, 0x2c, 0x6a, 0x7c, 0xc9, 0xd7, 0x6a, 0x7e, 0xb3, 0x55, 0x09, 0xfc, 0x0d, 0xb7, + 0x41, 0x3a, 0x29, 0x7a, 0xab, 0x06, 0xa6, 0x58, 0xf2, 0x46, 0x19, 0x4e, 0x50, 0x43, 0x77, 0x60, + 0xc2, 0x69, 0xb5, 0xe6, 0x83, 0xa6, 0x1f, 0xc8, 0x06, 0x46, 0xf2, 0x35, 0x06, 0xf3, 0x26, 0x2a, + 0xcf, 0x7f, 0x98, 0x28, 0xc4, 0x49, 0x82, 0xf6, 0xbf, 0x64, 0xfc, 0x76, 0xd5, 0xdd, 0xf4, 0x98, + 0x4f, 0x1a, 0x6a, 0xc2, 0x58, 0x8b, 0x9d, 0xc8, 0x22, 0x6d, 0x98, 0xd8, 0xc5, 0x2f, 0xf7, 0x28, + 0x33, 0xbc, 0xcb, 0x12, 0x9f, 0x1a, 0xb6, 0xa3, 0x15, 0x9d, 0x1c, 0x36, 0xa9, 0xdb, 0xff, 0xe3, + 0x29, 0xc6, 0xb1, 0x55, 0xb9, 0x20, 0x70, 0x50, 0x78, 0x08, 0x8a, 0xa7, 0xff, 0x6c, 0xbe, 0xc8, + 0x3d, 0x9e, 0x7a, 0xe1, 0x65, 0x88, 0x65, 0x5d, 0xf4, 0x59, 0x18, 0xa7, 0x2f, 0x69, 0xc5, 0x35, + 0x85, 0x33, 0xc7, 0xf2, 0x43, 0x4f, 0x29, 0x2c, 0x3d, 0xa5, 0xa0, 0x5e, 0x19, 0x27, 0x88, 0xa1, + 0xb7, 0x99, 0x39, 0xa5, 0x24, 0x5d, 0xe8, 0x85, 0xb4, 0x6e, 0x39, 0x29, 0xc9, 0x6a, 0x44, 0x50, + 0x1b, 0xa6, 0xd3, 0x89, 0x93, 0xc3, 0x19, 0x3b, 0xff, 0x49, 0x92, 0xce, 0x7d, 0x1c, 0xe7, 0x7e, + 0x4b, 0xc3, 0x42, 0x9c, 0x45, 0x1f, 0x5d, 0x4f, 0xa6, 0xb5, 0x2d, 0x1a, 0xc2, 0xfa, 0x54, 0x6a, + 0xdb, 0xb1, 0x8e, 0x19, 0x6d, 0x37, 0xe1, 0x8c, 0x96, 0x19, 0xf4, 0x4a, 0xe0, 0x30, 0x73, 0x1e, + 0x97, 0x5d, 0x14, 0x1a, 0x2f, 0xf9, 0xf8, 0xfe, 0x5e, 0xe9, 0xcc, 0x7a, 0x27, 0x44, 0xdc, 0x99, + 0x0e, 0xba, 0x01, 0xc7, 0x79, 0xe0, 0x94, 0x25, 0xe2, 0xd4, 0x1b, 0xae, 0xa7, 0x98, 0x55, 0x7e, + 0xac, 0x9c, 0xda, 0xdf, 0x2b, 0x1d, 0x9f, 0xcf, 0x42, 0xc0, 0xd9, 0xf5, 0xd0, 0x1b, 0x30, 0x5c, + 0xf7, 0xe4, 0x01, 0x38, 0x60, 0x24, 0x5f, 0x1d, 0x5e, 0x5a, 0xab, 0xaa, 0xef, 0x8f, 0xff, 0xe0, + 0xb8, 0x02, 0xda, 0xe4, 0xda, 0x22, 0x25, 0xe2, 0x1b, 0x4c, 0xc5, 0xd3, 0x4c, 0x4a, 0xc1, 0x8d, + 0x48, 0x04, 0x5c, 0x4d, 0xaa, 0x3c, 0xdd, 0x8c, 0x20, 0x05, 0x06, 0x61, 0xf4, 0x16, 0x20, 0x91, + 0xe4, 0x67, 0xbe, 0xc6, 0x72, 0xd2, 0x69, 0x26, 0x9c, 0xea, 0xe5, 0x5e, 0x4d, 0x61, 0xe0, 0x8c, + 0x5a, 0xe8, 0x2a, 0x3d, 0xb9, 0xf4, 0x52, 0x71, 0x32, 0xaa, 0x14, 0xdf, 0x4b, 0xa4, 0x15, 0x10, + 0x66, 0x75, 0x68, 0x52, 0xc4, 0x89, 0x7a, 0xa8, 0x0e, 0xa7, 0x9d, 0x76, 0xe4, 0x33, 0x45, 0x9c, + 0x89, 0xba, 0xee, 0x6f, 0x13, 0x8f, 0xe9, 0xc0, 0x87, 0x58, 0x9c, 0xce, 0xd3, 0xf3, 0x1d, 0xf0, + 0x70, 0x47, 0x2a, 0xf4, 0x15, 0x43, 0xc7, 0x42, 0xd3, 0x91, 0x19, 0x4e, 0xd5, 0x5c, 0x71, 0x2c, + 0x31, 0xd0, 0x2b, 0x30, 0xb2, 0xe5, 0x87, 0xd1, 0x1a, 0x89, 0xee, 0xfa, 0xc1, 0xb6, 0xc8, 0x2a, + 0x10, 0x67, 0x72, 0x89, 0x41, 0x58, 0xc7, 0x43, 0xcf, 0xc0, 0x20, 0xb3, 0xd0, 0x2a, 0x2f, 0xb1, + 0x6b, 0x70, 0x28, 0x3e, 0x63, 0xae, 0xf2, 0x62, 0x2c, 0xe1, 0x12, 0xb5, 0x5c, 0x59, 0x64, 0x86, + 0x2e, 0x09, 0xd4, 0x72, 0x65, 0x11, 0x4b, 0x38, 0x5d, 0xae, 0xe1, 0x96, 0x13, 0x90, 0x4a, 0xe0, + 0xd7, 0x48, 0xa8, 0xe5, 0x0f, 0x7a, 0x8c, 0xe7, 0x4c, 0xa0, 0xcb, 0xb5, 0x9a, 0x85, 0x80, 0xb3, + 0xeb, 0x21, 0x92, 0xce, 0x8a, 0x3b, 0x9e, 0xaf, 0xa1, 0x4c, 0x73, 0x6a, 0x3d, 0x26, 0xc6, 0xf5, + 0x60, 0x52, 0xe5, 0xe3, 0xe5, 0x59, 0x12, 0xc2, 0x99, 0x09, 0xb6, 0xb6, 0x7b, 0x4f, 0xb1, 0xa0, + 0x74, 0xbe, 0xe5, 0x04, 0x25, 0x9c, 0xa2, 0x6d, 0x04, 0x82, 0x9d, 0xec, 0x1a, 0x08, 0xf6, 0x22, + 0x0c, 0x87, 0xed, 0x3b, 0x75, 0xbf, 0xe9, 0xb8, 0x1e, 0x33, 0x74, 0xd1, 0xde, 0xcb, 0x55, 0x09, + 0xc0, 0x31, 0x0e, 0x5a, 0x81, 0x21, 0x47, 0x2a, 0x74, 0x51, 0x7e, 0x8c, 0x3b, 0xa5, 0xc6, 0xe5, + 0x61, 0x9f, 0xa4, 0x0a, 0x57, 0xd5, 0x45, 0xaf, 0xc3, 0x98, 0x88, 0xa3, 0x21, 0x52, 0xd8, 0x4f, + 0x9b, 0x5e, 0xc3, 0x55, 0x1d, 0x88, 0x4d, 0x5c, 0x74, 0x13, 0x46, 0x22, 0xbf, 0xc1, 0x5c, 0x5f, + 0x29, 0x03, 0x7b, 0x22, 0x3f, 0x14, 0xed, 0xba, 0x42, 0xd3, 0x55, 0x0d, 0xaa, 0x2a, 0xd6, 0xe9, + 0xa0, 0x75, 0xbe, 0xde, 0x59, 0xb6, 0x20, 0x12, 0x8a, 0x1c, 0xe8, 0x67, 0xf2, 0xac, 0x14, 0x19, + 0x9a, 0xb9, 0x1d, 0x44, 0x4d, 0xac, 0x93, 0x41, 0x57, 0x60, 0xaa, 0x15, 0xb8, 0x3e, 0x5b, 0x13, + 0x4a, 0x41, 0x3d, 0x63, 0xe6, 0x06, 0xad, 0x24, 0x11, 0x70, 0xba, 0x0e, 0x0b, 0x83, 0x22, 0x0a, + 0x67, 0x4e, 0xf1, 0xfc, 0x66, 0x5c, 0xfc, 0xc0, 0xcb, 0xb0, 0x82, 0xa2, 0x55, 0x76, 0x12, 0x73, + 0xc9, 0xd9, 0xcc, 0x6c, 0xbe, 0x73, 0xbd, 0x2e, 0x61, 0xe3, 0x6c, 0xb9, 0xfa, 0x8b, 0x63, 0x0a, + 0xa8, 0xae, 0xa5, 0x15, 0xa7, 0x8f, 0x9b, 0x70, 0xe6, 0x74, 0x07, 0x33, 0xd9, 0xc4, 0x4b, 0x36, + 0x66, 0x08, 0x8c, 0xe2, 0x10, 0x27, 0x68, 0xa2, 0x4f, 0xc2, 0xa4, 0x88, 0x11, 0x10, 0x0f, 0xd3, + 0x99, 0xd8, 0x95, 0x08, 0x27, 0x60, 0x38, 0x85, 0xcd, 0xf3, 0x8b, 0x39, 0x77, 0x1a, 0x44, 0x1c, + 0x7d, 0xd7, 0x5d, 0x6f, 0x3b, 0x9c, 0x39, 0xcb, 0xce, 0x07, 0x91, 0x5f, 0x2c, 0x09, 0xc5, 0x19, + 0x35, 0xd0, 0x3a, 0x4c, 0xb6, 0x02, 0x42, 0x9a, 0xec, 0x09, 0x23, 0xee, 0xb3, 0x12, 0x8f, 0x02, + 0x44, 0x7b, 0x52, 0x49, 0xc0, 0x0e, 0x32, 0xca, 0x70, 0x8a, 0x02, 0xba, 0x0b, 0x43, 0xfe, 0x0e, + 0x09, 0xb6, 0x88, 0x53, 0x9f, 0x39, 0xd7, 0xc1, 0xc1, 0x4d, 0x5c, 0x6e, 0x37, 0x04, 0x6e, 0xc2, + 0xfe, 0x47, 0x16, 0x77, 0xb7, 0xff, 0x91, 0x8d, 0xa1, 0x7f, 0xcb, 0x82, 0x53, 0x52, 0xa3, 0x56, + 0x6d, 0xd1, 0x51, 0x5f, 0xf4, 0xbd, 0x30, 0x0a, 0x78, 0xdc, 0x9a, 0xc7, 0xf3, 0x63, 0xb9, 0xac, + 0xe7, 0x54, 0x52, 0xc2, 0xfb, 0x53, 0x79, 0x18, 0x21, 0xce, 0x6f, 0x91, 0x3e, 0xba, 0x43, 0x12, + 0xc9, 0xc3, 0x68, 0x3e, 0x5c, 0x79, 0x7b, 0x69, 0x6d, 0xe6, 0x09, 0x1e, 0x74, 0x87, 0x6e, 0x86, + 0x6a, 0x12, 0x88, 0xd3, 0xf8, 0xe8, 0x12, 0x14, 0xfc, 0x70, 0xe6, 0xc9, 0x0e, 0x99, 0xe8, 0xfd, + 0xfa, 0x8d, 0x2a, 0xb7, 0x03, 0xbd, 0x51, 0xc5, 0x05, 0x3f, 0x94, 0x39, 0xbe, 0xe8, 0x4b, 0x33, + 0x9c, 0x79, 0x8a, 0x8b, 0x7a, 0x65, 0x8e, 0x2f, 0x56, 0x88, 0x63, 0x38, 0xda, 0x82, 0x89, 0xd0, + 0x78, 0xd1, 0x87, 0x33, 0xe7, 0xd9, 0x48, 0x3d, 0x95, 0x37, 0x69, 0x06, 0xb6, 0x96, 0x7c, 0xc7, + 0xa4, 0x82, 0x93, 0x64, 0xf9, 0xee, 0xd2, 0x64, 0x0a, 0xe1, 0xcc, 0xd3, 0x5d, 0x76, 0x97, 0x86, + 0xac, 0xef, 0x2e, 0x9d, 0x06, 0x4e, 0xd0, 0x9c, 0xfd, 0x11, 0x98, 0x4a, 0xb1, 0x4b, 0x87, 0xf1, + 0x79, 0x98, 0xdd, 0x86, 0x31, 0x63, 0x49, 0x3e, 0x52, 0x93, 0x98, 0x3f, 0x19, 0x86, 0x61, 0x65, + 0xaa, 0x80, 0x2e, 0x9a, 0x56, 0x30, 0xa7, 0x92, 0x56, 0x30, 0x43, 0x15, 0xbf, 0x6e, 0x18, 0xbe, + 0xac, 0x67, 0xc4, 0x92, 0xcd, 0x3b, 0x00, 0x7b, 0x77, 0xcc, 0xd2, 0xd4, 0x2f, 0xc5, 0x9e, 0xcd, + 0x69, 0xfa, 0x3a, 0x6a, 0x74, 0xae, 0xc0, 0x94, 0xe7, 0x33, 0x1e, 0x9d, 0xd4, 0x25, 0x03, 0xc6, + 0xf8, 0xac, 0x61, 0x3d, 0xd6, 0x59, 0x02, 0x01, 0xa7, 0xeb, 0xd0, 0x06, 0x39, 0xa3, 0x94, 0x54, + 0x21, 0x71, 0x3e, 0x0a, 0x0b, 0x28, 0x7d, 0x1b, 0xf2, 0x5f, 0xe1, 0xcc, 0x64, 0xfe, 0xdb, 0x90, + 0x57, 0x4a, 0x32, 0x63, 0xa1, 0x64, 0xc6, 0x98, 0xc6, 0xa4, 0xe5, 0xd7, 0xcb, 0x15, 0xc1, 0xe6, + 0x6b, 0x51, 0xde, 0xeb, 0xe5, 0x0a, 0xe6, 0x30, 0x34, 0x0f, 0x03, 0xec, 0x87, 0x8c, 0x21, 0x93, + 0xb7, 0x4d, 0xcb, 0x15, 0x2d, 0xc7, 0x28, 0xab, 0x80, 0x45, 0x45, 0x26, 0x11, 0xa7, 0x6f, 0x23, + 0x26, 0x11, 0x1f, 0x7c, 0x40, 0x89, 0xb8, 0x24, 0x80, 0x63, 0x5a, 0xe8, 0x1e, 0x1c, 0x37, 0xde, + 0xa3, 0xca, 0x53, 0x0d, 0xf2, 0x95, 0xe5, 0x09, 0xe4, 0x85, 0x33, 0xa2, 0xd3, 0xc7, 0xcb, 0x59, + 0x94, 0x70, 0x76, 0x03, 0xa8, 0x01, 0x53, 0xb5, 0x54, 0xab, 0x43, 0xbd, 0xb7, 0xaa, 0xd6, 0x45, + 0xba, 0xc5, 0x34, 0x61, 0xf4, 0x3a, 0x0c, 0xbd, 0xe7, 0x73, 0xc3, 0x36, 0xf1, 0x34, 0x91, 0x51, + 0x52, 0x86, 0xde, 0xbe, 0x51, 0x65, 0xe5, 0x07, 0x7b, 0xa5, 0x91, 0x8a, 0x5f, 0x97, 0x7f, 0xb1, + 0xaa, 0x80, 0x7e, 0xd2, 0x82, 0xd9, 0xf4, 0x83, 0x57, 0x75, 0x7a, 0xac, 0xf7, 0x4e, 0xdb, 0xa2, + 0xd1, 0xd9, 0xe5, 0x5c, 0x72, 0xb8, 0x43, 0x53, 0xe8, 0xe3, 0x74, 0x3f, 0x85, 0xee, 0x7d, 0x22, + 0x12, 0xb4, 0x3f, 0x1e, 0xef, 0x27, 0x5a, 0x7a, 0xb0, 0x57, 0x9a, 0xe0, 0x27, 0xa3, 0x7b, 0x5f, + 0xc5, 0xa3, 0xe7, 0x15, 0xd0, 0x8f, 0xc2, 0xf1, 0x20, 0x2d, 0x1b, 0x26, 0x92, 0x09, 0x7f, 0xb6, + 0x97, 0x53, 0x36, 0x39, 0xe1, 0x38, 0x8b, 0x20, 0xce, 0x6e, 0xc7, 0xfe, 0x5d, 0x8b, 0xe9, 0x04, + 0x44, 0xb7, 0x48, 0xd8, 0x6e, 0x44, 0x47, 0x60, 0x4c, 0xb6, 0x6c, 0xe8, 0xdb, 0x1f, 0xd8, 0x1a, + 0xec, 0xbf, 0xb6, 0x98, 0x35, 0xd8, 0x11, 0xfa, 0xb5, 0xbd, 0x0d, 0x43, 0x91, 0x68, 0x4d, 0x74, + 0x3d, 0xcf, 0x72, 0x45, 0x76, 0x8a, 0x59, 0xc4, 0xa9, 0x47, 0x8e, 0x2c, 0xc5, 0x8a, 0x8c, 0xfd, + 0x5f, 0xf0, 0x19, 0x90, 0x90, 0x23, 0x50, 0x6b, 0x2e, 0x99, 0x6a, 0xcd, 0x52, 0x97, 0x2f, 0xc8, + 0x51, 0x6f, 0xfe, 0xe7, 0x66, 0xbf, 0x99, 0x70, 0xef, 0x83, 0x6e, 0x86, 0x68, 0x7f, 0xc5, 0x02, + 0x88, 0x13, 0x80, 0xf4, 0x90, 0x90, 0xf9, 0x32, 0x7d, 0xd6, 0xf8, 0x91, 0x5f, 0xf3, 0x1b, 0x42, + 0xf5, 0x72, 0x3a, 0xd6, 0xac, 0xf2, 0xf2, 0x03, 0xed, 0x37, 0x56, 0xd8, 0xa8, 0x24, 0x23, 0xf2, + 0x16, 0x63, 0x5d, 0xbf, 0x11, 0x8d, 0xf7, 0xeb, 0x16, 0x1c, 0xcb, 0x72, 0x92, 0xa0, 0x8f, 0x64, + 0x2e, 0xe6, 0x54, 0x26, 0xa2, 0x6a, 0x36, 0x6f, 0x89, 0x72, 0xac, 0x30, 0x7a, 0xce, 0x74, 0x7d, + 0xb8, 0xe4, 0x14, 0x37, 0x60, 0xac, 0x12, 0x10, 0x8d, 0xbf, 0x78, 0x33, 0xce, 0x9b, 0x33, 0xbc, + 0xf0, 0xfc, 0xa1, 0x23, 0x0f, 0xd9, 0xdf, 0x28, 0xc0, 0x31, 0x6e, 0xe8, 0x34, 0xbf, 0xe3, 0xbb, + 0xf5, 0x8a, 0x5f, 0x17, 0xae, 0xad, 0xef, 0xc0, 0x68, 0x4b, 0x93, 0x4d, 0x77, 0x0a, 0xb4, 0xae, + 0xcb, 0xb0, 0x63, 0x69, 0x9a, 0x5e, 0x8a, 0x0d, 0x5a, 0xa8, 0x0e, 0xa3, 0x64, 0xc7, 0xad, 0x29, + 0x6b, 0x99, 0xc2, 0xa1, 0x2f, 0x69, 0xd5, 0xca, 0xb2, 0x46, 0x07, 0x1b, 0x54, 0x7b, 0x36, 0x4f, + 0xd6, 0x58, 0xb4, 0xbe, 0x2e, 0x16, 0x32, 0x3f, 0x67, 0xc1, 0xc9, 0x9c, 0xb0, 0xec, 0xb4, 0xb9, + 0xbb, 0xcc, 0xa4, 0x4c, 0x2c, 0x5b, 0xd5, 0x1c, 0x37, 0x34, 0xc3, 0x02, 0x8a, 0x3e, 0x05, 0xd0, + 0x8a, 0x53, 0x52, 0x76, 0x89, 0x5f, 0x6d, 0x44, 0xb2, 0xd5, 0x82, 0x92, 0xaa, 0xcc, 0x95, 0x1a, + 0x2d, 0xfb, 0xeb, 0x7d, 0xd0, 0xcf, 0x0c, 0x93, 0x50, 0x05, 0x06, 0xb7, 0x78, 0xcc, 0xbc, 0x8e, + 0xf3, 0x46, 0x71, 0x65, 0x10, 0xbe, 0x78, 0xde, 0xb4, 0x52, 0x2c, 0xc9, 0xa0, 0x55, 0x98, 0xe6, + 0xe9, 0x36, 0x1b, 0x4b, 0xa4, 0xe1, 0xec, 0x4a, 0xb1, 0x6f, 0x81, 0x7d, 0xaa, 0x12, 0x7f, 0x97, + 0xd3, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x13, 0xc6, 0xe9, 0x33, 0xdc, 0x6f, 0x47, 0x92, 0x12, 0xcf, + 0x6f, 0xa9, 0x5e, 0x26, 0xeb, 0x06, 0x14, 0x27, 0xb0, 0xd1, 0xeb, 0x30, 0xd6, 0x4a, 0x09, 0xb8, + 0xfb, 0x63, 0x49, 0x90, 0x29, 0xd4, 0x36, 0x71, 0x99, 0x9f, 0x44, 0x9b, 0x79, 0x85, 0xac, 0x6f, + 0x05, 0x24, 0xdc, 0xf2, 0x1b, 0x75, 0xc6, 0x01, 0xf7, 0x6b, 0x7e, 0x12, 0x09, 0x38, 0x4e, 0xd5, + 0xa0, 0x54, 0x36, 0x1c, 0xb7, 0xd1, 0x0e, 0x48, 0x4c, 0x65, 0xc0, 0xa4, 0xb2, 0x92, 0x80, 0xe3, + 0x54, 0x8d, 0xee, 0x92, 0xfb, 0xc1, 0x87, 0x23, 0xb9, 0xb7, 0x7f, 0xb9, 0x00, 0xc6, 0xd4, 0xfe, + 0x10, 0xe7, 0xdd, 0x7c, 0x03, 0xfa, 0x36, 0x83, 0x56, 0x4d, 0x18, 0xe1, 0x65, 0x7e, 0x59, 0x9c, + 0xfd, 0x9f, 0x7f, 0x19, 0xfd, 0x8f, 0x59, 0x2d, 0xba, 0xc7, 0x8f, 0x57, 0x02, 0x9f, 0x5e, 0x72, + 0x32, 0xac, 0xa6, 0x72, 0x47, 0x1a, 0x94, 0x81, 0x35, 0x3a, 0x04, 0xa0, 0x16, 0x3e, 0x15, 0x9c, + 0x82, 0x61, 0xaf, 0x56, 0x15, 0xe1, 0x73, 0x24, 0x15, 0x74, 0x09, 0x46, 0x44, 0x2a, 0x44, 0xe6, + 0x35, 0xc3, 0x37, 0x13, 0xb3, 0xaf, 0x5b, 0x8a, 0x8b, 0xb1, 0x8e, 0x63, 0xff, 0x54, 0x01, 0xa6, + 0x33, 0xdc, 0x1e, 0xf9, 0x35, 0xb2, 0xe9, 0x86, 0x51, 0xb0, 0x9b, 0xbc, 0x9c, 0xb0, 0x28, 0xc7, + 0x0a, 0x83, 0x9e, 0x55, 0xfc, 0xa2, 0x4a, 0x5e, 0x4e, 0xc2, 0xad, 0x48, 0x40, 0x0f, 0x99, 0xaa, + 0xff, 0x1c, 0xf4, 0xb5, 0x43, 0x22, 0x63, 0xdd, 0xab, 0x6b, 0x9b, 0x29, 0xec, 0x19, 0x84, 0x3e, + 0x01, 0x37, 0x95, 0x16, 0x5a, 0x7b, 0x02, 0x72, 0x3d, 0x34, 0x87, 0xd1, 0xce, 0x45, 0xc4, 0x73, + 0xbc, 0x48, 0x3c, 0x14, 0xe3, 0x18, 0xc8, 0xac, 0x14, 0x0b, 0xa8, 0xfd, 0xb5, 0x22, 0x9c, 0xca, + 0x75, 0x84, 0xa6, 0x5d, 0x6f, 0xfa, 0x9e, 0x1b, 0xf9, 0xca, 0x70, 0x91, 0xc7, 0x3d, 0x26, 0xad, + 0xad, 0x55, 0x51, 0x8e, 0x15, 0x06, 0x3a, 0x0f, 0xfd, 0x4c, 0x28, 0x9e, 0x4c, 0x83, 0x86, 0x17, + 0x96, 0x78, 0x44, 0x49, 0x0e, 0xd6, 0x6e, 0xf5, 0x62, 0xc7, 0x5b, 0xfd, 0x09, 0xca, 0xc1, 0xf8, + 0x8d, 0xe4, 0x85, 0x42, 0xbb, 0xeb, 0xfb, 0x0d, 0xcc, 0x80, 0xe8, 0x29, 0x31, 0x5e, 0x09, 0x4b, + 0x3d, 0xec, 0xd4, 0xfd, 0x50, 0x1b, 0xb4, 0x67, 0x60, 0x70, 0x9b, 0xec, 0x06, 0xae, 0xb7, 0x99, + 0xb4, 0xe0, 0xbc, 0xc6, 0x8b, 0xb1, 0x84, 0x9b, 0x59, 0xbf, 0x07, 0x1f, 0x46, 0xd6, 0x6f, 0x7d, + 0x05, 0x0c, 0x75, 0x65, 0x4f, 0x7e, 0xba, 0x08, 0x13, 0x78, 0x61, 0xe9, 0xc3, 0x89, 0xb8, 0x99, + 0x9e, 0x88, 0x87, 0x91, 0x1c, 0xfb, 0x70, 0xb3, 0xf1, 0x5b, 0x16, 0x4c, 0xb0, 0x84, 0x8c, 0x22, + 0x8a, 0x89, 0xeb, 0x7b, 0x47, 0xf0, 0x14, 0x78, 0x02, 0xfa, 0x03, 0xda, 0xa8, 0x98, 0x41, 0xb5, + 0xc7, 0x59, 0x4f, 0x30, 0x87, 0xa1, 0xd3, 0xd0, 0xc7, 0xba, 0x40, 0x27, 0x6f, 0x94, 0x1f, 0xc1, + 0x4b, 0x4e, 0xe4, 0x60, 0x56, 0xca, 0xe2, 0x29, 0x62, 0xd2, 0x6a, 0xb8, 0xbc, 0xd3, 0xb1, 0xc9, + 0xc2, 0x07, 0x23, 0x44, 0x4a, 0x66, 0xd7, 0xde, 0x5f, 0x3c, 0xc5, 0x6c, 0x92, 0x9d, 0x9f, 0xd9, + 0x7f, 0x57, 0x80, 0xb3, 0x99, 0xf5, 0x7a, 0x8e, 0xa7, 0xd8, 0xb9, 0xf6, 0xa3, 0x4c, 0xdf, 0x56, + 0x3c, 0x42, 0xfb, 0xf8, 0xbe, 0x5e, 0xb9, 0xff, 0xfe, 0x1e, 0xc2, 0x1c, 0x66, 0x0e, 0xd9, 0x07, + 0x24, 0xcc, 0x61, 0x66, 0xdf, 0x72, 0xc4, 0x04, 0xff, 0x5c, 0xc8, 0xf9, 0x16, 0x26, 0x30, 0xb8, + 0x40, 0xcf, 0x19, 0x06, 0x0c, 0xe5, 0x23, 0x9c, 0x9f, 0x31, 0xbc, 0x0c, 0x2b, 0x28, 0x9a, 0x87, + 0x89, 0xa6, 0xeb, 0xd1, 0xc3, 0x67, 0xd7, 0x64, 0xc5, 0x95, 0x2e, 0x63, 0xd5, 0x04, 0xe3, 0x24, + 0x3e, 0x72, 0xb5, 0x10, 0x88, 0xfc, 0xeb, 0x5e, 0x3f, 0xd4, 0xae, 0x9b, 0x33, 0xcd, 0x39, 0xd4, + 0x28, 0x66, 0x84, 0x43, 0x5c, 0xd5, 0xe4, 0x44, 0xc5, 0xde, 0xe5, 0x44, 0xa3, 0xd9, 0x32, 0xa2, + 0xd9, 0xd7, 0x61, 0xec, 0x81, 0x75, 0x23, 0xf6, 0x77, 0x8b, 0xf0, 0x58, 0x87, 0x6d, 0xcf, 0xcf, + 0x7a, 0x63, 0x0e, 0xb4, 0xb3, 0x3e, 0x35, 0x0f, 0x15, 0x38, 0xb6, 0xd1, 0x6e, 0x34, 0x76, 0x99, + 0x23, 0x18, 0xa9, 0x4b, 0x0c, 0xc1, 0x53, 0x4a, 0xe1, 0xc8, 0xb1, 0x95, 0x0c, 0x1c, 0x9c, 0x59, + 0x93, 0x3e, 0xb1, 0xe8, 0x4d, 0xb2, 0xab, 0x48, 0x25, 0x9e, 0x58, 0x58, 0x07, 0x62, 0x13, 0x17, + 0x5d, 0x81, 0x29, 0x67, 0xc7, 0x71, 0x79, 0xfa, 0x0b, 0x49, 0x80, 0xbf, 0xb1, 0x94, 0x2c, 0x7a, + 0x3e, 0x89, 0x80, 0xd3, 0x75, 0xd0, 0x5b, 0x80, 0xfc, 0x3b, 0xcc, 0xb9, 0xa4, 0x7e, 0x85, 0x78, + 0x42, 0xeb, 0xce, 0xe6, 0xae, 0x18, 0x1f, 0x09, 0x37, 0x52, 0x18, 0x38, 0xa3, 0x56, 0x22, 0x18, + 0xdf, 0x40, 0x7e, 0x30, 0xbe, 0xce, 0xe7, 0x62, 0xd7, 0xcc, 0x81, 0xef, 0xc2, 0xd8, 0x61, 0x2d, + 0xa6, 0x9f, 0x81, 0xc1, 0x40, 0xe4, 0x64, 0x4f, 0x78, 0x5d, 0xcb, 0x8c, 0xd5, 0x12, 0x6e, 0xff, + 0x6f, 0x16, 0x28, 0x59, 0xb2, 0x19, 0x77, 0xfb, 0x75, 0x66, 0xfe, 0xcd, 0xa5, 0xe0, 0x5a, 0xa8, + 0xad, 0xe3, 0x9a, 0xf9, 0x77, 0x0c, 0xc4, 0x26, 0x2e, 0x5f, 0x6e, 0x61, 0x1c, 0xe1, 0xc1, 0x78, + 0x40, 0x88, 0xb0, 0xa0, 0x0a, 0x03, 0x7d, 0x1a, 0x06, 0xeb, 0xee, 0x8e, 0x1b, 0x0a, 0x39, 0xda, + 0xa1, 0xf5, 0x76, 0xf1, 0xf7, 0x2d, 0x71, 0x32, 0x58, 0xd2, 0xb3, 0x7f, 0xba, 0x10, 0x0f, 0xdf, + 0xdb, 0x6d, 0x3f, 0x72, 0x8e, 0xe0, 0xd2, 0xbf, 0x62, 0x5c, 0xfa, 0x4f, 0x65, 0xaf, 0x09, 0xad, + 0x4b, 0xb9, 0x97, 0xfd, 0x8d, 0xc4, 0x65, 0xff, 0x74, 0x77, 0x52, 0x9d, 0x2f, 0xf9, 0xff, 0xd2, + 0x82, 0x29, 0x03, 0xff, 0x08, 0xee, 0x9a, 0x15, 0xf3, 0xae, 0x79, 0xbc, 0xeb, 0x37, 0xe4, 0xdc, + 0x31, 0x3f, 0x51, 0x4c, 0xf4, 0x9d, 0xdd, 0x2d, 0xef, 0x41, 0xdf, 0x96, 0x13, 0xd4, 0xc5, 0x13, + 0xfa, 0x62, 0x4f, 0x63, 0x3d, 0x77, 0xd5, 0x09, 0x84, 0x51, 0xc3, 0xf3, 0x72, 0xd4, 0x69, 0x51, + 0x57, 0x83, 0x06, 0xd6, 0x14, 0xba, 0x0c, 0x03, 0x61, 0xcd, 0x6f, 0x29, 0x97, 0x34, 0x96, 0xb9, + 0xba, 0xca, 0x4a, 0x0e, 0xf6, 0x4a, 0xc8, 0x6c, 0x8e, 0x16, 0x63, 0x81, 0x8f, 0xde, 0x81, 0x31, + 0xf6, 0x4b, 0x59, 0x18, 0x16, 0xf3, 0x85, 0x1d, 0x55, 0x1d, 0x91, 0x9b, 0xdf, 0x1a, 0x45, 0xd8, + 0x24, 0x35, 0xbb, 0x09, 0xc3, 0xea, 0xb3, 0x1e, 0xa9, 0x62, 0xfc, 0x7f, 0x2e, 0xc2, 0x74, 0xc6, + 0x9a, 0x43, 0xa1, 0x31, 0x13, 0x97, 0x7a, 0x5c, 0xaa, 0xef, 0x73, 0x2e, 0x42, 0xf6, 0xd6, 0xaa, + 0x8b, 0xb5, 0xd5, 0x73, 0xa3, 0x37, 0x43, 0x92, 0x6c, 0x94, 0x16, 0x75, 0x6f, 0x94, 0x36, 0x76, + 0x64, 0x43, 0x4d, 0x1b, 0x52, 0x3d, 0x7d, 0xa4, 0x73, 0xfa, 0x07, 0x7d, 0x70, 0x2c, 0x2b, 0x5c, + 0x33, 0xfa, 0x62, 0x22, 0x57, 0xff, 0xcb, 0x9d, 0x46, 0x58, 0xaf, 0xc9, 0x13, 0xf8, 0x8b, 0x28, + 0xa9, 0x73, 0x66, 0xf6, 0xfe, 0xae, 0xc3, 0x2c, 0xda, 0x64, 0xd1, 0x8b, 0xc4, 0x45, 0x25, 0x8f, + 0x8f, 0x8f, 0xf5, 0xdc, 0x01, 0x71, 0xd5, 0x85, 0x09, 0xeb, 0x25, 0x59, 0xdc, 0xdd, 0x7a, 0x49, + 0xb6, 0x8c, 0xca, 0x30, 0x50, 0xe3, 0x66, 0x31, 0xc5, 0xee, 0x47, 0x18, 0xb7, 0x89, 0x51, 0x07, + 0xb0, 0xb0, 0x85, 0x11, 0x04, 0x66, 0x5d, 0x18, 0xd1, 0x06, 0xe6, 0x91, 0x2e, 0x9e, 0x6d, 0x7a, + 0xf1, 0x69, 0x43, 0xf0, 0x48, 0x17, 0xd0, 0xcf, 0x59, 0x90, 0xf0, 0xfa, 0x51, 0xf2, 0x3b, 0x2b, + 0x57, 0x7e, 0x77, 0x0e, 0xfa, 0x02, 0xbf, 0x41, 0x92, 0xb9, 0xd6, 0xb1, 0xdf, 0x20, 0x98, 0x41, + 0x28, 0x46, 0x14, 0x4b, 0x65, 0x46, 0xf5, 0x17, 0xa7, 0x78, 0x4b, 0x3e, 0x01, 0xfd, 0x0d, 0xb2, + 0x43, 0x1a, 0xc9, 0x94, 0x98, 0xd7, 0x69, 0x21, 0xe6, 0x30, 0xfb, 0xb7, 0xfa, 0xe0, 0x4c, 0xc7, + 0x50, 0x62, 0x94, 0x63, 0xda, 0x74, 0x22, 0x72, 0xd7, 0xd9, 0x4d, 0xa6, 0x82, 0xbb, 0xc2, 0x8b, + 0xb1, 0x84, 0x33, 0xef, 0x5a, 0x9e, 0x1a, 0x25, 0x21, 0xed, 0x14, 0x19, 0x51, 0x04, 0xd4, 0x94, + 0x9e, 0x15, 0x1f, 0x86, 0xf4, 0xec, 0x45, 0x80, 0x30, 0x6c, 0x70, 0x0b, 0xc2, 0xba, 0x70, 0xdb, + 0x8d, 0x53, 0xe8, 0x54, 0xaf, 0x0b, 0x08, 0xd6, 0xb0, 0xd0, 0x12, 0x4c, 0xb6, 0x02, 0x3f, 0xe2, + 0xc2, 0xe3, 0x25, 0x6e, 0x64, 0xdb, 0x6f, 0x46, 0x71, 0xaa, 0x24, 0xe0, 0x38, 0x55, 0x03, 0xbd, + 0x02, 0x23, 0x22, 0xb2, 0x53, 0xc5, 0xf7, 0x1b, 0x42, 0x5e, 0xa5, 0xec, 0x4e, 0xab, 0x31, 0x08, + 0xeb, 0x78, 0x5a, 0x35, 0x26, 0x91, 0x1e, 0xcc, 0xac, 0xc6, 0xa5, 0xd2, 0x1a, 0x5e, 0x22, 0x0a, + 0xfc, 0x50, 0x4f, 0x51, 0xe0, 0x63, 0x09, 0xde, 0x70, 0xcf, 0x0a, 0x52, 0xe8, 0x2a, 0xf3, 0xfa, + 0x66, 0x1f, 0x4c, 0x8b, 0x85, 0xf3, 0xa8, 0x97, 0xcb, 0xcd, 0xf4, 0x72, 0x79, 0x18, 0x32, 0xbe, + 0x0f, 0xd7, 0xcc, 0x51, 0xaf, 0x99, 0x9f, 0xb1, 0xc0, 0xe4, 0xd4, 0xd0, 0xbf, 0x91, 0x9b, 0x4b, + 0xf3, 0x95, 0x5c, 0xce, 0x2f, 0x0e, 0x11, 0xfd, 0xfe, 0xb2, 0x6a, 0xda, 0xff, 0x8b, 0x05, 0x8f, + 0x77, 0xa5, 0x88, 0x96, 0x61, 0x98, 0xb1, 0x93, 0xda, 0x43, 0xef, 0x69, 0x65, 0x84, 0x2f, 0x01, + 0x39, 0xdc, 0x6d, 0x5c, 0x13, 0x2d, 0xa7, 0x92, 0x96, 0x3e, 0x93, 0x91, 0xb4, 0xf4, 0xb8, 0x31, + 0x3c, 0x0f, 0x98, 0xb5, 0xf4, 0xab, 0xf4, 0xc6, 0x31, 0x9d, 0xec, 0x3e, 0x66, 0xc8, 0x27, 0xed, + 0x84, 0x7c, 0x12, 0x99, 0xd8, 0xda, 0x1d, 0xf2, 0x49, 0x98, 0x64, 0x21, 0x1f, 0x99, 0x4b, 0x88, + 0xf0, 0xce, 0x2b, 0xc4, 0x66, 0xdf, 0xd7, 0x13, 0x30, 0x9c, 0xc2, 0xb6, 0xff, 0xa6, 0x08, 0x03, + 0x7c, 0xfb, 0x1d, 0xc1, 0xf3, 0xf2, 0x39, 0x18, 0x76, 0x9b, 0xcd, 0x36, 0xcf, 0x43, 0xd9, 0x1f, + 0x1b, 0x11, 0x97, 0x65, 0x21, 0x8e, 0xe1, 0x68, 0x45, 0x88, 0xc6, 0x3b, 0x44, 0x95, 0xe6, 0x1d, + 0x9f, 0x5b, 0x72, 0x22, 0x87, 0xf3, 0x4a, 0xea, 0x9e, 0x8d, 0x85, 0xe8, 0xe8, 0x73, 0x00, 0x61, + 0x14, 0xb8, 0xde, 0x26, 0x2d, 0x13, 0xa9, 0x07, 0x9e, 0xed, 0x40, 0xad, 0xaa, 0x90, 0x39, 0xcd, + 0xf8, 0xcc, 0x51, 0x00, 0xac, 0x51, 0x44, 0x73, 0xc6, 0x4d, 0x3f, 0x9b, 0x98, 0x3b, 0xe0, 0x54, + 0xe3, 0x39, 0x9b, 0x7d, 0x15, 0x86, 0x15, 0xf1, 0x6e, 0x82, 0xb2, 0x51, 0x9d, 0x2d, 0xfa, 0x04, + 0x4c, 0x24, 0xfa, 0x76, 0x28, 0x39, 0xdb, 0x6f, 0x5b, 0x30, 0xc1, 0x3b, 0xb3, 0xec, 0xed, 0x88, + 0xdb, 0xe0, 0x3e, 0x1c, 0x6b, 0x64, 0x9c, 0xca, 0x62, 0xfa, 0x7b, 0x3f, 0xc5, 0x95, 0x5c, 0x2d, + 0x0b, 0x8a, 0x33, 0xdb, 0x40, 0x17, 0xe8, 0x8e, 0xa3, 0xa7, 0xae, 0xd3, 0x10, 0xe1, 0x23, 0x46, + 0xf9, 0x6e, 0xe3, 0x65, 0x58, 0x41, 0xed, 0xbf, 0xb0, 0x60, 0x8a, 0xf7, 0xfc, 0x1a, 0xd9, 0x55, + 0x67, 0xd3, 0xf7, 0xb3, 0xef, 0x22, 0x03, 0x72, 0x21, 0x27, 0x03, 0xb2, 0xfe, 0x69, 0xc5, 0x8e, + 0x9f, 0xf6, 0x0d, 0x0b, 0xc4, 0x0a, 0x39, 0x02, 0x79, 0xc6, 0x8f, 0x98, 0xf2, 0x8c, 0xd9, 0xfc, + 0x4d, 0x90, 0x23, 0xc8, 0xf8, 0x27, 0x0b, 0x26, 0x39, 0x42, 0xac, 0xd6, 0xff, 0xbe, 0xce, 0xc3, + 0x82, 0xf9, 0x45, 0x99, 0x76, 0x9a, 0xd7, 0xc8, 0xee, 0xba, 0x5f, 0x71, 0xa2, 0xad, 0xec, 0x8f, + 0x32, 0x26, 0xab, 0xaf, 0xe3, 0x64, 0xd5, 0xe5, 0x06, 0x32, 0x32, 0xed, 0x75, 0x91, 0x68, 0x1e, + 0x36, 0xd3, 0x9e, 0xfd, 0xb7, 0x16, 0x20, 0xde, 0x8c, 0xc1, 0xb8, 0x51, 0x76, 0x88, 0x95, 0x6a, + 0x17, 0x5d, 0x7c, 0x34, 0x29, 0x08, 0xd6, 0xb0, 0x1e, 0xca, 0xf0, 0x24, 0x6c, 0x33, 0x8a, 0xdd, + 0x6d, 0x33, 0x0e, 0x31, 0xa2, 0xdf, 0x18, 0x84, 0xa4, 0x13, 0x20, 0xba, 0x05, 0xa3, 0x35, 0xa7, + 0xe5, 0xdc, 0x71, 0x1b, 0x6e, 0xe4, 0x92, 0xb0, 0x93, 0xe1, 0xd6, 0xa2, 0x86, 0x27, 0xb4, 0xe9, + 0x5a, 0x09, 0x36, 0xe8, 0xa0, 0x39, 0x80, 0x56, 0xe0, 0xee, 0xb8, 0x0d, 0xb2, 0xc9, 0xc4, 0x2e, + 0x2c, 0x60, 0x0d, 0xb7, 0x22, 0x93, 0xa5, 0x58, 0xc3, 0xc8, 0x88, 0x25, 0x51, 0x7c, 0xc4, 0xb1, + 0x24, 0xe0, 0xc8, 0x62, 0x49, 0xf4, 0x1d, 0x2a, 0x96, 0xc4, 0xd0, 0xa1, 0x63, 0x49, 0xf4, 0xf7, + 0x14, 0x4b, 0x02, 0xc3, 0x09, 0xc9, 0x7b, 0xd2, 0xff, 0x2b, 0x6e, 0x83, 0x88, 0x07, 0x07, 0x8f, + 0xb2, 0x33, 0xbb, 0xbf, 0x57, 0x3a, 0x81, 0x33, 0x31, 0x70, 0x4e, 0x4d, 0xf4, 0x29, 0x98, 0x71, + 0x1a, 0x0d, 0xff, 0xae, 0x9a, 0xd4, 0xe5, 0xb0, 0xe6, 0x34, 0xb8, 0xb6, 0x64, 0x90, 0x51, 0x3d, + 0xbd, 0xbf, 0x57, 0x9a, 0x99, 0xcf, 0xc1, 0xc1, 0xb9, 0xb5, 0xd1, 0x1b, 0x30, 0xdc, 0x0a, 0xfc, + 0xda, 0xaa, 0xe6, 0xa9, 0x7c, 0x96, 0x0e, 0x60, 0x45, 0x16, 0x1e, 0xec, 0x95, 0xc6, 0xd4, 0x1f, + 0x76, 0xe1, 0xc7, 0x15, 0x32, 0xc2, 0x34, 0x8c, 0x3c, 0xea, 0x30, 0x0d, 0xa3, 0x0f, 0x3b, 0x4c, + 0xc3, 0x36, 0x4c, 0x57, 0x49, 0xe0, 0x3a, 0x0d, 0xf7, 0x3e, 0xe5, 0xc9, 0xe5, 0x19, 0xb8, 0x0e, + 0xc3, 0x41, 0xe2, 0xd4, 0xef, 0x29, 0x9a, 0xb4, 0x96, 0x50, 0x4d, 0x9e, 0xf2, 0x31, 0x21, 0xfb, + 0xff, 0xb5, 0x60, 0x50, 0x38, 0x16, 0x1e, 0x01, 0x67, 0x3a, 0x6f, 0x28, 0x3e, 0x4a, 0xd9, 0x93, + 0xc2, 0x3a, 0x93, 0xab, 0xf2, 0x28, 0x27, 0x54, 0x1e, 0x8f, 0x77, 0x22, 0xd2, 0x59, 0xd9, 0xf1, + 0xef, 0x17, 0xe9, 0x0b, 0xc1, 0x70, 0x71, 0x7f, 0xf4, 0x43, 0xb0, 0x06, 0x83, 0xa1, 0x70, 0xb1, + 0x2e, 0xe4, 0x3b, 0xa7, 0x24, 0x27, 0x31, 0x36, 0xea, 0x13, 0x4e, 0xd5, 0x92, 0x48, 0xa6, 0xef, + 0x76, 0xf1, 0x11, 0xfa, 0x6e, 0x77, 0x0b, 0x02, 0xd0, 0xf7, 0x30, 0x82, 0x00, 0xd8, 0xdf, 0x66, + 0xb7, 0xb3, 0x5e, 0x7e, 0x04, 0x8c, 0xdb, 0x15, 0xf3, 0x1e, 0xb7, 0x3b, 0xac, 0x2c, 0xd1, 0xa9, + 0x1c, 0x06, 0xee, 0x37, 0x2d, 0x38, 0x93, 0xf1, 0x55, 0x1a, 0x37, 0xf7, 0x3c, 0x0c, 0x39, 0xed, + 0xba, 0xab, 0xf6, 0xb2, 0xa6, 0xfe, 0x9c, 0x17, 0xe5, 0x58, 0x61, 0xa0, 0x45, 0x98, 0x22, 0xf7, + 0x5a, 0x2e, 0xd7, 0x2b, 0xeb, 0xb6, 0xd0, 0x45, 0xee, 0x8d, 0xba, 0x9c, 0x04, 0xe2, 0x34, 0xbe, + 0x8a, 0xf1, 0x55, 0xcc, 0x8d, 0xf1, 0xf5, 0xeb, 0x16, 0x8c, 0x28, 0x27, 0xe3, 0x47, 0x3e, 0xda, + 0x9f, 0x34, 0x47, 0xfb, 0xb1, 0x0e, 0xa3, 0x9d, 0x33, 0xcc, 0x7f, 0x5e, 0x50, 0xfd, 0xad, 0xf8, + 0x41, 0xd4, 0x03, 0x97, 0xf8, 0xe0, 0x7e, 0x1c, 0x97, 0x60, 0xc4, 0x69, 0xb5, 0x24, 0x40, 0x1a, + 0xe4, 0xb1, 0xdc, 0x00, 0x71, 0x31, 0xd6, 0x71, 0x94, 0x5b, 0x49, 0x31, 0xd7, 0xad, 0xa4, 0x0e, + 0x10, 0x39, 0xc1, 0x26, 0x89, 0x68, 0x99, 0xb0, 0x1f, 0xce, 0x3f, 0x6f, 0xda, 0x91, 0xdb, 0x98, + 0x73, 0xbd, 0x28, 0x8c, 0x82, 0xb9, 0xb2, 0x17, 0xdd, 0x08, 0xf8, 0x33, 0x55, 0x8b, 0x92, 0xa7, + 0x68, 0x61, 0x8d, 0xae, 0x0c, 0xa8, 0xc1, 0xda, 0xe8, 0x37, 0x2d, 0x3b, 0xd6, 0x44, 0x39, 0x56, + 0x18, 0xf6, 0xab, 0xec, 0xf6, 0x61, 0x63, 0x7a, 0xb8, 0x08, 0x71, 0x7f, 0x37, 0xaa, 0x66, 0x83, + 0x29, 0x5e, 0x97, 0xf4, 0x38, 0x74, 0x9d, 0x0f, 0x7b, 0xda, 0xb0, 0xee, 0xa0, 0x19, 0x07, 0xab, + 0x43, 0x9f, 0x49, 0x59, 0xeb, 0xbc, 0xd0, 0xe5, 0xd6, 0x38, 0x84, 0x7d, 0x0e, 0x4b, 0x14, 0xc6, + 0xd2, 0x28, 0x95, 0x2b, 0x62, 0x5f, 0x68, 0x89, 0xc2, 0x04, 0x00, 0xc7, 0x38, 0x94, 0x61, 0x53, + 0x7f, 0xc2, 0x19, 0x14, 0xc7, 0x93, 0x56, 0xd8, 0x21, 0xd6, 0x30, 0xd0, 0x45, 0x21, 0xb4, 0xe0, + 0xba, 0x87, 0xc7, 0x12, 0x42, 0x0b, 0x39, 0x5c, 0x9a, 0xa4, 0xe9, 0x12, 0x8c, 0x90, 0x7b, 0x11, + 0x09, 0x3c, 0xa7, 0x41, 0x5b, 0xe8, 0x8f, 0x43, 0xa0, 0x2e, 0xc7, 0xc5, 0x58, 0xc7, 0x41, 0xeb, + 0x30, 0x11, 0x72, 0x59, 0x9e, 0xca, 0x62, 0xc0, 0x65, 0xa2, 0xcf, 0x2a, 0xf7, 0x6e, 0x13, 0x7c, + 0xc0, 0x8a, 0xf8, 0xe9, 0x24, 0x83, 0x5e, 0x24, 0x49, 0xa0, 0x37, 0x61, 0xbc, 0xe1, 0x3b, 0xf5, + 0x05, 0xa7, 0xe1, 0x78, 0x35, 0x36, 0x3e, 0x43, 0x66, 0xba, 0xf9, 0xeb, 0x06, 0x14, 0x27, 0xb0, + 0x29, 0x83, 0xa8, 0x97, 0x88, 0xcc, 0x1b, 0x8e, 0xb7, 0x49, 0xc2, 0x99, 0x61, 0xf6, 0x55, 0x8c, + 0x41, 0xbc, 0x9e, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0xcb, 0x30, 0x2a, 0x3f, 0x5f, 0x8b, 0x11, 0x13, + 0x7b, 0xe8, 0x68, 0x30, 0x6c, 0x60, 0xa2, 0x10, 0x8e, 0xcb, 0xff, 0xeb, 0x81, 0xb3, 0xb1, 0xe1, + 0xd6, 0x44, 0xe0, 0x04, 0xee, 0xcd, 0xfc, 0x09, 0xe9, 0x3a, 0xb9, 0x9c, 0x85, 0x74, 0xb0, 0x57, + 0x3a, 0x2d, 0x46, 0x2d, 0x13, 0x8e, 0xb3, 0x69, 0xa3, 0x55, 0x98, 0xde, 0x22, 0x4e, 0x23, 0xda, + 0x5a, 0xdc, 0x22, 0xb5, 0x6d, 0xb9, 0xe1, 0x18, 0xd7, 0xa8, 0x79, 0xb2, 0x5c, 0x4d, 0xa3, 0xe0, + 0xac, 0x7a, 0xe8, 0x5d, 0x98, 0x69, 0xb5, 0xef, 0x34, 0xdc, 0x70, 0x6b, 0xcd, 0x8f, 0x98, 0x4d, + 0xd4, 0x7c, 0xbd, 0x1e, 0x90, 0x90, 0x3b, 0xbb, 0xb2, 0xab, 0x57, 0xc6, 0xf5, 0xa9, 0xe4, 0xe0, + 0xe1, 0x5c, 0x0a, 0xe8, 0x3e, 0x1c, 0x4f, 0x2c, 0x04, 0x11, 0xa0, 0x63, 0x3c, 0x3f, 0x87, 0x51, + 0x35, 0xab, 0x82, 0x88, 0x75, 0x93, 0x05, 0xc2, 0xd9, 0x4d, 0xa0, 0xd7, 0x00, 0xdc, 0xd6, 0x8a, + 0xd3, 0x74, 0x1b, 0xf4, 0x39, 0x3a, 0xcd, 0xd6, 0x08, 0x7d, 0x9a, 0x40, 0xb9, 0x22, 0x4b, 0xe9, + 0xd9, 0x2c, 0xfe, 0xed, 0x62, 0x0d, 0x1b, 0x5d, 0x87, 0x71, 0xf1, 0x6f, 0x57, 0x4c, 0xe9, 0x94, + 0x4a, 0x77, 0x39, 0x2e, 0x6b, 0xa8, 0x79, 0x4c, 0x94, 0xe0, 0x44, 0x5d, 0xb4, 0x09, 0x67, 0x64, + 0xae, 0x4d, 0x7d, 0x7d, 0xca, 0x39, 0x08, 0x59, 0xe2, 0xa0, 0x21, 0xee, 0x24, 0x33, 0xdf, 0x09, + 0x11, 0x77, 0xa6, 0x43, 0xef, 0x75, 0x7d, 0x99, 0x73, 0x17, 0xe8, 0xe3, 0x71, 0x68, 0xc7, 0xeb, + 0x49, 0x20, 0x4e, 0xe3, 0x23, 0x1f, 0x8e, 0xbb, 0x5e, 0xd6, 0xaa, 0x3e, 0xc1, 0x08, 0x7d, 0x9c, + 0x7b, 0x7f, 0x77, 0x5e, 0xd1, 0x99, 0x70, 0x9c, 0x4d, 0x17, 0x95, 0x61, 0x3a, 0xe2, 0x05, 0x4b, + 0x6e, 0xc8, 0xf3, 0x92, 0xd0, 0x67, 0xdf, 0x49, 0xd6, 0xdc, 0x49, 0xba, 0x9a, 0xd7, 0xd3, 0x60, + 0x9c, 0x55, 0xe7, 0xfd, 0x59, 0x34, 0x7e, 0xc7, 0xa2, 0xb5, 0x35, 0x46, 0x1f, 0x7d, 0x1e, 0x46, + 0xf5, 0xf1, 0x11, 0x4c, 0xcb, 0xf9, 0x6c, 0x3e, 0x58, 0x3b, 0x5e, 0xf8, 0x33, 0x41, 0x1d, 0x21, + 0x3a, 0x0c, 0x1b, 0x14, 0x51, 0x2d, 0x23, 0x6a, 0xc3, 0xc5, 0xde, 0x98, 0xa2, 0xde, 0x0d, 0xfa, + 0x08, 0x64, 0xef, 0x1c, 0x74, 0x1d, 0x86, 0x6a, 0x0d, 0x97, 0x78, 0x51, 0xb9, 0xd2, 0x29, 0xe2, + 0xe6, 0xa2, 0xc0, 0x11, 0x5b, 0x51, 0xa4, 0x13, 0xe2, 0x65, 0x58, 0x51, 0xb0, 0x2f, 0xc3, 0x48, + 0xb5, 0x41, 0x48, 0x8b, 0x3b, 0x26, 0xa1, 0x67, 0xd8, 0xc3, 0x84, 0xb1, 0x96, 0x16, 0x63, 0x2d, + 0xf5, 0x37, 0x07, 0x63, 0x2a, 0x25, 0xdc, 0xfe, 0xa3, 0x02, 0x94, 0xba, 0x64, 0xb5, 0x4a, 0xe8, + 0xdb, 0xac, 0x9e, 0xf4, 0x6d, 0xf3, 0x30, 0x11, 0xff, 0xd3, 0x45, 0x79, 0xca, 0xba, 0xf7, 0x96, + 0x09, 0xc6, 0x49, 0xfc, 0x9e, 0x1d, 0x35, 0x74, 0x95, 0x5d, 0x5f, 0x57, 0x57, 0x23, 0x43, 0x55, + 0xdf, 0xdf, 0xfb, 0xdb, 0x3b, 0x57, 0xed, 0x6a, 0x7f, 0xbb, 0x00, 0xc7, 0xd5, 0x10, 0xfe, 0xf0, + 0x0e, 0xdc, 0xcd, 0xf4, 0xc0, 0x3d, 0x04, 0xa5, 0xb5, 0x7d, 0x03, 0x06, 0x78, 0x18, 0xd0, 0x1e, + 0x78, 0xfe, 0x27, 0xcc, 0x68, 0xeb, 0x8a, 0xcd, 0x34, 0x22, 0xae, 0xff, 0xa4, 0x05, 0x13, 0x09, + 0x8f, 0x3f, 0x84, 0x35, 0xb7, 0xf0, 0x07, 0xe1, 0xcb, 0xb3, 0x38, 0xfe, 0x73, 0xd0, 0xb7, 0xe5, + 0x2b, 0xab, 0x5b, 0x85, 0x71, 0xd5, 0x0f, 0x23, 0xcc, 0x20, 0xf6, 0x5f, 0x5a, 0xd0, 0xbf, 0xee, + 0xb8, 0x5e, 0x24, 0xb5, 0x1f, 0x56, 0x8e, 0xf6, 0xa3, 0x97, 0xef, 0x42, 0xaf, 0xc0, 0x00, 0xd9, + 0xd8, 0x20, 0xb5, 0x48, 0xcc, 0xaa, 0x0c, 0x0f, 0x31, 0xb0, 0xcc, 0x4a, 0x29, 0x13, 0xca, 0x1a, + 0xe3, 0x7f, 0xb1, 0x40, 0x46, 0xb7, 0x61, 0x38, 0x72, 0x9b, 0x64, 0xbe, 0x5e, 0x17, 0x36, 0x01, + 0x0f, 0x10, 0xd3, 0x64, 0x5d, 0x12, 0xc0, 0x31, 0x2d, 0xfb, 0x6b, 0x05, 0x80, 0x38, 0xb6, 0x59, + 0xb7, 0x4f, 0x5c, 0x48, 0x69, 0x8b, 0xcf, 0x67, 0x68, 0x8b, 0x51, 0x4c, 0x30, 0x43, 0x55, 0xac, + 0x86, 0xa9, 0xd8, 0xd3, 0x30, 0xf5, 0x1d, 0x66, 0x98, 0x16, 0x61, 0x2a, 0x8e, 0xcd, 0x66, 0x86, + 0xa6, 0x64, 0xf7, 0xf7, 0x7a, 0x12, 0x88, 0xd3, 0xf8, 0x36, 0x81, 0x73, 0x2a, 0x44, 0x95, 0xb8, + 0x0b, 0x99, 0x6d, 0xbc, 0xae, 0x7d, 0xef, 0x32, 0x4e, 0xb1, 0x3a, 0xbc, 0x90, 0xab, 0x0e, 0xff, + 0x45, 0x0b, 0x8e, 0x25, 0xdb, 0x61, 0x8e, 0xe4, 0x5f, 0xb1, 0xe0, 0x78, 0x9c, 0xd4, 0x25, 0x6d, + 0x82, 0xf0, 0x72, 0xc7, 0xb0, 0x5b, 0x39, 0x3d, 0x8e, 0xe3, 0x90, 0xac, 0x66, 0x91, 0xc6, 0xd9, + 0x2d, 0xda, 0xff, 0x4f, 0x1f, 0xcc, 0xe4, 0xc5, 0xeb, 0x62, 0xae, 0x33, 0xce, 0xbd, 0xea, 0x36, + 0xb9, 0x2b, 0x1c, 0x14, 0x62, 0xd7, 0x19, 0x5e, 0x8c, 0x25, 0x3c, 0x99, 0xc7, 0xa7, 0xd0, 0x63, + 0x1e, 0x9f, 0x2d, 0x98, 0xba, 0xbb, 0x45, 0xbc, 0x9b, 0x5e, 0xe8, 0x44, 0x6e, 0xb8, 0xe1, 0x32, + 0x05, 0x3a, 0x5f, 0x37, 0x32, 0x17, 0xfd, 0xd4, 0xed, 0x24, 0xc2, 0xc1, 0x5e, 0xe9, 0x8c, 0x51, + 0x10, 0x77, 0x99, 0x1f, 0x24, 0x38, 0x4d, 0x34, 0x9d, 0x06, 0xa9, 0xef, 0x11, 0xa7, 0x41, 0x6a, + 0xba, 0xc2, 0xec, 0x46, 0xfa, 0x45, 0xb0, 0x67, 0xeb, 0xaa, 0x2a, 0xc5, 0x1a, 0x06, 0xfa, 0x2c, + 0x20, 0x3d, 0x8f, 0x9d, 0x11, 0x2e, 0xf5, 0x85, 0xfd, 0xbd, 0x12, 0x5a, 0x4b, 0x41, 0x0f, 0xf6, + 0x4a, 0xd3, 0xb4, 0xb4, 0xec, 0xd1, 0xe7, 0x6f, 0x1c, 0x63, 0x2e, 0x83, 0x10, 0xba, 0x0d, 0x93, + 0xb4, 0x94, 0xed, 0x28, 0x19, 0x8b, 0x95, 0x3f, 0x59, 0x9f, 0xdb, 0xdf, 0x2b, 0x4d, 0xae, 0x25, + 0x60, 0x79, 0xa4, 0x53, 0x44, 0x32, 0xb2, 0x21, 0x0d, 0xf5, 0x9a, 0x0d, 0xc9, 0xfe, 0x8a, 0x05, + 0xa7, 0xe8, 0x05, 0x57, 0xbf, 0x9e, 0xa3, 0x45, 0x77, 0x5a, 0x2e, 0xd7, 0xd3, 0x88, 0xab, 0x86, + 0xc9, 0xea, 0x2a, 0x65, 0xae, 0xa5, 0x51, 0x50, 0x7a, 0xc2, 0x6f, 0xbb, 0x5e, 0x3d, 0x79, 0xc2, + 0x5f, 0x73, 0xbd, 0x3a, 0x66, 0x10, 0x75, 0x65, 0x15, 0x73, 0xc3, 0xae, 0x7f, 0x93, 0xee, 0x55, + 0xda, 0x97, 0xef, 0x6b, 0x37, 0xd0, 0x73, 0xba, 0x4e, 0x55, 0x98, 0x4f, 0xe6, 0xea, 0x53, 0xbf, + 0x6c, 0x81, 0x70, 0xe7, 0xee, 0xe1, 0x4e, 0x7e, 0x07, 0x46, 0x77, 0xd2, 0x39, 0x3e, 0xcf, 0xe5, + 0xfb, 0xb7, 0x8b, 0xcc, 0x9e, 0x8a, 0x45, 0x37, 0xf2, 0x79, 0x1a, 0xb4, 0xec, 0x3a, 0x08, 0xe8, + 0x12, 0x61, 0x5a, 0x8d, 0xee, 0xbd, 0x79, 0x11, 0xa0, 0xce, 0x70, 0x59, 0xe2, 0xef, 0x82, 0xc9, + 0x71, 0x2d, 0x29, 0x08, 0xd6, 0xb0, 0xec, 0x5f, 0x2d, 0xc2, 0x88, 0xcc, 0x29, 0xd9, 0xf6, 0x7a, + 0x91, 0x3d, 0x1e, 0x2a, 0xc9, 0x3c, 0x7a, 0x17, 0xa6, 0x02, 0x52, 0x6b, 0x07, 0xa1, 0xbb, 0x43, + 0x24, 0x58, 0x6c, 0x92, 0x39, 0x1e, 0xf5, 0x3f, 0x01, 0x3c, 0x60, 0x31, 0x9f, 0x12, 0x85, 0x4c, + 0x69, 0x9c, 0x26, 0x84, 0x2e, 0xc2, 0x30, 0x13, 0xbd, 0x57, 0x62, 0x81, 0xb0, 0x12, 0x7c, 0xad, + 0x4a, 0x00, 0x8e, 0x71, 0xd8, 0xe3, 0xa0, 0x7d, 0x87, 0xa1, 0x27, 0x5c, 0x9b, 0xab, 0xbc, 0x18, + 0x4b, 0x38, 0xfa, 0x14, 0x4c, 0xf2, 0x7a, 0x81, 0xdf, 0x72, 0x36, 0xb9, 0x4a, 0xb0, 0x5f, 0xc5, + 0x8b, 0x99, 0x5c, 0x4d, 0xc0, 0x0e, 0xf6, 0x4a, 0xc7, 0x92, 0x65, 0xac, 0xdb, 0x29, 0x2a, 0xcc, + 0xf2, 0x8f, 0x37, 0x42, 0xef, 0x8c, 0x94, 0xc1, 0x60, 0x0c, 0xc2, 0x3a, 0x9e, 0xfd, 0x8f, 0x16, + 0x4c, 0x69, 0x53, 0xd5, 0x73, 0xe2, 0x05, 0x63, 0x90, 0x0a, 0x3d, 0x0c, 0xd2, 0xe1, 0xc2, 0x17, + 0x64, 0xce, 0x70, 0xdf, 0x43, 0x9a, 0x61, 0xfb, 0xf3, 0x80, 0xd2, 0x09, 0x4b, 0xd1, 0x5b, 0xdc, + 0x5c, 0xde, 0x0d, 0x48, 0xbd, 0x93, 0xc2, 0x5f, 0x0f, 0x05, 0x23, 0x5d, 0x31, 0x79, 0x2d, 0xac, + 0xea, 0xdb, 0x3f, 0xd5, 0x07, 0x93, 0xc9, 0xe0, 0x13, 0xe8, 0x2a, 0x0c, 0x70, 0x2e, 0x5d, 0x90, + 0xef, 0x60, 0x4f, 0xa6, 0x85, 0xac, 0x60, 0xfc, 0x8a, 0x60, 0xf4, 0x45, 0x7d, 0xf4, 0x2e, 0x8c, + 0xd4, 0xfd, 0xbb, 0xde, 0x5d, 0x27, 0xa8, 0xcf, 0x57, 0xca, 0xe2, 0x84, 0xc8, 0x14, 0x40, 0x2d, + 0xc5, 0x68, 0x7a, 0x18, 0x0c, 0x66, 0x3b, 0x11, 0x83, 0xb0, 0x4e, 0x0e, 0xad, 0xb3, 0x1c, 0x3c, + 0x1b, 0xee, 0xe6, 0xaa, 0xd3, 0xea, 0xe4, 0x3b, 0xb5, 0x28, 0x91, 0x34, 0xca, 0x63, 0x22, 0x51, + 0x0f, 0x07, 0xe0, 0x98, 0x10, 0xfa, 0x22, 0x4c, 0x87, 0x39, 0x2a, 0xb1, 0xbc, 0xfc, 0xd5, 0x9d, + 0xb4, 0x44, 0x5c, 0x98, 0x92, 0xa5, 0x3c, 0xcb, 0x6a, 0x06, 0xdd, 0x03, 0x24, 0x44, 0xcf, 0xeb, + 0x41, 0x3b, 0x8c, 0x16, 0xda, 0x5e, 0xbd, 0x21, 0x73, 0xf4, 0x64, 0x67, 0xb8, 0x4f, 0x61, 0x6b, + 0x6d, 0xb3, 0x60, 0xb4, 0x69, 0x0c, 0x9c, 0xd1, 0x86, 0xfd, 0xe5, 0x3e, 0x98, 0x95, 0x19, 0x82, + 0x33, 0x7c, 0x44, 0xbe, 0x64, 0x25, 0x9c, 0x44, 0x5e, 0xcb, 0x3f, 0xe8, 0x1f, 0x99, 0xab, 0xc8, + 0x57, 0xd3, 0xae, 0x22, 0x6f, 0x1c, 0xb2, 0x1b, 0x0f, 0xcd, 0x61, 0xe4, 0x87, 0xd6, 0xcb, 0x63, + 0xff, 0x18, 0x18, 0x57, 0x33, 0xc2, 0x3c, 0xd2, 0x77, 0x45, 0xaa, 0x8e, 0x72, 0x9e, 0xff, 0x57, + 0x05, 0x8e, 0x71, 0xd9, 0x8f, 0xca, 0x78, 0xe0, 0xec, 0x9c, 0x55, 0x74, 0x28, 0x4d, 0xd2, 0x6c, + 0x45, 0xbb, 0x4b, 0x6e, 0x20, 0x7a, 0x9c, 0x49, 0x73, 0x59, 0xe0, 0xa4, 0x69, 0x4a, 0x08, 0x56, + 0x74, 0xd0, 0x0e, 0x4c, 0x6d, 0xb2, 0x10, 0x46, 0x7a, 0x52, 0xfd, 0x62, 0xfe, 0xbe, 0xbd, 0xb2, + 0xb8, 0xdc, 0x21, 0xa3, 0x3e, 0x7b, 0xfc, 0xa5, 0x50, 0x70, 0xba, 0x09, 0x96, 0xd0, 0xdf, 0xb9, + 0x1b, 0x2e, 0x37, 0x9c, 0x30, 0x72, 0x6b, 0x0b, 0x0d, 0xbf, 0xb6, 0x5d, 0x8d, 0xfc, 0x40, 0x66, + 0xf4, 0xcb, 0x7c, 0x7b, 0xcd, 0xdf, 0xae, 0xa6, 0xf0, 0xd3, 0x09, 0xfd, 0xb3, 0xb0, 0x70, 0x66, + 0x5b, 0x68, 0x0d, 0x06, 0x37, 0xdd, 0x08, 0x93, 0x96, 0x2f, 0x4e, 0x8b, 0xcc, 0xa3, 0xf0, 0x0a, + 0x47, 0x49, 0x27, 0xd8, 0x17, 0x00, 0x2c, 0x89, 0xa0, 0xb7, 0xd4, 0x25, 0x30, 0x90, 0x2f, 0x80, + 0x4d, 0xdb, 0xde, 0x65, 0x5e, 0x03, 0x6f, 0x42, 0xd1, 0xdb, 0x08, 0x3b, 0x05, 0x97, 0x59, 0x5b, + 0xa9, 0xa6, 0x13, 0xdf, 0xaf, 0xad, 0x54, 0x31, 0xad, 0xc8, 0x9c, 0x4b, 0xc3, 0x5a, 0xe8, 0x8a, + 0x0c, 0x42, 0x99, 0xbe, 0xb6, 0xe5, 0xea, 0x62, 0xb5, 0x9c, 0x4e, 0xf6, 0xcf, 0x8a, 0x31, 0xaf, + 0x8e, 0x6e, 0xc1, 0xf0, 0x26, 0x3f, 0xf8, 0x36, 0x42, 0x91, 0x25, 0x3c, 0xf3, 0x32, 0xba, 0x22, + 0x91, 0xd2, 0x29, 0xfe, 0x15, 0x08, 0xc7, 0xa4, 0xd0, 0x97, 0x2d, 0x38, 0x9e, 0x4c, 0xb3, 0xce, + 0x5c, 0xc2, 0x84, 0x99, 0xda, 0x2b, 0xbd, 0xe4, 0xbd, 0x67, 0x15, 0x8c, 0x06, 0x99, 0xfa, 0x25, + 0x13, 0x0d, 0x67, 0x37, 0x47, 0x07, 0x3a, 0xb8, 0x53, 0xef, 0x94, 0x74, 0x26, 0x11, 0x69, 0x87, + 0x0f, 0x34, 0x5e, 0x58, 0xc2, 0xb4, 0x22, 0x5a, 0x07, 0xd8, 0x68, 0x10, 0x11, 0xc2, 0x50, 0x18, + 0x45, 0x65, 0xde, 0xfe, 0x2b, 0x0a, 0x4b, 0xd0, 0x61, 0x2f, 0xd1, 0xb8, 0x14, 0x6b, 0x74, 0xe8, + 0x52, 0xaa, 0xb9, 0x5e, 0x9d, 0x04, 0x4c, 0xb9, 0x95, 0xb3, 0x94, 0x16, 0x19, 0x46, 0x7a, 0x29, + 0xf1, 0x72, 0x2c, 0x28, 0x30, 0x5a, 0xa4, 0xb5, 0xb5, 0x11, 0x76, 0xca, 0xa1, 0xb0, 0x48, 0x5a, + 0x5b, 0x89, 0x05, 0xc5, 0x69, 0xb1, 0x72, 0x2c, 0x28, 0xd0, 0x2d, 0xb3, 0x41, 0x37, 0x10, 0x09, + 0x66, 0x26, 0xf2, 0xb7, 0xcc, 0x0a, 0x47, 0x49, 0x6f, 0x19, 0x01, 0xc0, 0x92, 0x08, 0xfa, 0x9c, + 0xc9, 0xed, 0x4c, 0x32, 0x9a, 0xcf, 0x75, 0xe1, 0x76, 0x0c, 0xba, 0x9d, 0xf9, 0x9d, 0xd7, 0xa0, + 0xb0, 0x51, 0x63, 0x4a, 0xb1, 0x1c, 0x9d, 0xc1, 0xca, 0xa2, 0x41, 0x8d, 0xc5, 0x24, 0x5f, 0x59, + 0xc4, 0x85, 0x8d, 0x1a, 0x5d, 0xfa, 0xce, 0xfd, 0x76, 0x40, 0x56, 0xdc, 0x06, 0x11, 0xf9, 0x14, + 0x32, 0x97, 0xfe, 0xbc, 0x44, 0x4a, 0x2f, 0x7d, 0x05, 0xc2, 0x31, 0x29, 0x4a, 0x37, 0xe6, 0xc1, + 0xa6, 0xf3, 0xe9, 0x2a, 0x56, 0x2b, 0x4d, 0x37, 0x93, 0x0b, 0xdb, 0x86, 0xb1, 0x9d, 0xb0, 0xb5, + 0x45, 0xe4, 0xa9, 0xc8, 0xd4, 0x75, 0x39, 0xa1, 0x17, 0x6e, 0x09, 0x44, 0x37, 0x88, 0xda, 0x4e, + 0x23, 0x75, 0x90, 0x33, 0xd1, 0xca, 0x2d, 0x9d, 0x18, 0x36, 0x69, 0xd3, 0x85, 0xf0, 0x1e, 0x8f, + 0x8f, 0xc6, 0x14, 0x77, 0x39, 0x0b, 0x21, 0x23, 0x84, 0x1a, 0x5f, 0x08, 0x02, 0x80, 0x25, 0x11, + 0x35, 0xd8, 0xec, 0x02, 0x3a, 0xd1, 0x65, 0xb0, 0x53, 0xfd, 0x8d, 0x07, 0x9b, 0x5d, 0x38, 0x31, + 0x29, 0x76, 0xd1, 0xb4, 0x32, 0x32, 0xd2, 0x33, 0xb5, 0x5d, 0xce, 0x45, 0xd3, 0x2d, 0x83, 0x3d, + 0xbf, 0x68, 0xb2, 0xb0, 0x70, 0x66, 0x5b, 0xf4, 0xe3, 0x5a, 0x32, 0xd4, 0x9d, 0xc8, 0xf9, 0xf0, + 0x4c, 0x4e, 0xa4, 0xc8, 0x74, 0x3c, 0x3c, 0xfe, 0x71, 0x0a, 0x84, 0x63, 0x52, 0xa8, 0x0e, 0xe3, + 0x2d, 0x23, 0x84, 0x2a, 0xcb, 0x5d, 0x91, 0xc3, 0x17, 0x64, 0x05, 0x5b, 0xe5, 0x12, 0x22, 0x13, + 0x82, 0x13, 0x34, 0x99, 0xe5, 0x1e, 0x77, 0xf5, 0x63, 0xa9, 0x2d, 0x72, 0xa6, 0x3a, 0xc3, 0x1b, + 0x90, 0x4f, 0xb5, 0x00, 0x60, 0x49, 0x84, 0x8e, 0x86, 0x70, 0x50, 0xf3, 0x43, 0x96, 0x21, 0x26, + 0x4f, 0xc1, 0x9e, 0xa5, 0x26, 0x92, 0x71, 0xc3, 0x05, 0x08, 0xc7, 0xa4, 0xe8, 0x49, 0x4e, 0x2f, + 0xbc, 0xd3, 0xf9, 0x27, 0x79, 0xf2, 0xba, 0x63, 0x27, 0x39, 0xbd, 0xec, 0x8a, 0xe2, 0xaa, 0x53, + 0x61, 0xae, 0x59, 0x76, 0x8b, 0x9c, 0x7e, 0xa9, 0x38, 0xd9, 0xe9, 0x7e, 0x29, 0x10, 0x8e, 0x49, + 0xb1, 0xab, 0x98, 0xc5, 0x5a, 0x3b, 0xdb, 0xe1, 0x2a, 0xa6, 0x08, 0x19, 0x57, 0xb1, 0x16, 0x8b, + 0xcd, 0xfe, 0xa9, 0x02, 0x9c, 0xed, 0xbc, 0x6f, 0x63, 0x1d, 0x5a, 0x25, 0xb6, 0x59, 0x4a, 0xe8, + 0xd0, 0xb8, 0x44, 0x27, 0xc6, 0xea, 0x39, 0x82, 0xee, 0x15, 0x98, 0x52, 0xee, 0x88, 0x0d, 0xb7, + 0xb6, 0xab, 0x65, 0x9b, 0x54, 0xb1, 0x66, 0xaa, 0x49, 0x04, 0x9c, 0xae, 0x83, 0xe6, 0x61, 0xc2, + 0x28, 0x2c, 0x2f, 0x89, 0xe7, 0x7f, 0x9c, 0x97, 0xc1, 0x04, 0xe3, 0x24, 0xbe, 0xfd, 0x6b, 0x16, + 0x9c, 0xcc, 0x49, 0x2c, 0xde, 0x73, 0x80, 0xd8, 0x0d, 0x98, 0x68, 0x99, 0x55, 0xbb, 0xc4, 0xb4, + 0x36, 0xd2, 0x97, 0xab, 0xbe, 0x26, 0x00, 0x38, 0x49, 0xd4, 0xfe, 0x95, 0x02, 0x9c, 0xe9, 0x68, + 0x5f, 0x8f, 0x30, 0x9c, 0xd8, 0x6c, 0x86, 0xce, 0x62, 0x40, 0xea, 0xc4, 0x8b, 0x5c, 0xa7, 0x51, + 0x6d, 0x91, 0x9a, 0xa6, 0x05, 0x65, 0x86, 0xea, 0x57, 0x56, 0xab, 0xf3, 0x69, 0x0c, 0x9c, 0x53, + 0x13, 0xad, 0x00, 0x4a, 0x43, 0xc4, 0x0c, 0xb3, 0x27, 0x6e, 0x9a, 0x1e, 0xce, 0xa8, 0x81, 0x5e, + 0x85, 0x31, 0x65, 0xb7, 0xaf, 0xcd, 0x38, 0xbb, 0x20, 0xb0, 0x0e, 0xc0, 0x26, 0x1e, 0xba, 0xc4, + 0x13, 0xf6, 0x88, 0xd4, 0x4e, 0x42, 0x65, 0x3a, 0x21, 0xb3, 0xf1, 0x88, 0x62, 0xac, 0xe3, 0x2c, + 0x5c, 0xfe, 0xe3, 0xef, 0x9d, 0xfd, 0xc8, 0x9f, 0x7d, 0xef, 0xec, 0x47, 0xfe, 0xe2, 0x7b, 0x67, + 0x3f, 0xf2, 0xaf, 0xf6, 0xcf, 0x5a, 0x7f, 0xbc, 0x7f, 0xd6, 0xfa, 0xb3, 0xfd, 0xb3, 0xd6, 0x5f, + 0xec, 0x9f, 0xb5, 0xfe, 0xf7, 0xfd, 0xb3, 0xd6, 0xd7, 0xfe, 0xfa, 0xec, 0x47, 0xde, 0x41, 0x71, + 0xc8, 0xe5, 0x8b, 0x74, 0x76, 0x2e, 0xee, 0x5c, 0xfa, 0xd7, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdd, + 0x69, 0x81, 0x32, 0x11, 0x22, 0x01, 0x00, } func (m *AWSElasticBlockStoreVolumeSource) Marshal() (dAtA []byte, err error) { @@ -18123,6 +18124,11 @@ func (m *ResourceClaim) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.Request) + copy(dAtA[i:], m.Request) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Request))) + i-- + dAtA[i] = 0x12 i -= len(m.Name) copy(dAtA[i:], m.Name) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) @@ -25357,6 +25363,8 @@ func (m *ResourceClaim) Size() (n int) { _ = l l = len(m.Name) n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Request) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -29483,6 +29491,7 @@ func (this *ResourceClaim) String() string { } s := strings.Join([]string{`&ResourceClaim{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Request:` + fmt.Sprintf("%v", this.Request) + `,`, `}`, }, "") return s @@ -63483,6 +63492,38 @@ func (m *ResourceClaim) Unmarshal(dAtA []byte) error { } m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", 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.Request = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 17c4e9a94a3..0beb7fed7b8 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -5001,6 +5001,13 @@ message ResourceClaim { // the Pod where this field is used. It makes that resource available // inside a container. optional string name = 1; + + // Request is the name chosen for a request in the referenced claim. + // If empty, everything from the claim is made available, otherwise + // only the result of this request. + // + // +optional + optional string request = 2; } // ResourceFieldSelector represents container resources (cpu, memory) and their output format diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index b1656046e06..2f151acaae5 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -2665,6 +2665,13 @@ type ResourceClaim struct { // the Pod where this field is used. It makes that resource available // inside a container. Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + + // Request is the name chosen for a request in the referenced claim. + // If empty, everything from the claim is made available, otherwise + // only the result of this request. + // + // +optional + Request string `json:"request,omitempty" protobuf:"bytes,2,opt,name=request"` } const ( diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index bb2e9ae5d62..2321de99446 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -2103,8 +2103,9 @@ func (ReplicationControllerStatus) SwaggerDoc() map[string]string { } var map_ResourceClaim = map[string]string{ - "": "ResourceClaim references one entry in PodSpec.ResourceClaims.", - "name": "Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.", + "": "ResourceClaim references one entry in PodSpec.ResourceClaims.", + "name": "Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.", + "request": "Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request.", } func (ResourceClaim) SwaggerDoc() map[string]string { 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 0589b6acdaf..68eca062421 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/generated.pb.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/generated.pb.go @@ -25,6 +25,7 @@ import ( io "io" proto "github.com/gogo/protobuf/proto" + github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" v1 "k8s.io/api/core/v1" resource "k8s.io/apimachinery/pkg/api/resource" @@ -75,15 +76,15 @@ func (m *AllocationResult) XXX_DiscardUnknown() { var xxx_messageInfo_AllocationResult proto.InternalMessageInfo -func (m *AllocationResultModel) Reset() { *m = AllocationResultModel{} } -func (*AllocationResultModel) ProtoMessage() {} -func (*AllocationResultModel) Descriptor() ([]byte, []int) { +func (m *BasicDevice) Reset() { *m = BasicDevice{} } +func (*BasicDevice) ProtoMessage() {} +func (*BasicDevice) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{1} } -func (m *AllocationResultModel) XXX_Unmarshal(b []byte) error { +func (m *BasicDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *AllocationResultModel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *BasicDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -91,27 +92,27 @@ func (m *AllocationResultModel) XXX_Marshal(b []byte, deterministic bool) ([]byt } return b[:n], nil } -func (m *AllocationResultModel) XXX_Merge(src proto.Message) { - xxx_messageInfo_AllocationResultModel.Merge(m, src) +func (m *BasicDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_BasicDevice.Merge(m, src) } -func (m *AllocationResultModel) XXX_Size() int { +func (m *BasicDevice) XXX_Size() int { return m.Size() } -func (m *AllocationResultModel) XXX_DiscardUnknown() { - xxx_messageInfo_AllocationResultModel.DiscardUnknown(m) +func (m *BasicDevice) XXX_DiscardUnknown() { + xxx_messageInfo_BasicDevice.DiscardUnknown(m) } -var xxx_messageInfo_AllocationResultModel proto.InternalMessageInfo +var xxx_messageInfo_BasicDevice proto.InternalMessageInfo -func (m *DriverAllocationResult) Reset() { *m = DriverAllocationResult{} } -func (*DriverAllocationResult) ProtoMessage() {} -func (*DriverAllocationResult) Descriptor() ([]byte, []int) { +func (m *CELDeviceSelector) Reset() { *m = CELDeviceSelector{} } +func (*CELDeviceSelector) ProtoMessage() {} +func (*CELDeviceSelector) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{2} } -func (m *DriverAllocationResult) XXX_Unmarshal(b []byte) error { +func (m *CELDeviceSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DriverAllocationResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *CELDeviceSelector) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -119,27 +120,27 @@ func (m *DriverAllocationResult) XXX_Marshal(b []byte, deterministic bool) ([]by } return b[:n], nil } -func (m *DriverAllocationResult) XXX_Merge(src proto.Message) { - xxx_messageInfo_DriverAllocationResult.Merge(m, src) +func (m *CELDeviceSelector) XXX_Merge(src proto.Message) { + xxx_messageInfo_CELDeviceSelector.Merge(m, src) } -func (m *DriverAllocationResult) XXX_Size() int { +func (m *CELDeviceSelector) XXX_Size() int { return m.Size() } -func (m *DriverAllocationResult) XXX_DiscardUnknown() { - xxx_messageInfo_DriverAllocationResult.DiscardUnknown(m) +func (m *CELDeviceSelector) XXX_DiscardUnknown() { + xxx_messageInfo_CELDeviceSelector.DiscardUnknown(m) } -var xxx_messageInfo_DriverAllocationResult proto.InternalMessageInfo +var xxx_messageInfo_CELDeviceSelector proto.InternalMessageInfo -func (m *DriverRequests) Reset() { *m = DriverRequests{} } -func (*DriverRequests) ProtoMessage() {} -func (*DriverRequests) Descriptor() ([]byte, []int) { +func (m *Device) Reset() { *m = Device{} } +func (*Device) ProtoMessage() {} +func (*Device) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{3} } -func (m *DriverRequests) XXX_Unmarshal(b []byte) error { +func (m *Device) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DriverRequests) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Device) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -147,27 +148,27 @@ func (m *DriverRequests) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro } return b[:n], nil } -func (m *DriverRequests) XXX_Merge(src proto.Message) { - xxx_messageInfo_DriverRequests.Merge(m, src) +func (m *Device) XXX_Merge(src proto.Message) { + xxx_messageInfo_Device.Merge(m, src) } -func (m *DriverRequests) XXX_Size() int { +func (m *Device) XXX_Size() int { return m.Size() } -func (m *DriverRequests) XXX_DiscardUnknown() { - xxx_messageInfo_DriverRequests.DiscardUnknown(m) +func (m *Device) XXX_DiscardUnknown() { + xxx_messageInfo_Device.DiscardUnknown(m) } -var xxx_messageInfo_DriverRequests proto.InternalMessageInfo +var xxx_messageInfo_Device proto.InternalMessageInfo -func (m *NamedResourcesAllocationResult) Reset() { *m = NamedResourcesAllocationResult{} } -func (*NamedResourcesAllocationResult) ProtoMessage() {} -func (*NamedResourcesAllocationResult) Descriptor() ([]byte, []int) { +func (m *DeviceAllocationConfiguration) Reset() { *m = DeviceAllocationConfiguration{} } +func (*DeviceAllocationConfiguration) ProtoMessage() {} +func (*DeviceAllocationConfiguration) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{4} } -func (m *NamedResourcesAllocationResult) XXX_Unmarshal(b []byte) error { +func (m *DeviceAllocationConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *NamedResourcesAllocationResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DeviceAllocationConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -175,27 +176,27 @@ func (m *NamedResourcesAllocationResult) XXX_Marshal(b []byte, deterministic boo } return b[:n], nil } -func (m *NamedResourcesAllocationResult) XXX_Merge(src proto.Message) { - xxx_messageInfo_NamedResourcesAllocationResult.Merge(m, src) +func (m *DeviceAllocationConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceAllocationConfiguration.Merge(m, src) } -func (m *NamedResourcesAllocationResult) XXX_Size() int { +func (m *DeviceAllocationConfiguration) XXX_Size() int { return m.Size() } -func (m *NamedResourcesAllocationResult) XXX_DiscardUnknown() { - xxx_messageInfo_NamedResourcesAllocationResult.DiscardUnknown(m) +func (m *DeviceAllocationConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceAllocationConfiguration.DiscardUnknown(m) } -var xxx_messageInfo_NamedResourcesAllocationResult proto.InternalMessageInfo +var xxx_messageInfo_DeviceAllocationConfiguration proto.InternalMessageInfo -func (m *NamedResourcesAttribute) Reset() { *m = NamedResourcesAttribute{} } -func (*NamedResourcesAttribute) ProtoMessage() {} -func (*NamedResourcesAttribute) Descriptor() ([]byte, []int) { +func (m *DeviceAllocationResult) Reset() { *m = DeviceAllocationResult{} } +func (*DeviceAllocationResult) ProtoMessage() {} +func (*DeviceAllocationResult) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{5} } -func (m *NamedResourcesAttribute) XXX_Unmarshal(b []byte) error { +func (m *DeviceAllocationResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *NamedResourcesAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DeviceAllocationResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -203,27 +204,27 @@ func (m *NamedResourcesAttribute) XXX_Marshal(b []byte, deterministic bool) ([]b } return b[:n], nil } -func (m *NamedResourcesAttribute) XXX_Merge(src proto.Message) { - xxx_messageInfo_NamedResourcesAttribute.Merge(m, src) +func (m *DeviceAllocationResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceAllocationResult.Merge(m, src) } -func (m *NamedResourcesAttribute) XXX_Size() int { +func (m *DeviceAllocationResult) XXX_Size() int { return m.Size() } -func (m *NamedResourcesAttribute) XXX_DiscardUnknown() { - xxx_messageInfo_NamedResourcesAttribute.DiscardUnknown(m) +func (m *DeviceAllocationResult) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceAllocationResult.DiscardUnknown(m) } -var xxx_messageInfo_NamedResourcesAttribute proto.InternalMessageInfo +var xxx_messageInfo_DeviceAllocationResult proto.InternalMessageInfo -func (m *NamedResourcesAttributeValue) Reset() { *m = NamedResourcesAttributeValue{} } -func (*NamedResourcesAttributeValue) ProtoMessage() {} -func (*NamedResourcesAttributeValue) Descriptor() ([]byte, []int) { +func (m *DeviceAttribute) Reset() { *m = DeviceAttribute{} } +func (*DeviceAttribute) ProtoMessage() {} +func (*DeviceAttribute) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{6} } -func (m *NamedResourcesAttributeValue) XXX_Unmarshal(b []byte) error { +func (m *DeviceAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *NamedResourcesAttributeValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DeviceAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -231,27 +232,27 @@ func (m *NamedResourcesAttributeValue) XXX_Marshal(b []byte, deterministic bool) } return b[:n], nil } -func (m *NamedResourcesAttributeValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_NamedResourcesAttributeValue.Merge(m, src) +func (m *DeviceAttribute) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceAttribute.Merge(m, src) } -func (m *NamedResourcesAttributeValue) XXX_Size() int { +func (m *DeviceAttribute) XXX_Size() int { return m.Size() } -func (m *NamedResourcesAttributeValue) XXX_DiscardUnknown() { - xxx_messageInfo_NamedResourcesAttributeValue.DiscardUnknown(m) +func (m *DeviceAttribute) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceAttribute.DiscardUnknown(m) } -var xxx_messageInfo_NamedResourcesAttributeValue proto.InternalMessageInfo +var xxx_messageInfo_DeviceAttribute proto.InternalMessageInfo -func (m *NamedResourcesFilter) Reset() { *m = NamedResourcesFilter{} } -func (*NamedResourcesFilter) ProtoMessage() {} -func (*NamedResourcesFilter) Descriptor() ([]byte, []int) { +func (m *DeviceClaim) Reset() { *m = DeviceClaim{} } +func (*DeviceClaim) ProtoMessage() {} +func (*DeviceClaim) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{7} } -func (m *NamedResourcesFilter) XXX_Unmarshal(b []byte) error { +func (m *DeviceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *NamedResourcesFilter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DeviceClaim) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -259,27 +260,27 @@ func (m *NamedResourcesFilter) XXX_Marshal(b []byte, deterministic bool) ([]byte } return b[:n], nil } -func (m *NamedResourcesFilter) XXX_Merge(src proto.Message) { - xxx_messageInfo_NamedResourcesFilter.Merge(m, src) +func (m *DeviceClaim) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClaim.Merge(m, src) } -func (m *NamedResourcesFilter) XXX_Size() int { +func (m *DeviceClaim) XXX_Size() int { return m.Size() } -func (m *NamedResourcesFilter) XXX_DiscardUnknown() { - xxx_messageInfo_NamedResourcesFilter.DiscardUnknown(m) +func (m *DeviceClaim) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClaim.DiscardUnknown(m) } -var xxx_messageInfo_NamedResourcesFilter proto.InternalMessageInfo +var xxx_messageInfo_DeviceClaim proto.InternalMessageInfo -func (m *NamedResourcesInstance) Reset() { *m = NamedResourcesInstance{} } -func (*NamedResourcesInstance) ProtoMessage() {} -func (*NamedResourcesInstance) Descriptor() ([]byte, []int) { +func (m *DeviceClaimConfiguration) Reset() { *m = DeviceClaimConfiguration{} } +func (*DeviceClaimConfiguration) ProtoMessage() {} +func (*DeviceClaimConfiguration) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{8} } -func (m *NamedResourcesInstance) XXX_Unmarshal(b []byte) error { +func (m *DeviceClaimConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *NamedResourcesInstance) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DeviceClaimConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -287,27 +288,27 @@ func (m *NamedResourcesInstance) XXX_Marshal(b []byte, deterministic bool) ([]by } return b[:n], nil } -func (m *NamedResourcesInstance) XXX_Merge(src proto.Message) { - xxx_messageInfo_NamedResourcesInstance.Merge(m, src) +func (m *DeviceClaimConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClaimConfiguration.Merge(m, src) } -func (m *NamedResourcesInstance) XXX_Size() int { +func (m *DeviceClaimConfiguration) XXX_Size() int { return m.Size() } -func (m *NamedResourcesInstance) XXX_DiscardUnknown() { - xxx_messageInfo_NamedResourcesInstance.DiscardUnknown(m) +func (m *DeviceClaimConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClaimConfiguration.DiscardUnknown(m) } -var xxx_messageInfo_NamedResourcesInstance proto.InternalMessageInfo +var xxx_messageInfo_DeviceClaimConfiguration proto.InternalMessageInfo -func (m *NamedResourcesIntSlice) Reset() { *m = NamedResourcesIntSlice{} } -func (*NamedResourcesIntSlice) ProtoMessage() {} -func (*NamedResourcesIntSlice) Descriptor() ([]byte, []int) { +func (m *DeviceClass) Reset() { *m = DeviceClass{} } +func (*DeviceClass) ProtoMessage() {} +func (*DeviceClass) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{9} } -func (m *NamedResourcesIntSlice) XXX_Unmarshal(b []byte) error { +func (m *DeviceClass) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *NamedResourcesIntSlice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DeviceClass) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -315,27 +316,27 @@ func (m *NamedResourcesIntSlice) XXX_Marshal(b []byte, deterministic bool) ([]by } return b[:n], nil } -func (m *NamedResourcesIntSlice) XXX_Merge(src proto.Message) { - xxx_messageInfo_NamedResourcesIntSlice.Merge(m, src) +func (m *DeviceClass) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClass.Merge(m, src) } -func (m *NamedResourcesIntSlice) XXX_Size() int { +func (m *DeviceClass) XXX_Size() int { return m.Size() } -func (m *NamedResourcesIntSlice) XXX_DiscardUnknown() { - xxx_messageInfo_NamedResourcesIntSlice.DiscardUnknown(m) +func (m *DeviceClass) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClass.DiscardUnknown(m) } -var xxx_messageInfo_NamedResourcesIntSlice proto.InternalMessageInfo +var xxx_messageInfo_DeviceClass proto.InternalMessageInfo -func (m *NamedResourcesRequest) Reset() { *m = NamedResourcesRequest{} } -func (*NamedResourcesRequest) ProtoMessage() {} -func (*NamedResourcesRequest) Descriptor() ([]byte, []int) { +func (m *DeviceClassConfiguration) Reset() { *m = DeviceClassConfiguration{} } +func (*DeviceClassConfiguration) ProtoMessage() {} +func (*DeviceClassConfiguration) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{10} } -func (m *NamedResourcesRequest) XXX_Unmarshal(b []byte) error { +func (m *DeviceClassConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *NamedResourcesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DeviceClassConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -343,27 +344,27 @@ func (m *NamedResourcesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt } return b[:n], nil } -func (m *NamedResourcesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NamedResourcesRequest.Merge(m, src) +func (m *DeviceClassConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClassConfiguration.Merge(m, src) } -func (m *NamedResourcesRequest) XXX_Size() int { +func (m *DeviceClassConfiguration) XXX_Size() int { return m.Size() } -func (m *NamedResourcesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NamedResourcesRequest.DiscardUnknown(m) +func (m *DeviceClassConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClassConfiguration.DiscardUnknown(m) } -var xxx_messageInfo_NamedResourcesRequest proto.InternalMessageInfo +var xxx_messageInfo_DeviceClassConfiguration proto.InternalMessageInfo -func (m *NamedResourcesResources) Reset() { *m = NamedResourcesResources{} } -func (*NamedResourcesResources) ProtoMessage() {} -func (*NamedResourcesResources) Descriptor() ([]byte, []int) { +func (m *DeviceClassList) Reset() { *m = DeviceClassList{} } +func (*DeviceClassList) ProtoMessage() {} +func (*DeviceClassList) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{11} } -func (m *NamedResourcesResources) XXX_Unmarshal(b []byte) error { +func (m *DeviceClassList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *NamedResourcesResources) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DeviceClassList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -371,27 +372,27 @@ func (m *NamedResourcesResources) XXX_Marshal(b []byte, deterministic bool) ([]b } return b[:n], nil } -func (m *NamedResourcesResources) XXX_Merge(src proto.Message) { - xxx_messageInfo_NamedResourcesResources.Merge(m, src) +func (m *DeviceClassList) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClassList.Merge(m, src) } -func (m *NamedResourcesResources) XXX_Size() int { +func (m *DeviceClassList) XXX_Size() int { return m.Size() } -func (m *NamedResourcesResources) XXX_DiscardUnknown() { - xxx_messageInfo_NamedResourcesResources.DiscardUnknown(m) +func (m *DeviceClassList) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClassList.DiscardUnknown(m) } -var xxx_messageInfo_NamedResourcesResources proto.InternalMessageInfo +var xxx_messageInfo_DeviceClassList proto.InternalMessageInfo -func (m *NamedResourcesStringSlice) Reset() { *m = NamedResourcesStringSlice{} } -func (*NamedResourcesStringSlice) ProtoMessage() {} -func (*NamedResourcesStringSlice) Descriptor() ([]byte, []int) { +func (m *DeviceClassSpec) Reset() { *m = DeviceClassSpec{} } +func (*DeviceClassSpec) ProtoMessage() {} +func (*DeviceClassSpec) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{12} } -func (m *NamedResourcesStringSlice) XXX_Unmarshal(b []byte) error { +func (m *DeviceClassSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *NamedResourcesStringSlice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DeviceClassSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -399,22 +400,190 @@ func (m *NamedResourcesStringSlice) XXX_Marshal(b []byte, deterministic bool) ([ } return b[:n], nil } -func (m *NamedResourcesStringSlice) XXX_Merge(src proto.Message) { - xxx_messageInfo_NamedResourcesStringSlice.Merge(m, src) +func (m *DeviceClassSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClassSpec.Merge(m, src) } -func (m *NamedResourcesStringSlice) XXX_Size() int { +func (m *DeviceClassSpec) XXX_Size() int { return m.Size() } -func (m *NamedResourcesStringSlice) XXX_DiscardUnknown() { - xxx_messageInfo_NamedResourcesStringSlice.DiscardUnknown(m) +func (m *DeviceClassSpec) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClassSpec.DiscardUnknown(m) } -var xxx_messageInfo_NamedResourcesStringSlice proto.InternalMessageInfo +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} +} +func (m *DeviceConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceConfiguration) 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 *DeviceConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceConfiguration.Merge(m, src) +} +func (m *DeviceConfiguration) XXX_Size() int { + return m.Size() +} +func (m *DeviceConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceConfiguration.DiscardUnknown(m) +} + +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} +} +func (m *DeviceConstraint) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceConstraint) 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 *DeviceConstraint) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceConstraint.Merge(m, src) +} +func (m *DeviceConstraint) XXX_Size() int { + return m.Size() +} +func (m *DeviceConstraint) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceConstraint.DiscardUnknown(m) +} + +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} +} +func (m *DeviceRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceRequest) 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 *DeviceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceRequest.Merge(m, src) +} +func (m *DeviceRequest) XXX_Size() int { + return m.Size() +} +func (m *DeviceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceRequest.DiscardUnknown(m) +} + +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} +} +func (m *DeviceRequestAllocationResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceRequestAllocationResult) 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 *DeviceRequestAllocationResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceRequestAllocationResult.Merge(m, src) +} +func (m *DeviceRequestAllocationResult) XXX_Size() int { + return m.Size() +} +func (m *DeviceRequestAllocationResult) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceRequestAllocationResult.DiscardUnknown(m) +} + +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} +} +func (m *DeviceSelector) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceSelector) 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 *DeviceSelector) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceSelector.Merge(m, src) +} +func (m *DeviceSelector) XXX_Size() int { + return m.Size() +} +func (m *DeviceSelector) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceSelector.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceSelector proto.InternalMessageInfo + +func (m *OpaqueDeviceConfiguration) Reset() { *m = OpaqueDeviceConfiguration{} } +func (*OpaqueDeviceConfiguration) ProtoMessage() {} +func (*OpaqueDeviceConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_66649ee9bbcd89d2, []int{18} +} +func (m *OpaqueDeviceConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *OpaqueDeviceConfiguration) 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 *OpaqueDeviceConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_OpaqueDeviceConfiguration.Merge(m, src) +} +func (m *OpaqueDeviceConfiguration) XXX_Size() int { + return m.Size() +} +func (m *OpaqueDeviceConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_OpaqueDeviceConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_OpaqueDeviceConfiguration proto.InternalMessageInfo func (m *PodSchedulingContext) Reset() { *m = PodSchedulingContext{} } func (*PodSchedulingContext) ProtoMessage() {} func (*PodSchedulingContext) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{13} + return fileDescriptor_66649ee9bbcd89d2, []int{19} } func (m *PodSchedulingContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -442,7 +611,7 @@ var xxx_messageInfo_PodSchedulingContext proto.InternalMessageInfo func (m *PodSchedulingContextList) Reset() { *m = PodSchedulingContextList{} } func (*PodSchedulingContextList) ProtoMessage() {} func (*PodSchedulingContextList) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{14} + return fileDescriptor_66649ee9bbcd89d2, []int{20} } func (m *PodSchedulingContextList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -470,7 +639,7 @@ var xxx_messageInfo_PodSchedulingContextList proto.InternalMessageInfo func (m *PodSchedulingContextSpec) Reset() { *m = PodSchedulingContextSpec{} } func (*PodSchedulingContextSpec) ProtoMessage() {} func (*PodSchedulingContextSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{15} + return fileDescriptor_66649ee9bbcd89d2, []int{21} } func (m *PodSchedulingContextSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -498,7 +667,7 @@ var xxx_messageInfo_PodSchedulingContextSpec proto.InternalMessageInfo func (m *PodSchedulingContextStatus) Reset() { *m = PodSchedulingContextStatus{} } func (*PodSchedulingContextStatus) ProtoMessage() {} func (*PodSchedulingContextStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{16} + return fileDescriptor_66649ee9bbcd89d2, []int{22} } func (m *PodSchedulingContextStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -526,7 +695,7 @@ var xxx_messageInfo_PodSchedulingContextStatus proto.InternalMessageInfo func (m *ResourceClaim) Reset() { *m = ResourceClaim{} } func (*ResourceClaim) ProtoMessage() {} func (*ResourceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{17} + return fileDescriptor_66649ee9bbcd89d2, []int{23} } func (m *ResourceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -554,7 +723,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{18} + return fileDescriptor_66649ee9bbcd89d2, []int{24} } func (m *ResourceClaimConsumerReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -582,7 +751,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{19} + return fileDescriptor_66649ee9bbcd89d2, []int{25} } func (m *ResourceClaimList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -607,94 +776,10 @@ func (m *ResourceClaimList) XXX_DiscardUnknown() { var xxx_messageInfo_ResourceClaimList proto.InternalMessageInfo -func (m *ResourceClaimParameters) Reset() { *m = ResourceClaimParameters{} } -func (*ResourceClaimParameters) ProtoMessage() {} -func (*ResourceClaimParameters) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{20} -} -func (m *ResourceClaimParameters) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceClaimParameters) 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 *ResourceClaimParameters) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceClaimParameters.Merge(m, src) -} -func (m *ResourceClaimParameters) XXX_Size() int { - return m.Size() -} -func (m *ResourceClaimParameters) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceClaimParameters.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceClaimParameters proto.InternalMessageInfo - -func (m *ResourceClaimParametersList) Reset() { *m = ResourceClaimParametersList{} } -func (*ResourceClaimParametersList) ProtoMessage() {} -func (*ResourceClaimParametersList) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{21} -} -func (m *ResourceClaimParametersList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceClaimParametersList) 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 *ResourceClaimParametersList) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceClaimParametersList.Merge(m, src) -} -func (m *ResourceClaimParametersList) XXX_Size() int { - return m.Size() -} -func (m *ResourceClaimParametersList) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceClaimParametersList.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceClaimParametersList proto.InternalMessageInfo - -func (m *ResourceClaimParametersReference) Reset() { *m = ResourceClaimParametersReference{} } -func (*ResourceClaimParametersReference) ProtoMessage() {} -func (*ResourceClaimParametersReference) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{22} -} -func (m *ResourceClaimParametersReference) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceClaimParametersReference) 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 *ResourceClaimParametersReference) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceClaimParametersReference.Merge(m, src) -} -func (m *ResourceClaimParametersReference) XXX_Size() int { - return m.Size() -} -func (m *ResourceClaimParametersReference) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceClaimParametersReference.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceClaimParametersReference proto.InternalMessageInfo - func (m *ResourceClaimSchedulingStatus) Reset() { *m = ResourceClaimSchedulingStatus{} } func (*ResourceClaimSchedulingStatus) ProtoMessage() {} func (*ResourceClaimSchedulingStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{23} + return fileDescriptor_66649ee9bbcd89d2, []int{26} } func (m *ResourceClaimSchedulingStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -722,7 +807,7 @@ var xxx_messageInfo_ResourceClaimSchedulingStatus proto.InternalMessageInfo func (m *ResourceClaimSpec) Reset() { *m = ResourceClaimSpec{} } func (*ResourceClaimSpec) ProtoMessage() {} func (*ResourceClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{24} + return fileDescriptor_66649ee9bbcd89d2, []int{27} } func (m *ResourceClaimSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -750,7 +835,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{25} + return fileDescriptor_66649ee9bbcd89d2, []int{28} } func (m *ResourceClaimStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -778,7 +863,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{26} + return fileDescriptor_66649ee9bbcd89d2, []int{29} } func (m *ResourceClaimTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -806,7 +891,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{27} + return fileDescriptor_66649ee9bbcd89d2, []int{30} } func (m *ResourceClaimTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -834,7 +919,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{28} + return fileDescriptor_66649ee9bbcd89d2, []int{31} } func (m *ResourceClaimTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -859,99 +944,15 @@ func (m *ResourceClaimTemplateSpec) XXX_DiscardUnknown() { var xxx_messageInfo_ResourceClaimTemplateSpec proto.InternalMessageInfo -func (m *ResourceClass) Reset() { *m = ResourceClass{} } -func (*ResourceClass) ProtoMessage() {} -func (*ResourceClass) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{29} -} -func (m *ResourceClass) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceClass) 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 *ResourceClass) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceClass.Merge(m, src) -} -func (m *ResourceClass) XXX_Size() int { - return m.Size() -} -func (m *ResourceClass) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceClass.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceClass proto.InternalMessageInfo - -func (m *ResourceClassList) Reset() { *m = ResourceClassList{} } -func (*ResourceClassList) ProtoMessage() {} -func (*ResourceClassList) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{30} -} -func (m *ResourceClassList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceClassList) 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 *ResourceClassList) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceClassList.Merge(m, src) -} -func (m *ResourceClassList) XXX_Size() int { - return m.Size() -} -func (m *ResourceClassList) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceClassList.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceClassList proto.InternalMessageInfo - -func (m *ResourceClassParameters) Reset() { *m = ResourceClassParameters{} } -func (*ResourceClassParameters) ProtoMessage() {} -func (*ResourceClassParameters) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{31} -} -func (m *ResourceClassParameters) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceClassParameters) 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 *ResourceClassParameters) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceClassParameters.Merge(m, src) -} -func (m *ResourceClassParameters) XXX_Size() int { - return m.Size() -} -func (m *ResourceClassParameters) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceClassParameters.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceClassParameters proto.InternalMessageInfo - -func (m *ResourceClassParametersList) Reset() { *m = ResourceClassParametersList{} } -func (*ResourceClassParametersList) ProtoMessage() {} -func (*ResourceClassParametersList) Descriptor() ([]byte, []int) { +func (m *ResourcePool) Reset() { *m = ResourcePool{} } +func (*ResourcePool) ProtoMessage() {} +func (*ResourcePool) Descriptor() ([]byte, []int) { return fileDescriptor_66649ee9bbcd89d2, []int{32} } -func (m *ResourceClassParametersList) XXX_Unmarshal(b []byte) error { +func (m *ResourcePool) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResourceClassParametersList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResourcePool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -959,218 +960,22 @@ func (m *ResourceClassParametersList) XXX_Marshal(b []byte, deterministic bool) } return b[:n], nil } -func (m *ResourceClassParametersList) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceClassParametersList.Merge(m, src) +func (m *ResourcePool) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourcePool.Merge(m, src) } -func (m *ResourceClassParametersList) XXX_Size() int { +func (m *ResourcePool) XXX_Size() int { return m.Size() } -func (m *ResourceClassParametersList) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceClassParametersList.DiscardUnknown(m) +func (m *ResourcePool) XXX_DiscardUnknown() { + xxx_messageInfo_ResourcePool.DiscardUnknown(m) } -var xxx_messageInfo_ResourceClassParametersList proto.InternalMessageInfo - -func (m *ResourceClassParametersReference) Reset() { *m = ResourceClassParametersReference{} } -func (*ResourceClassParametersReference) ProtoMessage() {} -func (*ResourceClassParametersReference) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{33} -} -func (m *ResourceClassParametersReference) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceClassParametersReference) 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 *ResourceClassParametersReference) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceClassParametersReference.Merge(m, src) -} -func (m *ResourceClassParametersReference) XXX_Size() int { - return m.Size() -} -func (m *ResourceClassParametersReference) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceClassParametersReference.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceClassParametersReference proto.InternalMessageInfo - -func (m *ResourceFilter) Reset() { *m = ResourceFilter{} } -func (*ResourceFilter) ProtoMessage() {} -func (*ResourceFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{34} -} -func (m *ResourceFilter) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceFilter) 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 *ResourceFilter) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceFilter.Merge(m, src) -} -func (m *ResourceFilter) XXX_Size() int { - return m.Size() -} -func (m *ResourceFilter) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceFilter.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceFilter proto.InternalMessageInfo - -func (m *ResourceFilterModel) Reset() { *m = ResourceFilterModel{} } -func (*ResourceFilterModel) ProtoMessage() {} -func (*ResourceFilterModel) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{35} -} -func (m *ResourceFilterModel) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceFilterModel) 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 *ResourceFilterModel) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceFilterModel.Merge(m, src) -} -func (m *ResourceFilterModel) XXX_Size() int { - return m.Size() -} -func (m *ResourceFilterModel) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceFilterModel.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceFilterModel proto.InternalMessageInfo - -func (m *ResourceHandle) Reset() { *m = ResourceHandle{} } -func (*ResourceHandle) ProtoMessage() {} -func (*ResourceHandle) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{36} -} -func (m *ResourceHandle) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceHandle) 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 *ResourceHandle) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceHandle.Merge(m, src) -} -func (m *ResourceHandle) XXX_Size() int { - return m.Size() -} -func (m *ResourceHandle) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceHandle.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceHandle proto.InternalMessageInfo - -func (m *ResourceModel) Reset() { *m = ResourceModel{} } -func (*ResourceModel) ProtoMessage() {} -func (*ResourceModel) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{37} -} -func (m *ResourceModel) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceModel) 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 *ResourceModel) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceModel.Merge(m, src) -} -func (m *ResourceModel) XXX_Size() int { - return m.Size() -} -func (m *ResourceModel) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceModel.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceModel proto.InternalMessageInfo - -func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } -func (*ResourceRequest) ProtoMessage() {} -func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{38} -} -func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceRequest) 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 *ResourceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceRequest.Merge(m, src) -} -func (m *ResourceRequest) XXX_Size() int { - return m.Size() -} -func (m *ResourceRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceRequest proto.InternalMessageInfo - -func (m *ResourceRequestModel) Reset() { *m = ResourceRequestModel{} } -func (*ResourceRequestModel) ProtoMessage() {} -func (*ResourceRequestModel) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{39} -} -func (m *ResourceRequestModel) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResourceRequestModel) 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 *ResourceRequestModel) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceRequestModel.Merge(m, src) -} -func (m *ResourceRequestModel) XXX_Size() int { - return m.Size() -} -func (m *ResourceRequestModel) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceRequestModel.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceRequestModel proto.InternalMessageInfo +var xxx_messageInfo_ResourcePool proto.InternalMessageInfo func (m *ResourceSlice) Reset() { *m = ResourceSlice{} } func (*ResourceSlice) ProtoMessage() {} func (*ResourceSlice) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{40} + return fileDescriptor_66649ee9bbcd89d2, []int{33} } func (m *ResourceSlice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1198,7 +1003,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{41} + return fileDescriptor_66649ee9bbcd89d2, []int{34} } func (m *ResourceSliceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1223,15 +1028,15 @@ func (m *ResourceSliceList) XXX_DiscardUnknown() { var xxx_messageInfo_ResourceSliceList proto.InternalMessageInfo -func (m *StructuredResourceHandle) Reset() { *m = StructuredResourceHandle{} } -func (*StructuredResourceHandle) ProtoMessage() {} -func (*StructuredResourceHandle) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{42} +func (m *ResourceSliceSpec) Reset() { *m = ResourceSliceSpec{} } +func (*ResourceSliceSpec) ProtoMessage() {} +func (*ResourceSliceSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_66649ee9bbcd89d2, []int{35} } -func (m *StructuredResourceHandle) XXX_Unmarshal(b []byte) error { +func (m *ResourceSliceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *StructuredResourceHandle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResourceSliceSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -1239,60 +1044,40 @@ func (m *StructuredResourceHandle) XXX_Marshal(b []byte, deterministic bool) ([] } return b[:n], nil } -func (m *StructuredResourceHandle) XXX_Merge(src proto.Message) { - xxx_messageInfo_StructuredResourceHandle.Merge(m, src) +func (m *ResourceSliceSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceSliceSpec.Merge(m, src) } -func (m *StructuredResourceHandle) XXX_Size() int { +func (m *ResourceSliceSpec) XXX_Size() int { return m.Size() } -func (m *StructuredResourceHandle) XXX_DiscardUnknown() { - xxx_messageInfo_StructuredResourceHandle.DiscardUnknown(m) +func (m *ResourceSliceSpec) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceSliceSpec.DiscardUnknown(m) } -var xxx_messageInfo_StructuredResourceHandle proto.InternalMessageInfo - -func (m *VendorParameters) Reset() { *m = VendorParameters{} } -func (*VendorParameters) ProtoMessage() {} -func (*VendorParameters) Descriptor() ([]byte, []int) { - return fileDescriptor_66649ee9bbcd89d2, []int{43} -} -func (m *VendorParameters) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *VendorParameters) 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 *VendorParameters) XXX_Merge(src proto.Message) { - xxx_messageInfo_VendorParameters.Merge(m, src) -} -func (m *VendorParameters) XXX_Size() int { - return m.Size() -} -func (m *VendorParameters) XXX_DiscardUnknown() { - xxx_messageInfo_VendorParameters.DiscardUnknown(m) -} - -var xxx_messageInfo_VendorParameters proto.InternalMessageInfo +var xxx_messageInfo_ResourceSliceSpec proto.InternalMessageInfo func init() { proto.RegisterType((*AllocationResult)(nil), "k8s.io.api.resource.v1alpha3.AllocationResult") - proto.RegisterType((*AllocationResultModel)(nil), "k8s.io.api.resource.v1alpha3.AllocationResultModel") - proto.RegisterType((*DriverAllocationResult)(nil), "k8s.io.api.resource.v1alpha3.DriverAllocationResult") - proto.RegisterType((*DriverRequests)(nil), "k8s.io.api.resource.v1alpha3.DriverRequests") - proto.RegisterType((*NamedResourcesAllocationResult)(nil), "k8s.io.api.resource.v1alpha3.NamedResourcesAllocationResult") - proto.RegisterType((*NamedResourcesAttribute)(nil), "k8s.io.api.resource.v1alpha3.NamedResourcesAttribute") - proto.RegisterType((*NamedResourcesAttributeValue)(nil), "k8s.io.api.resource.v1alpha3.NamedResourcesAttributeValue") - proto.RegisterType((*NamedResourcesFilter)(nil), "k8s.io.api.resource.v1alpha3.NamedResourcesFilter") - proto.RegisterType((*NamedResourcesInstance)(nil), "k8s.io.api.resource.v1alpha3.NamedResourcesInstance") - proto.RegisterType((*NamedResourcesIntSlice)(nil), "k8s.io.api.resource.v1alpha3.NamedResourcesIntSlice") - proto.RegisterType((*NamedResourcesRequest)(nil), "k8s.io.api.resource.v1alpha3.NamedResourcesRequest") - proto.RegisterType((*NamedResourcesResources)(nil), "k8s.io.api.resource.v1alpha3.NamedResourcesResources") - proto.RegisterType((*NamedResourcesStringSlice)(nil), "k8s.io.api.resource.v1alpha3.NamedResourcesStringSlice") + proto.RegisterType((*BasicDevice)(nil), "k8s.io.api.resource.v1alpha3.BasicDevice") + proto.RegisterMapType((map[QualifiedName]DeviceAttribute)(nil), "k8s.io.api.resource.v1alpha3.BasicDevice.AttributesEntry") + proto.RegisterMapType((map[QualifiedName]resource.Quantity)(nil), "k8s.io.api.resource.v1alpha3.BasicDevice.CapacityEntry") + proto.RegisterType((*CELDeviceSelector)(nil), "k8s.io.api.resource.v1alpha3.CELDeviceSelector") + proto.RegisterType((*Device)(nil), "k8s.io.api.resource.v1alpha3.Device") + proto.RegisterType((*DeviceAllocationConfiguration)(nil), "k8s.io.api.resource.v1alpha3.DeviceAllocationConfiguration") + proto.RegisterType((*DeviceAllocationResult)(nil), "k8s.io.api.resource.v1alpha3.DeviceAllocationResult") + proto.RegisterType((*DeviceAttribute)(nil), "k8s.io.api.resource.v1alpha3.DeviceAttribute") + proto.RegisterType((*DeviceClaim)(nil), "k8s.io.api.resource.v1alpha3.DeviceClaim") + proto.RegisterType((*DeviceClaimConfiguration)(nil), "k8s.io.api.resource.v1alpha3.DeviceClaimConfiguration") + proto.RegisterType((*DeviceClass)(nil), "k8s.io.api.resource.v1alpha3.DeviceClass") + proto.RegisterType((*DeviceClassConfiguration)(nil), "k8s.io.api.resource.v1alpha3.DeviceClassConfiguration") + proto.RegisterType((*DeviceClassList)(nil), "k8s.io.api.resource.v1alpha3.DeviceClassList") + proto.RegisterType((*DeviceClassSpec)(nil), "k8s.io.api.resource.v1alpha3.DeviceClassSpec") + proto.RegisterType((*DeviceConfiguration)(nil), "k8s.io.api.resource.v1alpha3.DeviceConfiguration") + proto.RegisterType((*DeviceConstraint)(nil), "k8s.io.api.resource.v1alpha3.DeviceConstraint") + 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((*OpaqueDeviceConfiguration)(nil), "k8s.io.api.resource.v1alpha3.OpaqueDeviceConfiguration") proto.RegisterType((*PodSchedulingContext)(nil), "k8s.io.api.resource.v1alpha3.PodSchedulingContext") proto.RegisterType((*PodSchedulingContextList)(nil), "k8s.io.api.resource.v1alpha3.PodSchedulingContextList") proto.RegisterType((*PodSchedulingContextSpec)(nil), "k8s.io.api.resource.v1alpha3.PodSchedulingContextSpec") @@ -1300,30 +1085,16 @@ func init() { proto.RegisterType((*ResourceClaim)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaim") proto.RegisterType((*ResourceClaimConsumerReference)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimConsumerReference") proto.RegisterType((*ResourceClaimList)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimList") - proto.RegisterType((*ResourceClaimParameters)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimParameters") - proto.RegisterType((*ResourceClaimParametersList)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimParametersList") - proto.RegisterType((*ResourceClaimParametersReference)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimParametersReference") proto.RegisterType((*ResourceClaimSchedulingStatus)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimSchedulingStatus") proto.RegisterType((*ResourceClaimSpec)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimSpec") proto.RegisterType((*ResourceClaimStatus)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimStatus") proto.RegisterType((*ResourceClaimTemplate)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimTemplate") proto.RegisterType((*ResourceClaimTemplateList)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimTemplateList") proto.RegisterType((*ResourceClaimTemplateSpec)(nil), "k8s.io.api.resource.v1alpha3.ResourceClaimTemplateSpec") - proto.RegisterType((*ResourceClass)(nil), "k8s.io.api.resource.v1alpha3.ResourceClass") - proto.RegisterType((*ResourceClassList)(nil), "k8s.io.api.resource.v1alpha3.ResourceClassList") - proto.RegisterType((*ResourceClassParameters)(nil), "k8s.io.api.resource.v1alpha3.ResourceClassParameters") - proto.RegisterType((*ResourceClassParametersList)(nil), "k8s.io.api.resource.v1alpha3.ResourceClassParametersList") - proto.RegisterType((*ResourceClassParametersReference)(nil), "k8s.io.api.resource.v1alpha3.ResourceClassParametersReference") - proto.RegisterType((*ResourceFilter)(nil), "k8s.io.api.resource.v1alpha3.ResourceFilter") - proto.RegisterType((*ResourceFilterModel)(nil), "k8s.io.api.resource.v1alpha3.ResourceFilterModel") - proto.RegisterType((*ResourceHandle)(nil), "k8s.io.api.resource.v1alpha3.ResourceHandle") - proto.RegisterType((*ResourceModel)(nil), "k8s.io.api.resource.v1alpha3.ResourceModel") - proto.RegisterType((*ResourceRequest)(nil), "k8s.io.api.resource.v1alpha3.ResourceRequest") - proto.RegisterType((*ResourceRequestModel)(nil), "k8s.io.api.resource.v1alpha3.ResourceRequestModel") + proto.RegisterType((*ResourcePool)(nil), "k8s.io.api.resource.v1alpha3.ResourcePool") proto.RegisterType((*ResourceSlice)(nil), "k8s.io.api.resource.v1alpha3.ResourceSlice") proto.RegisterType((*ResourceSliceList)(nil), "k8s.io.api.resource.v1alpha3.ResourceSliceList") - proto.RegisterType((*StructuredResourceHandle)(nil), "k8s.io.api.resource.v1alpha3.StructuredResourceHandle") - proto.RegisterType((*VendorParameters)(nil), "k8s.io.api.resource.v1alpha3.VendorParameters") + proto.RegisterType((*ResourceSliceSpec)(nil), "k8s.io.api.resource.v1alpha3.ResourceSliceSpec") } func init() { @@ -1331,145 +1102,138 @@ func init() { } var fileDescriptor_66649ee9bbcd89d2 = []byte{ - // 2197 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4d, 0x6c, 0x1c, 0x57, - 0xd9, 0xb3, 0xbb, 0x89, 0xd7, 0x9f, 0xed, 0xb5, 0x33, 0xb6, 0xe3, 0x4d, 0xea, 0xee, 0xba, 0x23, - 0x10, 0x11, 0x38, 0xbb, 0x8d, 0xd3, 0xa6, 0x51, 0x29, 0x48, 0x99, 0xb8, 0x09, 0x16, 0x6d, 0xea, - 0xbe, 0x25, 0x6e, 0x53, 0xfe, 0x3a, 0xde, 0x79, 0xb1, 0x87, 0xcc, 0xce, 0x6c, 0xe6, 0xbd, 0x75, - 0x13, 0x71, 0x89, 0x2a, 0x10, 0x5c, 0x90, 0x8a, 0x84, 0x90, 0x38, 0x71, 0xe2, 0xc0, 0x85, 0x0b, - 0x5c, 0x39, 0x55, 0xd0, 0x1c, 0x83, 0x00, 0x51, 0x71, 0x58, 0x91, 0xe5, 0xc0, 0x81, 0x23, 0x37, - 0x4e, 0x68, 0xde, 0x7b, 0xf3, 0xf3, 0x66, 0x67, 0xd6, 0x3b, 0x4b, 0x63, 0x25, 0x27, 0xef, 0xbc, - 0xf7, 0xfd, 0xbd, 0xef, 0xff, 0x7d, 0xcf, 0xb0, 0x71, 0xe7, 0x32, 0x69, 0x58, 0x6e, 0xd3, 0xe8, - 0x5a, 0x4d, 0x0f, 0x13, 0xb7, 0xe7, 0xb5, 0x71, 0xf3, 0xf0, 0x82, 0x61, 0x77, 0x0f, 0x8c, 0x8b, - 0xcd, 0x7d, 0xec, 0x60, 0xcf, 0xa0, 0xd8, 0x6c, 0x74, 0x3d, 0x97, 0xba, 0xea, 0x1a, 0x87, 0x6e, - 0x18, 0x5d, 0xab, 0x11, 0x40, 0x37, 0x02, 0xe8, 0xb3, 0xe7, 0xf7, 0x2d, 0x7a, 0xd0, 0xdb, 0x6b, - 0xb4, 0xdd, 0x4e, 0x73, 0xdf, 0xdd, 0x77, 0x9b, 0x0c, 0x69, 0xaf, 0x77, 0x9b, 0x7d, 0xb1, 0x0f, - 0xf6, 0x8b, 0x13, 0x3b, 0xab, 0xc5, 0x58, 0xb7, 0x5d, 0xcf, 0x67, 0x9b, 0x64, 0x78, 0xf6, 0xa5, - 0x08, 0xa6, 0x63, 0xb4, 0x0f, 0x2c, 0x07, 0x7b, 0xf7, 0x9b, 0xdd, 0x3b, 0xfb, 0xb2, 0xbc, 0x79, - 0xb0, 0x48, 0xb3, 0x83, 0xa9, 0x91, 0xc6, 0xab, 0x99, 0x85, 0xe5, 0xf5, 0x1c, 0x6a, 0x75, 0x86, - 0xd9, 0x5c, 0x3a, 0x0a, 0x81, 0xb4, 0x0f, 0x70, 0xc7, 0x48, 0xe2, 0x69, 0xff, 0x52, 0x60, 0xf1, - 0x8a, 0x6d, 0xbb, 0x6d, 0x83, 0x5a, 0xae, 0x83, 0x30, 0xe9, 0xd9, 0x54, 0x75, 0x61, 0x21, 0x38, - 0xcf, 0xd7, 0x0c, 0xc7, 0xb4, 0x31, 0xa9, 0x2a, 0xeb, 0xc5, 0x73, 0xb3, 0x9b, 0x1b, 0x8d, 0x51, - 0x4a, 0x6f, 0x20, 0x09, 0x49, 0x5f, 0x7d, 0xd8, 0xaf, 0x4f, 0x0d, 0xfa, 0xf5, 0x05, 0x79, 0x9d, - 0xa0, 0x24, 0x75, 0x75, 0x0f, 0x16, 0x8d, 0x43, 0xc3, 0xb2, 0x8d, 0x3d, 0x1b, 0xbf, 0xe5, 0xdc, - 0x70, 0x4d, 0x4c, 0xaa, 0x85, 0x75, 0xe5, 0xdc, 0xec, 0xe6, 0x7a, 0x9c, 0xa3, 0x6f, 0x99, 0xc6, - 0xe1, 0x85, 0x86, 0x0f, 0xd0, 0xc2, 0x36, 0x6e, 0x53, 0xd7, 0xd3, 0x97, 0x07, 0xfd, 0xfa, 0xe2, - 0x95, 0x04, 0x36, 0x1a, 0xa2, 0xa7, 0xfd, 0x54, 0x81, 0x95, 0xe4, 0x49, 0xdf, 0x74, 0x4d, 0x6c, - 0xab, 0xf7, 0xa0, 0xe2, 0x18, 0x1d, 0x6c, 0x06, 0x62, 0xfa, 0xa7, 0xf5, 0x79, 0xbf, 0x36, 0xfa, - 0xb4, 0x37, 0x24, 0x9c, 0x24, 0x69, 0x5d, 0x1d, 0xf4, 0xeb, 0x15, 0x19, 0x06, 0x25, 0xf8, 0x68, - 0xbf, 0x29, 0xc0, 0xe9, 0x2d, 0xcf, 0x3a, 0xc4, 0xde, 0x90, 0x0d, 0x7e, 0xac, 0xc0, 0xea, 0x21, - 0x76, 0x4c, 0xd7, 0x43, 0xf8, 0x6e, 0x0f, 0x13, 0xba, 0x63, 0x78, 0x46, 0x07, 0x53, 0xec, 0x05, - 0xe2, 0x9d, 0x8f, 0x89, 0x17, 0xda, 0xbc, 0xd1, 0xbd, 0xb3, 0xdf, 0x10, 0x36, 0x6f, 0x20, 0xe3, - 0x83, 0xd7, 0xef, 0x51, 0xec, 0x10, 0xcb, 0x75, 0xf4, 0xba, 0xb0, 0xc6, 0xea, 0x6e, 0x3a, 0x55, - 0x94, 0xc5, 0xce, 0x17, 0x65, 0xc5, 0x48, 0xd3, 0x9c, 0xb0, 0xd1, 0xc5, 0xd1, 0x7a, 0x4a, 0x55, - 0xba, 0xfe, 0xbc, 0x10, 0x27, 0xdd, 0x26, 0x28, 0x9d, 0xa1, 0xf6, 0xf3, 0x02, 0x54, 0xb8, 0xc2, - 0x84, 0x98, 0x44, 0xdd, 0x04, 0x30, 0xd9, 0x8a, 0xaf, 0x6b, 0xa6, 0x9a, 0x19, 0x5d, 0x15, 0xc4, - 0x61, 0x2b, 0xdc, 0x41, 0x31, 0x28, 0x95, 0xc0, 0x22, 0x3f, 0x6c, 0x4c, 0xa9, 0x85, 0x49, 0x94, - 0x5a, 0x15, 0x8c, 0x16, 0x77, 0x13, 0xe4, 0xd0, 0x10, 0x03, 0xf5, 0x9b, 0x50, 0xf6, 0x84, 0xd0, - 0xd5, 0x22, 0x0b, 0xa7, 0xf3, 0xe3, 0x85, 0x93, 0x38, 0xaa, 0xbe, 0x28, 0x98, 0x95, 0x83, 0xb3, - 0xa3, 0x90, 0xa0, 0xa6, 0x43, 0x6d, 0xb4, 0x3f, 0xaa, 0xeb, 0x50, 0x72, 0x22, 0x0d, 0xcd, 0x09, - 0x5a, 0x25, 0xa6, 0x1b, 0xb6, 0xa3, 0xfd, 0x51, 0x81, 0xd5, 0x04, 0x11, 0x4a, 0x3d, 0x6b, 0xaf, - 0x47, 0xf1, 0xd1, 0xd8, 0xbe, 0x97, 0x54, 0x8c, 0x00, 0x7e, 0xd7, 0xb0, 0x7b, 0x58, 0xa8, 0xf4, - 0xd5, 0x5c, 0x61, 0x24, 0x51, 0xd0, 0x3f, 0x27, 0x18, 0xad, 0x8d, 0x82, 0x42, 0x09, 0xbe, 0xda, - 0xbf, 0x8b, 0x30, 0x12, 0x41, 0xfd, 0x36, 0x94, 0xef, 0xf6, 0x0c, 0x87, 0x5a, 0xf4, 0x7e, 0xf5, - 0x24, 0x13, 0xb2, 0x91, 0x69, 0x77, 0x49, 0xea, 0xb7, 0x05, 0x96, 0x7e, 0x6a, 0xd0, 0xaf, 0xcf, - 0x07, 0x5f, 0x5c, 0x8a, 0x90, 0xa4, 0xfa, 0x02, 0x94, 0xf6, 0x5c, 0x97, 0x87, 0x47, 0x59, 0x9f, - 0x1f, 0xf4, 0xeb, 0x33, 0xba, 0xeb, 0xda, 0x1c, 0x8c, 0x6d, 0xa9, 0x35, 0x28, 0x5a, 0x0e, 0xad, - 0x4e, 0xaf, 0x2b, 0xe7, 0x8a, 0xfa, 0x9c, 0x6f, 0xd4, 0x6d, 0x87, 0x72, 0x00, 0x7f, 0x43, 0x6d, - 0x43, 0xd9, 0x72, 0x68, 0xcb, 0xb6, 0xda, 0xb8, 0x5a, 0x66, 0x12, 0xbe, 0x94, 0x47, 0x8d, 0xdb, - 0x02, 0x97, 0xcb, 0x19, 0x7c, 0x09, 0x39, 0x03, 0xc2, 0xea, 0x17, 0xe0, 0x24, 0xa1, 0x9e, 0xe5, - 0xec, 0x57, 0x4f, 0x30, 0xb3, 0x2e, 0x0c, 0xfa, 0xf5, 0xd9, 0x16, 0x5b, 0xe1, 0xa0, 0x62, 0x5b, - 0x75, 0x61, 0x96, 0xff, 0xe2, 0x02, 0xcd, 0x30, 0x81, 0x5e, 0xc9, 0x23, 0x50, 0x2b, 0x42, 0xe7, - 0x19, 0x3b, 0xb6, 0xc0, 0x79, 0xc5, 0x39, 0xa8, 0x5f, 0x84, 0xe9, 0x43, 0xec, 0xf9, 0x21, 0x56, - 0x05, 0x26, 0xda, 0xe2, 0xa0, 0x5f, 0x9f, 0xdb, 0xe5, 0x4b, 0x1c, 0x3e, 0x00, 0xd0, 0xb6, 0x60, - 0x59, 0xe6, 0x75, 0xcd, 0xb2, 0x29, 0xf6, 0xd4, 0x0d, 0x28, 0x13, 0x51, 0x24, 0x84, 0xdb, 0x86, - 0x01, 0x14, 0x14, 0x0f, 0x14, 0x42, 0x68, 0xbf, 0x52, 0xe0, 0x74, 0x52, 0x87, 0x84, 0x1a, 0x4e, - 0x7b, 0x1c, 0xdf, 0xb7, 0x00, 0x42, 0x17, 0xf4, 0x33, 0x89, 0x1f, 0xdc, 0x2f, 0x4f, 0xe4, 0xf6, - 0x51, 0xea, 0x0a, 0x97, 0x08, 0x8a, 0x11, 0xd7, 0x2e, 0x0d, 0x8b, 0x29, 0xac, 0xb9, 0x06, 0x25, - 0xcb, 0xa1, 0xbc, 0x54, 0x17, 0xf5, 0xb2, 0x2f, 0xe2, 0xb6, 0x43, 0x09, 0x62, 0xab, 0xda, 0xeb, - 0xb0, 0x92, 0x28, 0x46, 0x3c, 0x75, 0xe4, 0x54, 0xd3, 0x83, 0xa1, 0x1c, 0x11, 0xfe, 0x50, 0x31, - 0xcc, 0x58, 0x42, 0x67, 0x41, 0xc3, 0x90, 0xd3, 0x69, 0x39, 0xb2, 0x7e, 0x4a, 0x08, 0x30, 0x13, - 0xac, 0x10, 0x14, 0x51, 0xd6, 0x74, 0x38, 0x93, 0xe9, 0x5b, 0xea, 0xe7, 0x61, 0x9a, 0xfb, 0x11, - 0x97, 0x60, 0x46, 0x9f, 0x1d, 0xf4, 0xeb, 0xd3, 0x1c, 0x82, 0xa0, 0x60, 0x4f, 0xfb, 0x5d, 0x01, - 0x96, 0x77, 0x5c, 0xb3, 0xd5, 0x3e, 0xc0, 0x66, 0xcf, 0xb6, 0x9c, 0xfd, 0xab, 0xae, 0x43, 0xf1, - 0x3d, 0xaa, 0xbe, 0x0f, 0x65, 0xbf, 0x27, 0x33, 0x0d, 0x6a, 0x88, 0x32, 0xfb, 0xe2, 0xa8, 0xcc, - 0x40, 0x1a, 0x3e, 0xb4, 0xdf, 0x93, 0xbc, 0xb5, 0xf7, 0x3d, 0xdc, 0xa6, 0x6f, 0x62, 0x6a, 0x44, - 0x26, 0x8c, 0xd6, 0x50, 0x48, 0x55, 0x7d, 0x17, 0x4a, 0xa4, 0x8b, 0xdb, 0x22, 0x39, 0x5e, 0x1a, - 0xad, 0xa0, 0x34, 0x19, 0x5b, 0x5d, 0xdc, 0x8e, 0xbc, 0xd0, 0xff, 0x42, 0x8c, 0xa2, 0xfa, 0xbe, - 0x1f, 0xce, 0x06, 0xed, 0xf9, 0xe5, 0xc5, 0xa7, 0x7d, 0x79, 0x02, 0xda, 0x0c, 0x5f, 0xaf, 0x08, - 0xea, 0x27, 0xf9, 0x37, 0x12, 0x74, 0xb5, 0x3f, 0x29, 0x50, 0x4d, 0x43, 0x7b, 0xc3, 0x22, 0x54, - 0xfd, 0xd6, 0x90, 0xea, 0x1a, 0xe3, 0xa9, 0xce, 0xc7, 0x66, 0x8a, 0x0b, 0x1d, 0x2f, 0x58, 0x89, - 0xa9, 0xed, 0x1d, 0x38, 0x61, 0x51, 0xdc, 0x09, 0xa2, 0x6b, 0x33, 0xff, 0xd9, 0xf4, 0x79, 0x41, - 0xfe, 0xc4, 0xb6, 0x4f, 0x08, 0x71, 0x7a, 0xda, 0x47, 0x19, 0x67, 0xf2, 0x15, 0xab, 0x5e, 0x86, - 0x39, 0xee, 0xfa, 0xd8, 0xf4, 0xbb, 0x48, 0x11, 0x20, 0xcb, 0x82, 0xd0, 0x5c, 0x2b, 0xb6, 0x87, - 0x24, 0x48, 0xf5, 0x55, 0xa8, 0x74, 0x5d, 0x8a, 0x1d, 0x6a, 0x19, 0x76, 0xd0, 0xd0, 0xfa, 0xfe, - 0xc8, 0xda, 0xc2, 0x1d, 0x69, 0x07, 0x25, 0x20, 0xb5, 0x5f, 0x28, 0x70, 0x36, 0xdb, 0x3a, 0xea, - 0xf7, 0xa1, 0x12, 0x9c, 0xf8, 0xaa, 0x6d, 0x58, 0x9d, 0x20, 0xd8, 0xbe, 0x3c, 0x5e, 0x3b, 0xc1, - 0x70, 0x22, 0xda, 0xc2, 0xe4, 0xa7, 0xc5, 0x99, 0x2a, 0x12, 0x18, 0x41, 0x09, 0x56, 0xda, 0x2f, - 0x0b, 0x30, 0x2f, 0x81, 0x1c, 0x43, 0xc8, 0xbc, 0x2d, 0x85, 0x4c, 0x33, 0xcf, 0x31, 0xb3, 0x62, - 0xe5, 0x56, 0x22, 0x56, 0x2e, 0xe4, 0x21, 0x3a, 0x3a, 0x48, 0x06, 0x0a, 0xd4, 0x24, 0xf8, 0xab, - 0xae, 0x43, 0x7a, 0x1d, 0xbf, 0x65, 0xbd, 0x8d, 0x3d, 0xec, 0x57, 0x94, 0x0d, 0x28, 0x1b, 0x5d, - 0xeb, 0xba, 0xe7, 0xf6, 0xba, 0xc9, 0x9c, 0x7b, 0x65, 0x67, 0x9b, 0xad, 0xa3, 0x10, 0xc2, 0x87, - 0x0e, 0x24, 0x62, 0xd2, 0xce, 0xc4, 0x3b, 0x41, 0xd1, 0x22, 0x86, 0x10, 0x61, 0xb5, 0x2a, 0x65, - 0x56, 0x2b, 0x1d, 0x8a, 0x3d, 0xcb, 0x14, 0x35, 0xff, 0x45, 0x01, 0x50, 0xbc, 0xb9, 0xbd, 0xf5, - 0xdf, 0x7e, 0xfd, 0x85, 0xac, 0x7b, 0x24, 0xbd, 0xdf, 0xc5, 0xa4, 0x71, 0x73, 0x7b, 0x0b, 0xf9, - 0xc8, 0xda, 0xc7, 0x0a, 0x9c, 0x92, 0x0e, 0x79, 0x0c, 0x29, 0x60, 0x47, 0x4e, 0x01, 0x5f, 0xca, - 0x61, 0xb2, 0x8c, 0xd8, 0x1f, 0x14, 0x60, 0x55, 0x82, 0x8b, 0xb5, 0xeb, 0x4f, 0xde, 0xad, 0x3f, - 0x80, 0xf9, 0xf0, 0x3a, 0x7e, 0xcd, 0x73, 0x3b, 0xc2, 0xbf, 0xbf, 0x9a, 0xe3, 0x5c, 0xb1, 0x0b, - 0x47, 0xe0, 0x5c, 0xbc, 0xe5, 0xbb, 0x1e, 0x27, 0x8c, 0x64, 0x3e, 0xaa, 0x0d, 0x15, 0x53, 0xba, - 0x44, 0x55, 0x4b, 0xe3, 0x5c, 0xef, 0xe5, 0x8b, 0x57, 0x94, 0x31, 0xe4, 0x75, 0x94, 0xa0, 0xad, - 0xfd, 0x4d, 0x81, 0xe7, 0x32, 0x84, 0x3e, 0x06, 0xa7, 0x79, 0x4f, 0x76, 0x9a, 0x97, 0x27, 0x52, - 0x6e, 0x86, 0xfb, 0xfc, 0x4c, 0x81, 0xf5, 0xa3, 0xcc, 0x91, 0x33, 0xd6, 0xd7, 0xa1, 0x74, 0xc7, - 0x72, 0x4c, 0xe6, 0x0a, 0xb1, 0xe8, 0xfd, 0xba, 0xe5, 0x98, 0x88, 0xed, 0x84, 0xf1, 0x5d, 0xcc, - 0xbc, 0xc7, 0x3d, 0x50, 0xe0, 0xf9, 0x91, 0xc9, 0x7e, 0x8c, 0x8e, 0xf6, 0x2b, 0xb0, 0xd0, 0x73, - 0x48, 0xcf, 0xa2, 0xc6, 0x9e, 0x8d, 0xe3, 0xf5, 0x6b, 0x69, 0xd0, 0xaf, 0x2f, 0xdc, 0x94, 0xb7, - 0x50, 0x12, 0x56, 0xfb, 0x6b, 0x32, 0x3d, 0xb0, 0x6a, 0x7a, 0x1d, 0x4e, 0xc5, 0xaa, 0x09, 0x21, - 0xb1, 0x1b, 0xfb, 0x19, 0x21, 0x43, 0x1c, 0x8b, 0x03, 0xa0, 0x61, 0x1c, 0x3f, 0x72, 0xba, 0x71, - 0x55, 0x7f, 0x96, 0x91, 0x23, 0x6d, 0x20, 0x99, 0x8f, 0xf6, 0x9f, 0x02, 0x2c, 0xa5, 0xd4, 0x82, - 0x89, 0x86, 0x10, 0xdf, 0x01, 0x88, 0x86, 0x1c, 0xe2, 0x04, 0x8d, 0x7c, 0xa3, 0x14, 0xbd, 0xc2, - 0x6e, 0x0a, 0xd1, 0x6a, 0x8c, 0xa2, 0x4a, 0x60, 0xd6, 0xc3, 0x04, 0x7b, 0x87, 0xd8, 0xbc, 0xe6, - 0x7a, 0x62, 0xe4, 0xf0, 0x5a, 0x0e, 0x15, 0x0d, 0xd5, 0x2d, 0x7d, 0x49, 0x1c, 0x69, 0x16, 0x45, - 0x84, 0x51, 0x9c, 0x8b, 0xda, 0x82, 0x15, 0x13, 0xc7, 0x67, 0x37, 0x2c, 0x09, 0x60, 0x93, 0x95, - 0xa3, 0x72, 0x34, 0xf5, 0xd9, 0x4a, 0x03, 0x42, 0xe9, 0xb8, 0xda, 0x5f, 0x14, 0x58, 0x91, 0x24, - 0xfb, 0x06, 0xee, 0x74, 0x6d, 0x83, 0xe2, 0x63, 0x48, 0xd2, 0xb7, 0xa4, 0xde, 0xe3, 0x95, 0x1c, - 0xea, 0x0b, 0x84, 0xcc, 0xea, 0x41, 0xb4, 0x3f, 0x2b, 0x70, 0x26, 0x15, 0xe3, 0x18, 0xd2, 0xe2, - 0xbb, 0x72, 0x5a, 0xbc, 0x38, 0xc1, 0xb9, 0x32, 0x92, 0xe2, 0xa3, 0xac, 0x53, 0xb5, 0xf8, 0x1d, - 0xe5, 0xd9, 0x6b, 0x16, 0xb5, 0x4f, 0x8a, 0x52, 0xcf, 0x4b, 0x8e, 0xa3, 0x39, 0x90, 0x33, 0x4a, - 0x61, 0xac, 0x8c, 0x32, 0x94, 0x16, 0x8b, 0x39, 0xd3, 0x22, 0x21, 0x13, 0xa5, 0x45, 0xf5, 0x16, - 0xcc, 0xcb, 0xb5, 0xa2, 0x34, 0xe6, 0xf0, 0x9e, 0x91, 0x6e, 0x49, 0xb5, 0x44, 0xa6, 0xa4, 0xbe, - 0x01, 0xcb, 0x84, 0x7a, 0xbd, 0x36, 0xed, 0x79, 0xd8, 0x8c, 0x8d, 0x6b, 0x4f, 0xb0, 0x7c, 0x52, - 0x1d, 0xf4, 0xeb, 0xcb, 0xad, 0x94, 0x7d, 0x94, 0x8a, 0x95, 0x6c, 0x5b, 0x09, 0x79, 0x9a, 0xdb, - 0x56, 0x92, 0xd5, 0x77, 0x7c, 0x5c, 0x94, 0xda, 0xd6, 0xb8, 0xd5, 0x9e, 0x85, 0xb6, 0x75, 0x84, - 0x97, 0x8d, 0x6c, 0x5b, 0x69, 0xca, 0xd4, 0x9e, 0x57, 0xb5, 0x23, 0xca, 0x66, 0x72, 0x38, 0x9f, - 0x6b, 0x6c, 0xff, 0x0e, 0x4c, 0xdf, 0x66, 0x03, 0xc5, 0x31, 0xbb, 0xe4, 0xe0, 0xa0, 0x7c, 0x0a, - 0xa9, 0x2f, 0x08, 0x56, 0xd3, 0xfc, 0x9b, 0xa0, 0x80, 0x5a, 0xb2, 0x2f, 0x8e, 0x6b, 0xe5, 0x69, - 0xee, 0x8b, 0xe3, 0x72, 0x66, 0xf8, 0xe7, 0x1f, 0xe4, 0xbe, 0x38, 0xd5, 0xde, 0xc7, 0xdf, 0x17, - 0xab, 0x4d, 0x98, 0xf1, 0xff, 0x92, 0xae, 0xd1, 0x0e, 0xae, 0xc7, 0xe1, 0xa4, 0xf1, 0x46, 0xb0, - 0x81, 0x22, 0x18, 0xed, 0x13, 0x05, 0x2a, 0xb2, 0x39, 0x27, 0x6a, 0xf4, 0x1e, 0x28, 0xb0, 0xe4, - 0x49, 0x64, 0xe2, 0xaf, 0x67, 0x17, 0xf2, 0xb8, 0x13, 0x7f, 0x3b, 0x7b, 0x4e, 0x30, 0x5c, 0x4a, - 0xd9, 0x44, 0x69, 0xac, 0xb4, 0x1f, 0x2a, 0x90, 0x06, 0xac, 0x3a, 0x19, 0x4f, 0x9f, 0x9b, 0x79, - 0xe6, 0xb6, 0xc2, 0xd3, 0xc7, 0x79, 0xf0, 0xfc, 0x7b, 0x4c, 0xa3, 0xfc, 0xf1, 0x77, 0x22, 0x8d, - 0xae, 0x43, 0x89, 0x85, 0x45, 0xc2, 0x1b, 0xb6, 0x0c, 0x6a, 0x20, 0xb6, 0xa3, 0x7a, 0x50, 0x89, - 0x0a, 0x80, 0xbf, 0xce, 0x0a, 0xc6, 0x91, 0xf3, 0xd6, 0xa8, 0x94, 0x24, 0xde, 0xb2, 0xd9, 0xe1, - 0x5a, 0x12, 0x45, 0x94, 0xe0, 0xa0, 0x7d, 0xa8, 0x44, 0x6d, 0x02, 0x57, 0xef, 0xdd, 0x0c, 0xf5, - 0xe6, 0x7a, 0x1b, 0x08, 0x7f, 0x8c, 0xa5, 0xe1, 0x9f, 0x14, 0x60, 0x21, 0xf1, 0x70, 0x98, 0xfa, - 0xdc, 0xa9, 0x3c, 0xe9, 0xe7, 0xce, 0x1f, 0x28, 0xb0, 0xec, 0xc9, 0x82, 0xc4, 0xdd, 0x7e, 0x33, - 0xd7, 0xdb, 0x27, 0xf7, 0xfb, 0x35, 0xc1, 0x7e, 0x39, 0x6d, 0x17, 0xa5, 0x72, 0xd3, 0x7e, 0xa4, - 0x40, 0x2a, 0xb8, 0xea, 0x66, 0xd8, 0xe6, 0x62, 0x3e, 0xdb, 0xf0, 0xa7, 0xd9, 0x71, 0x2c, 0xf3, - 0xfb, 0xd8, 0xe4, 0x94, 0x3f, 0x56, 0x3c, 0xf9, 0x5a, 0xbd, 0x01, 0x65, 0xc7, 0x35, 0x71, 0xac, - 0x87, 0x0c, 0x93, 0xec, 0x0d, 0xb1, 0x8e, 0x42, 0x88, 0x44, 0x28, 0x16, 0xc7, 0x0a, 0xc5, 0x03, - 0x98, 0xf7, 0xe2, 0x3e, 0x2f, 0x5a, 0xbf, 0x31, 0xbb, 0x1c, 0x6e, 0xd7, 0x15, 0xc1, 0x43, 0x8e, - 0x1e, 0x24, 0x13, 0x96, 0x7a, 0x37, 0xa6, 0xbf, 0xa7, 0xb6, 0x77, 0xe3, 0xcf, 0x9c, 0xe9, 0xb5, - 0xf1, 0xb7, 0x45, 0xa8, 0x66, 0x65, 0x19, 0xf5, 0x43, 0x05, 0x56, 0x78, 0x20, 0x25, 0xca, 0xe6, - 0x64, 0xe1, 0x1a, 0xde, 0xb6, 0x77, 0xd3, 0x68, 0xa2, 0x74, 0x56, 0xb2, 0x10, 0xf1, 0x41, 0xc9, - 0x64, 0xff, 0x22, 0x31, 0x2c, 0x84, 0x34, 0x7c, 0x49, 0x67, 0x25, 0x39, 0x6e, 0xe9, 0x48, 0xc7, - 0xfd, 0x2e, 0x4c, 0x7b, 0x6c, 0x20, 0xe2, 0xdf, 0x0b, 0xc6, 0x78, 0x77, 0x4c, 0xff, 0x9f, 0x9b, - 0xa8, 0x57, 0xe3, 0xdf, 0x04, 0x05, 0x54, 0xb5, 0x5f, 0x2b, 0x30, 0x94, 0xf3, 0x26, 0xaa, 0x5c, - 0x06, 0x40, 0xf7, 0xff, 0x54, 0x68, 0xc8, 0x22, 0xa6, 0xc5, 0x18, 0x51, 0x5d, 0x7f, 0xf8, 0xb8, - 0x36, 0xf5, 0xe8, 0x71, 0x6d, 0xea, 0xd3, 0xc7, 0xb5, 0xa9, 0x07, 0x83, 0x9a, 0xf2, 0x70, 0x50, - 0x53, 0x1e, 0x0d, 0x6a, 0xca, 0xa7, 0x83, 0x9a, 0xf2, 0x8f, 0x41, 0x4d, 0xf9, 0xe8, 0x9f, 0xb5, - 0xa9, 0xf7, 0xd6, 0x46, 0xfd, 0xb3, 0xdd, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x4f, 0xfc, 0x4e, - 0xd3, 0x8b, 0x27, 0x00, 0x00, + // 2095 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0xcd, 0x6f, 0x1c, 0x57, + 0xdd, 0xb3, 0xeb, 0xcf, 0x9f, 0xbf, 0x9f, 0x93, 0xe0, 0x9a, 0x66, 0x37, 0x99, 0x22, 0x70, 0xda, + 0x74, 0xb7, 0x71, 0x4b, 0x1b, 0x5a, 0x90, 0xf0, 0xd8, 0x6e, 0xe4, 0x28, 0x1f, 0xce, 0xdb, 0x26, + 0x34, 0x50, 0x4a, 0x9f, 0x67, 0x9f, 0xed, 0xc1, 0xb3, 0x33, 0xd3, 0x99, 0x37, 0x26, 0x16, 0x12, + 0x8a, 0xb8, 0x70, 0x8b, 0x7a, 0xe5, 0x80, 0xb8, 0x21, 0x21, 0x0e, 0x70, 0xe0, 0x88, 0x54, 0x24, + 0x90, 0xc8, 0x31, 0x08, 0x0e, 0x3d, 0x2d, 0xc9, 0x22, 0xfe, 0x89, 0x5c, 0x40, 0xef, 0xcd, 0x9b, + 0xcf, 0x9d, 0xd9, 0xcc, 0x46, 0x91, 0x45, 0x6f, 0x9e, 0xdf, 0xf7, 0xfb, 0x7d, 0xbf, 0xb7, 0x86, + 0x8b, 0x87, 0x97, 0xbd, 0x86, 0x61, 0x37, 0x89, 0x63, 0x34, 0x5d, 0xea, 0xd9, 0xbe, 0xab, 0xd3, + 0xe6, 0xd1, 0x25, 0x62, 0x3a, 0x07, 0xe4, 0xcd, 0xe6, 0x3e, 0xb5, 0xa8, 0x4b, 0x18, 0x6d, 0x37, + 0x1c, 0xd7, 0x66, 0x36, 0x7a, 0x39, 0xa0, 0x6e, 0x10, 0xc7, 0x68, 0x84, 0xd4, 0x8d, 0x90, 0x7a, + 0xe5, 0xf5, 0x7d, 0x83, 0x1d, 0xf8, 0xbb, 0x0d, 0xdd, 0xee, 0x34, 0xf7, 0xed, 0x7d, 0xbb, 0x29, + 0x98, 0x76, 0xfd, 0x3d, 0xf1, 0x25, 0x3e, 0xc4, 0x5f, 0x81, 0xb0, 0x15, 0x35, 0xa1, 0x5a, 0xb7, + 0x5d, 0xae, 0x36, 0xab, 0x70, 0xe5, 0xad, 0x98, 0xa6, 0x43, 0xf4, 0x03, 0xc3, 0xa2, 0xee, 0x71, + 0xd3, 0x39, 0xdc, 0x4f, 0xdb, 0x3b, 0x0c, 0x97, 0xd7, 0xec, 0x50, 0x46, 0xf2, 0x74, 0x35, 0x8b, + 0xb8, 0x5c, 0xdf, 0x62, 0x46, 0xa7, 0x5f, 0xcd, 0xdb, 0xcf, 0x62, 0xf0, 0xf4, 0x03, 0xda, 0x21, + 0x59, 0x3e, 0xf5, 0xbf, 0x0a, 0x2c, 0xac, 0x9b, 0xa6, 0xad, 0x13, 0x66, 0xd8, 0x16, 0xa6, 0x9e, + 0x6f, 0x32, 0xf4, 0x23, 0x98, 0x68, 0xd3, 0x23, 0x43, 0xa7, 0xde, 0xb2, 0x72, 0x4e, 0x59, 0x9d, + 0x5e, 0x7b, 0xab, 0x31, 0xc8, 0xd9, 0x8d, 0x4d, 0x41, 0x9c, 0x15, 0xa3, 0xcd, 0x3f, 0xec, 0xd6, + 0x47, 0x7a, 0xdd, 0xfa, 0x44, 0x80, 0xf7, 0x70, 0x28, 0x15, 0xdd, 0x81, 0x19, 0xcb, 0x6e, 0xd3, + 0x16, 0x35, 0xa9, 0xce, 0x6c, 0x77, 0xb9, 0x2a, 0xb4, 0x9c, 0x4b, 0x6a, 0xe1, 0x51, 0x68, 0x1c, + 0x5d, 0x6a, 0xdc, 0x48, 0xd0, 0x69, 0x0b, 0xbd, 0x6e, 0x7d, 0x26, 0x09, 0xc1, 0x29, 0x39, 0x68, + 0x0d, 0x40, 0xb7, 0x2d, 0xe6, 0xda, 0xa6, 0x49, 0xdd, 0xe5, 0xd1, 0x73, 0xca, 0xea, 0x94, 0x86, + 0xa4, 0x15, 0xb0, 0x11, 0x61, 0x70, 0x82, 0x4a, 0x7d, 0x5c, 0x85, 0x69, 0x8d, 0x78, 0x86, 0x1e, + 0x58, 0x89, 0x7e, 0x06, 0x40, 0x18, 0x73, 0x8d, 0x5d, 0x9f, 0x89, 0xf3, 0x57, 0x57, 0xa7, 0xd7, + 0xbe, 0x35, 0xf8, 0xfc, 0x09, 0xf6, 0xc6, 0x7a, 0xc4, 0xbb, 0x65, 0x31, 0xf7, 0x58, 0x7b, 0x25, + 0x54, 0x1f, 0x23, 0x7e, 0xfe, 0xaf, 0xfa, 0xec, 0x2d, 0x9f, 0x98, 0xc6, 0x9e, 0x41, 0xdb, 0x37, + 0x48, 0x87, 0xe2, 0x84, 0x46, 0x74, 0x04, 0x93, 0x3a, 0x71, 0x88, 0x6e, 0xb0, 0xe3, 0xe5, 0x8a, + 0xd0, 0xfe, 0x4e, 0x79, 0xed, 0x1b, 0x92, 0x33, 0xd0, 0x7d, 0x5e, 0xea, 0x9e, 0x0c, 0xc1, 0xfd, + 0x9a, 0x23, 0x5d, 0x2b, 0x26, 0xcc, 0x67, 0x6c, 0x47, 0x0b, 0x50, 0x3d, 0xa4, 0xc7, 0x22, 0x07, + 0xa6, 0x30, 0xff, 0x13, 0x6d, 0xc0, 0xd8, 0x11, 0x31, 0x7d, 0xba, 0x5c, 0x11, 0x11, 0x7b, 0xbd, + 0x54, 0x5e, 0x84, 0x52, 0x71, 0xc0, 0xfb, 0x6e, 0xe5, 0xb2, 0xb2, 0x72, 0x08, 0xb3, 0x29, 0x5b, + 0x73, 0x74, 0x6d, 0xa6, 0x75, 0x35, 0x12, 0xba, 0xa2, 0x14, 0x6f, 0x38, 0x87, 0xfb, 0x69, 0xe5, + 0xb7, 0x7c, 0x62, 0x31, 0x83, 0x1d, 0x27, 0x94, 0xa9, 0x57, 0x60, 0x71, 0x63, 0xeb, 0x5a, 0x60, + 0x4d, 0x32, 0x57, 0xe8, 0x3d, 0xc7, 0xa5, 0x9e, 0x67, 0xd8, 0x56, 0xa0, 0x37, 0xce, 0x95, 0xad, + 0x08, 0x83, 0x13, 0x54, 0xea, 0x11, 0x8c, 0xcb, 0x2c, 0x39, 0x07, 0xa3, 0x16, 0xe9, 0x50, 0xc9, + 0x37, 0x23, 0xf9, 0x46, 0x85, 0x4f, 0x05, 0x06, 0x5d, 0x85, 0xb1, 0x5d, 0x1e, 0x19, 0x69, 0xfe, + 0x85, 0xd2, 0x41, 0xd4, 0xa6, 0x7a, 0xdd, 0xfa, 0x98, 0x00, 0xe0, 0x40, 0x84, 0xfa, 0xa0, 0x02, + 0x67, 0xb3, 0x45, 0xb6, 0x61, 0x5b, 0x7b, 0xc6, 0xbe, 0xef, 0x8a, 0x0f, 0xf4, 0x5d, 0x18, 0x0f, + 0x44, 0x4a, 0x8b, 0x56, 0xa5, 0x45, 0xe3, 0x2d, 0x01, 0x7d, 0xda, 0xad, 0x9f, 0xc9, 0xb2, 0x06, + 0x18, 0x2c, 0xf9, 0xd0, 0x2a, 0x4c, 0xba, 0xf4, 0x53, 0x9f, 0x7a, 0xcc, 0x13, 0x79, 0x37, 0xa5, + 0xcd, 0xf0, 0xd4, 0xc1, 0x12, 0x86, 0x23, 0x2c, 0xba, 0xaf, 0xc0, 0x52, 0x50, 0xc9, 0x29, 0x1b, + 0x64, 0x15, 0x5f, 0x2a, 0x93, 0x13, 0x29, 0x46, 0xed, 0xab, 0xd2, 0xd8, 0xa5, 0x1c, 0x24, 0xce, + 0x53, 0xa5, 0xfe, 0x47, 0x81, 0x33, 0xf9, 0x5d, 0x07, 0xed, 0xc1, 0x84, 0x2b, 0xfe, 0x0a, 0x8b, + 0xf7, 0xbd, 0x32, 0x06, 0xc9, 0x63, 0x16, 0xf7, 0xb0, 0xe0, 0xdb, 0xc3, 0xa1, 0x70, 0xa4, 0xc3, + 0xb8, 0x2e, 0x6c, 0x92, 0x55, 0xfa, 0xde, 0x70, 0x3d, 0x32, 0xed, 0x81, 0xb9, 0x30, 0x5c, 0x01, + 0x18, 0x4b, 0xd1, 0xea, 0x6f, 0x15, 0x98, 0xcf, 0x54, 0x11, 0xaa, 0x41, 0xd5, 0xb0, 0x98, 0x48, + 0xab, 0x6a, 0x10, 0xa3, 0x6d, 0x8b, 0xdd, 0xe1, 0xc9, 0x8e, 0x39, 0x02, 0x9d, 0x87, 0xd1, 0x5d, + 0xdb, 0x36, 0x45, 0x38, 0x26, 0xb5, 0xd9, 0x5e, 0xb7, 0x3e, 0xa5, 0xd9, 0xb6, 0x19, 0x50, 0x08, + 0x14, 0xfa, 0x06, 0x8c, 0x7b, 0xcc, 0x35, 0xac, 0x7d, 0xd9, 0x23, 0xe7, 0x7b, 0xdd, 0xfa, 0x74, + 0x4b, 0x40, 0x02, 0x32, 0x89, 0x46, 0xaf, 0xc2, 0xc4, 0x11, 0x75, 0x45, 0x85, 0x8c, 0x09, 0x4a, + 0xd1, 0x81, 0xef, 0x04, 0xa0, 0x80, 0x34, 0x24, 0x50, 0x7f, 0x5f, 0x81, 0x69, 0x19, 0x40, 0x93, + 0x18, 0x1d, 0x74, 0x37, 0x91, 0x50, 0x41, 0x24, 0x5e, 0x1b, 0x22, 0x12, 0xda, 0x42, 0xd8, 0xbc, + 0x72, 0x32, 0x90, 0xc2, 0xb4, 0x6e, 0x5b, 0x1e, 0x73, 0x89, 0x61, 0xc9, 0x74, 0x4d, 0x37, 0x88, + 0x41, 0x89, 0x27, 0xd9, 0xb4, 0x25, 0xa9, 0x60, 0x3a, 0x86, 0x79, 0x38, 0x29, 0x17, 0x7d, 0x1c, + 0x85, 0xb8, 0x2a, 0x34, 0xbc, 0x5d, 0x4a, 0x03, 0x3f, 0x7c, 0xb9, 0xe8, 0xfe, 0x4d, 0x81, 0xe5, + 0x22, 0xa6, 0x54, 0x3d, 0x2a, 0xcf, 0x55, 0x8f, 0x95, 0x93, 0xab, 0xc7, 0x3f, 0x2b, 0x89, 0xd8, + 0x7b, 0x1e, 0xfa, 0x04, 0x26, 0xf9, 0x6a, 0xd3, 0x26, 0x8c, 0xc8, 0x15, 0xe2, 0x8d, 0x41, 0xed, + 0xdb, 0x6b, 0x70, 0x6a, 0x3e, 0xee, 0x6f, 0xee, 0xfe, 0x98, 0xea, 0xec, 0x3a, 0x65, 0x24, 0x6e, + 0xc6, 0x31, 0x0c, 0x47, 0x52, 0xd1, 0x4d, 0x18, 0xf5, 0x1c, 0xaa, 0x0f, 0x33, 0x88, 0x84, 0x69, + 0x2d, 0x87, 0xea, 0x71, 0xbf, 0xe6, 0x5f, 0x58, 0x08, 0x52, 0x7f, 0x95, 0x0c, 0x86, 0xe7, 0xa5, + 0x83, 0x51, 0xe4, 0x62, 0xe5, 0xe4, 0x5c, 0xfc, 0x79, 0xd4, 0x0a, 0x84, 0x7d, 0xd7, 0x0c, 0x8f, + 0xa1, 0x8f, 0xfa, 0xdc, 0xdc, 0x28, 0xe7, 0x66, 0xce, 0x2d, 0x9c, 0x1c, 0x55, 0x59, 0x08, 0x49, + 0xb8, 0xf8, 0x06, 0x8c, 0x19, 0x8c, 0x76, 0xc2, 0xfa, 0xba, 0x50, 0xda, 0xc7, 0xda, 0xac, 0x94, + 0x3a, 0xb6, 0xcd, 0xf9, 0x71, 0x20, 0x46, 0xfd, 0x5d, 0x25, 0x75, 0x02, 0xee, 0x7b, 0xf4, 0x43, + 0x98, 0xf2, 0xe4, 0x44, 0x0e, 0xbb, 0xc4, 0xc5, 0x32, 0x7a, 0xa2, 0x95, 0x70, 0x51, 0xaa, 0x9a, + 0x0a, 0x21, 0x1e, 0x8e, 0x25, 0x26, 0x2a, 0xb8, 0x32, 0x54, 0x05, 0x67, 0xe2, 0x5f, 0x54, 0xc1, + 0xe8, 0x2e, 0xcc, 0x7a, 0xbe, 0xc1, 0xc8, 0xae, 0x49, 0xf9, 0x5a, 0xea, 0x95, 0xde, 0x64, 0x17, + 0x7b, 0xdd, 0xfa, 0x6c, 0x2b, 0xc9, 0x8a, 0xd3, 0x92, 0x54, 0x17, 0xf2, 0x72, 0x03, 0xfd, 0x00, + 0xc6, 0x6d, 0x87, 0x7c, 0xea, 0x53, 0x19, 0xf0, 0x67, 0x2c, 0x87, 0x37, 0x05, 0x6d, 0x5e, 0x06, + 0x02, 0x3f, 0x4e, 0x80, 0xc6, 0x52, 0xa4, 0xfa, 0x40, 0x81, 0x85, 0x6c, 0x9f, 0x1c, 0xa2, 0x11, + 0xed, 0xc0, 0x5c, 0x87, 0x30, 0xfd, 0x20, 0x9a, 0x55, 0xa2, 0x3a, 0xa7, 0xb4, 0xd5, 0x5e, 0xb7, + 0x3e, 0x77, 0x3d, 0x85, 0x79, 0xda, 0xad, 0xa3, 0xf7, 0x7d, 0xd3, 0x3c, 0x4e, 0xaf, 0xa3, 0x19, + 0x7e, 0xf5, 0x17, 0x55, 0x98, 0x4d, 0x8d, 0x85, 0x12, 0x8b, 0xd7, 0x3a, 0xcc, 0xb7, 0xe3, 0x38, + 0x72, 0x84, 0x34, 0xe3, 0x2b, 0x92, 0x38, 0x99, 0x84, 0x82, 0x2f, 0x4b, 0x9f, 0xce, 0xca, 0xea, + 0x0b, 0xcf, 0xca, 0x3b, 0x30, 0x47, 0xa2, 0x45, 0xe0, 0xba, 0xdd, 0xa6, 0x72, 0x0c, 0x37, 0x24, + 0xd7, 0xdc, 0x7a, 0x0a, 0xfb, 0xb4, 0x5b, 0x3f, 0x95, 0x5d, 0x1f, 0x38, 0x1c, 0x67, 0xa4, 0xa0, + 0x57, 0x60, 0x4c, 0xb7, 0x7d, 0x8b, 0x89, 0x59, 0x5d, 0x8d, 0xab, 0x70, 0x83, 0x03, 0x71, 0x80, + 0x43, 0xdf, 0x84, 0x69, 0xd2, 0xee, 0x18, 0xd6, 0xba, 0xae, 0x53, 0xcf, 0x5b, 0x1e, 0x17, 0x5b, + 0x42, 0x34, 0x0b, 0xd7, 0x63, 0x14, 0x4e, 0xd2, 0xa9, 0x7f, 0x52, 0xc2, 0x15, 0xb4, 0x60, 0x55, + 0x42, 0x17, 0xf8, 0xe2, 0x25, 0x50, 0x32, 0x38, 0x89, 0xdd, 0x49, 0x80, 0x71, 0x88, 0x47, 0x5f, + 0x87, 0xf1, 0xb6, 0x6b, 0x1c, 0x51, 0x57, 0x46, 0x26, 0x2a, 0xaf, 0x4d, 0x01, 0xc5, 0x12, 0xcb, + 0x83, 0xed, 0x84, 0xab, 0x4c, 0x22, 0xd8, 0x3b, 0xb6, 0x6d, 0x62, 0x81, 0x11, 0x92, 0x84, 0x55, + 0xd2, 0x85, 0xb1, 0xa4, 0xc0, 0x56, 0x89, 0x55, 0x3f, 0x82, 0xb9, 0xcc, 0xfe, 0x7f, 0x15, 0xaa, + 0x3a, 0x35, 0x65, 0x15, 0x35, 0x07, 0x47, 0xb7, 0xef, 0xf6, 0xa0, 0x4d, 0xf4, 0xba, 0xf5, 0xea, + 0xc6, 0xd6, 0x35, 0xcc, 0x85, 0xa8, 0xbf, 0x51, 0xe0, 0xa5, 0xc2, 0x4a, 0x4b, 0x9c, 0x56, 0x19, + 0x78, 0x5a, 0x02, 0xe0, 0x10, 0x97, 0x74, 0x28, 0xa3, 0xae, 0x97, 0x33, 0xd8, 0xd2, 0xfd, 0x5c, + 0x5e, 0xec, 0x1b, 0x98, 0xfc, 0x64, 0xeb, 0x1e, 0xa3, 0x16, 0xdf, 0xc1, 0xe2, 0x99, 0xb9, 0x13, + 0x09, 0xc2, 0x09, 0xa1, 0xea, 0x1f, 0x2b, 0x70, 0x6a, 0xc7, 0x6e, 0xb7, 0xf4, 0x03, 0xda, 0xf6, + 0x4d, 0xc3, 0xda, 0xe7, 0x97, 0x62, 0x7a, 0x8f, 0x9d, 0xc0, 0xc0, 0xfe, 0x30, 0x35, 0xb0, 0x9f, + 0xd1, 0x88, 0xf3, 0x6c, 0x2c, 0x9a, 0xdc, 0xe8, 0x13, 0xbe, 0xcd, 0x12, 0xe6, 0x87, 0xdd, 0xf7, + 0xf2, 0x73, 0xc8, 0x16, 0xfc, 0x71, 0x64, 0x82, 0x6f, 0x2c, 0xe5, 0xaa, 0x7f, 0x57, 0x60, 0x39, + 0x8f, 0xed, 0x04, 0x86, 0xf0, 0xf7, 0xd2, 0x43, 0x78, 0x6d, 0xf8, 0xb3, 0x15, 0x4c, 0xe3, 0xcf, + 0x0a, 0xce, 0x24, 0xc6, 0xf2, 0x65, 0x98, 0x09, 0xda, 0x15, 0x6d, 0xf3, 0x69, 0x24, 0x13, 0xf7, + 0x94, 0x14, 0x34, 0xd3, 0x4a, 0xe0, 0x70, 0x8a, 0x12, 0xbd, 0x0b, 0x73, 0x8e, 0xcd, 0xa8, 0xc5, + 0x0c, 0x62, 0x06, 0x23, 0x31, 0xb8, 0x4c, 0x22, 0xde, 0xd7, 0x76, 0x52, 0x18, 0x9c, 0xa1, 0x54, + 0x7f, 0xa9, 0xc0, 0x4a, 0x71, 0x74, 0xd0, 0x4f, 0x61, 0x2e, 0x3c, 0xb1, 0xd8, 0x97, 0x4b, 0x5e, + 0xf0, 0x70, 0x92, 0x27, 0x96, 0x2d, 0x43, 0x7e, 0x26, 0xec, 0xb9, 0x29, 0x32, 0x0f, 0x67, 0x54, + 0xa9, 0xbf, 0xae, 0xc0, 0x6c, 0x8a, 0xe4, 0x04, 0x4a, 0xe6, 0x56, 0xaa, 0x64, 0x9a, 0xc3, 0x1c, + 0xb3, 0xa8, 0x56, 0xee, 0x66, 0x6a, 0xe5, 0xd2, 0x30, 0x42, 0x07, 0x17, 0x49, 0x4f, 0x81, 0x5a, + 0x8a, 0x9e, 0xef, 0x10, 0x7e, 0x87, 0xba, 0x98, 0xee, 0x51, 0x97, 0x5a, 0x3a, 0x45, 0x17, 0x61, + 0x92, 0x38, 0xc6, 0x15, 0xd7, 0xf6, 0x1d, 0x99, 0x52, 0x51, 0xea, 0xaf, 0xef, 0x6c, 0x0b, 0x38, + 0x8e, 0x28, 0x38, 0x75, 0x68, 0x91, 0x9c, 0x00, 0x89, 0x3b, 0x61, 0x00, 0xc7, 0x11, 0x45, 0xb4, + 0x18, 0x8c, 0x16, 0x2e, 0x06, 0x1a, 0x54, 0x7d, 0xa3, 0x2d, 0x2f, 0xb2, 0x6f, 0x48, 0x82, 0xea, + 0xed, 0xed, 0xcd, 0xa7, 0xdd, 0xfa, 0xf9, 0xa2, 0xf7, 0x53, 0x76, 0xec, 0x50, 0xaf, 0x71, 0x7b, + 0x7b, 0x13, 0x73, 0x66, 0xf5, 0x2f, 0x0a, 0x2c, 0xa6, 0x0e, 0x79, 0x02, 0x2d, 0x60, 0x27, 0xdd, + 0x02, 0x5e, 0x1b, 0x22, 0x64, 0x05, 0xb5, 0x7f, 0x5f, 0x81, 0xb3, 0x03, 0xcb, 0xa2, 0xc4, 0x9a, + 0xf5, 0x1d, 0x98, 0xf7, 0xad, 0xf4, 0xf2, 0x1b, 0x54, 0xfa, 0x12, 0x5f, 0xb1, 0x6e, 0xa7, 0x51, + 0x38, 0x4b, 0xcb, 0xaf, 0x5b, 0x8b, 0x7d, 0x29, 0x8b, 0x3e, 0xc8, 0xbe, 0x3c, 0x5f, 0x28, 0x7d, + 0xe5, 0x1e, 0xf0, 0xdc, 0x9c, 0x7e, 0x16, 0xae, 0x94, 0x7a, 0x16, 0xfe, 0xbc, 0x02, 0x4b, 0x39, + 0xd9, 0x8f, 0x3e, 0x06, 0x88, 0xb7, 0xae, 0x9c, 0x60, 0xe7, 0x18, 0xd9, 0xf7, 0xa8, 0x34, 0x27, + 0xde, 0x83, 0x63, 0x68, 0x42, 0x22, 0xf2, 0x60, 0xda, 0xa5, 0x1e, 0x75, 0x8f, 0x68, 0xfb, 0x7d, + 0xdb, 0x95, 0x21, 0xff, 0xf6, 0x10, 0x21, 0xef, 0xab, 0xba, 0x78, 0xb9, 0xc3, 0xb1, 0x60, 0x9c, + 0xd4, 0x82, 0x5a, 0x70, 0xba, 0x4d, 0x49, 0xc2, 0x4c, 0xb1, 0xa6, 0xd1, 0xb6, 0x7c, 0x43, 0x3a, + 0x2b, 0x05, 0x9c, 0xde, 0xcc, 0x23, 0xc2, 0xf9, 0xbc, 0xea, 0x3f, 0x15, 0x38, 0x9d, 0xb2, 0xec, + 0x03, 0xda, 0x71, 0x4c, 0xc2, 0xe8, 0x09, 0x74, 0xce, 0xbb, 0xa9, 0xce, 0xf9, 0xce, 0x10, 0xee, + 0x0b, 0x8d, 0x2c, 0x7c, 0x27, 0xf8, 0x87, 0x02, 0x2f, 0xe5, 0x72, 0x9c, 0x40, 0x27, 0xf8, 0x30, + 0xdd, 0x09, 0xde, 0x7c, 0x8e, 0x73, 0x15, 0x74, 0x84, 0x47, 0x45, 0xa7, 0x6a, 0x05, 0x1b, 0xd6, + 0x97, 0x6f, 0xd4, 0xa9, 0x7f, 0x50, 0x60, 0x26, 0xa4, 0xe4, 0x37, 0x86, 0x12, 0x3d, 0x6d, 0x0d, + 0x40, 0xfe, 0x40, 0x16, 0xbe, 0x9f, 0x55, 0x63, 0xbb, 0xaf, 0x44, 0x18, 0x9c, 0xa0, 0x42, 0x57, + 0x01, 0x85, 0x16, 0xb6, 0x4c, 0xb1, 0xfb, 0xf3, 0x1b, 0x58, 0x55, 0xf0, 0xae, 0x48, 0x5e, 0x84, + 0xfb, 0x28, 0x70, 0x0e, 0x97, 0xfa, 0x57, 0x25, 0x5e, 0x32, 0x04, 0xf8, 0xff, 0xd5, 0xf3, 0xc2, + 0xb8, 0x42, 0xcf, 0x27, 0x87, 0xa4, 0xa0, 0x0c, 0x4b, 0xc3, 0x94, 0x29, 0xfd, 0xe2, 0x4a, 0x23, + 0x94, 0xf8, 0x9c, 0x43, 0x52, 0x58, 0x57, 0x50, 0x12, 0x0f, 0xaa, 0x99, 0x53, 0x88, 0x52, 0x28, + 0x7b, 0x99, 0xbb, 0x26, 0xaf, 0xae, 0x81, 0x5b, 0x5f, 0x2d, 0x67, 0x0e, 0x4f, 0xd3, 0xdc, 0x6b, + 0xee, 0x45, 0x98, 0xb4, 0xec, 0x36, 0x15, 0x8f, 0x19, 0x99, 0x55, 0xe8, 0x86, 0x84, 0xe3, 0x88, + 0xa2, 0xef, 0xe7, 0xd5, 0xd1, 0x17, 0xf4, 0xf3, 0x2a, 0x5f, 0xdf, 0x4c, 0xb9, 0xd5, 0x8f, 0x89, + 0xc9, 0x10, 0xaf, 0x6f, 0x12, 0x8e, 0x23, 0x0a, 0x74, 0x33, 0x9e, 0xe5, 0xe3, 0x22, 0x26, 0x5f, + 0x2b, 0x33, 0xcb, 0x8b, 0xc7, 0xb8, 0xa6, 0x3d, 0x7c, 0x52, 0x1b, 0x79, 0xf4, 0xa4, 0x36, 0xf2, + 0xc5, 0x93, 0xda, 0xc8, 0xfd, 0x5e, 0x4d, 0x79, 0xd8, 0xab, 0x29, 0x8f, 0x7a, 0x35, 0xe5, 0x8b, + 0x5e, 0x4d, 0x79, 0xdc, 0xab, 0x29, 0x9f, 0xfd, 0xbb, 0x36, 0xf2, 0xfd, 0x97, 0x07, 0xfd, 0x17, + 0xc1, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x4d, 0x8f, 0x9b, 0x77, 0x64, 0x20, 0x00, 0x00, } func (m *AllocationResult) Marshal() (dAtA []byte, err error) { @@ -1492,9 +1256,168 @@ func (m *AllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.AvailableOnNodes != nil { + i -= len(m.Controller) + copy(dAtA[i:], m.Controller) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Controller))) + i-- + dAtA[i] = 0x22 + if m.NodeSelector != nil { { - size, err := m.AvailableOnNodes.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.NodeSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + { + size, err := m.Devices.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *BasicDevice) 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 *BasicDevice) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BasicDevice) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Capacity) > 0 { + keysForCapacity := make([]string, 0, len(m.Capacity)) + for k := range m.Capacity { + keysForCapacity = append(keysForCapacity, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCapacity) + for iNdEx := len(keysForCapacity) - 1; iNdEx >= 0; iNdEx-- { + v := m.Capacity[QualifiedName(keysForCapacity[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForCapacity[iNdEx]) + copy(dAtA[i:], keysForCapacity[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForCapacity[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Attributes) > 0 { + keysForAttributes := make([]string, 0, len(m.Attributes)) + for k := range m.Attributes { + keysForAttributes = append(keysForAttributes, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForAttributes) + for iNdEx := len(keysForAttributes) - 1; iNdEx >= 0; iNdEx-- { + v := m.Attributes[QualifiedName(keysForAttributes[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForAttributes[iNdEx]) + copy(dAtA[i:], keysForAttributes[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForAttributes[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *CELDeviceSelector) 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 *CELDeviceSelector) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CELDeviceSelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Device) 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 *Device) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Device) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Basic != nil { + { + size, err := m.Basic.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1504,10 +1427,99 @@ func (m *AllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if len(m.ResourceHandles) > 0 { - for iNdEx := len(m.ResourceHandles) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceAllocationConfiguration) 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 *DeviceAllocationConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceAllocationConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.DeviceConfiguration.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Requests[iNdEx]) + copy(dAtA[i:], m.Requests[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Requests[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.Source) + copy(dAtA[i:], m.Source) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Source))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceAllocationResult) 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 *DeviceAllocationResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceAllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Config) > 0 { + for iNdEx := len(m.Config) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.ResourceHandles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Config[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Results) > 0 { + for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Results[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1521,7 +1533,7 @@ func (m *AllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *AllocationResultModel) Marshal() (dAtA []byte, err error) { +func (m *DeviceAttribute) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1531,19 +1543,364 @@ func (m *AllocationResultModel) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AllocationResultModel) MarshalTo(dAtA []byte) (int, error) { +func (m *DeviceAttribute) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AllocationResultModel) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DeviceAttribute) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.NamedResources != nil { + if m.VersionValue != nil { + i -= len(*m.VersionValue) + copy(dAtA[i:], *m.VersionValue) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.VersionValue))) + i-- + dAtA[i] = 0x2a + } + if m.StringValue != nil { + i -= len(*m.StringValue) + copy(dAtA[i:], *m.StringValue) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.StringValue))) + i-- + dAtA[i] = 0x22 + } + if m.BoolValue != nil { + i-- + if *m.BoolValue { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.IntValue != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.IntValue)) + i-- + dAtA[i] = 0x10 + } + return len(dAtA) - i, nil +} + +func (m *DeviceClaim) 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 *DeviceClaim) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClaim) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Config) > 0 { + for iNdEx := len(m.Config) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Config[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Constraints) > 0 { + for iNdEx := len(m.Constraints) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Constraints[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Requests[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceClaimConfiguration) 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 *DeviceClaimConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClaimConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.DeviceConfiguration.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Requests[iNdEx]) + copy(dAtA[i:], m.Requests[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Requests[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceClass) 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 *DeviceClass) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClass) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceClassConfiguration) 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 *DeviceClassConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClassConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.DeviceConfiguration.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceClassList) 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 *DeviceClassList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClassList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceClassSpec) 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 *DeviceClassSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClassSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.SuitableNodes != nil { { - size, err := m.NamedResources.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.SuitableNodes.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if len(m.Config) > 0 { + for iNdEx := len(m.Config) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Config[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Selectors) > 0 { + for iNdEx := len(m.Selectors) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Selectors[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceConfiguration) 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 *DeviceConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Opaque != nil { + { + size, err := m.Opaque.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1556,7 +1913,7 @@ func (m *AllocationResultModel) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *DriverAllocationResult) Marshal() (dAtA []byte, err error) { +func (m *DeviceConstraint) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1566,40 +1923,36 @@ func (m *DriverAllocationResult) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DriverAllocationResult) MarshalTo(dAtA []byte) (int, error) { +func (m *DeviceConstraint) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DriverAllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DeviceConstraint) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - { - size, err := m.AllocationResultModel.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + if m.MatchAttribute != nil { + i -= len(*m.MatchAttribute) + copy(dAtA[i:], *m.MatchAttribute) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchAttribute))) + i-- + dAtA[i] = 0x12 } - i-- - dAtA[i] = 0x12 - { - size, err := m.VendorRequestParameters.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Requests[iNdEx]) + copy(dAtA[i:], m.Requests[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Requests[iNdEx]))) + i-- + dAtA[i] = 0xa } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *DriverRequests) Marshal() (dAtA []byte, err error) { +func (m *DeviceRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1609,20 +1962,36 @@ func (m *DriverRequests) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DriverRequests) MarshalTo(dAtA []byte) (int, error) { +func (m *DeviceRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DriverRequests) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DeviceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Requests) > 0 { - for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + i-- + if m.AdminAccess { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + i = encodeVarintGenerated(dAtA, i, uint64(m.Count)) + i-- + dAtA[i] = 0x28 + i -= len(m.AllocationMode) + copy(dAtA[i:], m.AllocationMode) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AllocationMode))) + i-- + dAtA[i] = 0x22 + if len(m.Selectors) > 0 { + for iNdEx := len(m.Selectors) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Requests[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Selectors[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1633,80 +2002,9 @@ func (m *DriverRequests) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x1a } } - { - size, err := m.VendorParameters.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - i -= len(m.DriverName) - copy(dAtA[i:], m.DriverName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.DriverName))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *NamedResourcesAllocationResult) 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 *NamedResourcesAllocationResult) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NamedResourcesAllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *NamedResourcesAttribute) 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 *NamedResourcesAttribute) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NamedResourcesAttribute) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.NamedResourcesAttributeValue.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } + i -= len(m.DeviceClassName) + copy(dAtA[i:], m.DeviceClassName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.DeviceClassName))) i-- dAtA[i] = 0x12 i -= len(m.Name) @@ -1717,7 +2015,7 @@ func (m *NamedResourcesAttribute) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *NamedResourcesAttributeValue) Marshal() (dAtA []byte, err error) { +func (m *DeviceRequestAllocationResult) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1727,26 +2025,62 @@ func (m *NamedResourcesAttributeValue) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NamedResourcesAttributeValue) MarshalTo(dAtA []byte) (int, error) { +func (m *DeviceRequestAllocationResult) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NamedResourcesAttributeValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DeviceRequestAllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.VersionValue != nil { - i -= len(*m.VersionValue) - copy(dAtA[i:], *m.VersionValue) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.VersionValue))) - i-- - dAtA[i] = 0x52 + i -= len(m.Device) + copy(dAtA[i:], m.Device) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Device))) + i-- + dAtA[i] = 0x22 + i -= len(m.Pool) + copy(dAtA[i:], m.Pool) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Pool))) + i-- + dAtA[i] = 0x1a + i -= len(m.Driver) + copy(dAtA[i:], m.Driver) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i-- + dAtA[i] = 0x12 + i -= len(m.Request) + copy(dAtA[i:], m.Request) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Request))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceSelector) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - if m.StringSliceValue != nil { + return dAtA[:n], nil +} + +func (m *DeviceSelector) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceSelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CEL != nil { { - size, err := m.StringSliceValue.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.CEL.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1754,58 +2088,12 @@ func (m *NamedResourcesAttributeValue) MarshalToSizedBuffer(dAtA []byte) (int, e i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x4a - } - if m.IntSliceValue != nil { - { - size, err := m.IntSliceValue.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - if m.IntValue != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.IntValue)) - i-- - dAtA[i] = 0x38 - } - if m.QuantityValue != nil { - { - size, err := m.QuantityValue.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - if m.StringValue != nil { - i -= len(*m.StringValue) - copy(dAtA[i:], *m.StringValue) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.StringValue))) - i-- - dAtA[i] = 0x2a - } - if m.BoolValue != nil { - i-- - if *m.BoolValue { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *NamedResourcesFilter) Marshal() (dAtA []byte, err error) { +func (m *OpaqueDeviceConfiguration) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1815,193 +2103,34 @@ func (m *NamedResourcesFilter) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NamedResourcesFilter) MarshalTo(dAtA []byte) (int, error) { +func (m *OpaqueDeviceConfiguration) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NamedResourcesFilter) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *OpaqueDeviceConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i -= len(m.Selector) - copy(dAtA[i:], m.Selector) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Selector))) + { + size, err := m.Parameters.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + 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 *NamedResourcesInstance) 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 *NamedResourcesInstance) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NamedResourcesInstance) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Attributes) > 0 { - for iNdEx := len(m.Attributes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Attributes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *NamedResourcesIntSlice) 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 *NamedResourcesIntSlice) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NamedResourcesIntSlice) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Ints) > 0 { - for iNdEx := len(m.Ints) - 1; iNdEx >= 0; iNdEx-- { - i = encodeVarintGenerated(dAtA, i, uint64(m.Ints[iNdEx])) - i-- - dAtA[i] = 0x8 - } - } - return len(dAtA) - i, nil -} - -func (m *NamedResourcesRequest) 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 *NamedResourcesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NamedResourcesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.Selector) - copy(dAtA[i:], m.Selector) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Selector))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *NamedResourcesResources) 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 *NamedResourcesResources) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NamedResourcesResources) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Instances) > 0 { - for iNdEx := len(m.Instances) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Instances[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *NamedResourcesStringSlice) 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 *NamedResourcesStringSlice) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NamedResourcesStringSlice) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Strings) > 0 { - for iNdEx := len(m.Strings) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Strings[iNdEx]) - copy(dAtA[i:], m.Strings[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Strings[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func (m *PodSchedulingContext) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2319,150 +2448,6 @@ func (m *ResourceClaimList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ResourceClaimParameters) 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 *ResourceClaimParameters) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceClaimParameters) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.DriverRequests) > 0 { - for iNdEx := len(m.DriverRequests) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.DriverRequests[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if m.GeneratedFrom != nil { - { - size, err := m.GeneratedFrom.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ResourceClaimParametersList) 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 *ResourceClaimParametersList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceClaimParametersList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ResourceClaimParametersReference) 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 *ResourceClaimParametersReference) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceClaimParametersReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0x1a - i -= len(m.Kind) - copy(dAtA[i:], m.Kind) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) - i-- - dAtA[i] = 0x12 - i -= len(m.APIGroup) - copy(dAtA[i:], m.APIGroup) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIGroup))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *ResourceClaimSchedulingStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2520,21 +2505,19 @@ func (m *ResourceClaimSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.ParametersRef != nil { - { - size, err := m.ParametersRef.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + i -= len(m.Controller) + copy(dAtA[i:], m.Controller) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Controller))) + i-- + dAtA[i] = 0x12 + { + size, err := m.Devices.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x12 + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i -= len(m.ResourceClassName) - copy(dAtA[i:], m.ResourceClassName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceClassName))) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -2567,7 +2550,7 @@ func (m *ResourceClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0 } i-- - dAtA[i] = 0x20 + dAtA[i] = 0x18 if len(m.ReservedFor) > 0 { for iNdEx := len(m.ReservedFor) - 1; iNdEx >= 0; iNdEx-- { { @@ -2579,7 +2562,7 @@ func (m *ResourceClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } } if m.Allocation != nil { @@ -2592,13 +2575,8 @@ func (m *ResourceClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0xa } - i -= len(m.DriverName) - copy(dAtA[i:], m.DriverName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.DriverName))) - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -2735,7 +2713,7 @@ func (m *ResourceClaimTemplateSpec) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *ResourceClass) Marshal() (dAtA []byte, err error) { +func (m *ResourcePool) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2745,509 +2723,30 @@ func (m *ResourceClass) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ResourceClass) MarshalTo(dAtA []byte) (int, error) { +func (m *ResourcePool) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResourceClass) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ResourcePool) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.StructuredParameters != nil { - i-- - if *m.StructuredParameters { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x28 - } - if m.SuitableNodes != nil { - { - size, err := m.SuitableNodes.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if m.ParametersRef != nil { - { - size, err := m.ParametersRef.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - i -= len(m.DriverName) - copy(dAtA[i:], m.DriverName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.DriverName))) + i = encodeVarintGenerated(dAtA, i, uint64(m.ResourceSliceCount)) i-- - dAtA[i] = 0x12 - { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } + dAtA[i] = 0x18 + i = encodeVarintGenerated(dAtA, i, uint64(m.Generation)) i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ResourceClassList) 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 *ResourceClassList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceClassList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ResourceClassParameters) 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 *ResourceClassParameters) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceClassParameters) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Filters) > 0 { - for iNdEx := len(m.Filters) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Filters[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.VendorParameters) > 0 { - for iNdEx := len(m.VendorParameters) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.VendorParameters[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if m.GeneratedFrom != nil { - { - size, err := m.GeneratedFrom.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ResourceClassParametersList) 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 *ResourceClassParametersList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceClassParametersList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ResourceClassParametersReference) 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 *ResourceClassParametersReference) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceClassParametersReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.Namespace) - copy(dAtA[i:], m.Namespace) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) - i-- - dAtA[i] = 0x22 + dAtA[i] = 0x10 i -= len(m.Name) copy(dAtA[i:], m.Name) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) i-- - dAtA[i] = 0x1a - i -= len(m.Kind) - copy(dAtA[i:], m.Kind) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) - i-- - dAtA[i] = 0x12 - i -= len(m.APIGroup) - copy(dAtA[i:], m.APIGroup) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIGroup))) - i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ResourceFilter) 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 *ResourceFilter) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceFilter) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.ResourceFilterModel.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - i -= len(m.DriverName) - copy(dAtA[i:], m.DriverName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.DriverName))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ResourceFilterModel) 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 *ResourceFilterModel) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceFilterModel) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.NamedResources != nil { - { - size, err := m.NamedResources.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ResourceHandle) 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 *ResourceHandle) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceHandle) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.StructuredData != nil { - { - size, err := m.StructuredData.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x12 - i -= len(m.DriverName) - copy(dAtA[i:], m.DriverName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.DriverName))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ResourceModel) 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 *ResourceModel) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceModel) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.NamedResources != nil { - { - size, err := m.NamedResources.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ResourceRequest) 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 *ResourceRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.ResourceRequestModel.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.VendorParameters.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ResourceRequestModel) 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 *ResourceRequestModel) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResourceRequestModel) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.NamedResources != nil { - { - size, err := m.NamedResources.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *ResourceSlice) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3269,7 +2768,7 @@ func (m *ResourceSlice) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l { - size, err := m.ResourceModel.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -3277,16 +2776,6 @@ func (m *ResourceSlice) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 - i -= len(m.DriverName) - copy(dAtA[i:], m.DriverName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.DriverName))) - i-- - dAtA[i] = 0x1a - i -= len(m.NodeName) - copy(dAtA[i:], m.NodeName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeName))) - i-- dAtA[i] = 0x12 { size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) @@ -3348,7 +2837,7 @@ func (m *ResourceSliceList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *StructuredResourceHandle) Marshal() (dAtA []byte, err error) { +func (m *ResourceSliceSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -3358,20 +2847,20 @@ func (m *StructuredResourceHandle) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StructuredResourceHandle) MarshalTo(dAtA []byte) (int, error) { +func (m *ResourceSliceSpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StructuredResourceHandle) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ResourceSliceSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Results) > 0 { - for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Devices) > 0 { + for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Results[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -3379,16 +2868,36 @@ func (m *StructuredResourceHandle) MarshalToSizedBuffer(dAtA []byte) (int, error i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x2a + dAtA[i] = 0x32 } } + i-- + if m.AllNodes { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + if m.NodeSelector != nil { + { + size, err := m.NodeSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } i -= len(m.NodeName) copy(dAtA[i:], m.NodeName) i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeName))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a { - size, err := m.VendorClaimParameters.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Pool.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -3397,52 +2906,9 @@ func (m *StructuredResourceHandle) MarshalToSizedBuffer(dAtA []byte) (int, error } i-- dAtA[i] = 0x12 - { - size, err := m.VendorClassParameters.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *VendorParameters) 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 *VendorParameters) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *VendorParameters) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Parameters.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - i -= len(m.DriverName) - copy(dAtA[i:], m.DriverName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.DriverName))) + 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 @@ -3465,57 +2931,103 @@ func (m *AllocationResult) Size() (n int) { } var l int _ = l - if len(m.ResourceHandles) > 0 { - for _, e := range m.ResourceHandles { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + l = m.Devices.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.NodeSelector != nil { + l = m.NodeSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.Controller) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *BasicDevice) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Attributes) > 0 { + for k, v := range m.Attributes { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } - if m.AvailableOnNodes != nil { - l = m.AvailableOnNodes.Size() + if len(m.Capacity) > 0 { + for k, v := range m.Capacity { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *CELDeviceSelector) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *Device) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if m.Basic != nil { + l = m.Basic.Size() n += 1 + l + sovGenerated(uint64(l)) } return n } -func (m *AllocationResultModel) Size() (n int) { +func (m *DeviceAllocationConfiguration) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.NamedResources != nil { - l = m.NamedResources.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *DriverAllocationResult) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.VendorRequestParameters.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.AllocationResultModel.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *DriverRequests) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DriverName) - n += 1 + l + sovGenerated(uint64(l)) - l = m.VendorParameters.Size() + l = len(m.Source) n += 1 + l + sovGenerated(uint64(l)) if len(m.Requests) > 0 { - for _, e := range m.Requests { + for _, s := range m.Requests { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.DeviceConfiguration.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *DeviceAllocationResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Results) > 0 { + for _, e := range m.Results { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Config) > 0 { + for _, e := range m.Config { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } @@ -3523,36 +3035,15 @@ func (m *DriverRequests) Size() (n int) { return n } -func (m *NamedResourcesAllocationResult) Size() (n int) { +func (m *DeviceAttribute) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *NamedResourcesAttribute) Size() (n int) { - if m == nil { - return 0 + if m.IntValue != nil { + n += 1 + sovGenerated(uint64(*m.IntValue)) } - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = m.NamedResourcesAttributeValue.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *NamedResourcesAttributeValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l if m.BoolValue != nil { n += 2 } @@ -3560,21 +3051,6 @@ func (m *NamedResourcesAttributeValue) Size() (n int) { l = len(*m.StringValue) n += 1 + l + sovGenerated(uint64(l)) } - if m.QuantityValue != nil { - l = m.QuantityValue.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.IntValue != nil { - n += 1 + sovGenerated(uint64(*m.IntValue)) - } - if m.IntSliceValue != nil { - l = m.IntSliceValue.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.StringSliceValue != nil { - l = m.StringSliceValue.Size() - n += 1 + l + sovGenerated(uint64(l)) - } if m.VersionValue != nil { l = len(*m.VersionValue) n += 1 + l + sovGenerated(uint64(l)) @@ -3582,18 +3058,149 @@ func (m *NamedResourcesAttributeValue) Size() (n int) { return n } -func (m *NamedResourcesFilter) Size() (n int) { +func (m *DeviceClaim) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Selector) + if len(m.Requests) > 0 { + for _, e := range m.Requests { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Constraints) > 0 { + for _, e := range m.Constraints { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Config) > 0 { + for _, e := range m.Config { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *DeviceClaimConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Requests) > 0 { + for _, s := range m.Requests { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.DeviceConfiguration.Size() n += 1 + l + sovGenerated(uint64(l)) return n } -func (m *NamedResourcesInstance) Size() (n int) { +func (m *DeviceClass) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *DeviceClassConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.DeviceConfiguration.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *DeviceClassList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *DeviceClassSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Selectors) > 0 { + for _, e := range m.Selectors { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Config) > 0 { + for _, e := range m.Config { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.SuitableNodes != nil { + l = m.SuitableNodes.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Opaque != nil { + l = m.Opaque.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceConstraint) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Requests) > 0 { + for _, s := range m.Requests { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.MatchAttribute != nil { + l = len(*m.MatchAttribute) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceRequest) Size() (n int) { if m == nil { return 0 } @@ -3601,67 +3208,61 @@ func (m *NamedResourcesInstance) Size() (n int) { _ = l l = len(m.Name) n += 1 + l + sovGenerated(uint64(l)) - if len(m.Attributes) > 0 { - for _, e := range m.Attributes { + l = len(m.DeviceClassName) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Selectors) > 0 { + for _, e := range m.Selectors { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } } + l = len(m.AllocationMode) + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.Count)) + n += 2 return n } -func (m *NamedResourcesIntSlice) Size() (n int) { +func (m *DeviceRequestAllocationResult) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Ints) > 0 { - for _, e := range m.Ints { - n += 1 + sovGenerated(uint64(e)) - } - } - return n -} - -func (m *NamedResourcesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Selector) + l = len(m.Request) + n += 1 + l + sovGenerated(uint64(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)) return n } -func (m *NamedResourcesResources) Size() (n int) { +func (m *DeviceSelector) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Instances) > 0 { - for _, e := range m.Instances { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } + if m.CEL != nil { + l = m.CEL.Size() + n += 1 + l + sovGenerated(uint64(l)) } return n } -func (m *NamedResourcesStringSlice) Size() (n int) { +func (m *OpaqueDeviceConfiguration) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Strings) > 0 { - for _, s := range m.Strings { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Parameters.Size() + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -3778,59 +3379,6 @@ func (m *ResourceClaimList) Size() (n int) { return n } -func (m *ResourceClaimParameters) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if m.GeneratedFrom != nil { - l = m.GeneratedFrom.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if len(m.DriverRequests) > 0 { - for _, e := range m.DriverRequests { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ResourceClaimParametersList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ResourceClaimParametersReference) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.APIGroup) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Kind) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - func (m *ResourceClaimSchedulingStatus) Size() (n int) { if m == nil { return 0 @@ -3854,12 +3402,10 @@ func (m *ResourceClaimSpec) Size() (n int) { } var l int _ = l - l = len(m.ResourceClassName) + l = m.Devices.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Controller) n += 1 + l + sovGenerated(uint64(l)) - if m.ParametersRef != nil { - l = m.ParametersRef.Size() - n += 1 + l + sovGenerated(uint64(l)) - } return n } @@ -3869,8 +3415,6 @@ func (m *ResourceClaimStatus) Size() (n int) { } var l int _ = l - l = len(m.DriverName) - n += 1 + l + sovGenerated(uint64(l)) if m.Allocation != nil { l = m.Allocation.Size() n += 1 + l + sovGenerated(uint64(l)) @@ -3928,187 +3472,16 @@ func (m *ResourceClaimTemplateSpec) Size() (n int) { return n } -func (m *ResourceClass) Size() (n int) { +func (m *ResourcePool) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.DriverName) - n += 1 + l + sovGenerated(uint64(l)) - if m.ParametersRef != nil { - l = m.ParametersRef.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.SuitableNodes != nil { - l = m.SuitableNodes.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.StructuredParameters != nil { - n += 2 - } - return n -} - -func (m *ResourceClassList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ResourceClassParameters) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if m.GeneratedFrom != nil { - l = m.GeneratedFrom.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if len(m.VendorParameters) > 0 { - for _, e := range m.VendorParameters { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - if len(m.Filters) > 0 { - for _, e := range m.Filters { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ResourceClassParametersList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ResourceClassParametersReference) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.APIGroup) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Kind) - n += 1 + l + sovGenerated(uint64(l)) l = len(m.Name) n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Namespace) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *ResourceFilter) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DriverName) - n += 1 + l + sovGenerated(uint64(l)) - l = m.ResourceFilterModel.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *ResourceFilterModel) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.NamedResources != nil { - l = m.NamedResources.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *ResourceHandle) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DriverName) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Data) - n += 1 + l + sovGenerated(uint64(l)) - if m.StructuredData != nil { - l = m.StructuredData.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *ResourceModel) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.NamedResources != nil { - l = m.NamedResources.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *ResourceRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.VendorParameters.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.ResourceRequestModel.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *ResourceRequestModel) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.NamedResources != nil { - l = m.NamedResources.Size() - n += 1 + l + sovGenerated(uint64(l)) - } + n += 1 + sovGenerated(uint64(m.Generation)) + n += 1 + sovGenerated(uint64(m.ResourceSliceCount)) return n } @@ -4120,11 +3493,7 @@ func (m *ResourceSlice) Size() (n int) { _ = l l = m.ObjectMeta.Size() n += 1 + l + sovGenerated(uint64(l)) - l = len(m.NodeName) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.DriverName) - n += 1 + l + sovGenerated(uint64(l)) - l = m.ResourceModel.Size() + l = m.Spec.Size() n += 1 + l + sovGenerated(uint64(l)) return n } @@ -4146,20 +3515,25 @@ func (m *ResourceSliceList) Size() (n int) { return n } -func (m *StructuredResourceHandle) Size() (n int) { +func (m *ResourceSliceSpec) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = m.VendorClassParameters.Size() + l = len(m.Driver) n += 1 + l + sovGenerated(uint64(l)) - l = m.VendorClaimParameters.Size() + l = m.Pool.Size() n += 1 + l + sovGenerated(uint64(l)) l = len(m.NodeName) n += 1 + l + sovGenerated(uint64(l)) - if len(m.Results) > 0 { - for _, e := range m.Results { + if m.NodeSelector != nil { + l = m.NodeSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + n += 2 + if len(m.Devices) > 0 { + for _, e := range m.Devices { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } @@ -4167,19 +3541,6 @@ func (m *StructuredResourceHandle) Size() (n int) { return n } -func (m *VendorParameters) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DriverName) - n += 1 + l + sovGenerated(uint64(l)) - l = m.Parameters.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - func sovGenerated(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -4190,160 +3551,280 @@ func (this *AllocationResult) String() string { if this == nil { return "nil" } - repeatedStringForResourceHandles := "[]ResourceHandle{" - for _, f := range this.ResourceHandles { - repeatedStringForResourceHandles += strings.Replace(strings.Replace(f.String(), "ResourceHandle", "ResourceHandle", 1), `&`, ``, 1) + "," - } - repeatedStringForResourceHandles += "}" s := strings.Join([]string{`&AllocationResult{`, - `ResourceHandles:` + repeatedStringForResourceHandles + `,`, - `AvailableOnNodes:` + strings.Replace(fmt.Sprintf("%v", this.AvailableOnNodes), "NodeSelector", "v1.NodeSelector", 1) + `,`, + `Devices:` + strings.Replace(strings.Replace(this.Devices.String(), "DeviceAllocationResult", "DeviceAllocationResult", 1), `&`, ``, 1) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v1.NodeSelector", 1) + `,`, + `Controller:` + fmt.Sprintf("%v", this.Controller) + `,`, `}`, }, "") return s } -func (this *AllocationResultModel) String() string { +func (this *BasicDevice) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&AllocationResultModel{`, - `NamedResources:` + strings.Replace(this.NamedResources.String(), "NamedResourcesAllocationResult", "NamedResourcesAllocationResult", 1) + `,`, + keysForAttributes := make([]string, 0, len(this.Attributes)) + for k := range this.Attributes { + keysForAttributes = append(keysForAttributes, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForAttributes) + mapStringForAttributes := "map[QualifiedName]DeviceAttribute{" + for _, k := range keysForAttributes { + mapStringForAttributes += fmt.Sprintf("%v: %v,", k, this.Attributes[QualifiedName(k)]) + } + mapStringForAttributes += "}" + keysForCapacity := make([]string, 0, len(this.Capacity)) + for k := range this.Capacity { + keysForCapacity = append(keysForCapacity, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCapacity) + mapStringForCapacity := "map[QualifiedName]resource.Quantity{" + for _, k := range keysForCapacity { + mapStringForCapacity += fmt.Sprintf("%v: %v,", k, this.Capacity[QualifiedName(k)]) + } + mapStringForCapacity += "}" + s := strings.Join([]string{`&BasicDevice{`, + `Attributes:` + mapStringForAttributes + `,`, + `Capacity:` + mapStringForCapacity + `,`, `}`, }, "") return s } -func (this *DriverAllocationResult) String() string { +func (this *CELDeviceSelector) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&DriverAllocationResult{`, - `VendorRequestParameters:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.VendorRequestParameters), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, - `AllocationResultModel:` + strings.Replace(strings.Replace(this.AllocationResultModel.String(), "AllocationResultModel", "AllocationResultModel", 1), `&`, ``, 1) + `,`, + s := strings.Join([]string{`&CELDeviceSelector{`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, `}`, }, "") return s } -func (this *DriverRequests) String() string { +func (this *Device) String() string { if this == nil { return "nil" } - repeatedStringForRequests := "[]ResourceRequest{" - for _, f := range this.Requests { - repeatedStringForRequests += strings.Replace(strings.Replace(f.String(), "ResourceRequest", "ResourceRequest", 1), `&`, ``, 1) + "," - } - repeatedStringForRequests += "}" - s := strings.Join([]string{`&DriverRequests{`, - `DriverName:` + fmt.Sprintf("%v", this.DriverName) + `,`, - `VendorParameters:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.VendorParameters), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, - `Requests:` + repeatedStringForRequests + `,`, - `}`, - }, "") - return s -} -func (this *NamedResourcesAllocationResult) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&NamedResourcesAllocationResult{`, + s := strings.Join([]string{`&Device{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Basic:` + strings.Replace(this.Basic.String(), "BasicDevice", "BasicDevice", 1) + `,`, `}`, }, "") return s } -func (this *NamedResourcesAttribute) String() string { +func (this *DeviceAllocationConfiguration) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&NamedResourcesAttribute{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `NamedResourcesAttributeValue:` + strings.Replace(strings.Replace(this.NamedResourcesAttributeValue.String(), "NamedResourcesAttributeValue", "NamedResourcesAttributeValue", 1), `&`, ``, 1) + `,`, + s := strings.Join([]string{`&DeviceAllocationConfiguration{`, + `Source:` + fmt.Sprintf("%v", this.Source) + `,`, + `Requests:` + fmt.Sprintf("%v", this.Requests) + `,`, + `DeviceConfiguration:` + strings.Replace(strings.Replace(this.DeviceConfiguration.String(), "DeviceConfiguration", "DeviceConfiguration", 1), `&`, ``, 1) + `,`, `}`, }, "") return s } -func (this *NamedResourcesAttributeValue) String() string { +func (this *DeviceAllocationResult) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&NamedResourcesAttributeValue{`, + repeatedStringForResults := "[]DeviceRequestAllocationResult{" + for _, f := range this.Results { + repeatedStringForResults += strings.Replace(strings.Replace(f.String(), "DeviceRequestAllocationResult", "DeviceRequestAllocationResult", 1), `&`, ``, 1) + "," + } + repeatedStringForResults += "}" + repeatedStringForConfig := "[]DeviceAllocationConfiguration{" + for _, f := range this.Config { + repeatedStringForConfig += strings.Replace(strings.Replace(f.String(), "DeviceAllocationConfiguration", "DeviceAllocationConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForConfig += "}" + s := strings.Join([]string{`&DeviceAllocationResult{`, + `Results:` + repeatedStringForResults + `,`, + `Config:` + repeatedStringForConfig + `,`, + `}`, + }, "") + return s +} +func (this *DeviceAttribute) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceAttribute{`, + `IntValue:` + valueToStringGenerated(this.IntValue) + `,`, `BoolValue:` + valueToStringGenerated(this.BoolValue) + `,`, `StringValue:` + valueToStringGenerated(this.StringValue) + `,`, - `QuantityValue:` + strings.Replace(fmt.Sprintf("%v", this.QuantityValue), "Quantity", "resource.Quantity", 1) + `,`, - `IntValue:` + valueToStringGenerated(this.IntValue) + `,`, - `IntSliceValue:` + strings.Replace(this.IntSliceValue.String(), "NamedResourcesIntSlice", "NamedResourcesIntSlice", 1) + `,`, - `StringSliceValue:` + strings.Replace(this.StringSliceValue.String(), "NamedResourcesStringSlice", "NamedResourcesStringSlice", 1) + `,`, `VersionValue:` + valueToStringGenerated(this.VersionValue) + `,`, `}`, }, "") return s } -func (this *NamedResourcesFilter) String() string { +func (this *DeviceClaim) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&NamedResourcesFilter{`, - `Selector:` + fmt.Sprintf("%v", this.Selector) + `,`, + repeatedStringForRequests := "[]DeviceRequest{" + for _, f := range this.Requests { + repeatedStringForRequests += strings.Replace(strings.Replace(f.String(), "DeviceRequest", "DeviceRequest", 1), `&`, ``, 1) + "," + } + repeatedStringForRequests += "}" + repeatedStringForConstraints := "[]DeviceConstraint{" + for _, f := range this.Constraints { + repeatedStringForConstraints += strings.Replace(strings.Replace(f.String(), "DeviceConstraint", "DeviceConstraint", 1), `&`, ``, 1) + "," + } + repeatedStringForConstraints += "}" + repeatedStringForConfig := "[]DeviceClaimConfiguration{" + for _, f := range this.Config { + repeatedStringForConfig += strings.Replace(strings.Replace(f.String(), "DeviceClaimConfiguration", "DeviceClaimConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForConfig += "}" + s := strings.Join([]string{`&DeviceClaim{`, + `Requests:` + repeatedStringForRequests + `,`, + `Constraints:` + repeatedStringForConstraints + `,`, + `Config:` + repeatedStringForConfig + `,`, `}`, }, "") return s } -func (this *NamedResourcesInstance) String() string { +func (this *DeviceClaimConfiguration) String() string { if this == nil { return "nil" } - repeatedStringForAttributes := "[]NamedResourcesAttribute{" - for _, f := range this.Attributes { - repeatedStringForAttributes += strings.Replace(strings.Replace(f.String(), "NamedResourcesAttribute", "NamedResourcesAttribute", 1), `&`, ``, 1) + "," + s := strings.Join([]string{`&DeviceClaimConfiguration{`, + `Requests:` + fmt.Sprintf("%v", this.Requests) + `,`, + `DeviceConfiguration:` + strings.Replace(strings.Replace(this.DeviceConfiguration.String(), "DeviceConfiguration", "DeviceConfiguration", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClass) String() string { + if this == nil { + return "nil" } - repeatedStringForAttributes += "}" - s := strings.Join([]string{`&NamedResourcesInstance{`, + s := strings.Join([]string{`&DeviceClass{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "DeviceClassSpec", "DeviceClassSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClassConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceClassConfiguration{`, + `DeviceConfiguration:` + strings.Replace(strings.Replace(this.DeviceConfiguration.String(), "DeviceConfiguration", "DeviceConfiguration", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClassList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]DeviceClass{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "DeviceClass", "DeviceClass", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&DeviceClassList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClassSpec) String() string { + if this == nil { + return "nil" + } + repeatedStringForSelectors := "[]DeviceSelector{" + for _, f := range this.Selectors { + repeatedStringForSelectors += strings.Replace(strings.Replace(f.String(), "DeviceSelector", "DeviceSelector", 1), `&`, ``, 1) + "," + } + repeatedStringForSelectors += "}" + repeatedStringForConfig := "[]DeviceClassConfiguration{" + for _, f := range this.Config { + repeatedStringForConfig += strings.Replace(strings.Replace(f.String(), "DeviceClassConfiguration", "DeviceClassConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForConfig += "}" + s := strings.Join([]string{`&DeviceClassSpec{`, + `Selectors:` + repeatedStringForSelectors + `,`, + `Config:` + repeatedStringForConfig + `,`, + `SuitableNodes:` + strings.Replace(fmt.Sprintf("%v", this.SuitableNodes), "NodeSelector", "v1.NodeSelector", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceConfiguration{`, + `Opaque:` + strings.Replace(this.Opaque.String(), "OpaqueDeviceConfiguration", "OpaqueDeviceConfiguration", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceConstraint) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceConstraint{`, + `Requests:` + fmt.Sprintf("%v", this.Requests) + `,`, + `MatchAttribute:` + valueToStringGenerated(this.MatchAttribute) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceRequest) String() string { + if this == nil { + return "nil" + } + repeatedStringForSelectors := "[]DeviceSelector{" + for _, f := range this.Selectors { + repeatedStringForSelectors += strings.Replace(strings.Replace(f.String(), "DeviceSelector", "DeviceSelector", 1), `&`, ``, 1) + "," + } + repeatedStringForSelectors += "}" + s := strings.Join([]string{`&DeviceRequest{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Attributes:` + repeatedStringForAttributes + `,`, + `DeviceClassName:` + fmt.Sprintf("%v", this.DeviceClassName) + `,`, + `Selectors:` + repeatedStringForSelectors + `,`, + `AllocationMode:` + fmt.Sprintf("%v", this.AllocationMode) + `,`, + `Count:` + fmt.Sprintf("%v", this.Count) + `,`, + `AdminAccess:` + fmt.Sprintf("%v", this.AdminAccess) + `,`, `}`, }, "") return s } -func (this *NamedResourcesIntSlice) String() string { +func (this *DeviceRequestAllocationResult) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&NamedResourcesIntSlice{`, - `Ints:` + fmt.Sprintf("%v", this.Ints) + `,`, + s := strings.Join([]string{`&DeviceRequestAllocationResult{`, + `Request:` + fmt.Sprintf("%v", this.Request) + `,`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Pool:` + fmt.Sprintf("%v", this.Pool) + `,`, + `Device:` + fmt.Sprintf("%v", this.Device) + `,`, `}`, }, "") return s } -func (this *NamedResourcesRequest) String() string { +func (this *DeviceSelector) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&NamedResourcesRequest{`, - `Selector:` + fmt.Sprintf("%v", this.Selector) + `,`, + s := strings.Join([]string{`&DeviceSelector{`, + `CEL:` + strings.Replace(this.CEL.String(), "CELDeviceSelector", "CELDeviceSelector", 1) + `,`, `}`, }, "") return s } -func (this *NamedResourcesResources) String() string { +func (this *OpaqueDeviceConfiguration) String() string { if this == nil { return "nil" } - repeatedStringForInstances := "[]NamedResourcesInstance{" - for _, f := range this.Instances { - repeatedStringForInstances += strings.Replace(strings.Replace(f.String(), "NamedResourcesInstance", "NamedResourcesInstance", 1), `&`, ``, 1) + "," - } - repeatedStringForInstances += "}" - s := strings.Join([]string{`&NamedResourcesResources{`, - `Instances:` + repeatedStringForInstances + `,`, - `}`, - }, "") - return s -} -func (this *NamedResourcesStringSlice) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&NamedResourcesStringSlice{`, - `Strings:` + fmt.Sprintf("%v", this.Strings) + `,`, + s := strings.Join([]string{`&OpaqueDeviceConfiguration{`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Parameters:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Parameters), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -4443,51 +3924,6 @@ func (this *ResourceClaimList) String() string { }, "") return s } -func (this *ResourceClaimParameters) String() string { - if this == nil { - return "nil" - } - repeatedStringForDriverRequests := "[]DriverRequests{" - for _, f := range this.DriverRequests { - repeatedStringForDriverRequests += strings.Replace(strings.Replace(f.String(), "DriverRequests", "DriverRequests", 1), `&`, ``, 1) + "," - } - repeatedStringForDriverRequests += "}" - s := strings.Join([]string{`&ResourceClaimParameters{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, - `GeneratedFrom:` + strings.Replace(this.GeneratedFrom.String(), "ResourceClaimParametersReference", "ResourceClaimParametersReference", 1) + `,`, - `DriverRequests:` + repeatedStringForDriverRequests + `,`, - `}`, - }, "") - return s -} -func (this *ResourceClaimParametersList) String() string { - if this == nil { - return "nil" - } - repeatedStringForItems := "[]ResourceClaimParameters{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ResourceClaimParameters", "ResourceClaimParameters", 1), `&`, ``, 1) + "," - } - repeatedStringForItems += "}" - s := strings.Join([]string{`&ResourceClaimParametersList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *ResourceClaimParametersReference) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ResourceClaimParametersReference{`, - `APIGroup:` + fmt.Sprintf("%v", this.APIGroup) + `,`, - `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `}`, - }, "") - return s -} func (this *ResourceClaimSchedulingStatus) String() string { if this == nil { return "nil" @@ -4504,8 +3940,8 @@ func (this *ResourceClaimSpec) String() string { return "nil" } s := strings.Join([]string{`&ResourceClaimSpec{`, - `ResourceClassName:` + fmt.Sprintf("%v", this.ResourceClassName) + `,`, - `ParametersRef:` + strings.Replace(this.ParametersRef.String(), "ResourceClaimParametersReference", "ResourceClaimParametersReference", 1) + `,`, + `Devices:` + strings.Replace(strings.Replace(this.Devices.String(), "DeviceClaim", "DeviceClaim", 1), `&`, ``, 1) + `,`, + `Controller:` + fmt.Sprintf("%v", this.Controller) + `,`, `}`, }, "") return s @@ -4520,7 +3956,6 @@ func (this *ResourceClaimStatus) String() string { } repeatedStringForReservedFor += "}" s := strings.Join([]string{`&ResourceClaimStatus{`, - `DriverName:` + fmt.Sprintf("%v", this.DriverName) + `,`, `Allocation:` + strings.Replace(this.Allocation.String(), "AllocationResult", "AllocationResult", 1) + `,`, `ReservedFor:` + repeatedStringForReservedFor + `,`, `DeallocationRequested:` + fmt.Sprintf("%v", this.DeallocationRequested) + `,`, @@ -4566,148 +4001,14 @@ func (this *ResourceClaimTemplateSpec) String() string { }, "") return s } -func (this *ResourceClass) String() string { +func (this *ResourcePool) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&ResourceClass{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, - `DriverName:` + fmt.Sprintf("%v", this.DriverName) + `,`, - `ParametersRef:` + strings.Replace(this.ParametersRef.String(), "ResourceClassParametersReference", "ResourceClassParametersReference", 1) + `,`, - `SuitableNodes:` + strings.Replace(fmt.Sprintf("%v", this.SuitableNodes), "NodeSelector", "v1.NodeSelector", 1) + `,`, - `StructuredParameters:` + valueToStringGenerated(this.StructuredParameters) + `,`, - `}`, - }, "") - return s -} -func (this *ResourceClassList) String() string { - if this == nil { - return "nil" - } - repeatedStringForItems := "[]ResourceClass{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ResourceClass", "ResourceClass", 1), `&`, ``, 1) + "," - } - repeatedStringForItems += "}" - s := strings.Join([]string{`&ResourceClassList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *ResourceClassParameters) String() string { - if this == nil { - return "nil" - } - repeatedStringForVendorParameters := "[]VendorParameters{" - for _, f := range this.VendorParameters { - repeatedStringForVendorParameters += strings.Replace(strings.Replace(f.String(), "VendorParameters", "VendorParameters", 1), `&`, ``, 1) + "," - } - repeatedStringForVendorParameters += "}" - repeatedStringForFilters := "[]ResourceFilter{" - for _, f := range this.Filters { - repeatedStringForFilters += strings.Replace(strings.Replace(f.String(), "ResourceFilter", "ResourceFilter", 1), `&`, ``, 1) + "," - } - repeatedStringForFilters += "}" - s := strings.Join([]string{`&ResourceClassParameters{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, - `GeneratedFrom:` + strings.Replace(this.GeneratedFrom.String(), "ResourceClassParametersReference", "ResourceClassParametersReference", 1) + `,`, - `VendorParameters:` + repeatedStringForVendorParameters + `,`, - `Filters:` + repeatedStringForFilters + `,`, - `}`, - }, "") - return s -} -func (this *ResourceClassParametersList) String() string { - if this == nil { - return "nil" - } - repeatedStringForItems := "[]ResourceClassParameters{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ResourceClassParameters", "ResourceClassParameters", 1), `&`, ``, 1) + "," - } - repeatedStringForItems += "}" - s := strings.Join([]string{`&ResourceClassParametersList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *ResourceClassParametersReference) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ResourceClassParametersReference{`, - `APIGroup:` + fmt.Sprintf("%v", this.APIGroup) + `,`, - `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + s := strings.Join([]string{`&ResourcePool{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, - `}`, - }, "") - return s -} -func (this *ResourceFilter) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ResourceFilter{`, - `DriverName:` + fmt.Sprintf("%v", this.DriverName) + `,`, - `ResourceFilterModel:` + strings.Replace(strings.Replace(this.ResourceFilterModel.String(), "ResourceFilterModel", "ResourceFilterModel", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *ResourceFilterModel) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ResourceFilterModel{`, - `NamedResources:` + strings.Replace(this.NamedResources.String(), "NamedResourcesFilter", "NamedResourcesFilter", 1) + `,`, - `}`, - }, "") - return s -} -func (this *ResourceHandle) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ResourceHandle{`, - `DriverName:` + fmt.Sprintf("%v", this.DriverName) + `,`, - `Data:` + fmt.Sprintf("%v", this.Data) + `,`, - `StructuredData:` + strings.Replace(this.StructuredData.String(), "StructuredResourceHandle", "StructuredResourceHandle", 1) + `,`, - `}`, - }, "") - return s -} -func (this *ResourceModel) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ResourceModel{`, - `NamedResources:` + strings.Replace(this.NamedResources.String(), "NamedResourcesResources", "NamedResourcesResources", 1) + `,`, - `}`, - }, "") - return s -} -func (this *ResourceRequest) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ResourceRequest{`, - `VendorParameters:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.VendorParameters), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, - `ResourceRequestModel:` + strings.Replace(strings.Replace(this.ResourceRequestModel.String(), "ResourceRequestModel", "ResourceRequestModel", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *ResourceRequestModel) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ResourceRequestModel{`, - `NamedResources:` + strings.Replace(this.NamedResources.String(), "NamedResourcesRequest", "NamedResourcesRequest", 1) + `,`, + `Generation:` + fmt.Sprintf("%v", this.Generation) + `,`, + `ResourceSliceCount:` + fmt.Sprintf("%v", this.ResourceSliceCount) + `,`, `}`, }, "") return s @@ -4718,9 +4019,7 @@ func (this *ResourceSlice) String() string { } s := strings.Join([]string{`&ResourceSlice{`, `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, - `NodeName:` + fmt.Sprintf("%v", this.NodeName) + `,`, - `DriverName:` + fmt.Sprintf("%v", this.DriverName) + `,`, - `ResourceModel:` + strings.Replace(strings.Replace(this.ResourceModel.String(), "ResourceModel", "ResourceModel", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceSliceSpec", "ResourceSliceSpec", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -4741,31 +4040,22 @@ func (this *ResourceSliceList) String() string { }, "") return s } -func (this *StructuredResourceHandle) String() string { +func (this *ResourceSliceSpec) String() string { if this == nil { return "nil" } - repeatedStringForResults := "[]DriverAllocationResult{" - for _, f := range this.Results { - repeatedStringForResults += strings.Replace(strings.Replace(f.String(), "DriverAllocationResult", "DriverAllocationResult", 1), `&`, ``, 1) + "," + repeatedStringForDevices := "[]Device{" + for _, f := range this.Devices { + repeatedStringForDevices += strings.Replace(strings.Replace(f.String(), "Device", "Device", 1), `&`, ``, 1) + "," } - repeatedStringForResults += "}" - s := strings.Join([]string{`&StructuredResourceHandle{`, - `VendorClassParameters:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.VendorClassParameters), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, - `VendorClaimParameters:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.VendorClaimParameters), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, + repeatedStringForDevices += "}" + s := strings.Join([]string{`&ResourceSliceSpec{`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Pool:` + strings.Replace(strings.Replace(this.Pool.String(), "ResourcePool", "ResourcePool", 1), `&`, ``, 1) + `,`, `NodeName:` + fmt.Sprintf("%v", this.NodeName) + `,`, - `Results:` + repeatedStringForResults + `,`, - `}`, - }, "") - return s -} -func (this *VendorParameters) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&VendorParameters{`, - `DriverName:` + fmt.Sprintf("%v", this.DriverName) + `,`, - `Parameters:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Parameters), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v1.NodeSelector", 1) + `,`, + `AllNodes:` + fmt.Sprintf("%v", this.AllNodes) + `,`, + `Devices:` + repeatedStringForDevices + `,`, `}`, }, "") return s @@ -4809,7 +4099,7 @@ func (m *AllocationResult) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceHandles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -4836,452 +4126,672 @@ func (m *AllocationResult) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ResourceHandles = append(m.ResourceHandles, ResourceHandle{}) - if err := m.ResourceHandles[len(m.ResourceHandles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AvailableOnNodes", 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.AvailableOnNodes == nil { - m.AvailableOnNodes = &v1.NodeSelector{} - } - if err := m.AvailableOnNodes.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 *AllocationResultModel) 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: AllocationResultModel: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AllocationResultModel: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NamedResources", 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.NamedResources == nil { - m.NamedResources = &NamedResourcesAllocationResult{} - } - if err := m.NamedResources.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 *DriverAllocationResult) 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: DriverAllocationResult: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DriverAllocationResult: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VendorRequestParameters", 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.VendorRequestParameters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AllocationResultModel", 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.AllocationResultModel.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 *DriverRequests) 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: DriverRequests: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DriverRequests: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DriverName", 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.DriverName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VendorParameters", 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.VendorParameters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Devices.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeSelector", 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.NodeSelector == nil { + m.NodeSelector = &v1.NodeSelector{} + } + if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Controller", 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.Controller = 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 *BasicDevice) 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: BasicDevice: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BasicDevice: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Attributes", 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.Attributes == nil { + m.Attributes = make(map[QualifiedName]DeviceAttribute) + } + var mapkey QualifiedName + mapvalue := &DeviceAttribute{} + for iNdEx < postIndex { + entryPreIndex := 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) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = QualifiedName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &DeviceAttribute{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Attributes[QualifiedName(mapkey)] = *mapvalue + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Capacity", 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.Capacity == nil { + m.Capacity = make(map[QualifiedName]resource.Quantity) + } + var mapkey QualifiedName + mapvalue := &resource.Quantity{} + for iNdEx < postIndex { + entryPreIndex := 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) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = QualifiedName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &resource.Quantity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Capacity[QualifiedName(mapkey)] = *mapvalue + 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 *CELDeviceSelector) 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: CELDeviceSelector: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CELDeviceSelector: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", 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.Expression = 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 *Device) 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: Device: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Device: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", 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.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Basic", 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.Basic == nil { + m.Basic = &BasicDevice{} + } + if err := m.Basic.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 *DeviceAllocationConfiguration) 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: DeviceAllocationConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceAllocationConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", 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.Source = AllocationConfigSource(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Requests", 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.Requests = append(m.Requests, ResourceRequest{}) - if err := m.Requests[len(m.Requests)-1].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 *NamedResourcesAllocationResult) 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: NamedResourcesAllocationResult: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NamedResourcesAllocationResult: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { @@ -5308,93 +4818,11 @@ func (m *NamedResourcesAllocationResult) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Requests = append(m.Requests, 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 *NamedResourcesAttribute) 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: NamedResourcesAttribute: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NamedResourcesAttribute: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", 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.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NamedResourcesAttributeValue", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DeviceConfiguration", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -5421,7 +4849,7 @@ func (m *NamedResourcesAttribute) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.NamedResourcesAttributeValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.DeviceConfiguration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -5446,7 +4874,7 @@ func (m *NamedResourcesAttribute) Unmarshal(dAtA []byte) error { } return nil } -func (m *NamedResourcesAttributeValue) Unmarshal(dAtA []byte) error { +func (m *DeviceAllocationResult) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5469,13 +4897,151 @@ func (m *NamedResourcesAttributeValue) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: NamedResourcesAttributeValue: wiretype end group for non-group") + return fmt.Errorf("proto: DeviceAllocationResult: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: NamedResourcesAttributeValue: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: DeviceAllocationResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Results", 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.Results = append(m.Results, DeviceRequestAllocationResult{}) + if err := m.Results[len(m.Results)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", 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.Config = append(m.Config, DeviceAllocationConfiguration{}) + if err := m.Config[len(m.Config)-1].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 *DeviceAttribute) 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: DeviceAttribute: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceAttribute: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IntValue", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IntValue = &v + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field BoolValue", wireType) } @@ -5496,7 +5062,7 @@ func (m *NamedResourcesAttributeValue) Unmarshal(dAtA []byte) error { } b := bool(v != 0) m.BoolValue = &b - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field StringValue", wireType) } @@ -5529,135 +5095,7 @@ func (m *NamedResourcesAttributeValue) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.StringValue = &s iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field QuantityValue", 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.QuantityValue == nil { - m.QuantityValue = &resource.Quantity{} - } - if err := m.QuantityValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IntValue", wireType) - } - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IntValue = &v - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IntSliceValue", 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.IntSliceValue == nil { - m.IntSliceValue = &NamedResourcesIntSlice{} - } - if err := m.IntSliceValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StringSliceValue", 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.StringSliceValue == nil { - m.StringSliceValue = &NamedResourcesStringSlice{} - } - if err := m.StringSliceValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field VersionValue", wireType) } @@ -5711,7 +5149,7 @@ func (m *NamedResourcesAttributeValue) Unmarshal(dAtA []byte) error { } return nil } -func (m *NamedResourcesFilter) Unmarshal(dAtA []byte) error { +func (m *DeviceClaim) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5734,15 +5172,167 @@ func (m *NamedResourcesFilter) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: NamedResourcesFilter: wiretype end group for non-group") + return fmt.Errorf("proto: DeviceClaim: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: NamedResourcesFilter: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: DeviceClaim: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Requests", 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.Requests = append(m.Requests, DeviceRequest{}) + if err := m.Requests[len(m.Requests)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Constraints", 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.Constraints = append(m.Constraints, DeviceConstraint{}) + if err := m.Constraints[len(m.Constraints)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", 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.Config = append(m.Config, DeviceClaimConfiguration{}) + if err := m.Config[len(m.Config)-1].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 *DeviceClaimConfiguration) 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: DeviceClaimConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClaimConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -5770,7 +5360,40 @@ func (m *NamedResourcesFilter) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Selector = string(dAtA[iNdEx:postIndex]) + m.Requests = append(m.Requests, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceConfiguration", 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.DeviceConfiguration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -5793,7 +5416,7 @@ func (m *NamedResourcesFilter) Unmarshal(dAtA []byte) error { } return nil } -func (m *NamedResourcesInstance) Unmarshal(dAtA []byte) error { +func (m *DeviceClass) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5816,10 +5439,681 @@ func (m *NamedResourcesInstance) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: NamedResourcesInstance: wiretype end group for non-group") + return fmt.Errorf("proto: DeviceClass: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: NamedResourcesInstance: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: DeviceClass: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", 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.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", 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.Spec.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 *DeviceClassConfiguration) 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: DeviceClassConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClassConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceConfiguration", 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.DeviceConfiguration.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 *DeviceClassList) 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: DeviceClassList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClassList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", 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.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", 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.Items = append(m.Items, DeviceClass{}) + if err := m.Items[len(m.Items)-1].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 *DeviceClassSpec) 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: DeviceClassSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClassSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selectors", 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.Selectors = append(m.Selectors, DeviceSelector{}) + if err := m.Selectors[len(m.Selectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", 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.Config = append(m.Config, DeviceClassConfiguration{}) + if err := m.Config[len(m.Config)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SuitableNodes", 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.SuitableNodes == nil { + m.SuitableNodes = &v1.NodeSelector{} + } + if err := m.SuitableNodes.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 *DeviceConfiguration) 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: DeviceConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Opaque", 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.Opaque == nil { + m.Opaque = &OpaqueDeviceConfiguration{} + } + if err := m.Opaque.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 *DeviceConstraint) 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: DeviceConstraint: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceConstraint: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", 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.Requests = append(m.Requests, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchAttribute", 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 + } + s := FullyQualifiedName(dAtA[iNdEx:postIndex]) + m.MatchAttribute = &s + 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 *DeviceRequest) 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: DeviceRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -5856,217 +6150,7 @@ func (m *NamedResourcesInstance) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Attributes", 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.Attributes = append(m.Attributes, NamedResourcesAttribute{}) - if err := m.Attributes[len(m.Attributes)-1].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 *NamedResourcesIntSlice) 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: NamedResourcesIntSlice: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NamedResourcesIntSlice: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType == 0 { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Ints = append(m.Ints, v) - } else if wireType == 2 { - var packedLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - packedLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if packedLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + packedLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var elementCount int - var count int - for _, integer := range dAtA[iNdEx:postIndex] { - if integer < 128 { - count++ - } - } - elementCount = count - if elementCount != 0 && len(m.Ints) == 0 { - m.Ints = make([]int64, 0, elementCount) - } - for iNdEx < postIndex { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Ints = append(m.Ints, v) - } - } else { - return fmt.Errorf("proto: wrong wireType = %d for field Ints", wireType) - } - 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 *NamedResourcesRequest) 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: NamedResourcesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NamedResourcesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DeviceClassName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -6094,61 +6178,11 @@ func (m *NamedResourcesRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Selector = string(dAtA[iNdEx:postIndex]) + m.DeviceClassName = 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 *NamedResourcesResources) 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: NamedResourcesResources: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NamedResourcesResources: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Instances", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Selectors", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -6175,64 +6209,14 @@ func (m *NamedResourcesResources) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Instances = append(m.Instances, NamedResourcesInstance{}) - if err := m.Instances[len(m.Instances)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Selectors = append(m.Selectors, DeviceSelector{}) + if err := m.Selectors[len(m.Selectors)-1].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 *NamedResourcesStringSlice) 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: NamedResourcesStringSlice: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NamedResourcesStringSlice: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Strings", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AllocationMode", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -6260,7 +6244,425 @@ func (m *NamedResourcesStringSlice) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Strings = append(m.Strings, string(dAtA[iNdEx:postIndex])) + m.AllocationMode = DeviceAllocationMode(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Count", wireType) + } + m.Count = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Count |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AdminAccess", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AdminAccess = bool(v != 0) + 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 *DeviceRequestAllocationResult) 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: DeviceRequestAllocationResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceRequestAllocationResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", 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.Request = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + 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 3: + 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 4: + 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 + 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 *DeviceSelector) 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: DeviceSelector: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceSelector: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CEL", 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.CEL == nil { + m.CEL = &CELDeviceSelector{} + } + if err := m.CEL.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 *OpaqueDeviceConfiguration) 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: OpaqueDeviceConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OpaqueDeviceConfiguration: 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 Parameters", 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.Parameters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -7191,422 +7593,6 @@ func (m *ResourceClaimList) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResourceClaimParameters) 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: ResourceClaimParameters: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceClaimParameters: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", 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.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GeneratedFrom", 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.GeneratedFrom == nil { - m.GeneratedFrom = &ResourceClaimParametersReference{} - } - if err := m.GeneratedFrom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DriverRequests", 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.DriverRequests = append(m.DriverRequests, DriverRequests{}) - if err := m.DriverRequests[len(m.DriverRequests)-1].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 *ResourceClaimParametersList) 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: ResourceClaimParametersList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceClaimParametersList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", 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.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", 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.Items = append(m.Items, ResourceClaimParameters{}) - if err := m.Items[len(m.Items)-1].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 *ResourceClaimParametersReference) 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: ResourceClaimParametersReference: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceClaimParametersReference: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", 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.APIGroup = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", 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.Kind = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", 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.Name = 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 *ResourceClaimSchedulingStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -7752,7 +7738,40 @@ func (m *ResourceClaimSpec) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceClassName", wireType) + 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 + } + if err := m.Devices.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Controller", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -7780,43 +7799,7 @@ func (m *ResourceClaimSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ResourceClassName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ParametersRef", 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.ParametersRef == nil { - m.ParametersRef = &ResourceClaimParametersReference{} - } - if err := m.ParametersRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Controller = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -7869,38 +7852,6 @@ func (m *ResourceClaimStatus) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DriverName", 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.DriverName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Allocation", wireType) } @@ -7936,7 +7887,7 @@ func (m *ResourceClaimStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ReservedFor", wireType) } @@ -7970,7 +7921,7 @@ func (m *ResourceClaimStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field DeallocationRequested", wireType) } @@ -8360,7 +8311,7 @@ func (m *ResourceClaimTemplateSpec) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResourceClass) Unmarshal(dAtA []byte) error { +func (m *ResourcePool) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8383,706 +8334,13 @@ func (m *ResourceClass) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResourceClass: wiretype end group for non-group") + return fmt.Errorf("proto: ResourcePool: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceClass: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResourcePool: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", 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.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DriverName", 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.DriverName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ParametersRef", 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.ParametersRef == nil { - m.ParametersRef = &ResourceClassParametersReference{} - } - if err := m.ParametersRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SuitableNodes", 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.SuitableNodes == nil { - m.SuitableNodes = &v1.NodeSelector{} - } - if err := m.SuitableNodes.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StructuredParameters", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.StructuredParameters = &b - 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 *ResourceClassList) 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: ResourceClassList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceClassList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", 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.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", 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.Items = append(m.Items, ResourceClass{}) - if err := m.Items[len(m.Items)-1].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 *ResourceClassParameters) 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: ResourceClassParameters: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceClassParameters: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", 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.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GeneratedFrom", 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.GeneratedFrom == nil { - m.GeneratedFrom = &ResourceClassParametersReference{} - } - if err := m.GeneratedFrom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VendorParameters", 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.VendorParameters = append(m.VendorParameters, VendorParameters{}) - if err := m.VendorParameters[len(m.VendorParameters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Filters", 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.Filters = append(m.Filters, ResourceFilter{}) - if err := m.Filters[len(m.Filters)-1].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 *ResourceClassParametersList) 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: ResourceClassParametersList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceClassParametersList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", 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.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", 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.Items = append(m.Items, ResourceClassParameters{}) - if err := m.Items[len(m.Items)-1].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 *ResourceClassParametersReference) 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: ResourceClassParametersReference: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceClassParametersReference: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", 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.APIGroup = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", 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.Kind = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } @@ -9114,125 +8372,11 @@ func (m *ResourceClassParametersReference) Unmarshal(dAtA []byte) error { } m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Namespace", 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.Namespace = 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 *ResourceFilter) 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: ResourceFilter: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceFilter: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DriverName", 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.DriverName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceFilterModel", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Generation", wireType) } - var msglen int + m.Generation = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -9242,80 +8386,16 @@ func (m *ResourceFilter) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Generation |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthGenerated + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceSliceCount", wireType) } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ResourceFilterModel.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 *ResourceFilterModel) 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: ResourceFilterModel: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceFilterModel: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NamedResources", wireType) - } - var msglen int + m.ResourceSliceCount = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -9325,466 +8405,11 @@ func (m *ResourceFilterModel) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.ResourceSliceCount |= int64(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.NamedResources == nil { - m.NamedResources = &NamedResourcesFilter{} - } - if err := m.NamedResources.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 *ResourceHandle) 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: ResourceHandle: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceHandle: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DriverName", 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.DriverName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", 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.Data = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StructuredData", 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.StructuredData == nil { - m.StructuredData = &StructuredResourceHandle{} - } - if err := m.StructuredData.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 *ResourceModel) 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: ResourceModel: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceModel: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NamedResources", 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.NamedResources == nil { - m.NamedResources = &NamedResourcesResources{} - } - if err := m.NamedResources.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 *ResourceRequest) 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: ResourceRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VendorParameters", 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.VendorParameters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceRequestModel", 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.ResourceRequestModel.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 *ResourceRequestModel) 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: ResourceRequestModel: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceRequestModel: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NamedResources", 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.NamedResources == nil { - m.NamedResources = &NamedResourcesRequest{} - } - if err := m.NamedResources.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -9870,71 +8495,7 @@ func (m *ResourceSlice) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NodeName", 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.NodeName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DriverName", 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.DriverName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceModel", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9961,7 +8522,7 @@ func (m *ResourceSlice) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceModel.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -10103,7 +8664,7 @@ func (m *ResourceSliceList) Unmarshal(dAtA []byte) error { } return nil } -func (m *StructuredResourceHandle) Unmarshal(dAtA []byte) error { +func (m *ResourceSliceSpec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10126,17 +8687,17 @@ func (m *StructuredResourceHandle) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StructuredResourceHandle: wiretype end group for non-group") + return fmt.Errorf("proto: ResourceSliceSpec: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StructuredResourceHandle: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResourceSliceSpec: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VendorClassParameters", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -10146,28 +8707,27 @@ func (m *StructuredResourceHandle) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.VendorClassParameters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Driver = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VendorClaimParameters", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10194,11 +8754,11 @@ func (m *StructuredResourceHandle) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.VendorClaimParameters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Pool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) } @@ -10230,9 +8790,65 @@ func (m *StructuredResourceHandle) Unmarshal(dAtA []byte) error { } m.NodeName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeSelector", 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.NodeSelector == nil { + m.NodeSelector = &v1.NodeSelector{} + } + if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllNodes", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllNodes = bool(v != 0) + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10259,123 +8875,8 @@ func (m *StructuredResourceHandle) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Results = append(m.Results, DriverAllocationResult{}) - if err := m.Results[len(m.Results)-1].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 *VendorParameters) 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: VendorParameters: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: VendorParameters: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DriverName", 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.DriverName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Parameters", 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.Parameters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Devices = append(m.Devices, Device{}) + if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/staging/src/k8s.io/api/resource/v1alpha3/generated.proto b/staging/src/k8s.io/api/resource/v1alpha3/generated.proto index 1f864a0edf4..35a7fbafa8b 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/generated.proto +++ b/staging/src/k8s.io/api/resource/v1alpha3/generated.proto @@ -32,182 +32,495 @@ option go_package = "k8s.io/api/resource/v1alpha3"; // AllocationResult contains attributes of an allocated resource. message AllocationResult { - // ResourceHandles contain the state associated with an allocation that - // should be maintained throughout the lifetime of a claim. Each - // ResourceHandle contains data that should be passed to a specific kubelet - // plugin once it lands on a node. This data is returned by the driver - // after a successful allocation and is opaque to Kubernetes. Driver - // documentation may explain to users how to interpret this data if needed. - // - // Setting this field is optional. It has a maximum size of 32 entries. - // If null (or empty), it is assumed this allocation will be processed by a - // single kubelet plugin with no ResourceHandle data attached. The name of - // the kubelet plugin invoked will match the DriverName set in the - // ResourceClaimStatus this AllocationResult is embedded in. - // - // +listType=atomic - // +optional - repeated ResourceHandle resourceHandles = 1; - - // This field will get set by the resource driver after it has allocated - // the resource to inform the scheduler where it can schedule Pods using - // the ResourceClaim. - // - // Setting this field is optional. If null, the resource is available - // everywhere. - // +optional - optional .k8s.io.api.core.v1.NodeSelector availableOnNodes = 2; -} - -// AllocationResultModel must have one and only one field set. -message AllocationResultModel { - // NamedResources describes the allocation result when using the named resources model. + // Devices is the result of allocating devices. // // +optional - optional NamedResourcesAllocationResult namedResources = 1; -} + optional DeviceAllocationResult devices = 1; -// DriverAllocationResult contains vendor parameters and the allocation result for -// one request. -message DriverAllocationResult { - // VendorRequestParameters are the per-request configuration parameters - // from the time that the claim was allocated. + // NodeSelector defines where the allocated resources are available. If + // unset, they are available everywhere. // // +optional - optional .k8s.io.apimachinery.pkg.runtime.RawExtension vendorRequestParameters = 1; + optional .k8s.io.api.core.v1.NodeSelector nodeSelector = 3; - optional AllocationResultModel allocationResultModel = 2; -} - -// DriverRequests describes all resources that are needed from one particular driver. -message DriverRequests { - // DriverName is the name used by the DRA driver kubelet plugin. - optional string driverName = 1; - - // VendorParameters are arbitrary setup parameters for all requests of the - // claim. They are ignored while allocating the claim. + // Controller is the name of the DRA driver which handled the + // allocation. That driver is also responsible for deallocating the + // claim. It is empty when the claim can be deallocated without + // involving a driver. + // + // A driver may allocate devices provided by other drivers, so this + // driver name here can be different from the driver names listed for + // the results. + // + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. // // +optional - optional .k8s.io.apimachinery.pkg.runtime.RawExtension vendorParameters = 2; - - // Requests describes all resources that are needed from the driver. - // +listType=atomic - repeated ResourceRequest requests = 3; + // +featureGate=DRAControlPlaneController + optional string controller = 4; } -// NamedResourcesAllocationResult is used in AllocationResultModel. -message NamedResourcesAllocationResult { - // Name is the name of the selected resource instance. - optional string name = 1; +// BasicDevice defines one device instance. +message BasicDevice { + // Attributes defines the set of attributes for this device. + // The name of each attribute must be unique in that set. + // + // The maximum number of attributes and capacities combined is 32. + // + // +optional + map attributes = 1; + + // Capacity defines the set of capacities for this device. + // The name of each capacity must be unique in that set. + // + // The maximum number of attributes and capacities combined is 32. + // + // +optional + map capacity = 2; } -// NamedResourcesAttribute is a combination of an attribute name and its value. -message NamedResourcesAttribute { - // Name is unique identifier among all resource instances managed by - // the driver on the node. It must be a DNS subdomain. +// CELDeviceSelector contains a CEL expression for selecting a device. +message CELDeviceSelector { + // Expression is a CEL expression which evaluates a single device. It + // must evaluate to true when the device under consideration satisfies + // the desired criteria, and false when it does not. Any other result + // is an error and causes allocation of devices to abort. + // + // The expression's input is an object named "device", which carries + // the following properties: + // - driver (string): the name of the driver which defines this device. + // - attributes (map[string]object): the device's attributes, grouped by prefix + // (e.g. device.attributes["dra.example.com"] evaluates to an object with all + // of the attributes which were prefixed by "dra.example.com". + // - capacity (map[string]object): the device's capacities, grouped by prefix. + // + // Example: Consider a device with driver="dra.example.com", which exposes + // two attributes named "model" and "ext.example.com/family" and which + // exposes one capacity named "modules". This input to this expression + // would have the following fields: + // + // device.driver + // device.attributes["dra.example.com"].model + // device.attributes["ext.example.com"].family + // device.capacity["dra.example.com"].modules + // + // The device.driver field can be used to check for a specific driver, + // either as a high-level precondition (i.e. you only want to consider + // devices from this driver) or as part of a multi-clause expression + // that is meant to consider devices from different drivers. + // + // The value type of each attribute is defined by the device + // definition, and users who write these expressions must consult the + // documentation for their specific drivers. The value type of each + // capacity is Quantity. + // + // If an unknown prefix is used as a lookup in either device.attributes + // or device.capacity, an empty map will be returned. Any reference to + // an unknown field will cause an evaluation error and allocation to + // abort. + // + // A robust expression should check for the existence of attributes + // before referencing them. + // + // For ease of use, the cel.bind() function is enabled, and can be used + // to simplify expressions that access multiple attributes with the + // same domain. For example: + // + // cel.bind(dra, device.attributes["dra.example.com"], dra.someBool && dra.anotherBool) + // + // +required + optional string expression = 1; +} + +// Device represents one individual hardware instance that can be selected based +// on its attributes. Besides the name, exactly one field must be set. +message Device { + // Name is unique identifier among all devices managed by + // the driver in the pool. It must be a DNS label. + // + // +required optional string name = 1; - optional NamedResourcesAttributeValue attributeValue = 2; + // Basic defines one device instance. + // + // +optional + // +oneOf=deviceType + optional BasicDevice basic = 2; } -// NamedResourcesAttributeValue must have one and only one field set. -message NamedResourcesAttributeValue { - // QuantityValue is a quantity. - optional .k8s.io.apimachinery.pkg.api.resource.Quantity quantity = 6; +// DeviceAllocationConfiguration gets embedded in an AllocationResult. +message DeviceAllocationConfiguration { + // Source records whether the configuration comes from a class and thus + // is not something that a normal user would have been able to set + // or from a claim. + // + // +required + optional string source = 1; + + // Requests lists the names of requests where the configuration applies. + // If empty, its applies to all requests. + // + // +optional + // +listType=atomic + repeated string requests = 2; + + optional DeviceConfiguration deviceConfiguration = 3; +} + +// DeviceAllocationResult is the result of allocating devices. +message DeviceAllocationResult { + // Results lists all allocated devices. + // + // +optional + // +listType=atomic + repeated DeviceRequestAllocationResult results = 1; + + // This field is a combination of all the claim and class configuration parameters. + // Drivers can distinguish between those based on a flag. + // + // This includes configuration parameters for drivers which have no allocated + // devices in the result because it is up to the drivers which configuration + // parameters they support. They can silently ignore unknown configuration + // parameters. + // + // +optional + // +listType=atomic + repeated DeviceAllocationConfiguration config = 2; +} + +// DeviceAttribute must have exactly one field set. +message DeviceAttribute { + // IntValue is a number. + // + // +optional + // +oneOf=ValueType + optional int64 int = 2; // BoolValue is a true/false value. - optional bool bool = 2; + // + // +optional + // +oneOf=ValueType + optional bool bool = 3; - // IntValue is a 64-bit integer. - optional int64 int = 7; - - // IntSliceValue is an array of 64-bit integers. - optional NamedResourcesIntSlice intSlice = 8; - - // StringValue is a string. - optional string string = 5; - - // StringSliceValue is an array of strings. - optional NamedResourcesStringSlice stringSlice = 9; + // StringValue is a string. Must not be longer than 64 characters. + // + // +optional + // +oneOf=ValueType + optional string string = 4; // VersionValue is a semantic version according to semver.org spec 2.0.0. - optional string version = 10; + // Must not be longer than 64 characters. + // + // +optional + // +oneOf=ValueType + optional string version = 5; } -// NamedResourcesFilter is used in ResourceFilterModel. -message NamedResourcesFilter { - // Selector is a CEL expression which must evaluate to true if a - // resource instance is suitable. The language is as defined in - // https://kubernetes.io/docs/reference/using-api/cel/ +// DeviceClaim defines how to request devices with a ResourceClaim. +message DeviceClaim { + // Requests represent individual requests for distinct devices which + // must all be satisfied. If empty, nothing needs to be allocated. // - // In addition, for each type in NamedResourcesAttributeValue there is a map that - // resolves to the corresponding value of the instance under evaluation. - // For example: + // +optional + // +listType=atomic + repeated DeviceRequest requests = 1; + + // These constraints must be satisfied by the set of devices that get + // allocated for the claim. // - // attributes.quantity["a"].isGreaterThan(quantity("0")) && - // attributes.stringslice["b"].isSorted() - optional string selector = 1; + // +optional + // +listType=atomic + repeated DeviceConstraint constraints = 2; + + // This field holds configuration for multiple potential drivers which + // could satisfy requests in this claim. It is ignored while allocating + // the claim. + // + // +optional + // +listType=atomic + repeated DeviceClaimConfiguration config = 3; } -// NamedResourcesInstance represents one individual hardware instance that can be selected based -// on its attributes. -message NamedResourcesInstance { - // Name is unique identifier among all resource instances managed by - // the driver on the node. It must be a DNS subdomain. +// DeviceClaimConfiguration is used for configuration parameters in DeviceClaim. +message DeviceClaimConfiguration { + // Requests lists the names of requests where the configuration applies. + // If empty, it applies to all requests. + // + // +optional + // +listType=atomic + repeated string requests = 1; + + optional DeviceConfiguration deviceConfiguration = 2; +} + +// DeviceClass is a vendor- or admin-provided resource that contains +// device configuration and selectors. It can be referenced in +// the device requests of a claim to apply these presets. +// Cluster scoped. +// +// This is an alpha type and requires enabling the DynamicResourceAllocation +// feature gate. +message DeviceClass { + // Standard object metadata + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Spec defines what can be allocated and how to configure it. + // + // This is mutable. Consumers have to be prepared for classes changing + // at any time, either because they get updated or replaced. Claim + // allocations are done once based on whatever was set in classes at + // the time of allocation. + // + // Changing the spec automatically increments the metadata.generation number. + optional DeviceClassSpec spec = 2; +} + +// DeviceClassConfiguration is used in DeviceClass. +message DeviceClassConfiguration { + optional DeviceConfiguration deviceConfiguration = 1; +} + +// DeviceClassList is a collection of classes. +message DeviceClassList { + // Standard list metadata + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is the list of resource classes. + repeated DeviceClass items = 2; +} + +// DeviceClassSpec is used in a [DeviceClass] to define what can be allocated +// and how to configure it. +message DeviceClassSpec { + // Each selector must be satisfied by a device which is claimed via this class. + // + // +optional + // +listType=atomic + repeated DeviceSelector selectors = 1; + + // Config defines configuration parameters that apply to each device that is claimed via this class. + // Some classses may potentially be satisfied by multiple drivers, so each instance of a vendor + // configuration applies to exactly one driver. + // + // They are passed to the driver, but are not considered while allocating the claim. + // + // +optional + // +listType=atomic + repeated DeviceClassConfiguration config = 2; + + // Only nodes matching the selector will be considered by the scheduler + // when trying to find a Node that fits a Pod when that Pod uses + // a claim that has not been allocated yet *and* that claim + // gets allocated through a control plane controller. It is ignored + // when the claim does not use a control plane controller + // for allocation. + // + // Setting this field is optional. If unset, all Nodes are candidates. + // + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. + // + // +optional + // +featureGate=DRAControlPlaneController + optional .k8s.io.api.core.v1.NodeSelector suitableNodes = 3; +} + +// DeviceConfiguration must have exactly one field set. It gets embedded +// inline in some other structs which have other fields, so field names must +// not conflict with those. +message DeviceConfiguration { + // Opaque provides driver-specific configuration parameters. + // + // +optional + // +oneOf=ConfigurationType + optional OpaqueDeviceConfiguration opaque = 1; +} + +// DeviceConstraint must have exactly one field set besides Requests. +message DeviceConstraint { + // Requests is a list of the one or more requests in this claim which + // must co-satisfy this constraint. If a request is fulfilled by + // multiple devices, then all of the devices must satisfy the + // constraint. If this is not specified, this constraint applies to all + // requests in this claim. + // + // +optional + // +listType=atomic + repeated string requests = 1; + + // MatchAttribute requires that all devices in question have this + // attribute and that its type and value are the same across those + // devices. + // + // For example, if you specified "dra.example.com/numa" (a hypothetical example!), + // then only devices in the same NUMA node will be chosen. A device which + // does not have that attribute will not be chosen. All devices should + // use a value of the same type for this attribute because that is part of + // its specification, but if one device doesn't, then it also will not be + // chosen. + // + // Must include the domain qualifier. + // + // +optional + // +oneOf=ConstraintType + optional string matchAttribute = 2; +} + +// DeviceRequest is a request for devices required for a claim. +// This is typically a request for a single resource like a device, but can +// also ask for several identical devices. +// +// A DeviceClassName is currently required. Clients must check that it is +// indeed set. It's absence indicates that something changed in a way that +// is not supported by the client yet, in which case it must refuse to +// handle the request. +message DeviceRequest { + // Name can be used to reference this request in a pod.spec.containers[].resources.claims + // entry and in a constraint of the claim. + // + // Must be a DNS label. + // + // +required optional string name = 1; - // Attributes defines the attributes of this resource instance. - // The name of each attribute must be unique. + // DeviceClassName references a specific DeviceClass, which can define + // additional configuration and selectors to be inherited by this + // request. + // + // A class is required. Which classes are available depends on the cluster. + // + // Administrators may use this to restrict which devices may get + // requested by only installing classes with selectors for permitted + // devices. If users are free to request anything without restrictions, + // then administrators can create an empty DeviceClass for users + // to reference. + // + // +required + optional string deviceClassName = 2; + + // Selectors define criteria which must be satisfied by a specific + // device in order for that device to be considered for this + // request. All selectors must be satisfied for a device to be + // considered. // - // +listType=atomic // +optional - repeated NamedResourcesAttribute attributes = 2; -} - -// NamedResourcesIntSlice contains a slice of 64-bit integers. -message NamedResourcesIntSlice { - // Ints is the slice of 64-bit integers. - // // +listType=atomic - repeated int64 ints = 1; + repeated DeviceSelector selectors = 3; + + // AllocationMode and its related fields define how devices are allocated + // to satisfy this request. Supported values are: + // + // - ExactCount: This request is for a specific number of devices. + // This is the default. The exact number is provided in the + // count field. + // + // - All: This request is for all of the matching devices in a pool. + // Allocation will fail if some devices are already allocated, + // unless adminAccess is requested. + // + // If AlloctionMode is not specified, the default mode is ExactCount. If + // the mode is ExactCount and count is not specified, the default count is + // one. Any other requests must specify this field. + // + // More modes may get added in the future. Clients must refuse to handle + // requests with unknown modes. + // + // +optional + optional string allocationMode = 4; + + // Count is used only when the count mode is "ExactCount". Must be greater than zero. + // If AllocationMode is ExactCount and this field is not specified, the default is one. + // + // +optional + // +oneOf=AllocationMode + optional int64 count = 5; + + // AdminAccess indicates that this is a claim for administrative access + // to the device(s). Claims with AdminAccess are expected to be used for + // monitoring or other management services for a device. They ignore + // all ordinary claims to the device with respect to access modes and + // any resource allocations. + // + // +optional + // +default=false + optional bool adminAccess = 6; } -// NamedResourcesRequest is used in ResourceRequestModel. -message NamedResourcesRequest { - // Selector is a CEL expression which must evaluate to true if a - // resource instance is suitable. The language is as defined in - // https://kubernetes.io/docs/reference/using-api/cel/ +// DeviceRequestAllocationResult contains the allocation result for one request. +message DeviceRequestAllocationResult { + // Request is the name of the request in the claim which caused this + // device to be allocated. Multiple devices may have been allocated + // per request. // - // In addition, for each type NamedResourcesin AttributeValue there is a map that - // resolves to the corresponding value of the instance under evaluation. - // For example: + // +required + optional string request = 1; + + // 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. // - // attributes.quantity["a"].isGreaterThan(quantity("0")) && - // attributes.stringslice["b"].isSorted() - optional string selector = 1; + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + optional string driver = 2; + + // 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 = 3; + + // Device references one device instance via its name in the driver's + // resource pool. It must be a DNS label. + // + // +required + optional string device = 4; } -// NamedResourcesResources is used in ResourceModel. -message NamedResourcesResources { - // The list of all individual resources instances currently available. +// DeviceSelector must have exactly one field set. +message DeviceSelector { + // CEL contains a CEL expression for selecting a device. // - // +listType=atomic - repeated NamedResourcesInstance instances = 1; + // +optional + // +oneOf=SelectorType + optional CELDeviceSelector cel = 1; } -// NamedResourcesStringSlice contains a slice of strings. -message NamedResourcesStringSlice { - // Strings is the slice of strings. +// OpaqueDeviceConfiguration contains configuration parameters for a driver +// in a format defined by the driver vendor. +message OpaqueDeviceConfiguration { + // Driver is used to determine which kubelet plugin needs + // to be passed these configuration parameters. // - // +listType=atomic - repeated string strings = 1; + // An admission policy provided by the driver developer could use this + // to decide whether it needs to validate them. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + optional string driver = 1; + + // Parameters can contain arbitrary data. It is the responsibility of + // the driver developer to handle validation and versioning. Typically this + // includes self-identification and a version ("kind" + "apiVersion" for + // Kubernetes types), with conversion between different versions. + // + // +required + optional .k8s.io.apimachinery.pkg.runtime.RawExtension parameters = 2; } // PodSchedulingContext objects hold information that is needed to schedule // a Pod with ResourceClaims that use "WaitForFirstConsumer" allocation // mode. // -// This is an alpha type and requires enabling the DynamicResourceAllocation +// This is an alpha type and requires enabling the DRAControlPlaneController // feature gate. message PodSchedulingContext { // Standard object metadata @@ -218,6 +531,7 @@ message PodSchedulingContext { optional PodSchedulingContextSpec spec = 2; // Status describes where resources for the Pod can be allocated. + // // +optional optional PodSchedulingContextStatus status = 3; } @@ -237,6 +551,7 @@ message PodSchedulingContextSpec { // SelectedNode is the node for which allocation of ResourceClaims that // are referenced by the Pod and that use "WaitForFirstConsumer" // allocation is to be attempted. + // // +optional optional string selectedNode = 1; @@ -247,8 +562,8 @@ message PodSchedulingContextSpec { // that suits all pending resources. This may get increased in the // future, but not reduced. // - // +listType=atomic // +optional + // +listType=atomic repeated string potentialNodes = 2; } @@ -264,9 +579,11 @@ message PodSchedulingContextStatus { repeated ResourceClaimSchedulingStatus resourceClaims = 1; } -// ResourceClaim describes which resources are needed by a resource consumer. -// Its status tracks whether the resource has been allocated and what the -// resulting attributes are. +// ResourceClaim describes a request for access to resources in the cluster, +// for use by workloads. For example, if a workload needs an accelerator device +// with specific properties, this is how that request is expressed. The status +// stanza tracks whether this claim has been satisfied and what specific +// resources have been allocated. // // This is an alpha type and requires enabling the DynamicResourceAllocation // feature gate. @@ -275,13 +592,11 @@ message ResourceClaim { // +optional optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - // Spec describes the desired attributes of a resource that then needs - // to be allocated. It can only be set once when creating the - // ResourceClaim. + // Spec describes what is being requested and how to configure it. + // The spec is immutable. optional ResourceClaimSpec spec = 2; - // Status describes whether the resource is available and with which - // attributes. + // Status describes whether the claim is ready to use and what has been allocated. // +optional optional ResourceClaimStatus status = 3; } @@ -297,12 +612,15 @@ message ResourceClaimConsumerReference { optional string apiGroup = 1; // Resource is the type of resource being referenced, for example "pods". + // +required optional string resource = 3; // Name is the name of resource being referenced. + // +required optional string name = 4; // UID identifies exactly one incarnation of the resource. + // +required optional string uid = 5; } @@ -316,63 +634,12 @@ message ResourceClaimList { repeated ResourceClaim items = 2; } -// ResourceClaimParameters defines resource requests for a ResourceClaim in an -// in-tree format understood by Kubernetes. -message ResourceClaimParameters { - // Standard object metadata - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // If this object was created from some other resource, then this links - // back to that resource. This field is used to find the in-tree representation - // of the claim parameters when the parameter reference of the claim refers - // to some unknown type. - // +optional - optional ResourceClaimParametersReference generatedFrom = 2; - - // DriverRequests describes all resources that are needed for the - // allocated claim. A single claim may use resources coming from - // different drivers. For each driver, this array has at most one - // entry which then may have one or more per-driver requests. - // - // May be empty, in which case the claim can always be allocated. - // - // +listType=atomic - repeated DriverRequests driverRequests = 4; -} - -// ResourceClaimParametersList is a collection of ResourceClaimParameters. -message ResourceClaimParametersList { - // Standard list metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // Items is the list of node resource capacity objects. - repeated ResourceClaimParameters items = 2; -} - -// ResourceClaimParametersReference contains enough information to let you -// locate the parameters for a ResourceClaim. The object must be in the same -// namespace as the ResourceClaim. -message ResourceClaimParametersReference { - // APIGroup is the group for the resource being referenced. It is - // empty for the core API. This matches the group in the APIVersion - // that is used when creating the resources. - // +optional - optional string apiGroup = 1; - - // Kind is the type of resource being referenced. This is the same - // value as in the parameter object's metadata, for example "ConfigMap". - optional string kind = 2; - - // Name is the name of resource being referenced. - optional string name = 3; -} - // ResourceClaimSchedulingStatus contains information about one particular // ResourceClaim with "WaitForFirstConsumer" allocation mode. message ResourceClaimSchedulingStatus { // Name matches the pod.spec.resourceClaims[*].Name field. - // +optional + // + // +required optional string name = 1; // UnsuitableNodes lists nodes that the ResourceClaim cannot be @@ -382,68 +649,87 @@ message ResourceClaimSchedulingStatus { // PodSchedulingSpec.PotentialNodes. This may get increased in the // future, but not reduced. // - // +listType=atomic // +optional + // +listType=atomic repeated string unsuitableNodes = 2; } -// ResourceClaimSpec defines how a resource is to be allocated. +// ResourceClaimSpec defines what is being requested in a ResourceClaim and how to configure it. message ResourceClaimSpec { - // ResourceClassName references the driver and additional parameters - // via the name of a ResourceClass that was created as part of the - // driver deployment. - optional string resourceClassName = 1; - - // ParametersRef references a separate object with arbitrary parameters - // that will be used by the driver when allocating a resource for the - // claim. + // Devices defines how to request devices. // - // The object must be in the same namespace as the ResourceClaim. // +optional - optional ResourceClaimParametersReference parametersRef = 2; + optional DeviceClaim devices = 1; + + // Controller is the name of the DRA driver that is meant + // to handle allocation of this claim. If empty, allocation is handled + // by the scheduler while scheduling a pod. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. + // + // +optional + // +featureGate=DRAControlPlaneController + optional string controller = 2; } // ResourceClaimStatus tracks whether the resource has been allocated and what -// the resulting attributes are. +// the result of that was. message ResourceClaimStatus { - // DriverName is a copy of the driver name from the ResourceClass at - // the time when allocation started. + // Allocation is set once the claim has been allocated successfully. + // // +optional - optional string driverName = 1; - - // Allocation is set by the resource driver once a resource or set of - // resources has been allocated successfully. If this is not specified, the - // resources have not been allocated yet. - // +optional - optional AllocationResult allocation = 2; + optional AllocationResult allocation = 1; // 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. + // 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. + // + // In 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. + // + // Both 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. // // There can be at most 32 such reservations. This may get increased in // the future, but not reduced. // + // +optional // +listType=map // +listMapKey=uid // +patchStrategy=merge // +patchMergeKey=uid - // +optional - repeated ResourceClaimConsumerReference reservedFor = 3; + repeated ResourceClaimConsumerReference reservedFor = 2; - // DeallocationRequested indicates that a ResourceClaim is to be - // deallocated. + // Indicates that a claim is to be deallocated. While this is set, + // no new consumers may be added to ReservedFor. // - // The driver then must deallocate this claim and reset the field + // This is only used if the claim needs to be deallocated by a DRA driver. + // That driver then must deallocate this claim and reset the field // together with clearing the Allocation field. // - // While DeallocationRequested is set, no new consumers may be added to - // ReservedFor. + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. + // // +optional - optional bool deallocationRequested = 4; + // +featureGate=DRAControlPlaneController + optional bool deallocationRequested = 3; } // ResourceClaimTemplate is used to produce ResourceClaim objects. +// +// This is an alpha type and requires enabling the DynamicResourceAllocation +// feature gate. message ResourceClaimTemplate { // Standard object metadata // +optional @@ -481,254 +767,146 @@ message ResourceClaimTemplateSpec { optional ResourceClaimSpec spec = 2; } -// ResourceClass is used by administrators to influence how resources -// are allocated. +// ResourcePool describes the pool that ResourceSlices belong to. +message ResourcePool { + // Name is used to identify the pool. For node-local devices, this + // is often the node name, but this is not required. + // + // It must not be longer than 253 characters and must consist of one or more DNS sub-domains + // separated by slashes. This field is immutable. + // + // +required + optional string name = 1; + + // Generation tracks the change in a pool over time. Whenever a driver + // changes something about one or more of the resources in a pool, it + // must change the generation in all ResourceSlices which are part of + // that pool. Consumers of ResourceSlices should only consider + // resources from the pool with the highest generation number. The + // generation may be reset by drivers, which should be fine for + // consumers, assuming that all ResourceSlices in a pool are updated to + // match or deleted. + // + // Combined with ResourceSliceCount, this mechanism enables consumers to + // detect pools which are comprised of multiple ResourceSlices and are + // in an incomplete state. + // + // +required + optional int64 generation = 2; + + // ResourceSliceCount is the total number of ResourceSlices in the pool at this + // generation number. Must be greater than zero. + // + // Consumers can use this to check whether they have seen all ResourceSlices + // belonging to the same pool. + // + // +required + optional int64 resourceSliceCount = 3; +} + +// ResourceSlice represents one or more resources in a pool of similar resources, +// managed by a common driver. A pool may span more than one ResourceSlice, and exactly how many +// ResourceSlices comprise a pool is determined by the driver. +// +// At the moment, the only supported resources are devices with attributes and capacities. +// Each device in a given pool, regardless of how many ResourceSlices, must have a unique name. +// The ResourceSlice in which a device gets published may change over time. The unique identifier +// for a device is the tuple , , . +// +// Whenever a driver needs to update a pool, it increments the pool.Spec.Pool.Generation number +// and updates all ResourceSlices with that new number and new resource definitions. A consumer +// must only use ResourceSlices with the highest generation number and ignore all others. +// +// When allocating all resources in a pool matching certain criteria or when +// looking for the best solution among several different alternatives, a +// consumer should check the number of ResourceSlices in a pool (included in +// each ResourceSlice) to determine whether its view of a pool is complete and +// if not, should wait until the driver has completed updating the pool. +// +// For resources that are not local to a node, the node name is not set. Instead, +// the driver may use a node selector to specify where the devices are available. // // This is an alpha type and requires enabling the DynamicResourceAllocation // feature gate. -message ResourceClass { - // Standard object metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // DriverName defines the name of the dynamic resource driver that is - // used for allocation of a ResourceClaim that uses this class. - // - // Resource drivers have a unique name in forward domain order - // (acme.example.com). - optional string driverName = 2; - - // ParametersRef references an arbitrary separate object that may hold - // parameters that will be used by the driver when allocating a - // resource that uses this class. A dynamic resource driver can - // distinguish between parameters stored here and and those stored in - // ResourceClaimSpec. - // +optional - optional ResourceClassParametersReference parametersRef = 3; - - // Only nodes matching the selector will be considered by the scheduler - // when trying to find a Node that fits a Pod when that Pod uses - // a ResourceClaim that has not been allocated yet. - // - // Setting this field is optional. If null, all nodes are candidates. - // +optional - optional .k8s.io.api.core.v1.NodeSelector suitableNodes = 4; - - // If and only if allocation of claims using this class is handled - // via structured parameters, then StructuredParameters must be set to true. - // +optional - optional bool structuredParameters = 5; -} - -// ResourceClassList is a collection of classes. -message ResourceClassList { - // Standard list metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // Items is the list of resource classes. - repeated ResourceClass items = 2; -} - -// ResourceClassParameters defines resource requests for a ResourceClass in an -// in-tree format understood by Kubernetes. -message ResourceClassParameters { - // Standard object metadata - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // If this object was created from some other resource, then this links - // back to that resource. This field is used to find the in-tree representation - // of the class parameters when the parameter reference of the class refers - // to some unknown type. - // +optional - optional ResourceClassParametersReference generatedFrom = 2; - - // VendorParameters are arbitrary setup parameters for all claims using - // this class. They are ignored while allocating the claim. There must - // not be more than one entry per driver. - // - // +listType=atomic - // +optional - repeated VendorParameters vendorParameters = 3; - - // Filters describes additional contraints that must be met when using the class. - // - // +listType=atomic - repeated ResourceFilter filters = 4; -} - -// ResourceClassParametersList is a collection of ResourceClassParameters. -message ResourceClassParametersList { - // Standard list metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // Items is the list of node resource capacity objects. - repeated ResourceClassParameters items = 2; -} - -// ResourceClassParametersReference contains enough information to let you -// locate the parameters for a ResourceClass. -message ResourceClassParametersReference { - // APIGroup is the group for the resource being referenced. It is - // empty for the core API. This matches the group in the APIVersion - // that is used when creating the resources. - // +optional - optional string apiGroup = 1; - - // Kind is the type of resource being referenced. This is the same - // value as in the parameter object's metadata. - optional string kind = 2; - - // Name is the name of resource being referenced. - optional string name = 3; - - // Namespace that contains the referenced resource. Must be empty - // for cluster-scoped resources and non-empty for namespaced - // resources. - // +optional - optional string namespace = 4; -} - -// ResourceFilter is a filter for resources from one particular driver. -message ResourceFilter { - // DriverName is the name used by the DRA driver kubelet plugin. - optional string driverName = 1; - - optional ResourceFilterModel resourceFilterModel = 2; -} - -// ResourceFilterModel must have one and only one field set. -message ResourceFilterModel { - // NamedResources describes a resource filter using the named resources model. - // - // +optional - optional NamedResourcesFilter namedResources = 1; -} - -// ResourceHandle holds opaque resource data for processing by a specific kubelet plugin. -message ResourceHandle { - // DriverName specifies the name of the resource driver whose kubelet - // plugin should be invoked to process this ResourceHandle's data once it - // lands on a node. This may differ from the DriverName set in - // ResourceClaimStatus this ResourceHandle is embedded in. - optional string driverName = 1; - - // Data contains the opaque data associated with this ResourceHandle. It is - // set by the controller component of the resource driver whose name - // matches the DriverName set in the ResourceClaimStatus this - // ResourceHandle is embedded in. It is set at allocation time and is - // intended for processing by the kubelet plugin whose name matches - // the DriverName set in this ResourceHandle. - // - // The maximum size of this field is 16KiB. This may get increased in the - // future, but not reduced. - // +optional - optional string data = 2; - - // If StructuredData is set, then it needs to be used instead of Data. - // - // +optional - optional StructuredResourceHandle structuredData = 5; -} - -// ResourceModel must have one and only one field set. -message ResourceModel { - // NamedResources describes available resources using the named resources model. - // - // +optional - optional NamedResourcesResources namedResources = 1; -} - -// ResourceRequest is a request for resources from one particular driver. -message ResourceRequest { - // VendorParameters are arbitrary setup parameters for the requested - // resource. They are ignored while allocating a claim. - // - // +optional - optional .k8s.io.apimachinery.pkg.runtime.RawExtension vendorParameters = 1; - - optional ResourceRequestModel resourceRequestModel = 2; -} - -// ResourceRequestModel must have one and only one field set. -message ResourceRequestModel { - // NamedResources describes a request for resources with the named resources model. - // - // +optional - optional NamedResourcesRequest namedResources = 1; -} - -// ResourceSlice provides information about available -// resources on individual nodes. message ResourceSlice { // Standard object metadata // +optional optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - // NodeName identifies the node which provides the resources - // if they are local to a node. + // Contains the information published by the driver. // - // A field selector can be used to list only ResourceSlice - // objects with a certain node name. - // - // +optional - optional string nodeName = 2; - - // DriverName identifies the DRA driver providing the capacity information. - // A field selector can be used to list only ResourceSlice - // objects with a certain driver name. - optional string driverName = 3; - - optional ResourceModel resourceModel = 4; + // Changing the spec automatically increments the metadata.generation number. + optional ResourceSliceSpec spec = 2; } // ResourceSliceList is a collection of ResourceSlices. message ResourceSliceList { // Standard list metadata // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta listMeta = 1; - // Items is the list of node resource capacity objects. + // Items is the list of resource ResourceSlices. repeated ResourceSlice items = 2; } -// StructuredResourceHandle is the in-tree representation of the allocation result. -message StructuredResourceHandle { - // VendorClassParameters are the per-claim configuration parameters - // from the resource class at the time that the claim was allocated. +// ResourceSliceSpec contains the information published by the driver in one ResourceSlice. +message ResourceSliceSpec { + // Driver identifies the DRA driver providing the capacity information. + // A field selector can be used to list only ResourceSlice + // objects with a certain driver name. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. This field is immutable. + // + // +required + optional string driver = 1; + + // Pool describes the pool that this ResourceSlice belongs to. + // + // +required + optional ResourcePool pool = 2; + + // NodeName identifies the node which provides the resources in this pool. + // A field selector can be used to list only ResourceSlice + // objects belonging to a certain node. + // + // This field can be used to limit access from nodes to ResourceSlices with + // the same node name. It also indicates to autoscalers that adding + // new nodes of the same type as some old node might also make new + // resources available. + // + // Exactly one of NodeName, NodeSelector and AllNodes must be set. + // This field is immutable. // // +optional - optional .k8s.io.apimachinery.pkg.runtime.RawExtension vendorClassParameters = 1; + // +oneOf=NodeSelection + optional string nodeName = 3; - // VendorClaimParameters are the per-claim configuration parameters - // from the resource claim parameters at the time that the claim was - // allocated. + // NodeSelector defines which nodes have access to the resources in the pool, + // when that pool is not limited to a single node. + // + // Must use exactly one term. + // + // Exactly one of NodeName, NodeSelector and AllNodes must be set. // // +optional - optional .k8s.io.apimachinery.pkg.runtime.RawExtension vendorClaimParameters = 2; + // +oneOf=NodeSelection + optional .k8s.io.api.core.v1.NodeSelector nodeSelector = 4; - // NodeName is the name of the node providing the necessary resources - // if the resources are local to a node. + // AllNodes indicates that all nodes have access to the resources in the pool. + // + // Exactly one of NodeName, NodeSelector and AllNodes must be set. // // +optional - optional string nodeName = 4; + // +oneOf=NodeSelection + optional bool allNodes = 5; - // Results lists all allocated driver resources. + // Devices lists some or all of the devices in this pool. // + // Must not have more than 128 entries. + // + // +optional // +listType=atomic - repeated DriverAllocationResult results = 5; -} - -// VendorParameters are opaque parameters for one particular driver. -message VendorParameters { - // DriverName is the name used by the DRA driver kubelet plugin. - optional string driverName = 1; - - // Parameters can be arbitrary setup parameters. They are ignored while - // allocating a claim. - // - // +optional - optional .k8s.io.apimachinery.pkg.runtime.RawExtension parameters = 2; + repeated Device devices = 6; } diff --git a/staging/src/k8s.io/api/resource/v1alpha3/namedresources.go b/staging/src/k8s.io/api/resource/v1alpha3/namedresources.go deleted file mode 100644 index 2ce0d3c9e97..00000000000 --- a/staging/src/k8s.io/api/resource/v1alpha3/namedresources.go +++ /dev/null @@ -1,127 +0,0 @@ -/* -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 v1alpha3 - -import ( - "k8s.io/apimachinery/pkg/api/resource" -) - -// NamedResourcesResources is used in ResourceModel. -type NamedResourcesResources struct { - // The list of all individual resources instances currently available. - // - // +listType=atomic - Instances []NamedResourcesInstance `json:"instances" protobuf:"bytes,1,name=instances"` -} - -// NamedResourcesInstance represents one individual hardware instance that can be selected based -// on its attributes. -type NamedResourcesInstance struct { - // Name is unique identifier among all resource instances managed by - // the driver on the node. It must be a DNS subdomain. - Name string `json:"name" protobuf:"bytes,1,name=name"` - - // Attributes defines the attributes of this resource instance. - // The name of each attribute must be unique. - // - // +listType=atomic - // +optional - Attributes []NamedResourcesAttribute `json:"attributes,omitempty" protobuf:"bytes,2,opt,name=attributes"` -} - -// NamedResourcesAttribute is a combination of an attribute name and its value. -type NamedResourcesAttribute struct { - // Name is unique identifier among all resource instances managed by - // the driver on the node. It must be a DNS subdomain. - Name string `json:"name" protobuf:"bytes,1,name=name"` - - NamedResourcesAttributeValue `json:",inline" protobuf:"bytes,2,opt,name=attributeValue"` -} - -// The Go field names below have a Value suffix to avoid a conflict between the -// field "String" and the corresponding method. That method is required. -// The Kubernetes API is defined without that suffix to keep it more natural. - -// NamedResourcesAttributeValue must have one and only one field set. -type NamedResourcesAttributeValue struct { - // QuantityValue is a quantity. - QuantityValue *resource.Quantity `json:"quantity,omitempty" protobuf:"bytes,6,opt,name=quantity"` - // BoolValue is a true/false value. - BoolValue *bool `json:"bool,omitempty" protobuf:"bytes,2,opt,name=bool"` - // IntValue is a 64-bit integer. - IntValue *int64 `json:"int,omitempty" protobuf:"varint,7,opt,name=int"` - // IntSliceValue is an array of 64-bit integers. - IntSliceValue *NamedResourcesIntSlice `json:"intSlice,omitempty" protobuf:"varint,8,rep,name=intSlice"` - // StringValue is a string. - StringValue *string `json:"string,omitempty" protobuf:"bytes,5,opt,name=string"` - // StringSliceValue is an array of strings. - StringSliceValue *NamedResourcesStringSlice `json:"stringSlice,omitempty" protobuf:"bytes,9,rep,name=stringSlice"` - // VersionValue is a semantic version according to semver.org spec 2.0.0. - VersionValue *string `json:"version,omitempty" protobuf:"bytes,10,opt,name=version"` -} - -// NamedResourcesIntSlice contains a slice of 64-bit integers. -type NamedResourcesIntSlice struct { - // Ints is the slice of 64-bit integers. - // - // +listType=atomic - Ints []int64 `json:"ints" protobuf:"bytes,1,opt,name=ints"` -} - -// NamedResourcesStringSlice contains a slice of strings. -type NamedResourcesStringSlice struct { - // Strings is the slice of strings. - // - // +listType=atomic - Strings []string `json:"strings" protobuf:"bytes,1,opt,name=strings"` -} - -// NamedResourcesRequest is used in ResourceRequestModel. -type NamedResourcesRequest struct { - // Selector is a CEL expression which must evaluate to true if a - // resource instance is suitable. The language is as defined in - // https://kubernetes.io/docs/reference/using-api/cel/ - // - // In addition, for each type NamedResourcesin AttributeValue there is a map that - // resolves to the corresponding value of the instance under evaluation. - // For example: - // - // attributes.quantity["a"].isGreaterThan(quantity("0")) && - // attributes.stringslice["b"].isSorted() - Selector string `json:"selector" protobuf:"bytes,1,name=selector"` -} - -// NamedResourcesFilter is used in ResourceFilterModel. -type NamedResourcesFilter struct { - // Selector is a CEL expression which must evaluate to true if a - // resource instance is suitable. The language is as defined in - // https://kubernetes.io/docs/reference/using-api/cel/ - // - // In addition, for each type in NamedResourcesAttributeValue there is a map that - // resolves to the corresponding value of the instance under evaluation. - // For example: - // - // attributes.quantity["a"].isGreaterThan(quantity("0")) && - // attributes.stringslice["b"].isSorted() - Selector string `json:"selector" protobuf:"bytes,1,name=selector"` -} - -// NamedResourcesAllocationResult is used in AllocationResultModel. -type NamedResourcesAllocationResult struct { - // Name is the name of the selected resource instance. - Name string `json:"name" protobuf:"bytes,1,name=name"` -} diff --git a/staging/src/k8s.io/api/resource/v1alpha3/register.go b/staging/src/k8s.io/api/resource/v1alpha3/register.go index 36357daa389..74044e8cf0e 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/register.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/register.go @@ -44,8 +44,8 @@ var ( // Adds the list of known types to the given scheme. func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, - &ResourceClass{}, - &ResourceClassList{}, + &DeviceClass{}, + &DeviceClassList{}, &ResourceClaim{}, &ResourceClaimList{}, &ResourceClaimTemplate{}, @@ -54,15 +54,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &PodSchedulingContextList{}, &ResourceSlice{}, &ResourceSliceList{}, - &ResourceClaimParameters{}, - &ResourceClaimParametersList{}, - &ResourceClassParameters{}, - &ResourceClassParametersList{}, ) - // Add common types - scheme.AddKnownTypes(SchemeGroupVersion, &metav1.Status{}) - // Add the watch version that applies metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/staging/src/k8s.io/api/resource/v1alpha3/types.go b/staging/src/k8s.io/api/resource/v1alpha3/types.go index bd161eb4ac1..298d8d1078e 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/types.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/types.go @@ -18,9 +18,11 @@ package v1alpha3 import ( v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/validation" ) const ( @@ -28,16 +30,281 @@ const ( // which were allocated through a builtin controller. // Reserved for use by Kubernetes, DRA driver controllers must // use their own finalizer. - Finalizer = "dra.k8s.io/delete-protection" + Finalizer = "resource.kubernetes.io/delete-protection" ) +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.31 + +// ResourceSlice represents one or more resources in a pool of similar resources, +// managed by a common driver. A pool may span more than one ResourceSlice, and exactly how many +// ResourceSlices comprise a pool is determined by the driver. +// +// At the moment, the only supported resources are devices with attributes and capacities. +// Each device in a given pool, regardless of how many ResourceSlices, must have a unique name. +// The ResourceSlice in which a device gets published may change over time. The unique identifier +// for a device is the tuple , , . +// +// Whenever a driver needs to update a pool, it increments the pool.Spec.Pool.Generation number +// and updates all ResourceSlices with that new number and new resource definitions. A consumer +// must only use ResourceSlices with the highest generation number and ignore all others. +// +// When allocating all resources in a pool matching certain criteria or when +// looking for the best solution among several different alternatives, a +// consumer should check the number of ResourceSlices in a pool (included in +// each ResourceSlice) to determine whether its view of a pool is complete and +// if not, should wait until the driver has completed updating the pool. +// +// For resources that are not local to a node, the node name is not set. Instead, +// the driver may use a node selector to specify where the devices are available. +// +// This is an alpha type and requires enabling the DynamicResourceAllocation +// feature gate. +type ResourceSlice struct { + metav1.TypeMeta `json:",inline"` + // Standard object metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Contains the information published by the driver. + // + // Changing the spec automatically increments the metadata.generation number. + Spec ResourceSliceSpec `json:"spec" protobuf:"bytes,2,name=spec"` +} + +const ( + // ResourceSliceSelectorNodeName can be used in a [metav1.ListOptions] + // field selector to filter based on [ResourceSliceSpec.NodeName]. + ResourceSliceSelectorNodeName = "spec.nodeName" + // ResourceSliceSelectorDriver can be used in a [metav1.ListOptions] + // field selector to filter based on [ResourceSliceSpec.Driver]. + ResourceSliceSelectorDriver = "spec.driver" +) + +// ResourceSliceSpec contains the information published by the driver in one ResourceSlice. +type ResourceSliceSpec struct { + // Driver identifies the DRA driver providing the capacity information. + // A field selector can be used to list only ResourceSlice + // objects with a certain driver name. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. This field is immutable. + // + // +required + Driver string `json:"driver" protobuf:"bytes,1,name=driver"` + + // Pool describes the pool that this ResourceSlice belongs to. + // + // +required + Pool ResourcePool `json:"pool" protobuf:"bytes,2,name=pool"` + + // NodeName identifies the node which provides the resources in this pool. + // A field selector can be used to list only ResourceSlice + // objects belonging to a certain node. + // + // This field can be used to limit access from nodes to ResourceSlices with + // the same node name. It also indicates to autoscalers that adding + // new nodes of the same type as some old node might also make new + // resources available. + // + // Exactly one of NodeName, NodeSelector and AllNodes must be set. + // This field is immutable. + // + // +optional + // +oneOf=NodeSelection + NodeName string `json:"nodeName,omitempty" protobuf:"bytes,3,opt,name=nodeName"` + + // NodeSelector defines which nodes have access to the resources in the pool, + // when that pool is not limited to a single node. + // + // Must use exactly one term. + // + // Exactly one of NodeName, NodeSelector and AllNodes must be set. + // + // +optional + // +oneOf=NodeSelection + NodeSelector *v1.NodeSelector `json:"nodeSelector,omitempty" protobuf:"bytes,4,opt,name=nodeSelector"` + + // AllNodes indicates that all nodes have access to the resources in the pool. + // + // Exactly one of NodeName, NodeSelector and AllNodes must be set. + // + // +optional + // +oneOf=NodeSelection + AllNodes bool `json:"allNodes,omitempty" protobuf:"bytes,5,opt,name=allNodes"` + + // Devices lists some or all of the devices in this pool. + // + // Must not have more than 128 entries. + // + // +optional + // +listType=atomic + Devices []Device `json:"devices" protobuf:"bytes,6,name=devices"` +} + +// ResourcePool describes the pool that ResourceSlices belong to. +type ResourcePool struct { + // Name is used to identify the pool. For node-local devices, this + // is often the node name, but this is not required. + // + // It must not be longer than 253 characters and must consist of one or more DNS sub-domains + // separated by slashes. This field is immutable. + // + // +required + Name string `json:"name" protobuf:"bytes,1,name=name"` + + // Generation tracks the change in a pool over time. Whenever a driver + // changes something about one or more of the resources in a pool, it + // must change the generation in all ResourceSlices which are part of + // that pool. Consumers of ResourceSlices should only consider + // resources from the pool with the highest generation number. The + // generation may be reset by drivers, which should be fine for + // consumers, assuming that all ResourceSlices in a pool are updated to + // match or deleted. + // + // Combined with ResourceSliceCount, this mechanism enables consumers to + // detect pools which are comprised of multiple ResourceSlices and are + // in an incomplete state. + // + // +required + Generation int64 `json:"generation" protobuf:"bytes,2,name=generation"` + + // ResourceSliceCount is the total number of ResourceSlices in the pool at this + // generation number. Must be greater than zero. + // + // Consumers can use this to check whether they have seen all ResourceSlices + // belonging to the same pool. + // + // +required + ResourceSliceCount int64 `json:"resourceSliceCount" protobuf:"bytes,3,name=resourceSliceCount"` +} + +const ResourceSliceMaxSharedCapacity = 128 +const ResourceSliceMaxDevices = 128 +const PoolNameMaxLength = validation.DNS1123SubdomainMaxLength // Same as for a single node name. + +// Device represents one individual hardware instance that can be selected based +// on its attributes. Besides the name, exactly one field must be set. +type Device struct { + // Name is unique identifier among all devices managed by + // the driver in the pool. It must be a DNS label. + // + // +required + Name string `json:"name" protobuf:"bytes,1,name=name"` + + // Basic defines one device instance. + // + // +optional + // +oneOf=deviceType + Basic *BasicDevice `json:"basic,omitempty" protobuf:"bytes,2,opt,name=basic"` +} + +// BasicDevice defines one device instance. +type BasicDevice struct { + // Attributes defines the set of attributes for this device. + // The name of each attribute must be unique in that set. + // + // The maximum number of attributes and capacities combined is 32. + // + // +optional + Attributes map[QualifiedName]DeviceAttribute `json:"attributes,omitempty" protobuf:"bytes,1,rep,name=attributes"` + + // Capacity defines the set of capacities for this device. + // The name of each capacity must be unique in that set. + // + // The maximum number of attributes and capacities combined is 32. + // + // +optional + Capacity map[QualifiedName]resource.Quantity `json:"capacity,omitempty" protobuf:"bytes,2,rep,name=capacity"` +} + +// Limit for the sum of the number of entries in both ResourceSlices. +const ResourceSliceMaxAttributesAndCapacitiesPerDevice = 32 + +// QualifiedName is the name of a device attribute or capacity. +// +// Attributes and capacities are defined either by the owner of the specific +// driver (usually the vendor) or by some 3rd party (e.g. the Kubernetes +// project). Because they are sometimes compared across devices, a given name +// is expected to mean the same thing and have the same type on all devices. +// +// Names must be either a C identifier (e.g. "theName") or a DNS subdomain +// followed by a slash ("/") followed by a C identifier +// (e.g. "dra.example.com/theName"). Names which do not include the +// domain prefix are assumed to be part of the driver's domain. Attributes +// or capacities defined by 3rd parties must include the domain prefix. +// +// The maximum length for the DNS subdomain is 63 characters (same as +// for driver names) and the maximum length of the C identifier +// is 32. +type QualifiedName string + +// FullyQualifiedName is a QualifiedName where the domain is set. +type FullyQualifiedName string + +// DeviceMaxIDLength is the maximum length of the identifier in a device attribute or capacity name (`/`). +const DeviceMaxIDLength = 32 + +// DeviceAttribute must have exactly one field set. +type DeviceAttribute struct { + // The Go field names below have a Value suffix to avoid a conflict between the + // field "String" and the corresponding method. That method is required. + // The Kubernetes API is defined without that suffix to keep it more natural. + + // IntValue is a number. + // + // +optional + // +oneOf=ValueType + IntValue *int64 `json:"int,omitempty" protobuf:"varint,2,opt,name=int"` + + // BoolValue is a true/false value. + // + // +optional + // +oneOf=ValueType + BoolValue *bool `json:"bool,omitempty" protobuf:"varint,3,opt,name=bool"` + + // StringValue is a string. Must not be longer than 64 characters. + // + // +optional + // +oneOf=ValueType + StringValue *string `json:"string,omitempty" protobuf:"bytes,4,opt,name=string"` + + // VersionValue is a semantic version according to semver.org spec 2.0.0. + // Must not be longer than 64 characters. + // + // +optional + // +oneOf=ValueType + VersionValue *string `json:"version,omitempty" protobuf:"bytes,5,opt,name=version"` +} + +// DeviceAttributeMaxValueLength is the maximum length of a string or version attribute value. +const DeviceAttributeMaxValueLength = 64 + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.31 + +// ResourceSliceList is a collection of ResourceSlices. +type ResourceSliceList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata + // +optional + metav1.ListMeta `json:"listMeta" protobuf:"bytes,1,opt,name=listMeta"` + + // Items is the list of resource ResourceSlices. + Items []ResourceSlice `json:"items" protobuf:"bytes,2,rep,name=items"` +} + // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.26 -// ResourceClaim describes which resources are needed by a resource consumer. -// Its status tracks whether the resource has been allocated and what the -// resulting attributes are. +// ResourceClaim describes a request for access to resources in the cluster, +// for use by workloads. For example, if a workload needs an accelerator device +// with specific properties, this is how that request is expressed. The status +// stanza tracks whether this claim has been satisfied and what specific +// resources have been allocated. // // This is an alpha type and requires enabling the DynamicResourceAllocation // feature gate. @@ -47,185 +314,489 @@ type ResourceClaim struct { // +optional metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // Spec describes the desired attributes of a resource that then needs - // to be allocated. It can only be set once when creating the - // ResourceClaim. + // Spec describes what is being requested and how to configure it. + // The spec is immutable. Spec ResourceClaimSpec `json:"spec" protobuf:"bytes,2,name=spec"` - // Status describes whether the resource is available and with which - // attributes. + // Status describes whether the claim is ready to use and what has been allocated. // +optional Status ResourceClaimStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` } -// ResourceClaimSpec defines how a resource is to be allocated. +// ResourceClaimSpec defines what is being requested in a ResourceClaim and how to configure it. type ResourceClaimSpec struct { - // ResourceClassName references the driver and additional parameters - // via the name of a ResourceClass that was created as part of the - // driver deployment. - ResourceClassName string `json:"resourceClassName" protobuf:"bytes,1,name=resourceClassName"` - - // ParametersRef references a separate object with arbitrary parameters - // that will be used by the driver when allocating a resource for the - // claim. + // Devices defines how to request devices. // - // The object must be in the same namespace as the ResourceClaim. // +optional - ParametersRef *ResourceClaimParametersReference `json:"parametersRef,omitempty" protobuf:"bytes,2,opt,name=parametersRef"` + Devices DeviceClaim `json:"devices" protobuf:"bytes,1,name=devices"` + + // Controller is the name of the DRA driver that is meant + // to handle allocation of this claim. If empty, allocation is handled + // by the scheduler while scheduling a pod. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. + // + // +optional + // +featureGate=DRAControlPlaneController + Controller string `json:"controller,omitempty" protobuf:"bytes,2,opt,name=controller"` +} + +// DeviceClaim defines how to request devices with a ResourceClaim. +type DeviceClaim struct { + // Requests represent individual requests for distinct devices which + // must all be satisfied. If empty, nothing needs to be allocated. + // + // +optional + // +listType=atomic + Requests []DeviceRequest `json:"requests" protobuf:"bytes,1,name=requests"` + + // These constraints must be satisfied by the set of devices that get + // allocated for the claim. + // + // +optional + // +listType=atomic + Constraints []DeviceConstraint `json:"constraints,omitempty" protobuf:"bytes,2,opt,name=constraints"` + + // This field holds configuration for multiple potential drivers which + // could satisfy requests in this claim. It is ignored while allocating + // the claim. + // + // +optional + // +listType=atomic + Config []DeviceClaimConfiguration `json:"config,omitempty" protobuf:"bytes,3,opt,name=config"` +} + +const ( + DeviceRequestsMaxSize = AllocationResultsMaxSize + DeviceConstraintsMaxSize = 32 + DeviceConfigMaxSize = 32 +) + +// DeviceRequest is a request for devices required for a claim. +// This is typically a request for a single resource like a device, but can +// also ask for several identical devices. +// +// A DeviceClassName is currently required. Clients must check that it is +// indeed set. It's absence indicates that something changed in a way that +// is not supported by the client yet, in which case it must refuse to +// handle the request. +type DeviceRequest struct { + // Name can be used to reference this request in a pod.spec.containers[].resources.claims + // entry and in a constraint of the claim. + // + // Must be a DNS label. + // + // +required + Name string `json:"name" protobuf:"bytes,1,name=name"` + + // DeviceClassName references a specific DeviceClass, which can define + // additional configuration and selectors to be inherited by this + // request. + // + // A class is required. Which classes are available depends on the cluster. + // + // Administrators may use this to restrict which devices may get + // requested by only installing classes with selectors for permitted + // devices. If users are free to request anything without restrictions, + // then administrators can create an empty DeviceClass for users + // to reference. + // + // +required + DeviceClassName string `json:"deviceClassName" protobuf:"bytes,2,name=deviceClassName"` + + // Selectors define criteria which must be satisfied by a specific + // device in order for that device to be considered for this + // request. All selectors must be satisfied for a device to be + // considered. + // + // +optional + // +listType=atomic + Selectors []DeviceSelector `json:"selectors,omitempty" protobuf:"bytes,3,name=selectors"` + + // AllocationMode and its related fields define how devices are allocated + // to satisfy this request. Supported values are: + // + // - ExactCount: This request is for a specific number of devices. + // This is the default. The exact number is provided in the + // count field. + // + // - All: This request is for all of the matching devices in a pool. + // Allocation will fail if some devices are already allocated, + // unless adminAccess is requested. + // + // If AlloctionMode is not specified, the default mode is ExactCount. If + // the mode is ExactCount and count is not specified, the default count is + // one. Any other requests must specify this field. + // + // More modes may get added in the future. Clients must refuse to handle + // requests with unknown modes. + // + // +optional + AllocationMode DeviceAllocationMode `json:"allocationMode,omitempty" protobuf:"bytes,4,opt,name=allocationMode"` + + // Count is used only when the count mode is "ExactCount". Must be greater than zero. + // If AllocationMode is ExactCount and this field is not specified, the default is one. + // + // +optional + // +oneOf=AllocationMode + Count int64 `json:"count,omitempty" protobuf:"bytes,5,opt,name=count"` + + // AdminAccess indicates that this is a claim for administrative access + // to the device(s). Claims with AdminAccess are expected to be used for + // monitoring or other management services for a device. They ignore + // all ordinary claims to the device with respect to access modes and + // any resource allocations. + // + // +optional + // +default=false + AdminAccess bool `json:"adminAccess,omitempty" protobuf:"bytes,6,opt,name=adminAccess"` +} + +const ( + DeviceSelectorsMaxSize = 32 +) + +type DeviceAllocationMode string + +// Valid [DeviceRequest.CountMode] values. +const ( + DeviceAllocationModeExactCount = DeviceAllocationMode("ExactCount") + DeviceAllocationModeAll = DeviceAllocationMode("All") +) + +// DeviceSelector must have exactly one field set. +type DeviceSelector struct { + // CEL contains a CEL expression for selecting a device. + // + // +optional + // +oneOf=SelectorType + CEL *CELDeviceSelector `json:"cel,omitempty" protobuf:"bytes,1,opt,name=cel"` +} + +// CELDeviceSelector contains a CEL expression for selecting a device. +type CELDeviceSelector struct { + // Expression is a CEL expression which evaluates a single device. It + // must evaluate to true when the device under consideration satisfies + // the desired criteria, and false when it does not. Any other result + // is an error and causes allocation of devices to abort. + // + // The expression's input is an object named "device", which carries + // the following properties: + // - driver (string): the name of the driver which defines this device. + // - attributes (map[string]object): the device's attributes, grouped by prefix + // (e.g. device.attributes["dra.example.com"] evaluates to an object with all + // of the attributes which were prefixed by "dra.example.com". + // - capacity (map[string]object): the device's capacities, grouped by prefix. + // + // Example: Consider a device with driver="dra.example.com", which exposes + // two attributes named "model" and "ext.example.com/family" and which + // exposes one capacity named "modules". This input to this expression + // would have the following fields: + // + // device.driver + // device.attributes["dra.example.com"].model + // device.attributes["ext.example.com"].family + // device.capacity["dra.example.com"].modules + // + // The device.driver field can be used to check for a specific driver, + // either as a high-level precondition (i.e. you only want to consider + // devices from this driver) or as part of a multi-clause expression + // that is meant to consider devices from different drivers. + // + // The value type of each attribute is defined by the device + // definition, and users who write these expressions must consult the + // documentation for their specific drivers. The value type of each + // capacity is Quantity. + // + // If an unknown prefix is used as a lookup in either device.attributes + // or device.capacity, an empty map will be returned. Any reference to + // an unknown field will cause an evaluation error and allocation to + // abort. + // + // A robust expression should check for the existence of attributes + // before referencing them. + // + // For ease of use, the cel.bind() function is enabled, and can be used + // to simplify expressions that access multiple attributes with the + // same domain. For example: + // + // cel.bind(dra, device.attributes["dra.example.com"], dra.someBool && dra.anotherBool) + // + // +required + Expression string `json:"expression" protobuf:"bytes,1,name=expression"` +} + +// DeviceConstraint must have exactly one field set besides Requests. +type DeviceConstraint struct { + // Requests is a list of the one or more requests in this claim which + // must co-satisfy this constraint. If a request is fulfilled by + // multiple devices, then all of the devices must satisfy the + // constraint. If this is not specified, this constraint applies to all + // requests in this claim. + // + // +optional + // +listType=atomic + Requests []string `json:"requests,omitempty" protobuf:"bytes,1,opt,name=requests"` + + // MatchAttribute requires that all devices in question have this + // attribute and that its type and value are the same across those + // devices. + // + // For example, if you specified "dra.example.com/numa" (a hypothetical example!), + // then only devices in the same NUMA node will be chosen. A device which + // does not have that attribute will not be chosen. All devices should + // use a value of the same type for this attribute because that is part of + // its specification, but if one device doesn't, then it also will not be + // chosen. + // + // Must include the domain qualifier. + // + // +optional + // +oneOf=ConstraintType + MatchAttribute *FullyQualifiedName `json:"matchAttribute,omitempty" protobuf:"bytes,2,opt,name=matchAttribute"` +} + +// DeviceClaimConfiguration is used for configuration parameters in DeviceClaim. +type DeviceClaimConfiguration struct { + // Requests lists the names of requests where the configuration applies. + // If empty, it applies to all requests. + // + // +optional + // +listType=atomic + Requests []string `json:"requests,omitempty" protobuf:"bytes,1,opt,name=requests"` + + DeviceConfiguration `json:",inline" protobuf:"bytes,2,name=deviceConfiguration"` +} + +// DeviceConfiguration must have exactly one field set. It gets embedded +// inline in some other structs which have other fields, so field names must +// not conflict with those. +type DeviceConfiguration struct { + // Opaque provides driver-specific configuration parameters. + // + // +optional + // +oneOf=ConfigurationType + Opaque *OpaqueDeviceConfiguration `json:"opaque,omitempty" protobuf:"bytes,1,opt,name=opaque"` +} + +// OpaqueDeviceConfiguration contains configuration parameters for a driver +// in a format defined by the driver vendor. +type OpaqueDeviceConfiguration struct { + // Driver is used to determine which kubelet plugin needs + // to be passed these configuration parameters. + // + // An admission policy provided by the driver developer could use this + // to decide whether it needs to validate them. + // + // 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,name=driver"` + + // Parameters can contain arbitrary data. It is the responsibility of + // the driver developer to handle validation and versioning. Typically this + // includes self-identification and a version ("kind" + "apiVersion" for + // Kubernetes types), with conversion between different versions. + // + // +required + Parameters runtime.RawExtension `json:"parameters" protobuf:"bytes,2,name=parameters"` } // ResourceClaimStatus tracks whether the resource has been allocated and what -// the resulting attributes are. +// the result of that was. type ResourceClaimStatus struct { - // DriverName is a copy of the driver name from the ResourceClass at - // the time when allocation started. + // Allocation is set once the claim has been allocated successfully. + // // +optional - DriverName string `json:"driverName,omitempty" protobuf:"bytes,1,opt,name=driverName"` - - // Allocation is set by the resource driver once a resource or set of - // resources has been allocated successfully. If this is not specified, the - // resources have not been allocated yet. - // +optional - Allocation *AllocationResult `json:"allocation,omitempty" protobuf:"bytes,2,opt,name=allocation"` + Allocation *AllocationResult `json:"allocation,omitempty" protobuf:"bytes,1,opt,name=allocation"` // 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. + // 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. + // + // In 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. + // + // Both 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. // // There can be at most 32 such reservations. This may get increased in // the future, but not reduced. // + // +optional // +listType=map // +listMapKey=uid // +patchStrategy=merge // +patchMergeKey=uid - // +optional - ReservedFor []ResourceClaimConsumerReference `json:"reservedFor,omitempty" protobuf:"bytes,3,opt,name=reservedFor" patchStrategy:"merge" patchMergeKey:"uid"` + ReservedFor []ResourceClaimConsumerReference `json:"reservedFor,omitempty" protobuf:"bytes,2,opt,name=reservedFor" patchStrategy:"merge" patchMergeKey:"uid"` - // DeallocationRequested indicates that a ResourceClaim is to be - // deallocated. + // Indicates that a claim is to be deallocated. While this is set, + // no new consumers may be added to ReservedFor. // - // The driver then must deallocate this claim and reset the field + // This is only used if the claim needs to be deallocated by a DRA driver. + // That driver then must deallocate this claim and reset the field // together with clearing the Allocation field. // - // While DeallocationRequested is set, no new consumers may be added to - // ReservedFor. + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. + // // +optional - DeallocationRequested bool `json:"deallocationRequested,omitempty" protobuf:"varint,4,opt,name=deallocationRequested"` + // +featureGate=DRAControlPlaneController + DeallocationRequested bool `json:"deallocationRequested,omitempty" protobuf:"bytes,3,opt,name=deallocationRequested"` } // ReservedForMaxSize is the maximum number of entries in // claim.status.reservedFor. const ResourceClaimReservedForMaxSize = 32 +// ResourceClaimConsumerReference contains enough information to let you +// locate the consumer of a ResourceClaim. The user must be a resource in the same +// namespace as the ResourceClaim. +type ResourceClaimConsumerReference struct { + // APIGroup is the group for the resource being referenced. It is + // empty for the core API. This matches the group in the APIVersion + // that is used when creating the resources. + // +optional + APIGroup string `json:"apiGroup,omitempty" protobuf:"bytes,1,opt,name=apiGroup"` + // Resource is the type of resource being referenced, for example "pods". + // +required + Resource string `json:"resource" protobuf:"bytes,3,name=resource"` + // Name is the name of resource being referenced. + // +required + Name string `json:"name" protobuf:"bytes,4,name=name"` + // UID identifies exactly one incarnation of the resource. + // +required + UID types.UID `json:"uid" protobuf:"bytes,5,name=uid"` +} + // AllocationResult contains attributes of an allocated resource. type AllocationResult struct { - // ResourceHandles contain the state associated with an allocation that - // should be maintained throughout the lifetime of a claim. Each - // ResourceHandle contains data that should be passed to a specific kubelet - // plugin once it lands on a node. This data is returned by the driver - // after a successful allocation and is opaque to Kubernetes. Driver - // documentation may explain to users how to interpret this data if needed. + // Devices is the result of allocating devices. // - // Setting this field is optional. It has a maximum size of 32 entries. - // If null (or empty), it is assumed this allocation will be processed by a - // single kubelet plugin with no ResourceHandle data attached. The name of - // the kubelet plugin invoked will match the DriverName set in the - // ResourceClaimStatus this AllocationResult is embedded in. + // +optional + Devices DeviceAllocationResult `json:"devices,omitempty" protobuf:"bytes,1,opt,name=devices"` + + // NodeSelector defines where the allocated resources are available. If + // unset, they are available everywhere. // + // +optional + NodeSelector *v1.NodeSelector `json:"nodeSelector,omitempty" protobuf:"bytes,3,opt,name=nodeSelector"` + + // Controller is the name of the DRA driver which handled the + // allocation. That driver is also responsible for deallocating the + // claim. It is empty when the claim can be deallocated without + // involving a driver. + // + // A driver may allocate devices provided by other drivers, so this + // driver name here can be different from the driver names listed for + // the results. + // + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. + // + // +optional + // +featureGate=DRAControlPlaneController + Controller string `json:"controller,omitempty" protobuf:"bytes,4,opt,name=controller"` +} + +// DeviceAllocationResult is the result of allocating devices. +type DeviceAllocationResult struct { + // Results lists all allocated devices. + // + // +optional // +listType=atomic - // +optional - ResourceHandles []ResourceHandle `json:"resourceHandles,omitempty" protobuf:"bytes,1,opt,name=resourceHandles"` + Results []DeviceRequestAllocationResult `json:"results,omitempty" protobuf:"bytes,1,opt,name=results"` - // This field will get set by the resource driver after it has allocated - // the resource to inform the scheduler where it can schedule Pods using - // the ResourceClaim. + // This field is a combination of all the claim and class configuration parameters. + // Drivers can distinguish between those based on a flag. // - // Setting this field is optional. If null, the resource is available - // everywhere. - // +optional - AvailableOnNodes *v1.NodeSelector `json:"availableOnNodes,omitempty" protobuf:"bytes,2,opt,name=availableOnNodes"` -} - -// AllocationResultResourceHandlesMaxSize represents the maximum number of -// entries in allocation.resourceHandles. -const AllocationResultResourceHandlesMaxSize = 32 - -// ResourceHandle holds opaque resource data for processing by a specific kubelet plugin. -type ResourceHandle struct { - // DriverName specifies the name of the resource driver whose kubelet - // plugin should be invoked to process this ResourceHandle's data once it - // lands on a node. This may differ from the DriverName set in - // ResourceClaimStatus this ResourceHandle is embedded in. - DriverName string `json:"driverName" protobuf:"bytes,1,name=driverName"` - - // Data contains the opaque data associated with this ResourceHandle. It is - // set by the controller component of the resource driver whose name - // matches the DriverName set in the ResourceClaimStatus this - // ResourceHandle is embedded in. It is set at allocation time and is - // intended for processing by the kubelet plugin whose name matches - // the DriverName set in this ResourceHandle. - // - // The maximum size of this field is 16KiB. This may get increased in the - // future, but not reduced. - // +optional - Data string `json:"data,omitempty" protobuf:"bytes,2,opt,name=data"` - - // If StructuredData is set, then it needs to be used instead of Data. + // This includes configuration parameters for drivers which have no allocated + // devices in the result because it is up to the drivers which configuration + // parameters they support. They can silently ignore unknown configuration + // parameters. // // +optional - StructuredData *StructuredResourceHandle `json:"structuredData,omitempty" protobuf:"bytes,5,opt,name=structuredData"` -} - -// ResourceHandleDataMaxSize represents the maximum size of resourceHandle.data. -const ResourceHandleDataMaxSize = 16 * 1024 - -// StructuredResourceHandle is the in-tree representation of the allocation result. -type StructuredResourceHandle struct { - // VendorClassParameters are the per-claim configuration parameters - // from the resource class at the time that the claim was allocated. - // - // +optional - VendorClassParameters runtime.RawExtension `json:"vendorClassParameters,omitempty" protobuf:"bytes,1,opt,name=vendorClassParameters"` - - // VendorClaimParameters are the per-claim configuration parameters - // from the resource claim parameters at the time that the claim was - // allocated. - // - // +optional - VendorClaimParameters runtime.RawExtension `json:"vendorClaimParameters,omitempty" protobuf:"bytes,2,opt,name=vendorClaimParameters"` - - // NodeName is the name of the node providing the necessary resources - // if the resources are local to a node. - // - // +optional - NodeName string `json:"nodeName,omitempty" protobuf:"bytes,4,name=nodeName"` - - // Results lists all allocated driver resources. - // // +listType=atomic - Results []DriverAllocationResult `json:"results" protobuf:"bytes,5,name=results"` + Config []DeviceAllocationConfiguration `json:"config,omitempty" protobuf:"bytes,2,opt,name=config"` } -// DriverAllocationResult contains vendor parameters and the allocation result for -// one request. -type DriverAllocationResult struct { - // VendorRequestParameters are the per-request configuration parameters - // from the time that the claim was allocated. +// AllocationResultsMaxSize represents the maximum number of +// entries in allocation.devices.results. +const AllocationResultsMaxSize = 32 + +// DeviceRequestAllocationResult contains the allocation result for one request. +type DeviceRequestAllocationResult struct { + // Request is the name of the request in the claim which caused this + // device to be allocated. Multiple devices may have been allocated + // per request. + // + // +required + Request string `json:"request" protobuf:"bytes,1,name=request"` + + // 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,2,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,3,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,4,name=device"` +} + +// DeviceAllocationConfiguration gets embedded in an AllocationResult. +type DeviceAllocationConfiguration struct { + // Source records whether the configuration comes from a class and thus + // is not something that a normal user would have been able to set + // or from a claim. + // + // +required + Source AllocationConfigSource `json:"source" protobuf:"bytes,1,name=source"` + + // Requests lists the names of requests where the configuration applies. + // If empty, its applies to all requests. // // +optional - VendorRequestParameters runtime.RawExtension `json:"vendorRequestParameters,omitempty" protobuf:"bytes,1,opt,name=vendorRequestParameters"` + // +listType=atomic + Requests []string `json:"requests,omitempty" protobuf:"bytes,2,opt,name=requests"` - AllocationResultModel `json:",inline" protobuf:"bytes,2,name=allocationResultModel"` + DeviceConfiguration `json:",inline" protobuf:"bytes,3,name=deviceConfiguration"` } -// AllocationResultModel must have one and only one field set. -type AllocationResultModel struct { - // NamedResources describes the allocation result when using the named resources model. - // - // +optional - NamedResources *NamedResourcesAllocationResult `json:"namedResources,omitempty" protobuf:"bytes,1,opt,name=namedResources"` -} +type AllocationConfigSource string + +// Valid [DeviceAllocationConfiguration.Source] values. +const ( + AllocationConfigSourceClass = "FromClass" + AllocationConfigSourceClaim = "FromClaim" +) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.26 @@ -249,7 +820,7 @@ type ResourceClaimList struct { // a Pod with ResourceClaims that use "WaitForFirstConsumer" allocation // mode. // -// This is an alpha type and requires enabling the DynamicResourceAllocation +// This is an alpha type and requires enabling the DRAControlPlaneController // feature gate. type PodSchedulingContext struct { metav1.TypeMeta `json:",inline"` @@ -261,6 +832,7 @@ type PodSchedulingContext struct { Spec PodSchedulingContextSpec `json:"spec" protobuf:"bytes,2,name=spec"` // Status describes where resources for the Pod can be allocated. + // // +optional Status PodSchedulingContextStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` } @@ -270,6 +842,7 @@ type PodSchedulingContextSpec struct { // SelectedNode is the node for which allocation of ResourceClaims that // are referenced by the Pod and that use "WaitForFirstConsumer" // allocation is to be attempted. + // // +optional SelectedNode string `json:"selectedNode,omitempty" protobuf:"bytes,1,opt,name=selectedNode"` @@ -280,8 +853,8 @@ type PodSchedulingContextSpec struct { // that suits all pending resources. This may get increased in the // future, but not reduced. // - // +listType=atomic // +optional + // +listType=atomic PotentialNodes []string `json:"potentialNodes,omitempty" protobuf:"bytes,2,opt,name=potentialNodes"` } @@ -305,8 +878,9 @@ type PodSchedulingContextStatus struct { // ResourceClaim with "WaitForFirstConsumer" allocation mode. type ResourceClaimSchedulingStatus struct { // Name matches the pod.spec.resourceClaims[*].Name field. - // +optional - Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` + // + // +required + Name string `json:"name" protobuf:"bytes,1,name=name"` // UnsuitableNodes lists nodes that the ResourceClaim cannot be // allocated for. @@ -315,8 +889,8 @@ type ResourceClaimSchedulingStatus struct { // PodSchedulingSpec.PotentialNodes. This may get increased in the // future, but not reduced. // - // +listType=atomic // +optional + // +listType=atomic UnsuitableNodes []string `json:"unsuitableNodes,omitempty" protobuf:"bytes,2,opt,name=unsuitableNodes"` } @@ -342,113 +916,85 @@ type PodSchedulingContextList struct { // +genclient // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.26 +// +k8s:prerelease-lifecycle-gen:introduced=1.31 -// ResourceClass is used by administrators to influence how resources -// are allocated. +// DeviceClass is a vendor- or admin-provided resource that contains +// device configuration and selectors. It can be referenced in +// the device requests of a claim to apply these presets. +// Cluster scoped. // // This is an alpha type and requires enabling the DynamicResourceAllocation // feature gate. -type ResourceClass struct { +type DeviceClass struct { metav1.TypeMeta `json:",inline"` // Standard object metadata // +optional metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // DriverName defines the name of the dynamic resource driver that is - // used for allocation of a ResourceClaim that uses this class. + // Spec defines what can be allocated and how to configure it. // - // Resource drivers have a unique name in forward domain order - // (acme.example.com). - DriverName string `json:"driverName" protobuf:"bytes,2,name=driverName"` + // This is mutable. Consumers have to be prepared for classes changing + // at any time, either because they get updated or replaced. Claim + // allocations are done once based on whatever was set in classes at + // the time of allocation. + // + // Changing the spec automatically increments the metadata.generation number. + Spec DeviceClassSpec `json:"spec" protobuf:"bytes,2,name=spec"` +} - // ParametersRef references an arbitrary separate object that may hold - // parameters that will be used by the driver when allocating a - // resource that uses this class. A dynamic resource driver can - // distinguish between parameters stored here and and those stored in - // ResourceClaimSpec. +// DeviceClassSpec is used in a [DeviceClass] to define what can be allocated +// and how to configure it. +type DeviceClassSpec struct { + // Each selector must be satisfied by a device which is claimed via this class. + // // +optional - ParametersRef *ResourceClassParametersReference `json:"parametersRef,omitempty" protobuf:"bytes,3,opt,name=parametersRef"` + // +listType=atomic + Selectors []DeviceSelector `json:"selectors,omitempty" protobuf:"bytes,1,opt,name=selectors"` + + // Config defines configuration parameters that apply to each device that is claimed via this class. + // Some classses may potentially be satisfied by multiple drivers, so each instance of a vendor + // configuration applies to exactly one driver. + // + // They are passed to the driver, but are not considered while allocating the claim. + // + // +optional + // +listType=atomic + Config []DeviceClassConfiguration `json:"config,omitempty" protobuf:"bytes,2,opt,name=config"` // Only nodes matching the selector will be considered by the scheduler // when trying to find a Node that fits a Pod when that Pod uses - // a ResourceClaim that has not been allocated yet. + // a claim that has not been allocated yet *and* that claim + // gets allocated through a control plane controller. It is ignored + // when the claim does not use a control plane controller + // for allocation. + // + // Setting this field is optional. If unset, all Nodes are candidates. + // + // This is an alpha field and requires enabling the DRAControlPlaneController + // feature gate. // - // Setting this field is optional. If null, all nodes are candidates. // +optional - SuitableNodes *v1.NodeSelector `json:"suitableNodes,omitempty" protobuf:"bytes,4,opt,name=suitableNodes"` + // +featureGate=DRAControlPlaneController + SuitableNodes *v1.NodeSelector `json:"suitableNodes,omitempty" protobuf:"bytes,3,opt,name=suitableNodes"` +} - // If and only if allocation of claims using this class is handled - // via structured parameters, then StructuredParameters must be set to true. - // +optional - StructuredParameters *bool `json:"structuredParameters,omitempty" protobuf:"bytes,5,opt,name=structuredParameters"` +// DeviceClassConfiguration is used in DeviceClass. +type DeviceClassConfiguration struct { + DeviceConfiguration `json:",inline" protobuf:"bytes,1,opt,name=deviceConfiguration"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.26 -// ResourceClassList is a collection of classes. -type ResourceClassList struct { +// DeviceClassList is a collection of classes. +type DeviceClassList struct { metav1.TypeMeta `json:",inline"` // Standard list metadata // +optional metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Items is the list of resource classes. - Items []ResourceClass `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// ResourceClassParametersReference contains enough information to let you -// locate the parameters for a ResourceClass. -type ResourceClassParametersReference struct { - // APIGroup is the group for the resource being referenced. It is - // empty for the core API. This matches the group in the APIVersion - // that is used when creating the resources. - // +optional - APIGroup string `json:"apiGroup,omitempty" protobuf:"bytes,1,opt,name=apiGroup"` - // Kind is the type of resource being referenced. This is the same - // value as in the parameter object's metadata. - Kind string `json:"kind" protobuf:"bytes,2,name=kind"` - // Name is the name of resource being referenced. - Name string `json:"name" protobuf:"bytes,3,name=name"` - // Namespace that contains the referenced resource. Must be empty - // for cluster-scoped resources and non-empty for namespaced - // resources. - // +optional - Namespace string `json:"namespace,omitempty" protobuf:"bytes,4,opt,name=namespace"` -} - -// ResourceClaimParametersReference contains enough information to let you -// locate the parameters for a ResourceClaim. The object must be in the same -// namespace as the ResourceClaim. -type ResourceClaimParametersReference struct { - // APIGroup is the group for the resource being referenced. It is - // empty for the core API. This matches the group in the APIVersion - // that is used when creating the resources. - // +optional - APIGroup string `json:"apiGroup,omitempty" protobuf:"bytes,1,opt,name=apiGroup"` - // Kind is the type of resource being referenced. This is the same - // value as in the parameter object's metadata, for example "ConfigMap". - Kind string `json:"kind" protobuf:"bytes,2,name=kind"` - // Name is the name of resource being referenced. - Name string `json:"name" protobuf:"bytes,3,name=name"` -} - -// ResourceClaimConsumerReference contains enough information to let you -// locate the consumer of a ResourceClaim. The user must be a resource in the same -// namespace as the ResourceClaim. -type ResourceClaimConsumerReference struct { - // APIGroup is the group for the resource being referenced. It is - // empty for the core API. This matches the group in the APIVersion - // that is used when creating the resources. - // +optional - APIGroup string `json:"apiGroup,omitempty" protobuf:"bytes,1,opt,name=apiGroup"` - // Resource is the type of resource being referenced, for example "pods". - Resource string `json:"resource" protobuf:"bytes,3,name=resource"` - // Name is the name of resource being referenced. - Name string `json:"name" protobuf:"bytes,4,name=name"` - // UID identifies exactly one incarnation of the resource. - UID types.UID `json:"uid" protobuf:"bytes,5,name=uid"` + Items []DeviceClass `json:"items" protobuf:"bytes,2,rep,name=items"` } // +genclient @@ -456,6 +1002,9 @@ type ResourceClaimConsumerReference struct { // +k8s:prerelease-lifecycle-gen:introduced=1.26 // ResourceClaimTemplate is used to produce ResourceClaim objects. +// +// This is an alpha type and requires enabling the DynamicResourceAllocation +// feature gate. type ResourceClaimTemplate struct { metav1.TypeMeta `json:",inline"` // Standard object metadata @@ -497,207 +1046,3 @@ type ResourceClaimTemplateList struct { // Items is the list of resource claim templates. Items []ResourceClaimTemplate `json:"items" protobuf:"bytes,2,rep,name=items"` } - -// +genclient -// +genclient:nonNamespaced -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.30 - -// ResourceSlice provides information about available -// resources on individual nodes. -type ResourceSlice struct { - metav1.TypeMeta `json:",inline"` - // Standard object metadata - // +optional - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // NodeName identifies the node which provides the resources - // if they are local to a node. - // - // A field selector can be used to list only ResourceSlice - // objects with a certain node name. - // - // +optional - NodeName string `json:"nodeName,omitempty" protobuf:"bytes,2,opt,name=nodeName"` - - // DriverName identifies the DRA driver providing the capacity information. - // A field selector can be used to list only ResourceSlice - // objects with a certain driver name. - DriverName string `json:"driverName" protobuf:"bytes,3,name=driverName"` - - ResourceModel `json:",inline" protobuf:"bytes,4,name=resourceModel"` -} - -// ResourceModel must have one and only one field set. -type ResourceModel struct { - // NamedResources describes available resources using the named resources model. - // - // +optional - NamedResources *NamedResourcesResources `json:"namedResources,omitempty" protobuf:"bytes,1,opt,name=namedResources"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.30 - -// ResourceSliceList is a collection of ResourceSlices. -type ResourceSliceList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata - // +optional - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // Items is the list of node resource capacity objects. - Items []ResourceSlice `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.30 - -// ResourceClaimParameters defines resource requests for a ResourceClaim in an -// in-tree format understood by Kubernetes. -type ResourceClaimParameters struct { - metav1.TypeMeta `json:",inline"` - // Standard object metadata - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // If this object was created from some other resource, then this links - // back to that resource. This field is used to find the in-tree representation - // of the claim parameters when the parameter reference of the claim refers - // to some unknown type. - // +optional - GeneratedFrom *ResourceClaimParametersReference `json:"generatedFrom,omitempty" protobuf:"bytes,2,opt,name=generatedFrom"` - - // DriverRequests describes all resources that are needed for the - // allocated claim. A single claim may use resources coming from - // different drivers. For each driver, this array has at most one - // entry which then may have one or more per-driver requests. - // - // May be empty, in which case the claim can always be allocated. - // - // +listType=atomic - DriverRequests []DriverRequests `json:"driverRequests,omitempty" protobuf:"bytes,4,opt,name=driverRequests"` -} - -// DriverRequests describes all resources that are needed from one particular driver. -type DriverRequests struct { - // DriverName is the name used by the DRA driver kubelet plugin. - DriverName string `json:"driverName,omitempty" protobuf:"bytes,1,opt,name=driverName"` - - // VendorParameters are arbitrary setup parameters for all requests of the - // claim. They are ignored while allocating the claim. - // - // +optional - VendorParameters runtime.RawExtension `json:"vendorParameters,omitempty" protobuf:"bytes,2,opt,name=vendorParameters"` - - // Requests describes all resources that are needed from the driver. - // +listType=atomic - Requests []ResourceRequest `json:"requests,omitempty" protobuf:"bytes,3,opt,name=requests"` -} - -// ResourceRequest is a request for resources from one particular driver. -type ResourceRequest struct { - // VendorParameters are arbitrary setup parameters for the requested - // resource. They are ignored while allocating a claim. - // - // +optional - VendorParameters runtime.RawExtension `json:"vendorParameters,omitempty" protobuf:"bytes,1,opt,name=vendorParameters"` - - ResourceRequestModel `json:",inline" protobuf:"bytes,2,name=resourceRequestModel"` -} - -// ResourceRequestModel must have one and only one field set. -type ResourceRequestModel struct { - // NamedResources describes a request for resources with the named resources model. - // - // +optional - NamedResources *NamedResourcesRequest `json:"namedResources,omitempty" protobuf:"bytes,1,opt,name=namedResources"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.30 - -// ResourceClaimParametersList is a collection of ResourceClaimParameters. -type ResourceClaimParametersList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata - // +optional - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // Items is the list of node resource capacity objects. - Items []ResourceClaimParameters `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.30 - -// ResourceClassParameters defines resource requests for a ResourceClass in an -// in-tree format understood by Kubernetes. -type ResourceClassParameters struct { - metav1.TypeMeta `json:",inline"` - // Standard object metadata - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // If this object was created from some other resource, then this links - // back to that resource. This field is used to find the in-tree representation - // of the class parameters when the parameter reference of the class refers - // to some unknown type. - // +optional - GeneratedFrom *ResourceClassParametersReference `json:"generatedFrom,omitempty" protobuf:"bytes,2,opt,name=generatedFrom"` - - // VendorParameters are arbitrary setup parameters for all claims using - // this class. They are ignored while allocating the claim. There must - // not be more than one entry per driver. - // - // +listType=atomic - // +optional - VendorParameters []VendorParameters `json:"vendorParameters,omitempty" protobuf:"bytes,3,opt,name=vendorParameters"` - - // Filters describes additional contraints that must be met when using the class. - // - // +listType=atomic - Filters []ResourceFilter `json:"filters,omitempty" protobuf:"bytes,4,opt,name=filters"` -} - -// ResourceFilter is a filter for resources from one particular driver. -type ResourceFilter struct { - // DriverName is the name used by the DRA driver kubelet plugin. - DriverName string `json:"driverName,omitempty" protobuf:"bytes,1,opt,name=driverName"` - - ResourceFilterModel `json:",inline" protobuf:"bytes,2,name=resourceFilterModel"` -} - -// ResourceFilterModel must have one and only one field set. -type ResourceFilterModel struct { - // NamedResources describes a resource filter using the named resources model. - // - // +optional - NamedResources *NamedResourcesFilter `json:"namedResources,omitempty" protobuf:"bytes,1,opt,name=namedResources"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.30 - -// ResourceClassParametersList is a collection of ResourceClassParameters. -type ResourceClassParametersList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata - // +optional - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // Items is the list of node resource capacity objects. - Items []ResourceClassParameters `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// VendorParameters are opaque parameters for one particular driver. -type VendorParameters struct { - // DriverName is the name used by the DRA driver kubelet plugin. - DriverName string `json:"driverName,omitempty" protobuf:"bytes,1,opt,name=driverName"` - - // Parameters can be arbitrary setup parameters. They are ignored while - // allocating a claim. - // - // +optional - Parameters runtime.RawExtension `json:"parameters,omitempty" protobuf:"bytes,2,opt,name=parameters"` -} 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 9fe49cf7489..8154c99ce6f 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 @@ -28,46 +28,202 @@ package v1alpha3 // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_AllocationResult = map[string]string{ - "": "AllocationResult contains attributes of an allocated resource.", - "resourceHandles": "ResourceHandles contain the state associated with an allocation that should be maintained throughout the lifetime of a claim. Each ResourceHandle contains data that should be passed to a specific kubelet plugin once it lands on a node. This data is returned by the driver after a successful allocation and is opaque to Kubernetes. Driver documentation may explain to users how to interpret this data if needed.\n\nSetting this field is optional. It has a maximum size of 32 entries. If null (or empty), it is assumed this allocation will be processed by a single kubelet plugin with no ResourceHandle data attached. The name of the kubelet plugin invoked will match the DriverName set in the ResourceClaimStatus this AllocationResult is embedded in.", - "availableOnNodes": "This field will get set by the resource driver after it has allocated the resource to inform the scheduler where it can schedule Pods using the ResourceClaim.\n\nSetting this field is optional. If null, the resource is available everywhere.", + "": "AllocationResult contains attributes of an allocated resource.", + "devices": "Devices is the result of allocating devices.", + "nodeSelector": "NodeSelector defines where the allocated resources are available. If unset, they are available everywhere.", + "controller": "Controller is the name of the DRA driver which handled the allocation. That driver is also responsible for deallocating the claim. It is empty when the claim can be deallocated without involving a driver.\n\nA driver may allocate devices provided by other drivers, so this driver name here can be different from the driver names listed for the results.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", } func (AllocationResult) SwaggerDoc() map[string]string { return map_AllocationResult } -var map_AllocationResultModel = map[string]string{ - "": "AllocationResultModel must have one and only one field set.", - "namedResources": "NamedResources describes the allocation result when using the named resources model.", +var map_BasicDevice = map[string]string{ + "": "BasicDevice defines one device instance.", + "attributes": "Attributes defines the set of attributes for this device. The name of each attribute must be unique in that set.\n\nThe maximum number of attributes and capacities combined is 32.", + "capacity": "Capacity defines the set of capacities for this device. The name of each capacity must be unique in that set.\n\nThe maximum number of attributes and capacities combined is 32.", } -func (AllocationResultModel) SwaggerDoc() map[string]string { - return map_AllocationResultModel +func (BasicDevice) SwaggerDoc() map[string]string { + return map_BasicDevice } -var map_DriverAllocationResult = map[string]string{ - "": "DriverAllocationResult contains vendor parameters and the allocation result for one request.", - "vendorRequestParameters": "VendorRequestParameters are the per-request configuration parameters from the time that the claim was allocated.", +var map_CELDeviceSelector = map[string]string{ + "": "CELDeviceSelector contains a CEL expression for selecting a device.", + "expression": "Expression is a CEL expression which evaluates a single device. It must evaluate to true when the device under consideration satisfies the desired criteria, and false when it does not. Any other result is an error and causes allocation of devices to abort.\n\nThe expression's input is an object named \"device\", which carries the following properties:\n - driver (string): the name of the driver which defines this device.\n - attributes (map[string]object): the device's attributes, grouped by prefix\n (e.g. device.attributes[\"dra.example.com\"] evaluates to an object with all\n of the attributes which were prefixed by \"dra.example.com\".\n - capacity (map[string]object): the device's capacities, grouped by prefix.\n\nExample: Consider a device with driver=\"dra.example.com\", which exposes two attributes named \"model\" and \"ext.example.com/family\" and which exposes one capacity named \"modules\". This input to this expression would have the following fields:\n\n device.driver\n device.attributes[\"dra.example.com\"].model\n device.attributes[\"ext.example.com\"].family\n device.capacity[\"dra.example.com\"].modules\n\nThe device.driver field can be used to check for a specific driver, either as a high-level precondition (i.e. you only want to consider devices from this driver) or as part of a multi-clause expression that is meant to consider devices from different drivers.\n\nThe value type of each attribute is defined by the device definition, and users who write these expressions must consult the documentation for their specific drivers. The value type of each capacity is Quantity.\n\nIf an unknown prefix is used as a lookup in either device.attributes or device.capacity, an empty map will be returned. Any reference to an unknown field will cause an evaluation error and allocation to abort.\n\nA robust expression should check for the existence of attributes before referencing them.\n\nFor ease of use, the cel.bind() function is enabled, and can be used to simplify expressions that access multiple attributes with the same domain. For example:\n\n cel.bind(dra, device.attributes[\"dra.example.com\"], dra.someBool && dra.anotherBool)", } -func (DriverAllocationResult) SwaggerDoc() map[string]string { - return map_DriverAllocationResult +func (CELDeviceSelector) SwaggerDoc() map[string]string { + return map_CELDeviceSelector } -var map_DriverRequests = map[string]string{ - "": "DriverRequests describes all resources that are needed from one particular driver.", - "driverName": "DriverName is the name used by the DRA driver kubelet plugin.", - "vendorParameters": "VendorParameters are arbitrary setup parameters for all requests of the claim. They are ignored while allocating the claim.", - "requests": "Requests describes all resources that are needed from the driver.", +var map_Device = map[string]string{ + "": "Device represents one individual hardware instance that can be selected based on its attributes. Besides the name, exactly one field must be set.", + "name": "Name is unique identifier among all devices managed by the driver in the pool. It must be a DNS label.", + "basic": "Basic defines one device instance.", } -func (DriverRequests) SwaggerDoc() map[string]string { - return map_DriverRequests +func (Device) SwaggerDoc() map[string]string { + return map_Device +} + +var map_DeviceAllocationConfiguration = map[string]string{ + "": "DeviceAllocationConfiguration gets embedded in an AllocationResult.", + "source": "Source records whether the configuration comes from a class and thus is not something that a normal user would have been able to set or from a claim.", + "requests": "Requests lists the names of requests where the configuration applies. If empty, its applies to all requests.", +} + +func (DeviceAllocationConfiguration) SwaggerDoc() map[string]string { + return map_DeviceAllocationConfiguration +} + +var map_DeviceAllocationResult = map[string]string{ + "": "DeviceAllocationResult is the result of allocating devices.", + "results": "Results lists all allocated devices.", + "config": "This field is a combination of all the claim and class configuration parameters. Drivers can distinguish between those based on a flag.\n\nThis includes configuration parameters for drivers which have no allocated devices in the result because it is up to the drivers which configuration parameters they support. They can silently ignore unknown configuration parameters.", +} + +func (DeviceAllocationResult) SwaggerDoc() map[string]string { + return map_DeviceAllocationResult +} + +var map_DeviceAttribute = map[string]string{ + "": "DeviceAttribute must have exactly one field set.", + "int": "IntValue is a number.", + "bool": "BoolValue is a true/false value.", + "string": "StringValue is a string. Must not be longer than 64 characters.", + "version": "VersionValue is a semantic version according to semver.org spec 2.0.0. Must not be longer than 64 characters.", +} + +func (DeviceAttribute) SwaggerDoc() map[string]string { + return map_DeviceAttribute +} + +var map_DeviceClaim = map[string]string{ + "": "DeviceClaim defines how to request devices with a ResourceClaim.", + "requests": "Requests represent individual requests for distinct devices which must all be satisfied. If empty, nothing needs to be allocated.", + "constraints": "These constraints must be satisfied by the set of devices that get allocated for the claim.", + "config": "This field holds configuration for multiple potential drivers which could satisfy requests in this claim. It is ignored while allocating the claim.", +} + +func (DeviceClaim) SwaggerDoc() map[string]string { + return map_DeviceClaim +} + +var map_DeviceClaimConfiguration = map[string]string{ + "": "DeviceClaimConfiguration is used for configuration parameters in DeviceClaim.", + "requests": "Requests lists the names of requests where the configuration applies. If empty, it applies to all requests.", +} + +func (DeviceClaimConfiguration) SwaggerDoc() map[string]string { + return map_DeviceClaimConfiguration +} + +var map_DeviceClass = map[string]string{ + "": "DeviceClass is a vendor- or admin-provided resource that contains device configuration and selectors. It can be referenced in the device requests of a claim to apply these presets. Cluster scoped.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "metadata": "Standard object metadata", + "spec": "Spec defines what can be allocated and how to configure it.\n\nThis is mutable. Consumers have to be prepared for classes changing at any time, either because they get updated or replaced. Claim allocations are done once based on whatever was set in classes at the time of allocation.\n\nChanging the spec automatically increments the metadata.generation number.", +} + +func (DeviceClass) SwaggerDoc() map[string]string { + return map_DeviceClass +} + +var map_DeviceClassConfiguration = map[string]string{ + "": "DeviceClassConfiguration is used in DeviceClass.", +} + +func (DeviceClassConfiguration) SwaggerDoc() map[string]string { + return map_DeviceClassConfiguration +} + +var map_DeviceClassList = map[string]string{ + "": "DeviceClassList is a collection of classes.", + "metadata": "Standard list metadata", + "items": "Items is the list of resource classes.", +} + +func (DeviceClassList) SwaggerDoc() map[string]string { + return map_DeviceClassList +} + +var map_DeviceClassSpec = map[string]string{ + "": "DeviceClassSpec is used in a [DeviceClass] to define what can be allocated and how to configure it.", + "selectors": "Each selector must be satisfied by a device which is claimed via this class.", + "config": "Config defines configuration parameters that apply to each device that is claimed via this class. Some classses may potentially be satisfied by multiple drivers, so each instance of a vendor configuration applies to exactly one driver.\n\nThey are passed to the driver, but are not considered while allocating the claim.", + "suitableNodes": "Only nodes matching the selector will be considered by the scheduler when trying to find a Node that fits a Pod when that Pod uses a claim that has not been allocated yet *and* that claim gets allocated through a control plane controller. It is ignored when the claim does not use a control plane controller for allocation.\n\nSetting this field is optional. If unset, all Nodes are candidates.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", +} + +func (DeviceClassSpec) SwaggerDoc() map[string]string { + return map_DeviceClassSpec +} + +var map_DeviceConfiguration = map[string]string{ + "": "DeviceConfiguration must have exactly one field set. It gets embedded inline in some other structs which have other fields, so field names must not conflict with those.", + "opaque": "Opaque provides driver-specific configuration parameters.", +} + +func (DeviceConfiguration) SwaggerDoc() map[string]string { + return map_DeviceConfiguration +} + +var map_DeviceConstraint = map[string]string{ + "": "DeviceConstraint must have exactly one field set besides Requests.", + "requests": "Requests is a list of the one or more requests in this claim which must co-satisfy this constraint. If a request is fulfilled by multiple devices, then all of the devices must satisfy the constraint. If this is not specified, this constraint applies to all requests in this claim.", + "matchAttribute": "MatchAttribute requires that all devices in question have this attribute and that its type and value are the same across those devices.\n\nFor example, if you specified \"dra.example.com/numa\" (a hypothetical example!), then only devices in the same NUMA node will be chosen. A device which does not have that attribute will not be chosen. All devices should use a value of the same type for this attribute because that is part of its specification, but if one device doesn't, then it also will not be chosen.\n\nMust include the domain qualifier.", +} + +func (DeviceConstraint) SwaggerDoc() map[string]string { + return map_DeviceConstraint +} + +var map_DeviceRequest = map[string]string{ + "": "DeviceRequest is a request for devices required for a claim. This is typically a request for a single resource like a device, but can also ask for several identical devices.\n\nA DeviceClassName is currently required. Clients must check that it is indeed set. It's absence indicates that something changed in a way that is not supported by the client yet, in which case it must refuse to handle the request.", + "name": "Name can be used to reference this request in a pod.spec.containers[].resources.claims entry and in a constraint of the claim.\n\nMust be a DNS label.", + "deviceClassName": "DeviceClassName references a specific DeviceClass, which can define additional configuration and selectors to be inherited by this request.\n\nA class is required. Which classes are available depends on the cluster.\n\nAdministrators may use this to restrict which devices may get requested by only installing classes with selectors for permitted devices. If users are free to request anything without restrictions, then administrators can create an empty DeviceClass for users to reference.", + "selectors": "Selectors define criteria which must be satisfied by a specific device in order for that device to be considered for this request. All selectors must be satisfied for a device to be considered.", + "allocationMode": "AllocationMode and its related fields define how devices are allocated to satisfy this request. Supported values are:\n\n- ExactCount: This request is for a specific number of devices.\n This is the default. The exact number is provided in the\n count field.\n\n- All: This request is for all of the matching devices in a pool.\n Allocation will fail if some devices are already allocated,\n unless adminAccess is requested.\n\nIf AlloctionMode is not specified, the default mode is ExactCount. If the mode is ExactCount and count is not specified, the default count is one. Any other requests must specify this field.\n\nMore modes may get added in the future. Clients must refuse to handle requests with unknown modes.", + "count": "Count is used only when the count mode is \"ExactCount\". Must be greater than zero. If AllocationMode is ExactCount and this field is not specified, the default is one.", + "adminAccess": "AdminAccess indicates that this is a claim for administrative access to the device(s). Claims with AdminAccess are expected to be used for monitoring or other management services for a device. They ignore all ordinary claims to the device with respect to access modes and any resource allocations.", +} + +func (DeviceRequest) SwaggerDoc() map[string]string { + return map_DeviceRequest +} + +var map_DeviceRequestAllocationResult = map[string]string{ + "": "DeviceRequestAllocationResult contains the allocation result for one request.", + "request": "Request is the name of the request in the claim which caused this device to be allocated. Multiple devices may have been allocated per request.", + "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.", +} + +func (DeviceRequestAllocationResult) SwaggerDoc() map[string]string { + return map_DeviceRequestAllocationResult +} + +var map_DeviceSelector = map[string]string{ + "": "DeviceSelector must have exactly one field set.", + "cel": "CEL contains a CEL expression for selecting a device.", +} + +func (DeviceSelector) SwaggerDoc() map[string]string { + return map_DeviceSelector +} + +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.", + "parameters": "Parameters can contain arbitrary data. It is the responsibility of the driver developer to handle validation and versioning. Typically this includes self-identification and a version (\"kind\" + \"apiVersion\" for Kubernetes types), with conversion between different versions.", +} + +func (OpaqueDeviceConfiguration) SwaggerDoc() map[string]string { + return map_OpaqueDeviceConfiguration } var map_PodSchedulingContext = map[string]string{ - "": "PodSchedulingContext objects hold information that is needed to schedule a Pod with ResourceClaims that use \"WaitForFirstConsumer\" allocation mode.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "": "PodSchedulingContext objects hold information that is needed to schedule a Pod with ResourceClaims that use \"WaitForFirstConsumer\" allocation mode.\n\nThis is an alpha type and requires enabling the DRAControlPlaneController feature gate.", "metadata": "Standard object metadata", "spec": "Spec describes where resources for the Pod are needed.", "status": "Status describes where resources for the Pod can be allocated.", @@ -107,10 +263,10 @@ func (PodSchedulingContextStatus) SwaggerDoc() map[string]string { } var map_ResourceClaim = map[string]string{ - "": "ResourceClaim describes which resources are needed by a resource consumer. Its status tracks whether the resource has been allocated and what the resulting attributes are.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "": "ResourceClaim describes a request for access to resources in the cluster, for use by workloads. For example, if a workload needs an accelerator device with specific properties, this is how that request is expressed. The status stanza tracks whether this claim has been satisfied and what specific resources have been allocated.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", "metadata": "Standard object metadata", - "spec": "Spec describes the desired attributes of a resource that then needs to be allocated. It can only be set once when creating the ResourceClaim.", - "status": "Status describes whether the resource is available and with which attributes.", + "spec": "Spec describes what is being requested and how to configure it. The spec is immutable.", + "status": "Status describes whether the claim is ready to use and what has been allocated.", } func (ResourceClaim) SwaggerDoc() map[string]string { @@ -139,38 +295,6 @@ func (ResourceClaimList) SwaggerDoc() map[string]string { return map_ResourceClaimList } -var map_ResourceClaimParameters = map[string]string{ - "": "ResourceClaimParameters defines resource requests for a ResourceClaim in an in-tree format understood by Kubernetes.", - "metadata": "Standard object metadata", - "generatedFrom": "If this object was created from some other resource, then this links back to that resource. This field is used to find the in-tree representation of the claim parameters when the parameter reference of the claim refers to some unknown type.", - "driverRequests": "DriverRequests describes all resources that are needed for the allocated claim. A single claim may use resources coming from different drivers. For each driver, this array has at most one entry which then may have one or more per-driver requests.\n\nMay be empty, in which case the claim can always be allocated.", -} - -func (ResourceClaimParameters) SwaggerDoc() map[string]string { - return map_ResourceClaimParameters -} - -var map_ResourceClaimParametersList = map[string]string{ - "": "ResourceClaimParametersList is a collection of ResourceClaimParameters.", - "metadata": "Standard list metadata", - "items": "Items is the list of node resource capacity objects.", -} - -func (ResourceClaimParametersList) SwaggerDoc() map[string]string { - return map_ResourceClaimParametersList -} - -var map_ResourceClaimParametersReference = map[string]string{ - "": "ResourceClaimParametersReference contains enough information to let you locate the parameters for a ResourceClaim. The object must be in the same namespace as the ResourceClaim.", - "apiGroup": "APIGroup is the group for the resource being referenced. It is empty for the core API. This matches the group in the APIVersion that is used when creating the resources.", - "kind": "Kind is the type of resource being referenced. This is the same value as in the parameter object's metadata, for example \"ConfigMap\".", - "name": "Name is the name of resource being referenced.", -} - -func (ResourceClaimParametersReference) SwaggerDoc() map[string]string { - return map_ResourceClaimParametersReference -} - var map_ResourceClaimSchedulingStatus = map[string]string{ "": "ResourceClaimSchedulingStatus contains information about one particular ResourceClaim with \"WaitForFirstConsumer\" allocation mode.", "name": "Name matches the pod.spec.resourceClaims[*].Name field.", @@ -182,9 +306,9 @@ func (ResourceClaimSchedulingStatus) SwaggerDoc() map[string]string { } var map_ResourceClaimSpec = map[string]string{ - "": "ResourceClaimSpec defines how a resource is to be allocated.", - "resourceClassName": "ResourceClassName references the driver and additional parameters via the name of a ResourceClass that was created as part of the driver deployment.", - "parametersRef": "ParametersRef references a separate object with arbitrary parameters that will be used by the driver when allocating a resource for the claim.\n\nThe object must be in the same namespace as the ResourceClaim.", + "": "ResourceClaimSpec defines what is being requested in a ResourceClaim and how to configure it.", + "devices": "Devices defines how to request devices.", + "controller": "Controller is the name of the DRA driver that is meant to handle allocation of this claim. If empty, allocation is handled by the scheduler while scheduling a pod.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", } func (ResourceClaimSpec) SwaggerDoc() map[string]string { @@ -192,11 +316,10 @@ func (ResourceClaimSpec) SwaggerDoc() map[string]string { } var map_ResourceClaimStatus = map[string]string{ - "": "ResourceClaimStatus tracks whether the resource has been allocated and what the resulting attributes are.", - "driverName": "DriverName is a copy of the driver name from the ResourceClass at the time when allocation started.", - "allocation": "Allocation is set by the resource driver once a resource or set of resources has been allocated successfully. If this is not specified, the resources have not been allocated yet.", - "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.\n\nThere can be at most 32 such reservations. This may get increased in the future, but not reduced.", - "deallocationRequested": "DeallocationRequested indicates that a ResourceClaim is to be deallocated.\n\nThe driver then must deallocate this claim and reset the field together with clearing the Allocation field.\n\nWhile DeallocationRequested is set, no new consumers may be added to ReservedFor.", + "": "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.", + "deallocationRequested": "Indicates that a claim is to be deallocated. While this is set, no new consumers may be added to ReservedFor.\n\nThis is only used if the claim needs to be deallocated by a DRA driver. That driver then must deallocate this claim and reset the field together with clearing the Allocation field.\n\nThis is an alpha field and requires enabling the DRAControlPlaneController feature gate.", } func (ResourceClaimStatus) SwaggerDoc() map[string]string { @@ -204,7 +327,7 @@ func (ResourceClaimStatus) SwaggerDoc() map[string]string { } var map_ResourceClaimTemplate = map[string]string{ - "": "ResourceClaimTemplate is used to produce ResourceClaim objects.", + "": "ResourceClaimTemplate is used to produce ResourceClaim objects.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", "metadata": "Standard object metadata", "spec": "Describes the ResourceClaim that is to be generated.\n\nThis field is immutable. A ResourceClaim will get created by the control plane for a Pod when needed and then not get updated anymore.", } @@ -233,124 +356,21 @@ func (ResourceClaimTemplateSpec) SwaggerDoc() map[string]string { return map_ResourceClaimTemplateSpec } -var map_ResourceClass = map[string]string{ - "": "ResourceClass is used by administrators to influence how resources are allocated.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", - "metadata": "Standard object metadata", - "driverName": "DriverName defines the name of the dynamic resource driver that is used for allocation of a ResourceClaim that uses this class.\n\nResource drivers have a unique name in forward domain order (acme.example.com).", - "parametersRef": "ParametersRef references an arbitrary separate object that may hold parameters that will be used by the driver when allocating a resource that uses this class. A dynamic resource driver can distinguish between parameters stored here and and those stored in ResourceClaimSpec.", - "suitableNodes": "Only nodes matching the selector will be considered by the scheduler when trying to find a Node that fits a Pod when that Pod uses a ResourceClaim that has not been allocated yet.\n\nSetting this field is optional. If null, all nodes are candidates.", - "structuredParameters": "If and only if allocation of claims using this class is handled via structured parameters, then StructuredParameters must be set to true.", +var map_ResourcePool = map[string]string{ + "": "ResourcePool describes the pool that ResourceSlices belong to.", + "name": "Name is used to identify the pool. For node-local devices, this is often the node name, but this is not required.\n\nIt must not be longer than 253 characters and must consist of one or more DNS sub-domains separated by slashes. This field is immutable.", + "generation": "Generation tracks the change in a pool over time. Whenever a driver changes something about one or more of the resources in a pool, it must change the generation in all ResourceSlices which are part of that pool. Consumers of ResourceSlices should only consider resources from the pool with the highest generation number. The generation may be reset by drivers, which should be fine for consumers, assuming that all ResourceSlices in a pool are updated to match or deleted.\n\nCombined with ResourceSliceCount, this mechanism enables consumers to detect pools which are comprised of multiple ResourceSlices and are in an incomplete state.", + "resourceSliceCount": "ResourceSliceCount is the total number of ResourceSlices in the pool at this generation number. Must be greater than zero.\n\nConsumers can use this to check whether they have seen all ResourceSlices belonging to the same pool.", } -func (ResourceClass) SwaggerDoc() map[string]string { - return map_ResourceClass -} - -var map_ResourceClassList = map[string]string{ - "": "ResourceClassList is a collection of classes.", - "metadata": "Standard list metadata", - "items": "Items is the list of resource classes.", -} - -func (ResourceClassList) SwaggerDoc() map[string]string { - return map_ResourceClassList -} - -var map_ResourceClassParameters = map[string]string{ - "": "ResourceClassParameters defines resource requests for a ResourceClass in an in-tree format understood by Kubernetes.", - "metadata": "Standard object metadata", - "generatedFrom": "If this object was created from some other resource, then this links back to that resource. This field is used to find the in-tree representation of the class parameters when the parameter reference of the class refers to some unknown type.", - "vendorParameters": "VendorParameters are arbitrary setup parameters for all claims using this class. They are ignored while allocating the claim. There must not be more than one entry per driver.", - "filters": "Filters describes additional contraints that must be met when using the class.", -} - -func (ResourceClassParameters) SwaggerDoc() map[string]string { - return map_ResourceClassParameters -} - -var map_ResourceClassParametersList = map[string]string{ - "": "ResourceClassParametersList is a collection of ResourceClassParameters.", - "metadata": "Standard list metadata", - "items": "Items is the list of node resource capacity objects.", -} - -func (ResourceClassParametersList) SwaggerDoc() map[string]string { - return map_ResourceClassParametersList -} - -var map_ResourceClassParametersReference = map[string]string{ - "": "ResourceClassParametersReference contains enough information to let you locate the parameters for a ResourceClass.", - "apiGroup": "APIGroup is the group for the resource being referenced. It is empty for the core API. This matches the group in the APIVersion that is used when creating the resources.", - "kind": "Kind is the type of resource being referenced. This is the same value as in the parameter object's metadata.", - "name": "Name is the name of resource being referenced.", - "namespace": "Namespace that contains the referenced resource. Must be empty for cluster-scoped resources and non-empty for namespaced resources.", -} - -func (ResourceClassParametersReference) SwaggerDoc() map[string]string { - return map_ResourceClassParametersReference -} - -var map_ResourceFilter = map[string]string{ - "": "ResourceFilter is a filter for resources from one particular driver.", - "driverName": "DriverName is the name used by the DRA driver kubelet plugin.", -} - -func (ResourceFilter) SwaggerDoc() map[string]string { - return map_ResourceFilter -} - -var map_ResourceFilterModel = map[string]string{ - "": "ResourceFilterModel must have one and only one field set.", - "namedResources": "NamedResources describes a resource filter using the named resources model.", -} - -func (ResourceFilterModel) SwaggerDoc() map[string]string { - return map_ResourceFilterModel -} - -var map_ResourceHandle = map[string]string{ - "": "ResourceHandle holds opaque resource data for processing by a specific kubelet plugin.", - "driverName": "DriverName specifies the name of the resource driver whose kubelet plugin should be invoked to process this ResourceHandle's data once it lands on a node. This may differ from the DriverName set in ResourceClaimStatus this ResourceHandle is embedded in.", - "data": "Data contains the opaque data associated with this ResourceHandle. It is set by the controller component of the resource driver whose name matches the DriverName set in the ResourceClaimStatus this ResourceHandle is embedded in. It is set at allocation time and is intended for processing by the kubelet plugin whose name matches the DriverName set in this ResourceHandle.\n\nThe maximum size of this field is 16KiB. This may get increased in the future, but not reduced.", - "structuredData": "If StructuredData is set, then it needs to be used instead of Data.", -} - -func (ResourceHandle) SwaggerDoc() map[string]string { - return map_ResourceHandle -} - -var map_ResourceModel = map[string]string{ - "": "ResourceModel must have one and only one field set.", - "namedResources": "NamedResources describes available resources using the named resources model.", -} - -func (ResourceModel) SwaggerDoc() map[string]string { - return map_ResourceModel -} - -var map_ResourceRequest = map[string]string{ - "": "ResourceRequest is a request for resources from one particular driver.", - "vendorParameters": "VendorParameters are arbitrary setup parameters for the requested resource. They are ignored while allocating a claim.", -} - -func (ResourceRequest) SwaggerDoc() map[string]string { - return map_ResourceRequest -} - -var map_ResourceRequestModel = map[string]string{ - "": "ResourceRequestModel must have one and only one field set.", - "namedResources": "NamedResources describes a request for resources with the named resources model.", -} - -func (ResourceRequestModel) SwaggerDoc() map[string]string { - return map_ResourceRequestModel +func (ResourcePool) SwaggerDoc() map[string]string { + return map_ResourcePool } var map_ResourceSlice = map[string]string{ - "": "ResourceSlice provides information about available resources on individual nodes.", - "metadata": "Standard object metadata", - "nodeName": "NodeName identifies the node which provides the resources if they are local to a node.\n\nA field selector can be used to list only ResourceSlice objects with a certain node name.", - "driverName": "DriverName identifies the DRA driver providing the capacity information. A field selector can be used to list only ResourceSlice objects with a certain driver name.", + "": "ResourceSlice represents one or more resources in a pool of similar resources, managed by a common driver. A pool may span more than one ResourceSlice, and exactly how many ResourceSlices comprise a pool is determined by the driver.\n\nAt the moment, the only supported resources are devices with attributes and capacities. Each device in a given pool, regardless of how many ResourceSlices, must have a unique name. The ResourceSlice in which a device gets published may change over time. The unique identifier for a device is the tuple , , .\n\nWhenever a driver needs to update a pool, it increments the pool.Spec.Pool.Generation number and updates all ResourceSlices with that new number and new resource definitions. A consumer must only use ResourceSlices with the highest generation number and ignore all others.\n\nWhen allocating all resources in a pool matching certain criteria or when looking for the best solution among several different alternatives, a consumer should check the number of ResourceSlices in a pool (included in each ResourceSlice) to determine whether its view of a pool is complete and if not, should wait until the driver has completed updating the pool.\n\nFor resources that are not local to a node, the node name is not set. Instead, the driver may use a node selector to specify where the devices are available.\n\nThis is an alpha type and requires enabling the DynamicResourceAllocation feature gate.", + "metadata": "Standard object metadata", + "spec": "Contains the information published by the driver.\n\nChanging the spec automatically increments the metadata.generation number.", } func (ResourceSlice) SwaggerDoc() map[string]string { @@ -359,34 +379,26 @@ func (ResourceSlice) SwaggerDoc() map[string]string { var map_ResourceSliceList = map[string]string{ "": "ResourceSliceList is a collection of ResourceSlices.", - "metadata": "Standard list metadata", - "items": "Items is the list of node resource capacity objects.", + "listMeta": "Standard list metadata", + "items": "Items is the list of resource ResourceSlices.", } func (ResourceSliceList) SwaggerDoc() map[string]string { return map_ResourceSliceList } -var map_StructuredResourceHandle = map[string]string{ - "": "StructuredResourceHandle is the in-tree representation of the allocation result.", - "vendorClassParameters": "VendorClassParameters are the per-claim configuration parameters from the resource class at the time that the claim was allocated.", - "vendorClaimParameters": "VendorClaimParameters are the per-claim configuration parameters from the resource claim parameters at the time that the claim was allocated.", - "nodeName": "NodeName is the name of the node providing the necessary resources if the resources are local to a node.", - "results": "Results lists all allocated driver resources.", +var map_ResourceSliceSpec = map[string]string{ + "": "ResourceSliceSpec contains the information published by the driver in one ResourceSlice.", + "driver": "Driver identifies the DRA driver providing the capacity information. A field selector can be used to list only ResourceSlice objects with a certain driver name.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver. This field is immutable.", + "pool": "Pool describes the pool that this ResourceSlice belongs to.", + "nodeName": "NodeName identifies the node which provides the resources in this pool. A field selector can be used to list only ResourceSlice objects belonging to a certain node.\n\nThis field can be used to limit access from nodes to ResourceSlices with the same node name. It also indicates to autoscalers that adding new nodes of the same type as some old node might also make new resources available.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set. This field is immutable.", + "nodeSelector": "NodeSelector defines which nodes have access to the resources in the pool, when that pool is not limited to a single node.\n\nMust use exactly one term.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set.", + "allNodes": "AllNodes indicates that all nodes have access to the resources in the pool.\n\nExactly one of NodeName, NodeSelector and AllNodes must be set.", + "devices": "Devices lists some or all of the devices in this pool.\n\nMust not have more than 128 entries.", } -func (StructuredResourceHandle) SwaggerDoc() map[string]string { - return map_StructuredResourceHandle -} - -var map_VendorParameters = map[string]string{ - "": "VendorParameters are opaque parameters for one particular driver.", - "driverName": "DriverName is the name used by the DRA driver kubelet plugin.", - "parameters": "Parameters can be arbitrary setup parameters. They are ignored while allocating a claim.", -} - -func (VendorParameters) SwaggerDoc() map[string]string { - return map_VendorParameters +func (ResourceSliceSpec) SwaggerDoc() map[string]string { + return map_ResourceSliceSpec } // AUTO-GENERATED FUNCTIONS END HERE 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 a9a6de63752..58171df1f2d 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 @@ -23,21 +23,16 @@ package v1alpha3 import ( v1 "k8s.io/api/core/v1" + resource "k8s.io/apimachinery/pkg/api/resource" 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 *AllocationResult) DeepCopyInto(out *AllocationResult) { *out = *in - if in.ResourceHandles != nil { - in, out := &in.ResourceHandles, &out.ResourceHandles - *out = make([]ResourceHandle, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.AvailableOnNodes != nil { - in, out := &in.AvailableOnNodes, &out.AvailableOnNodes + in.Devices.DeepCopyInto(&out.Devices) + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector *out = new(v1.NodeSelector) (*in).DeepCopyInto(*out) } @@ -55,51 +50,105 @@ func (in *AllocationResult) DeepCopy() *AllocationResult { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AllocationResultModel) DeepCopyInto(out *AllocationResultModel) { +func (in *BasicDevice) DeepCopyInto(out *BasicDevice) { *out = *in - if in.NamedResources != nil { - in, out := &in.NamedResources, &out.NamedResources - *out = new(NamedResourcesAllocationResult) - **out = **in + if in.Attributes != nil { + in, out := &in.Attributes, &out.Attributes + *out = make(map[QualifiedName]DeviceAttribute, len(*in)) + for key, val := range *in { + (*out)[key] = *val.DeepCopy() + } + } + if in.Capacity != nil { + in, out := &in.Capacity, &out.Capacity + *out = make(map[QualifiedName]resource.Quantity, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AllocationResultModel. -func (in *AllocationResultModel) DeepCopy() *AllocationResultModel { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BasicDevice. +func (in *BasicDevice) DeepCopy() *BasicDevice { if in == nil { return nil } - out := new(AllocationResultModel) + out := new(BasicDevice) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DriverAllocationResult) DeepCopyInto(out *DriverAllocationResult) { +func (in *CELDeviceSelector) DeepCopyInto(out *CELDeviceSelector) { *out = *in - in.VendorRequestParameters.DeepCopyInto(&out.VendorRequestParameters) - in.AllocationResultModel.DeepCopyInto(&out.AllocationResultModel) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DriverAllocationResult. -func (in *DriverAllocationResult) DeepCopy() *DriverAllocationResult { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CELDeviceSelector. +func (in *CELDeviceSelector) DeepCopy() *CELDeviceSelector { if in == nil { return nil } - out := new(DriverAllocationResult) + out := new(CELDeviceSelector) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DriverRequests) DeepCopyInto(out *DriverRequests) { +func (in *Device) DeepCopyInto(out *Device) { + *out = *in + if in.Basic != nil { + in, out := &in.Basic, &out.Basic + *out = new(BasicDevice) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Device. +func (in *Device) DeepCopy() *Device { + if in == nil { + return nil + } + out := new(Device) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceAllocationConfiguration) DeepCopyInto(out *DeviceAllocationConfiguration) { *out = *in - in.VendorParameters.DeepCopyInto(&out.VendorParameters) if in.Requests != nil { in, out := &in.Requests, &out.Requests - *out = make([]ResourceRequest, len(*in)) + *out = make([]string, len(*in)) + copy(*out, *in) + } + in.DeviceConfiguration.DeepCopyInto(&out.DeviceConfiguration) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceAllocationConfiguration. +func (in *DeviceAllocationConfiguration) DeepCopy() *DeviceAllocationConfiguration { + if in == nil { + return nil + } + out := new(DeviceAllocationConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceAllocationResult) DeepCopyInto(out *DeviceAllocationResult) { + *out = *in + if in.Results != nil { + in, out := &in.Results, &out.Results + *out = make([]DeviceRequestAllocationResult, len(*in)) + copy(*out, *in) + } + if in.Config != nil { + in, out := &in.Config, &out.Config + *out = make([]DeviceAllocationConfiguration, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -107,82 +156,34 @@ func (in *DriverRequests) DeepCopyInto(out *DriverRequests) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DriverRequests. -func (in *DriverRequests) DeepCopy() *DriverRequests { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceAllocationResult. +func (in *DeviceAllocationResult) DeepCopy() *DeviceAllocationResult { if in == nil { return nil } - out := new(DriverRequests) + out := new(DeviceAllocationResult) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesAllocationResult) DeepCopyInto(out *NamedResourcesAllocationResult) { +func (in *DeviceAttribute) DeepCopyInto(out *DeviceAttribute) { *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesAllocationResult. -func (in *NamedResourcesAllocationResult) DeepCopy() *NamedResourcesAllocationResult { - if in == nil { - return nil - } - out := new(NamedResourcesAllocationResult) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesAttribute) DeepCopyInto(out *NamedResourcesAttribute) { - *out = *in - in.NamedResourcesAttributeValue.DeepCopyInto(&out.NamedResourcesAttributeValue) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesAttribute. -func (in *NamedResourcesAttribute) DeepCopy() *NamedResourcesAttribute { - if in == nil { - return nil - } - out := new(NamedResourcesAttribute) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesAttributeValue) DeepCopyInto(out *NamedResourcesAttributeValue) { - *out = *in - if in.QuantityValue != nil { - in, out := &in.QuantityValue, &out.QuantityValue - x := (*in).DeepCopy() - *out = &x + if in.IntValue != nil { + in, out := &in.IntValue, &out.IntValue + *out = new(int64) + **out = **in } if in.BoolValue != nil { in, out := &in.BoolValue, &out.BoolValue *out = new(bool) **out = **in } - if in.IntValue != nil { - in, out := &in.IntValue, &out.IntValue - *out = new(int64) - **out = **in - } - if in.IntSliceValue != nil { - in, out := &in.IntSliceValue, &out.IntSliceValue - *out = new(NamedResourcesIntSlice) - (*in).DeepCopyInto(*out) - } if in.StringValue != nil { in, out := &in.StringValue, &out.StringValue *out = new(string) **out = **in } - if in.StringSliceValue != nil { - in, out := &in.StringSliceValue, &out.StringSliceValue - *out = new(NamedResourcesStringSlice) - (*in).DeepCopyInto(*out) - } if in.VersionValue != nil { in, out := &in.VersionValue, &out.VersionValue *out = new(string) @@ -191,38 +192,36 @@ func (in *NamedResourcesAttributeValue) DeepCopyInto(out *NamedResourcesAttribut return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesAttributeValue. -func (in *NamedResourcesAttributeValue) DeepCopy() *NamedResourcesAttributeValue { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceAttribute. +func (in *DeviceAttribute) DeepCopy() *DeviceAttribute { if in == nil { return nil } - out := new(NamedResourcesAttributeValue) + out := new(DeviceAttribute) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesFilter) DeepCopyInto(out *NamedResourcesFilter) { +func (in *DeviceClaim) DeepCopyInto(out *DeviceClaim) { *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesFilter. -func (in *NamedResourcesFilter) DeepCopy() *NamedResourcesFilter { - if in == nil { - return nil + if in.Requests != nil { + in, out := &in.Requests, &out.Requests + *out = make([]DeviceRequest, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } - out := new(NamedResourcesFilter) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesInstance) DeepCopyInto(out *NamedResourcesInstance) { - *out = *in - if in.Attributes != nil { - in, out := &in.Attributes, &out.Attributes - *out = make([]NamedResourcesAttribute, len(*in)) + if in.Constraints != nil { + in, out := &in.Constraints, &out.Constraints + *out = make([]DeviceConstraint, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Config != nil { + in, out := &in.Config, &out.Config + *out = make([]DeviceClaimConfiguration, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -230,93 +229,270 @@ func (in *NamedResourcesInstance) DeepCopyInto(out *NamedResourcesInstance) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesInstance. -func (in *NamedResourcesInstance) DeepCopy() *NamedResourcesInstance { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClaim. +func (in *DeviceClaim) DeepCopy() *DeviceClaim { if in == nil { return nil } - out := new(NamedResourcesInstance) + out := new(DeviceClaim) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesIntSlice) DeepCopyInto(out *NamedResourcesIntSlice) { +func (in *DeviceClaimConfiguration) DeepCopyInto(out *DeviceClaimConfiguration) { *out = *in - if in.Ints != nil { - in, out := &in.Ints, &out.Ints - *out = make([]int64, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesIntSlice. -func (in *NamedResourcesIntSlice) DeepCopy() *NamedResourcesIntSlice { - if in == nil { - return nil - } - out := new(NamedResourcesIntSlice) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesRequest) DeepCopyInto(out *NamedResourcesRequest) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesRequest. -func (in *NamedResourcesRequest) DeepCopy() *NamedResourcesRequest { - if in == nil { - return nil - } - out := new(NamedResourcesRequest) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesResources) DeepCopyInto(out *NamedResourcesResources) { - *out = *in - if in.Instances != nil { - in, out := &in.Instances, &out.Instances - *out = make([]NamedResourcesInstance, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesResources. -func (in *NamedResourcesResources) DeepCopy() *NamedResourcesResources { - if in == nil { - return nil - } - out := new(NamedResourcesResources) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedResourcesStringSlice) DeepCopyInto(out *NamedResourcesStringSlice) { - *out = *in - if in.Strings != nil { - in, out := &in.Strings, &out.Strings + if in.Requests != nil { + in, out := &in.Requests, &out.Requests *out = make([]string, len(*in)) copy(*out, *in) } + in.DeviceConfiguration.DeepCopyInto(&out.DeviceConfiguration) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedResourcesStringSlice. -func (in *NamedResourcesStringSlice) DeepCopy() *NamedResourcesStringSlice { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClaimConfiguration. +func (in *DeviceClaimConfiguration) DeepCopy() *DeviceClaimConfiguration { if in == nil { return nil } - out := new(NamedResourcesStringSlice) + out := new(DeviceClaimConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceClass) DeepCopyInto(out *DeviceClass) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClass. +func (in *DeviceClass) DeepCopy() *DeviceClass { + if in == nil { + return nil + } + out := new(DeviceClass) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *DeviceClass) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceClassConfiguration) DeepCopyInto(out *DeviceClassConfiguration) { + *out = *in + in.DeviceConfiguration.DeepCopyInto(&out.DeviceConfiguration) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClassConfiguration. +func (in *DeviceClassConfiguration) DeepCopy() *DeviceClassConfiguration { + if in == nil { + return nil + } + out := new(DeviceClassConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceClassList) DeepCopyInto(out *DeviceClassList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]DeviceClass, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClassList. +func (in *DeviceClassList) DeepCopy() *DeviceClassList { + if in == nil { + return nil + } + out := new(DeviceClassList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *DeviceClassList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceClassSpec) DeepCopyInto(out *DeviceClassSpec) { + *out = *in + if in.Selectors != nil { + in, out := &in.Selectors, &out.Selectors + *out = make([]DeviceSelector, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Config != nil { + in, out := &in.Config, &out.Config + *out = make([]DeviceClassConfiguration, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.SuitableNodes != nil { + in, out := &in.SuitableNodes, &out.SuitableNodes + *out = new(v1.NodeSelector) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClassSpec. +func (in *DeviceClassSpec) DeepCopy() *DeviceClassSpec { + if in == nil { + return nil + } + out := new(DeviceClassSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceConfiguration) DeepCopyInto(out *DeviceConfiguration) { + *out = *in + if in.Opaque != nil { + in, out := &in.Opaque, &out.Opaque + *out = new(OpaqueDeviceConfiguration) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceConfiguration. +func (in *DeviceConfiguration) DeepCopy() *DeviceConfiguration { + if in == nil { + return nil + } + out := new(DeviceConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceConstraint) DeepCopyInto(out *DeviceConstraint) { + *out = *in + if in.Requests != nil { + in, out := &in.Requests, &out.Requests + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.MatchAttribute != nil { + in, out := &in.MatchAttribute, &out.MatchAttribute + *out = new(FullyQualifiedName) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceConstraint. +func (in *DeviceConstraint) DeepCopy() *DeviceConstraint { + if in == nil { + return nil + } + out := new(DeviceConstraint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceRequest) DeepCopyInto(out *DeviceRequest) { + *out = *in + if in.Selectors != nil { + in, out := &in.Selectors, &out.Selectors + *out = make([]DeviceSelector, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceRequest. +func (in *DeviceRequest) DeepCopy() *DeviceRequest { + if in == nil { + return nil + } + out := new(DeviceRequest) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceRequestAllocationResult) DeepCopyInto(out *DeviceRequestAllocationResult) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceRequestAllocationResult. +func (in *DeviceRequestAllocationResult) DeepCopy() *DeviceRequestAllocationResult { + if in == nil { + return nil + } + out := new(DeviceRequestAllocationResult) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeviceSelector) DeepCopyInto(out *DeviceSelector) { + *out = *in + if in.CEL != nil { + in, out := &in.CEL, &out.CEL + *out = new(CELDeviceSelector) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceSelector. +func (in *DeviceSelector) DeepCopy() *DeviceSelector { + if in == nil { + return nil + } + out := new(DeviceSelector) + 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 + in.Parameters.DeepCopyInto(&out.Parameters) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpaqueDeviceConfiguration. +func (in *OpaqueDeviceConfiguration) DeepCopy() *OpaqueDeviceConfiguration { + if in == nil { + return nil + } + out := new(OpaqueDeviceConfiguration) in.DeepCopyInto(out) return out } @@ -503,93 +679,6 @@ func (in *ResourceClaimList) DeepCopyObject() runtime.Object { return nil } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClaimParameters) DeepCopyInto(out *ResourceClaimParameters) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.GeneratedFrom != nil { - in, out := &in.GeneratedFrom, &out.GeneratedFrom - *out = new(ResourceClaimParametersReference) - **out = **in - } - if in.DriverRequests != nil { - in, out := &in.DriverRequests, &out.DriverRequests - *out = make([]DriverRequests, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClaimParameters. -func (in *ResourceClaimParameters) DeepCopy() *ResourceClaimParameters { - if in == nil { - return nil - } - out := new(ResourceClaimParameters) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClaimParameters) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClaimParametersList) DeepCopyInto(out *ResourceClaimParametersList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ResourceClaimParameters, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClaimParametersList. -func (in *ResourceClaimParametersList) DeepCopy() *ResourceClaimParametersList { - if in == nil { - return nil - } - out := new(ResourceClaimParametersList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClaimParametersList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClaimParametersReference) DeepCopyInto(out *ResourceClaimParametersReference) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClaimParametersReference. -func (in *ResourceClaimParametersReference) DeepCopy() *ResourceClaimParametersReference { - if in == nil { - return nil - } - out := new(ResourceClaimParametersReference) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ResourceClaimSchedulingStatus) DeepCopyInto(out *ResourceClaimSchedulingStatus) { *out = *in @@ -614,11 +703,7 @@ func (in *ResourceClaimSchedulingStatus) DeepCopy() *ResourceClaimSchedulingStat // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ResourceClaimSpec) DeepCopyInto(out *ResourceClaimSpec) { *out = *in - if in.ParametersRef != nil { - in, out := &in.ParametersRef, &out.ParametersRef - *out = new(ResourceClaimParametersReference) - **out = **in - } + in.Devices.DeepCopyInto(&out.Devices) return } @@ -737,288 +822,17 @@ func (in *ResourceClaimTemplateSpec) DeepCopy() *ResourceClaimTemplateSpec { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClass) DeepCopyInto(out *ResourceClass) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.ParametersRef != nil { - in, out := &in.ParametersRef, &out.ParametersRef - *out = new(ResourceClassParametersReference) - **out = **in - } - if in.SuitableNodes != nil { - in, out := &in.SuitableNodes, &out.SuitableNodes - *out = new(v1.NodeSelector) - (*in).DeepCopyInto(*out) - } - if in.StructuredParameters != nil { - in, out := &in.StructuredParameters, &out.StructuredParameters - *out = new(bool) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClass. -func (in *ResourceClass) DeepCopy() *ResourceClass { - if in == nil { - return nil - } - out := new(ResourceClass) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClass) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClassList) DeepCopyInto(out *ResourceClassList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ResourceClass, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClassList. -func (in *ResourceClassList) DeepCopy() *ResourceClassList { - if in == nil { - return nil - } - out := new(ResourceClassList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClassList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClassParameters) DeepCopyInto(out *ResourceClassParameters) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.GeneratedFrom != nil { - in, out := &in.GeneratedFrom, &out.GeneratedFrom - *out = new(ResourceClassParametersReference) - **out = **in - } - if in.VendorParameters != nil { - in, out := &in.VendorParameters, &out.VendorParameters - *out = make([]VendorParameters, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Filters != nil { - in, out := &in.Filters, &out.Filters - *out = make([]ResourceFilter, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClassParameters. -func (in *ResourceClassParameters) DeepCopy() *ResourceClassParameters { - if in == nil { - return nil - } - out := new(ResourceClassParameters) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClassParameters) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClassParametersList) DeepCopyInto(out *ResourceClassParametersList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ResourceClassParameters, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClassParametersList. -func (in *ResourceClassParametersList) DeepCopy() *ResourceClassParametersList { - if in == nil { - return nil - } - out := new(ResourceClassParametersList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ResourceClassParametersList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceClassParametersReference) DeepCopyInto(out *ResourceClassParametersReference) { +func (in *ResourcePool) DeepCopyInto(out *ResourcePool) { *out = *in return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceClassParametersReference. -func (in *ResourceClassParametersReference) DeepCopy() *ResourceClassParametersReference { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourcePool. +func (in *ResourcePool) DeepCopy() *ResourcePool { if in == nil { return nil } - out := new(ResourceClassParametersReference) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceFilter) DeepCopyInto(out *ResourceFilter) { - *out = *in - in.ResourceFilterModel.DeepCopyInto(&out.ResourceFilterModel) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceFilter. -func (in *ResourceFilter) DeepCopy() *ResourceFilter { - if in == nil { - return nil - } - out := new(ResourceFilter) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceFilterModel) DeepCopyInto(out *ResourceFilterModel) { - *out = *in - if in.NamedResources != nil { - in, out := &in.NamedResources, &out.NamedResources - *out = new(NamedResourcesFilter) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceFilterModel. -func (in *ResourceFilterModel) DeepCopy() *ResourceFilterModel { - if in == nil { - return nil - } - out := new(ResourceFilterModel) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceHandle) DeepCopyInto(out *ResourceHandle) { - *out = *in - if in.StructuredData != nil { - in, out := &in.StructuredData, &out.StructuredData - *out = new(StructuredResourceHandle) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceHandle. -func (in *ResourceHandle) DeepCopy() *ResourceHandle { - if in == nil { - return nil - } - out := new(ResourceHandle) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceModel) DeepCopyInto(out *ResourceModel) { - *out = *in - if in.NamedResources != nil { - in, out := &in.NamedResources, &out.NamedResources - *out = new(NamedResourcesResources) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceModel. -func (in *ResourceModel) DeepCopy() *ResourceModel { - if in == nil { - return nil - } - out := new(ResourceModel) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceRequest) DeepCopyInto(out *ResourceRequest) { - *out = *in - in.VendorParameters.DeepCopyInto(&out.VendorParameters) - in.ResourceRequestModel.DeepCopyInto(&out.ResourceRequestModel) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceRequest. -func (in *ResourceRequest) DeepCopy() *ResourceRequest { - if in == nil { - return nil - } - out := new(ResourceRequest) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceRequestModel) DeepCopyInto(out *ResourceRequestModel) { - *out = *in - if in.NamedResources != nil { - in, out := &in.NamedResources, &out.NamedResources - *out = new(NamedResourcesRequest) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceRequestModel. -func (in *ResourceRequestModel) DeepCopy() *ResourceRequestModel { - if in == nil { - return nil - } - out := new(ResourceRequestModel) + out := new(ResourcePool) in.DeepCopyInto(out) return out } @@ -1028,7 +842,7 @@ func (in *ResourceSlice) DeepCopyInto(out *ResourceSlice) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.ResourceModel.DeepCopyInto(&out.ResourceModel) + in.Spec.DeepCopyInto(&out.Spec) return } @@ -1084,13 +898,17 @@ func (in *ResourceSliceList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *StructuredResourceHandle) DeepCopyInto(out *StructuredResourceHandle) { +func (in *ResourceSliceSpec) DeepCopyInto(out *ResourceSliceSpec) { *out = *in - in.VendorClassParameters.DeepCopyInto(&out.VendorClassParameters) - in.VendorClaimParameters.DeepCopyInto(&out.VendorClaimParameters) - if in.Results != nil { - in, out := &in.Results, &out.Results - *out = make([]DriverAllocationResult, len(*in)) + out.Pool = in.Pool + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = new(v1.NodeSelector) + (*in).DeepCopyInto(*out) + } + if in.Devices != nil { + in, out := &in.Devices, &out.Devices + *out = make([]Device, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -1098,29 +916,12 @@ func (in *StructuredResourceHandle) DeepCopyInto(out *StructuredResourceHandle) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StructuredResourceHandle. -func (in *StructuredResourceHandle) DeepCopy() *StructuredResourceHandle { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceSliceSpec. +func (in *ResourceSliceSpec) DeepCopy() *ResourceSliceSpec { if in == nil { return nil } - out := new(StructuredResourceHandle) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VendorParameters) DeepCopyInto(out *VendorParameters) { - *out = *in - in.Parameters.DeepCopyInto(&out.Parameters) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VendorParameters. -func (in *VendorParameters) DeepCopy() *VendorParameters { - if in == nil { - return nil - } - out := new(VendorParameters) + out := new(ResourceSliceSpec) in.DeepCopyInto(out) return out } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json index bce577f34d8..9e6c849bc64 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json @@ -567,7 +567,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -862,7 +863,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1157,7 +1159,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.pb index a3d7f56343d0fdca057a40852fc49f10178078ca..f5b24b295388d18c6bde9c7f4a3107dbd7a4c302 100644 GIT binary patch delta 166 zcmewsvLJMVG~@q`GO3JA#{wr$5c6l+6tGb?g^}^hW=m!hF2<>w^LPaq8679r^QntU xa&hJ*=B9=v=9H!i@f4*NmZlb$Y!+1UWZnEtxSWl6#R@kVSvK)<5oLHP8vuxcG=cyC delta 121 zcmZ1w`YmLFG~?BcGO3Kra{{?0FW~fL7U~GtD4W8_xM;H_vk4bt`{q1e0Y*mS$@P5d l?A%daYGb*#NK(B8mV2 diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml index d1db1d5afa5..8d775f771f8 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml @@ -338,6 +338,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -553,6 +554,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -770,6 +772,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json index f69a59a91de..8b0df04cebc 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json @@ -568,7 +568,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -863,7 +864,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1158,7 +1160,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.pb index 19814ef0cb9571b116a00509bdd3f130db3d59a7..408b95f7b1b3282604f404218cda2a4b3e660222 100644 GIT binary patch delta 166 zcmZn;T^l+zP0fMxn{~C4HHtHU)r07|(3BVK(7noVvM?SAdbxak2uB zx~L=MDGcPeWb@M*H1KhY|JXtr3D&AmZS;EVORj-{&J{thPBO(R> diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml index a0131753da8..eb6bebd9187 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml @@ -346,6 +346,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -561,6 +562,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -778,6 +780,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json index 5bbbd0b5408..e6a0f6f79fc 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json @@ -569,7 +569,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -864,7 +865,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1159,7 +1161,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.pb index 288d3517d7e99bc692a365f51d3003dbebf766a7..020723d6bab9c2fd5dba35d4945f52b402dcd9c2 100644 GIT binary patch delta 164 zcmdlGaw}wl4C9WCvZ;)$?SUMOLX+=H`Z7yx3fL%@!pL}LvkkKe7vt2;g}efcjE<8P zc+^EDxj6F@b5p|-b4pW%c#2XBOH+$WHgDiNz)h4oX+?IHO}t!08R^M7Iac#B02EX* AR{#J2 delta 123 zcmcZ=vLR%G3}fF$*;Gc>y8#@GLX+Q0`Z7y(1Zc`!;rhEaRz-a;c20uOc}Zg(g3c^ktUX6tGb~g^}^hW?NwuPF&IGCEFH zEbg(mOU_GOmp2-ql}!pOL2vn{g;7i0V81}OnXM&rqf oJnHP+T%37{xv87?^Bv&ECF9AuSxoT;Bg+zAF06X(Rn~C<0M-*CtN;K2 diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml index 73fd267ac9e..0fa09f8eedf 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml @@ -346,6 +346,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -561,6 +562,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -778,6 +780,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json index 3a1ec1676d8..2737e8a9f80 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json @@ -568,7 +568,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -863,7 +864,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1158,7 +1160,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.pb index f91e84593371fb21b8520c92a0238bc019c7383c..f21185b0b5890f2d9e1b0918fb55423271e8a61d 100644 GIT binary patch delta 172 zcmeAP-4;4Qk*Pm)^Bu+%M%D{~9E?JfKS=m8Np0GEn=zG<@yupNW)m*Pshe*p2{1A` zPJXSdE-J~znU|QG8kU$-nkvLolv-GtT3oVOQpJ;X^FQHoHsTd4++bwc#LGpL;l*qK Df*CnA delta 130 zcmdlM+7miKk?Cp3<~xijjI7H7IT(c|H%j_4Np)<#&6vu_xM;H@vk4bt`{puU0Y*mS p$?bgV?A%R`zdyU64R;J&37477+GIMaxe-_{wU$gB(-Vt9mZ5f#xt9pm`%7Cr*6KjB*4h% zIQfmTx~L=UB|B#{~fAR3+>H diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml index 6b743b56746..684f18bf47e 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml @@ -346,6 +346,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -561,6 +562,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -778,6 +780,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json index 3b2d3b067d0..02a9ea37fea 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json @@ -567,7 +567,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -862,7 +863,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1157,7 +1159,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.pb index c6c9a4d88a59e84b57130456f80029c9ed7d2f6a..6fbf0cad5917769eec7efc04d825678684c5796b 100644 GIT binary patch delta 168 zcmewzvNUvp0^|RUim8mu#{#(~Ka})k656!+24gBCocuyr zT~v~bGcPeWH7qfwG*yVFD7COOwYX%nn2IOs=HJ5QY{V;8xWUM>iIQ1BlXbJW;tfWYCA?f%^*X4evH<`kXe09g diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml index b9a3d77afb7..7113936cffc 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml @@ -338,6 +338,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -553,6 +554,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -770,6 +772,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json index 7ee0e6bf98a..a07a873505d 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json @@ -568,7 +568,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -863,7 +864,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1158,7 +1160,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.pb index f11469c4c727ae2484c075e2bd98d741b04cb27d..602311a3526f6adfa3d445ba948ca55bfb5493a6 100644 GIT binary patch delta 172 zcmeAO-4r@Ok*Pa$^Bu+%M%FWd9E?JfKS=m8Np0GEn=zG<@yupNW)m*Pshe*p2{1A` zPJXSdE-J~znU|QG8kU$-nkvLolv-GtT3oVOQpJ;X^FQHoHsTd4++bwc#LGpL;rVO; Dcd zocvl@T~v~bGcPeWH7qfwG*yVFD7COOwYX%nq>3l&=6}NFY{V;8xWUM>iIR`zdyU64R;J&37477+GIMaxe-_{wU$gB(-Vt9mZ5f#xt9pm`%7Cr*6KjB*4h% zIQfmTx~L=UB|B#{~fAR3+>H diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml index 31f391838f4..62ca88e65e2 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml @@ -346,6 +346,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -561,6 +562,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -778,6 +780,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json index 43d8d906cd5..6e31218a452 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json @@ -651,7 +651,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -946,7 +947,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1241,7 +1243,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.pb b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.pb index 3299cba95c3b1def605eb631009d91c33955d120..7b46bd20ae7ec20de5bc76218c798a0a3d72bd29 100644 GIT binary patch delta 191 zcmX>e`7v^W6w}4X%^Mg~7#ZJ8Ze-MDT)lZcV=5!Z(I5^+0VWCN$rB{~STz`pHU&Tw zo!NYa#e|D->gHS(0Y*m0$#tsgqLN&kd5O8HVTn1VsX{zOsfDGf#U-29sCu$)o+w(* TM!aIB8;mTQc)5r&T$&vKGXOm) delta 144 zcmewuc|3B06w~s^%^Mg~7#R;uZe-MDY}~w_F_n>Hb`S@n0Fwms`M<>@ZMlfv(*eH?0$arS64YLUshb+ic$+pQ;SPBZ{Rz?O_VxmMRt}=yj(;X>B+h|R`UxZ0QX2TH~;_u delta 118 zcmewzb}?*%7~|HB;;D>`vnSUwMlf{*Y?Mf0WL&h_hS`LRv3+wPuK**X@ni)ab#`tp i&b-9j)Xn?&4shd=@nqdBs(6EuWeG1AR=svAw(I~mCm_)P diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml index 65f779c7050..0cfdcea93fa 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml @@ -362,6 +362,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -577,6 +578,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -794,6 +796,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json index 44ae84f9379..8532d6e6c77 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json @@ -651,7 +651,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -946,7 +947,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1241,7 +1243,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.pb b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.pb index ab0ccdde0f80c75b4da68baae899fe54a77847b9..58b2a586a1a3ea45e061d87ded56e2ebc52d2e4c 100644 GIT binary patch delta 178 zcmX>T`7LsSJmbZU3aN~YZzi`f>N2ek-Kdzt$ar+J6mtaArT{SK%;uXcCR~hDH}mle zFfuw$mKRVLmE_{gOUz9TOUx-v72+vMEi6qfF4??M)suDeG|_T4;uS01U}V|E%SDvo G((C~4FE@Gs delta 131 zcmewsc_wm#Jmd0>3aN~YhbFf%>M}KkZd6QRWSl)&iaCO*BLK`bw@&fAY++3V_iMgqpqXiCdvhP0{{^fByIoz diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml index 4aff17a0e28..df844e02e7d 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml @@ -398,6 +398,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -613,6 +614,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -830,6 +832,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json index c1d300c4072..0b7a61836ef 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json @@ -509,7 +509,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -804,7 +805,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1099,7 +1101,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1791,7 +1794,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1871,7 +1875,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1952,7 +1957,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.pb index 2db5082632d648053ffc0bc95fb4bb346ce3b764..73db1ea18fcd7a8ea1b4946251fcefd04ca6a351 100644 GIT binary patch delta 299 zcmX>TvmjO|+oG6(i<66~%ut9qAU{Q@D|Yikjub}5Gn>m9O}H4RZWd4!U}SWhtf-_e zD#^u}mzbLxmY7qTD#TNiT3DJ|T(a3;$&+=niBLHk@rvbdFtTjob0sxfnTQ~p! delta 210 zcmZ1wdnQIG+oG6(i<66~%ut9qAU{QDTg>K%94U;9i#C@tns70;Z(hSKz{qGkSx!rx zotuj@FEKZD^G}`w+_+>sSvLpB-(X}}!pntKZ>7>1R>swn-87~$Zr!|5%Ms1&$@)5O TlNV?S;F8S3CE+$XPR|Jd2`xM^ diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml index fec1c9a37a8..1977741c02f 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml @@ -294,6 +294,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -509,6 +510,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -726,6 +728,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -1200,6 +1203,7 @@ status: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -1256,6 +1260,7 @@ status: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -1315,6 +1320,7 @@ status: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodStatusResult.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodStatusResult.json index b41862a3c86..a401783f94d 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodStatusResult.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodStatusResult.json @@ -128,7 +128,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -208,7 +209,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -289,7 +291,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodStatusResult.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodStatusResult.pb index e1aaa06d3150c1951f27cf6196dfded868e5c3cb..172c1132b399a63ea8c658c73668153d914b494c 100644 GIT binary patch delta 143 zcmdnYf0uuP4CC&NvZ;)WS0^_!PGvm2`2n*dBctQwzijHFl3bj5iMgp^i8-aILOeyO dg{7&*C6fbK-6o%B79dV(7IDhlCKs|h0RX<`5m((Bct(T16Fl*ZZ6Ke#N5=$IjnAz?=lPE OlFY&-;Wl|TyAuF8vK|Bg diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodStatusResult.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodStatusResult.yaml index 89743862466..5ad52b13ef7 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodStatusResult.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodStatusResult.yaml @@ -65,6 +65,7 @@ status: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -121,6 +122,7 @@ status: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -180,6 +182,7 @@ status: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json index 982bfcc28d6..021ce494962 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json @@ -552,7 +552,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -847,7 +848,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1142,7 +1144,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.pb index 2ee42f7f8debd08ecade3cb436d4c3ca7ca2d206..ff551bd183bf7d236ef7e50aa94fcb3c1e4adf08 100644 GIT binary patch delta 161 zcmeAP-WEJTf@wzZ<_5+TM#fE>>lsrS8P9Bf%4EXDICXQKk^m#4y(o`XyqSV6D)Z&uOdzC#|H!l({XCq#*!VN~2O}t!08GfD>0KQx`IsgCw delta 114 zcmdlM+!H)Og6Un*<_5+TM#hfK^^B>EjEgouWisJnY~L)!E5OKTJXxDhot>MDGcPeW eb#pr30d8C}o~)bqDcoRWS;EVORqu1<^Q-`aMIcK6 diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml index 5bb4e5e81c0..0c42d574d6b 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml @@ -327,6 +327,7 @@ template: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -542,6 +543,7 @@ template: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -759,6 +761,7 @@ template: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json index 98f11e072b3..eb2bdc33520 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json @@ -558,7 +558,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -853,7 +854,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1148,7 +1150,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.pb index 27a191e10a5971f4b7a78e9abc12e1a311b0e840..76a110fbc229bc48042b328c8bc682dfcc2eaa7c 100644 GIT binary patch delta 167 zcmZn**$^^8iK!!G^IFCfM#k%tI~kQ2H*H?Sn99g_X0s5p2^Ztk&8w9J7#STW?@?A4 ymE_{gOUz9TOUx-v72+vMEi6qfF4_D_*^_nidEs(4;uS00U}V|E%SDvoGHd`^PB;eu delta 120 zcmdlG(iSp7iRoVO=CzC|jErk1cQPt5c5Gh5n99hwXtNNr2^VAgW_MlzMn>bw5q#?G l++3V_iMgqpr|=!%#wFv)y7{%j4MvtFyj)oIim1r20RV_lA;JIv diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml index 29a1c32423a..8563deeb606 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml @@ -332,6 +332,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -547,6 +548,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -764,6 +766,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json index 62f3f7091e2..eae671a4536 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json @@ -567,7 +567,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -862,7 +863,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1157,7 +1159,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.pb b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.pb index 67e74c3eb2cd2f2cb24a81a05cb07b3f9fafc297..98bc88c1ba8d014d3e781850063c038e95908bfc 100644 GIT binary patch delta 168 zcmZn;T^l+ad$C%2uPN-Zo+EiTzCqvFZBnNg&ijd;b1HyBwq@p2Jmcsd&Zam6-_ delta 123 zcmZ1*+8jDTjp=&G=KG8(jLh=_xh6A8`Z5W1Y`({s%E-8AvkS8c7i0V8N?rj*M&rp{ neCq7nT%37{xv86v@g3mCCF9AuSyu4|Bg+zAF06XpRMOc175*cx diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml index 6cb101e2e72..76ab0b6062f 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml @@ -338,6 +338,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -553,6 +554,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -770,6 +772,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json index 149a6cd6090..a50d48b57e1 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json @@ -568,7 +568,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -863,7 +864,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1158,7 +1160,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.pb index d2514063e5bf6d00eeb36eeb745bfb43b5f3bc10..7e512c7f3d370918516658d832e53d00a6b02a5e 100644 GIT binary patch delta 167 zcmbOfx+ipkI#Yk>=8aq_jEom1_b~=BZrc2iF_n?=%w~6H6E4Q7n;$3%Ffuw${-~@j yD#^u}mzbLxmY7qTD#TNiT3DJ|T(VhS#glb2i%2;e@ro61FtTjoV(PnpM6E4Q~%{9CNjEu&Ud->Ga lxw$y=5_3~GpX58hjZ4Opb+dxv4MvtFyj)oIda4w&0RR+BBlrLS diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml index ffe3362357a..ea9efd7a1fd 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml @@ -348,6 +348,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -563,6 +564,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -780,6 +782,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json index f7295e0ca91..9947335378b 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json @@ -569,7 +569,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -864,7 +865,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, @@ -1159,7 +1161,8 @@ }, "claims": [ { - "name": "nameValue" + "name": "nameValue", + "request": "requestValue" } ] }, diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.pb b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.pb index a962506ce58c2924e9d1ae8affc14e68fb2b4086..16dadda0fb960f5b7b9beb850b77a666f0055987 100644 GIT binary patch delta 168 zcmdlT@-$?EI@6Aj%^SH=7@67wC-*Z3GH%-ZkTI2!@yup-W)m*Pshb}t2{1A`PX4H@ zE-J~znU|QG8kU$-nkvLolv-GtT3oVOUd5AjGmA($8}W)2Z!ofK;^iXBa2YlLrY<(1 delta 121 zcmaDFvO8pgI#XZB=8aq_j7)a}CigQ2GInf!$e7B=xM;IGvk4bt`{o*60Y*mS$-R8) l?A%dOcNS*Z@$;Bq9I+ diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml index adeddf322a6..bf4285d5e11 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml @@ -338,6 +338,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -553,6 +554,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: @@ -770,6 +772,7 @@ spec: resources: claims: - name: nameValue + request: requestValue limits: limitsKey: "0" requests: diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaimParameters.json b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.DeviceClass.json similarity index 65% rename from staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaimParameters.json rename to staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.DeviceClass.json index 8cc8d44a413..1b683f8015d 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaimParameters.json +++ b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.DeviceClass.json @@ -1,5 +1,5 @@ { - "kind": "ResourceClaimParameters", + "kind": "DeviceClass", "apiVersion": "resource.k8s.io/v1alpha3", "metadata": { "name": "nameValue", @@ -43,27 +43,19 @@ } ] }, - "generatedFrom": { - "apiGroup": "apiGroupValue", - "kind": "kindValue", - "name": "nameValue" - }, - "driverRequests": [ - { - "driverName": "driverNameValue", - "vendorParameters": { - "apiVersion": "example.com/v1", - "kind": "CustomType", - "spec": { - "replicas": 1 - }, - "status": { - "available": 1 + "spec": { + "selectors": [ + { + "cel": { + "expression": "expressionValue" } - }, - "requests": [ - { - "vendorParameters": { + } + ], + "config": [ + { + "opaque": { + "driver": "driverValue", + "parameters": { "apiVersion": "example.com/v1", "kind": "CustomType", "spec": { @@ -72,12 +64,33 @@ "status": { "available": 1 } - }, - "namedResources": { - "selector": "selectorValue" } } + } + ], + "suitableNodes": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "keyValue", + "operator": "operatorValue", + "values": [ + "valuesValue" + ] + } + ], + "matchFields": [ + { + "key": "keyValue", + "operator": "operatorValue", + "values": [ + "valuesValue" + ] + } + ] + } ] } - ] + } } \ No newline at end of file diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClassParameters.pb b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.DeviceClass.pb similarity index 63% rename from staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClassParameters.pb rename to staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.DeviceClass.pb index 2353f1de185d22b734a52e4ef0b8d87bae16dddc..3952de283d2c1604a464c64ab35b938bcfcc6882 100644 GIT binary patch delta 187 zcmey#@`pt~+oG6(OPx!iD784hv?w`M4=A9QnXg}Fn3z+Lk!UQ$?UGuSnVjmJlUQ6V zbYi1*Dx>NnMlNA4K`#E(iUOdv;>`TKu*96wRH1UNQm$ey?v$d;vecrhbIQc}w@lT)2@5{rxdV4_mO zT!LKusTBo9sl~;a`FUWaO2UabIr+(nB|rh+{1k|O4ORn2Ar&s(qSV6D)Z&t2h@rx{ zi6zMyjwK~UnMtK35S3DGjEd;$O1X-;xKoNU%TkLV8Yc@drPcE%=jW9a<>%x;MWx;{ zacySeI?c#s%*6w>2%;QWuM}rNetr(brQ8rtLCs|3;x5iFElP&^7}c#(*xZoHDiy>P fz%{v#S$%RZvxblox|4(^Z(}xLlVFr$P+|Z8{*!f1 delta 205 zcmZ3$@qvAU0pqTXhN+D8_FQ5`sm1xFMaikoIf=!^eu=rMVTn1VsY0q;yom*w?nU{f z1rPzw?999rFjI;%52j3NG7A@fN>OH6Y7s)~31+U3Oqjx)DTyVCU<0%+F>$4EB~>d; zR$xw;EXABAq{N$-pOOkULaUT(vNUt5fDkViHy6S-p~;QR!HiOqpD~-TDKJVgC@}y4 D2_!)k 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 404c396c5ff..fe03182cc65 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 @@ -33,14 +33,56 @@ metadata: selfLink: selfLinkValue uid: uidValue spec: - parametersRef: - apiGroup: apiGroupValue - kind: kindValue - name: nameValue - resourceClassName: resourceClassNameValue + controller: controllerValue + devices: + config: + - opaque: + driver: driverValue + parameters: + apiVersion: example.com/v1 + kind: CustomType + spec: + replicas: 1 + status: + available: 1 + requests: + - requestsValue + constraints: + - matchAttribute: matchAttributeValue + requests: + - requestsValue + requests: + - adminAccess: true + allocationMode: allocationModeValue + count: 5 + deviceClassName: deviceClassNameValue + name: nameValue + selectors: + - cel: + expression: expressionValue status: allocation: - availableOnNodes: + controller: controllerValue + devices: + config: + - opaque: + driver: driverValue + parameters: + apiVersion: example.com/v1 + kind: CustomType + spec: + replicas: 1 + status: + available: 1 + requests: + - requestsValue + source: sourceValue + results: + - device: deviceValue + driver: driverValue + pool: poolValue + request: requestValue + nodeSelector: nodeSelectorTerms: - matchExpressions: - key: keyValue @@ -52,37 +94,7 @@ status: operator: operatorValue values: - valuesValue - resourceHandles: - - data: dataValue - driverName: driverNameValue - structuredData: - nodeName: nodeNameValue - results: - - namedResources: - name: nameValue - vendorRequestParameters: - apiVersion: example.com/v1 - kind: CustomType - spec: - replicas: 1 - status: - available: 1 - vendorClaimParameters: - apiVersion: example.com/v1 - kind: CustomType - spec: - replicas: 1 - status: - available: 1 - vendorClassParameters: - apiVersion: example.com/v1 - kind: CustomType - spec: - replicas: 1 - status: - available: 1 deallocationRequested: true - driverName: driverNameValue reservedFor: - apiGroup: apiGroupValue name: nameValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaimParameters.pb b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaimParameters.pb deleted file mode 100644 index 96246a9fc95c9393c45011631fbed7600803e845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 703 zcmcgq!A=`75Zyo|61OB_g#_B8rCv}KN}@_pj&MMN3ZV*d;5NINq;9;nW$#7}QGS5G z;LIoV4=V8wh(phaAAnge2?+Jv+w+_8n>WuM_guibY}=yKxlOP=?zy(myOTYT<_C1c zt?w_D0|_EM1q&%=XkGYJWp^vAuIPLYGRJUZgbFQWc(S0PMp1PJlCp)bJCwt3LXG{6 zomwsi9(6Vs^Uq0IXyw`7+J3Eed;Rx!wG|u@x_S6R=#*V-v$}*Br8~xH_@RXUM$B0Q zl+qbwB;w1hH)r4T^DC>5g(?R}um1Vc%}x`Hcx&WKrB|`dp->>jB^mTOSCyE3OhLg2 zttY~UHpTu6`_X$DPCMM+KCQNb4vC>0xU;D#lj&F4%51*ha(TQ=!iV~at&^EUt8-Hh z`M3AS3TqCmn4n#T9}ZYN8j0;hr}V)5GcR%={vdamP75={IfDuB&$vY+ rMFNiZ_vXY>q&ZG%Ko+rQ_gPKZVLvdpd%KC5<4YutRaN! zKU$USfDLixJcgibySDNYw6+2$fr*uU{$%qaD~{Q|$A^f4LSI@MAaQp^3}nsiqr=34L&57g n_vo||5O_UWBuYRr{i(47rJ*^}xKb9yP}r8d)%th08t}mnHl$~4 delta 91 zcmbQoae{4v1ydK><^_x?j7&?I!L*A#msnA1aeir0a;kGqVsWuwVs2_!VoqtQkSZ5% eVnL>RQGRIwM1V6pGcN_ql;X^TDU)JQVgLYYX&trz diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaimTemplate.yaml b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaimTemplate.yaml index 52b050c8fd4..79f9482f3e5 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaimTemplate.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClaimTemplate.yaml @@ -66,8 +66,30 @@ spec: selfLink: selfLinkValue uid: uidValue spec: - parametersRef: - apiGroup: apiGroupValue - kind: kindValue - name: nameValue - resourceClassName: resourceClassNameValue + controller: controllerValue + devices: + config: + - opaque: + driver: driverValue + parameters: + apiVersion: example.com/v1 + kind: CustomType + spec: + replicas: 1 + status: + available: 1 + requests: + - requestsValue + constraints: + - matchAttribute: matchAttributeValue + requests: + - requestsValue + requests: + - adminAccess: true + allocationMode: allocationModeValue + count: 5 + deviceClassName: deviceClassNameValue + name: nameValue + selectors: + - cel: + expression: expressionValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClass.json b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClass.json deleted file mode 100644 index bd89915d429..00000000000 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClass.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "kind": "ResourceClass", - "apiVersion": "resource.k8s.io/v1alpha3", - "metadata": { - "name": "nameValue", - "generateName": "generateNameValue", - "namespace": "namespaceValue", - "selfLink": "selfLinkValue", - "uid": "uidValue", - "resourceVersion": "resourceVersionValue", - "generation": 7, - "creationTimestamp": "2008-01-01T01:01:01Z", - "deletionTimestamp": "2009-01-01T01:01:01Z", - "deletionGracePeriodSeconds": 10, - "labels": { - "labelsKey": "labelsValue" - }, - "annotations": { - "annotationsKey": "annotationsValue" - }, - "ownerReferences": [ - { - "apiVersion": "apiVersionValue", - "kind": "kindValue", - "name": "nameValue", - "uid": "uidValue", - "controller": true, - "blockOwnerDeletion": true - } - ], - "finalizers": [ - "finalizersValue" - ], - "managedFields": [ - { - "manager": "managerValue", - "operation": "operationValue", - "apiVersion": "apiVersionValue", - "time": "2004-01-01T01:01:01Z", - "fieldsType": "fieldsTypeValue", - "fieldsV1": {}, - "subresource": "subresourceValue" - } - ] - }, - "driverName": "driverNameValue", - "parametersRef": { - "apiGroup": "apiGroupValue", - "kind": "kindValue", - "name": "nameValue", - "namespace": "namespaceValue" - }, - "suitableNodes": { - "nodeSelectorTerms": [ - { - "matchExpressions": [ - { - "key": "keyValue", - "operator": "operatorValue", - "values": [ - "valuesValue" - ] - } - ], - "matchFields": [ - { - "key": "keyValue", - "operator": "operatorValue", - "values": [ - "valuesValue" - ] - } - ] - } - ] - }, - "structuredParameters": true -} \ No newline at end of file diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClass.pb b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClass.pb deleted file mode 100644 index 3827942c850817472426bbeff56c8489a0ff6ff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 567 zcma)2J5B;Y7~Vw^m%)W~V?nmu!YBp4Lb9>M!bFWB#8BAH!Viu+%xq>@5;PXJ-on}= zcmoseU@WY?fethB2(hsH{^$2dB59#rR1qL~COS|{B3UDRZ*+iZdV`OAxAi+Yp;$`) zF^}GJsKD?5+L&hGZ}x$Kz(cs4wSv-gDpTAsE1@fa_AUrZ^hMRlNLQo7tr=?@ge08l zZnWNToXPX&Yu>ZY6ngo3Q>clqE2uzm3{;-O*e@EWFX9lDFk^g(hw6zQdrP(6xvir@ zLYN^A7W%`vnra!RWLe0*9oeGXBMeh=rv&OhPj-wp2AJVK2;J~YJe~TV$q!cFgv!Im z?^Z&WGV+U4f{Q%*0!^i*t diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClass.yaml b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClass.yaml deleted file mode 100644 index f43facc6f79..00000000000 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClass.yaml +++ /dev/null @@ -1,53 +0,0 @@ -apiVersion: resource.k8s.io/v1alpha3 -driverName: driverNameValue -kind: ResourceClass -metadata: - annotations: - annotationsKey: annotationsValue - creationTimestamp: "2008-01-01T01:01:01Z" - deletionGracePeriodSeconds: 10 - deletionTimestamp: "2009-01-01T01:01:01Z" - finalizers: - - finalizersValue - generateName: generateNameValue - generation: 7 - labels: - labelsKey: labelsValue - managedFields: - - apiVersion: apiVersionValue - fieldsType: fieldsTypeValue - fieldsV1: {} - manager: managerValue - operation: operationValue - subresource: subresourceValue - time: "2004-01-01T01:01:01Z" - name: nameValue - namespace: namespaceValue - ownerReferences: - - apiVersion: apiVersionValue - blockOwnerDeletion: true - controller: true - kind: kindValue - name: nameValue - uid: uidValue - resourceVersion: resourceVersionValue - selfLink: selfLinkValue - uid: uidValue -parametersRef: - apiGroup: apiGroupValue - kind: kindValue - name: nameValue - namespace: namespaceValue -structuredParameters: true -suitableNodes: - nodeSelectorTerms: - - matchExpressions: - - key: keyValue - operator: operatorValue - values: - - valuesValue - matchFields: - - key: keyValue - operator: operatorValue - values: - - valuesValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClassParameters.json b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClassParameters.json deleted file mode 100644 index b39aeb9a01b..00000000000 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClassParameters.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "kind": "ResourceClassParameters", - "apiVersion": "resource.k8s.io/v1alpha3", - "metadata": { - "name": "nameValue", - "generateName": "generateNameValue", - "namespace": "namespaceValue", - "selfLink": "selfLinkValue", - "uid": "uidValue", - "resourceVersion": "resourceVersionValue", - "generation": 7, - "creationTimestamp": "2008-01-01T01:01:01Z", - "deletionTimestamp": "2009-01-01T01:01:01Z", - "deletionGracePeriodSeconds": 10, - "labels": { - "labelsKey": "labelsValue" - }, - "annotations": { - "annotationsKey": "annotationsValue" - }, - "ownerReferences": [ - { - "apiVersion": "apiVersionValue", - "kind": "kindValue", - "name": "nameValue", - "uid": "uidValue", - "controller": true, - "blockOwnerDeletion": true - } - ], - "finalizers": [ - "finalizersValue" - ], - "managedFields": [ - { - "manager": "managerValue", - "operation": "operationValue", - "apiVersion": "apiVersionValue", - "time": "2004-01-01T01:01:01Z", - "fieldsType": "fieldsTypeValue", - "fieldsV1": {}, - "subresource": "subresourceValue" - } - ] - }, - "generatedFrom": { - "apiGroup": "apiGroupValue", - "kind": "kindValue", - "name": "nameValue", - "namespace": "namespaceValue" - }, - "vendorParameters": [ - { - "driverName": "driverNameValue", - "parameters": { - "apiVersion": "example.com/v1", - "kind": "CustomType", - "spec": { - "replicas": 1 - }, - "status": { - "available": 1 - } - } - } - ], - "filters": [ - { - "driverName": "driverNameValue", - "namedResources": { - "selector": "selectorValue" - } - } - ] -} \ No newline at end of file diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClassParameters.yaml b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClassParameters.yaml deleted file mode 100644 index 25b8a9ee184..00000000000 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceClassParameters.yaml +++ /dev/null @@ -1,52 +0,0 @@ -apiVersion: resource.k8s.io/v1alpha3 -filters: -- driverName: driverNameValue - namedResources: - selector: selectorValue -generatedFrom: - apiGroup: apiGroupValue - kind: kindValue - name: nameValue - namespace: namespaceValue -kind: ResourceClassParameters -metadata: - annotations: - annotationsKey: annotationsValue - creationTimestamp: "2008-01-01T01:01:01Z" - deletionGracePeriodSeconds: 10 - deletionTimestamp: "2009-01-01T01:01:01Z" - finalizers: - - finalizersValue - generateName: generateNameValue - generation: 7 - labels: - labelsKey: labelsValue - managedFields: - - apiVersion: apiVersionValue - fieldsType: fieldsTypeValue - fieldsV1: {} - manager: managerValue - operation: operationValue - subresource: subresourceValue - time: "2004-01-01T01:01:01Z" - name: nameValue - namespace: namespaceValue - ownerReferences: - - apiVersion: apiVersionValue - blockOwnerDeletion: true - controller: true - kind: kindValue - name: nameValue - uid: uidValue - resourceVersion: resourceVersionValue - selfLink: selfLinkValue - uid: uidValue -vendorParameters: -- driverName: driverNameValue - parameters: - apiVersion: example.com/v1 - kind: CustomType - spec: - replicas: 1 - status: - available: 1 diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceSlice.json b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceSlice.json index 43e6eeb2219..a3a916ae363 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceSlice.json +++ b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceSlice.json @@ -43,32 +43,55 @@ } ] }, - "nodeName": "nodeNameValue", - "driverName": "driverNameValue", - "namedResources": { - "instances": [ + "spec": { + "driver": "driverValue", + "pool": { + "name": "nameValue", + "generation": 2, + "resourceSliceCount": 3 + }, + "nodeName": "nodeNameValue", + "nodeSelector": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "keyValue", + "operator": "operatorValue", + "values": [ + "valuesValue" + ] + } + ], + "matchFields": [ + { + "key": "keyValue", + "operator": "operatorValue", + "values": [ + "valuesValue" + ] + } + ] + } + ] + }, + "allNodes": true, + "devices": [ { "name": "nameValue", - "attributes": [ - { - "name": "nameValue", - "quantity": "0", - "bool": true, - "int": 7, - "intSlice": { - "ints": [ - 1 - ] - }, - "string": "stringValue", - "stringSlice": { - "strings": [ - "stringsValue" - ] - }, - "version": "versionValue" + "basic": { + "attributes": { + "attributesKey": { + "int": 2, + "bool": true, + "string": "stringValue", + "version": "versionValue" + } + }, + "capacity": { + "capacityKey": "0" } - ] + } } ] } diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceSlice.pb b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceSlice.pb index 907c56bb8bccf3430a616caaecd290cba7824458..9a36629f9a87a81673798852682fa37419c8525e 100644 GIT binary patch delta 237 zcmbQp@`YuB0n;z7za7>$CFtQB(OGT`D( zEGa3UFD4`LC65(5D3 C&?<5O diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceSlice.yaml b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceSlice.yaml index 86289d94d0a..93d7f2e1170 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceSlice.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.ResourceSlice.yaml @@ -1,5 +1,4 @@ apiVersion: resource.k8s.io/v1alpha3 -driverName: driverNameValue kind: ResourceSlice metadata: annotations: @@ -33,20 +32,34 @@ metadata: resourceVersion: resourceVersionValue selfLink: selfLinkValue uid: uidValue -namedResources: - instances: - - attributes: - - bool: true - int: 7 - intSlice: - ints: - - 1 - name: nameValue - quantity: "0" - string: stringValue - stringSlice: - strings: - - stringsValue - version: versionValue +spec: + allNodes: true + devices: + - basic: + attributes: + attributesKey: + bool: true + int: 2 + string: stringValue + version: versionValue + capacity: + capacityKey: "0" name: nameValue -nodeName: nodeNameValue + driver: driverValue + nodeName: nodeNameValue + nodeSelector: + nodeSelectorTerms: + - matchExpressions: + - key: keyValue + operator: operatorValue + values: + - valuesValue + matchFields: + - key: keyValue + operator: operatorValue + values: + - valuesValue + pool: + generation: 2 + name: nameValue + resourceSliceCount: 3 diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.Status.json b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.Status.json deleted file mode 100644 index 24ac6260e10..00000000000 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.Status.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "kind": "Status", - "apiVersion": "resource.k8s.io/v1alpha3", - "metadata": { - "selfLink": "selfLinkValue", - "resourceVersion": "resourceVersionValue", - "continue": "continueValue", - "remainingItemCount": 4 - }, - "status": "statusValue", - "message": "messageValue", - "reason": "reasonValue", - "details": { - "name": "nameValue", - "group": "groupValue", - "kind": "kindValue", - "uid": "uidValue", - "causes": [ - { - "reason": "reasonValue", - "message": "messageValue", - "field": "fieldValue" - } - ], - "retryAfterSeconds": 5 - }, - "code": 6 -} \ No newline at end of file diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.Status.pb b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.Status.pb deleted file mode 100644 index 05265b30c973f496589cbe5c51534f41d966171c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmY+6%L>9U5Jf9!(W%`87t)nvqqwLqkbZ<=Y&K-cX#I8b5%hR za9CO-<7|bwDkzs`_dJNUe~1%{uY(vIvDXOBkP^1_MQT-w)*)Mbtr9Isqy0BaE29Ug z9r|-MW(oO;K<6D2i6%gvSQPXTw>Ow+(FMYwvBvemnJKC7KJqpED(r79gIZ!6ikr!C M>SW0KIE#4n1|3vR5C8xG diff --git a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.Status.yaml b/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.Status.yaml deleted file mode 100644 index 06c2f189067..00000000000 --- a/staging/src/k8s.io/api/testdata/HEAD/resource.k8s.io.v1alpha3.Status.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: resource.k8s.io/v1alpha3 -code: 6 -details: - causes: - - field: fieldValue - message: messageValue - reason: reasonValue - group: groupValue - kind: kindValue - name: nameValue - retryAfterSeconds: 5 - uid: uidValue -kind: Status -message: messageValue -metadata: - continue: continueValue - remainingItemCount: 4 - resourceVersion: resourceVersionValue - selfLink: selfLinkValue -reason: reasonValue -status: statusValue diff --git a/staging/src/k8s.io/api/testdata/v1.29.0/apps.v1.DaemonSet.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.29.0/apps.v1.DaemonSet.after_roundtrip.pb index 5fe83c6f42b331d584e686a7f9a076e437caee6e..dd1054b941f5a6c8ebb0e39ce2e5c0b0a77281bf 100644 GIT binary patch delta 144 zcmZ1+v@&RdG-Jm`nN&um^L~>biup6`_T4C(!pL}avn8_t7vtH@rzHg#8BHh4@~HFi ra&hJ*=B9=v=9H!iF>L0S=3w1CP1uBufT{;R|qM= delta 138 zcmZ1(v^Z#jG-K07nN&vRlYU&26UBU)g|_-`luc#aY{@LZ#dv!2SxEs#M&rr%q||x1 rxj6F@b5p|-b4pV;PvEoR#w*Rix>;J`1|!Q09xi;QaIj8x)p!B`z?v(K diff --git a/staging/src/k8s.io/api/testdata/v1.29.0/apps.v1.Deployment.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.29.0/apps.v1.Deployment.after_roundtrip.pb index 9e66f34abd60b0ed6e02f570f2da3c106656bef1..731a22c1e74a7eb3c7829a44e0ea179723f2f7a1 100644 GIT binary patch delta 148 zcmdlGv@K|Y4C9oIvZ;)$SN%8`g(iO#^<|dY?YmJfg^}^Jgs%uNkT%qdM3V%R*9&xV_T0uI*AQVKU1SzhsQ;Wvqcb+VJjI{@7aD@XtU delta 143 zcmdlMv>|AM3}fF$*;Gc>^L`wRLX#5|eVL`U`fijJgs%uNkT%qdM3V%R*9&xV_T0uI*AQVKU1SzhsQ;Wvqcb+VJjYybndD>VQB delta 143 zcmaDHcsFo@4CC&NvZ;)$U49&lLX#5|eVL`U`fijXeBGaUx&37167+Ej-aWD!^_LuNwlG?iYHe)IyvAp2n!f(oCUyV-ywKyyJ diff --git a/staging/src/k8s.io/api/testdata/v1.29.0/apps.v1beta1.StatefulSet.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.29.0/apps.v1beta1.StatefulSet.after_roundtrip.pb index 0e996204770a4e99c5e216b12b481788e94dcbf5..73f11626f64e953bbae020aa41a4375b199b72f0 100644 GIT binary patch delta 151 zcmeww^*d^U64T|V&37477+F7uaWD!^z9`|#B(;0<9mZ5f#;cp1m<6~P&u;#sD8R^Q xI+*o2wCTxUNDJa}vWO>EIh2J<+E&zsVEsg*H delta 142 zcmewz^)+gO64TkJ&37477+K$jaWD!^4v_F=lG?iY4r3}KCOJU0*s8tlN0#V rdAPYa^AdAY!xD2!Q#VUUbFglnD{R7sSIq-9mKQu+_)VGYrSSv+YJVuj diff --git a/staging/src/k8s.io/api/testdata/v1.29.0/apps.v1beta2.Deployment.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.29.0/apps.v1beta2.Deployment.after_roundtrip.pb index ea64a0d378a8052574793cb55b81ee2e7c4c3898..1695071cdda82c72029117dbb4ae0965de5240f4 100644 GIT binary patch delta 151 zcmdlQv^!{mBGZ(h&37167+J6SaWD!^c9isGlG?rbHe)Iy*o2wCTxUNDJa}vWO>EIh2J<+E&zsVEsg*H delta 142 zcmewz^)+gO64TkJ&37477+K$jaWD!^4v_F=lG?iY4r3}KWb|!3s6w{ip%^Mg~7#WXGZe-MDY}>q^F_n>HfjTb}Vdy6w|V>%^Mg~7#R;vZe-MDY}mY>F_n>HmOlrh0Fwms`3ntexMlkL6-6)a5$arzoq|wI+0D9aiB>(^b delta 138 zcmcZ>d?9#(7~__W;;D>`vnJOvMlfyl-6)a5$asFU4YL3j=6TO$|%TDNWt%pv=L#dA6_#8zD7v3O5*8Uhr_?Gin+e03<9c!~g&Q diff --git a/staging/src/k8s.io/api/testdata/v1.29.0/batch.v1beta1.CronJob.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.29.0/batch.v1beta1.CronJob.after_roundtrip.pb index 6123c6cf03f1e98cc0c85c40857520111d5acef3..87a87757dfa380181a7624dea2acea5b2d320181 100644 GIT binary patch delta 157 zcmX>db}?*%JmZ>;3aN~Y$0xTj>N2$jZB$HQWLz*=iaCO5w=bA;b@NRY0WQX~o3o__ z7#U3`@8wnJM}J1ZB$HQWSliwiaCO5t1p;ye)CNh0WQYVn{%ZF z7#WQx*U6~!aC33yCFZ7vCFYc-ZZ;6G;l?Y?!Mb_3;tfWY7d%|}OaUr;s+q$G02~=E AO8@`> diff --git a/staging/src/k8s.io/api/testdata/v1.29.0/core.v1.Pod.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.29.0/core.v1.Pod.after_roundtrip.pb index f8ba6632b88bdb618a1822813c5c901516bbf343..5bb77db5fbb60acfa1f28be99035ef07464f1f66 100644 GIT binary patch delta 257 zcmdlMaVSDC+oG6(i<66~%ut9qAU{QD%|^jgM#ig~%NYf@7|(7tR1jcfG@ZOqL!FP8 zi!(1VH#ICVr!-ZFVY9C!2kYi5f+lPPR6Ss0dBwv;$fU`&YTk_RCZANB%J^+_yt*UQ mQh8KMy?6`ri=A^4i;Kao2trnh=Dx{MS}G_;q04{Kb^-vE8%(VL delta 244 zcmX>Uu`NO{+oG6(i<66~%ut9qAU{QD!A8MUM#l4-%NYf@7*B8JmJncMG@h)lrOw06 z#hI6wn;MpwQ<}OtP?Cdn^EE*eHoR&cu(7=0;lgjqD@1YEv(OX1kq4Z z@DC`cfjy6 zpe*l9LZ!$O#L+}D!IihY)U8$zpMHC_Xlfg1Jv(}fRu2Ye!3c>@LwS?#TeaL&5xxUW z!nr`6m_%KhrL)59u7NRPJTGh){GAyaw?$%BCbFux^`y1MI0@MS5>$B}=|0pW!pSyG zl*4L@c>MiS`u5*x9Q=l_hrbt0&BJ6g4CI~tIPXkn5i0i|bWNH0vred{{s4e@hsa5f zuY-|JW2~A~dZ^+y=Kl5O2y+)z+*(43oHWy`qY@Iy=J2_bQwF-V9U;^8p2B$$i(q1R zu*AzR&ryQz&pF{^I0xkn)?9K600UpVeuv!bYgOH>*k!OY2X+zq{o`Y-;i2{Z(-X8h z=1}mIFdVM+t2z7sUh#r{>68a7n)a_#SN4QY_aBBg^!|BRCSfRsxDWxZjGAsWkqe-& z4%WcLA!ZRvXFkgscX2PHvhdlB@`h;}jXfc+ghb{e*gw(Xcyt)7a1r5ifYNS?pm^|n t1D05je1k=KR%?*qxjEuWC*E6OvGG5*Mlu3Y#@$BaLiUN#`rjs`)sq^u2apooF mriLZvl%@(XY~C%!!MfQ=*o2LMst0T=uXwl!nKb#ex*q^Iz*%?*qxjEq}1*E6OvGM?Z3lu3Y#@$}|ONdZPiO9i^28_NqGF8roU{;2K;05N+iZ~y=R diff --git a/staging/src/k8s.io/api/testdata/v1.29.0/core.v1.ReplicationController.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.29.0/core.v1.ReplicationController.after_roundtrip.pb index e74a5e077e2241e70050980ff9ab02f14cdb47d5..617e150e2edc7744d80a992065adf9cc2338b1b7 100644 GIT binary patch delta 146 zcmdlSxHE8q64S)M&1)G`7#SZ-?qpPA+`V}XV=5!#)y+c80$hw|H=j`yU}Q9%d{;@G skC%%xFEKYYEHS4vRfu7;fHDW`=6qojHo~et$lqXOdBwwp-?+uB0A`mhDgXcg delta 139 zcmdlPxH)iw5>t2J=CzC|jEuJ?cQPt5Zr!|wF_n?={AM9$0WQYVn=dE|FftlXeyF6* q!_CE+mzbLxmY7qTy7`S12kYiSVG}mIY96q$yx`%&Z^~pjjoARo{4Q(& diff --git a/staging/src/k8s.io/api/testdata/v1.29.0/extensions.v1beta1.DaemonSet.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.29.0/extensions.v1beta1.DaemonSet.after_roundtrip.pb index 36fc4ffe11c6199c17000e59cbaf39956c12b0d7..aafbbe9b71588e25b1b8299fa38504d4f9fdfa3e 100644 GIT binary patch delta 148 zcmdlGv@K|Y8dF!$=KG8(jLaAPxF#p?_%aFY-h7WSm67r4W*24wF2=K)|0xPEGMY~2 vS61ia<>Jgs%uNkT%qdM3V%RJt&B3~Pp|A-X0aXv!SYGjP5i)7Am&P*yU_&e# delta 140 zcmdlMv>|AM8dFQq=KG8(j7+EfCO;7OXWY8^9%Cva*5*;? sav_EKqI@6?}%^SH=7#S~5?qdvM+`9Q8V=5!#`OWUk0$hxzH{X^NU}Q9&{6*5*;? s-@0gLU&VVG}mIY96q$yx`%&Z_4CgjoAS96D@@R diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/apps.v1.DaemonSet.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/apps.v1.DaemonSet.after_roundtrip.pb index d8b5c3cb5d9c5c597f8a37b9a646fb07da0979ac..9d473166f9f66b8e8021b05bde063fa780ce48ea 100644 GIT binary patch delta 144 zcmewz+!!)Jn(@I#nN&umHk`)`y@VPssp*^*g+i?MTazmfnWqv_-Y%IbW) rT%37{xv61^Ii;yW44d<%U063?5{_Uaph||FWf?CQA(JMHYd!%0Vks(Z delta 138 zcmZn+`5in#n(@{~nN&vRg#lcX4~qFR3-$VMluc#aY{@LZ#n`@CS4x19(Ri|*v^ozr r7iV5#ZfaO!PHF1q34C+7@k+a}Zr-kNgOOzkFBd*jTv#W|YCZt~AUY_p diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/apps.v1.Deployment.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/apps.v1.Deployment.after_roundtrip.pb index 6cb8c88f2e0c8cd7e8d252018b7fe2db2ed809b8..0f33ae4adf0562db4dd2852c73c6eef2c4b103b8 100644 GIT binary patch delta 148 zcmeAO=?j@4!}w;SY$_w`+5iqlp~-<_zRXgS{Wr>`Ffy*)Y{M+T#n`!7PfCE1(R8u` xk2)VO7iV5#ZfaO!PHCzT!{&*6bGQj8aADoNP2mP3%Q9Xr{3f}uPL|Sq2LRD{D53xW delta 143 zcmeAR=?Ix1!}x5YY$_w`@&FD-p~>?keVL_t{Wr>`FfuORY{M+T#n`^tKuUm-(Ri|> tv^ozr7iV5#ZfaO!PHF1qJIXGso39H;un|(TOW_71%MxBLd`20u0RYB0DhvPs diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/apps.v1.ReplicaSet.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/apps.v1.ReplicaSet.after_roundtrip.pb index 3e245809a346331d8875b8d63745f6e0d6bdd7f0..8a303c2208b93bbeed81a27ffd9b8d59d56e7c9d 100644 GIT binary patch delta 148 zcmdlQygPV;4CBm=vZ;)$FZ?+eg(e4z`7%pQ_TMO%!pOLGvkkKV7h~sUJt+Z3M$^d( xJnDSBT%37{xv61^Ii;yW44WtN&EY1Xz=d`5Hia9EEX#Pg@SEhqI$26{HURXGD2@OC delta 143 zcmdlTyft`&4CCaDvZ;)$kNi0pg(lCF^ktUn_1`F$!pOLMvkkKV7i0To11SMUM&rqj t(&{|iT%37{xv61^Ii;za?Rb1r6rEaU2pa;c20rz1ERg(lCH^ktTs?7vYyg^_XXW?NHy`ceXnjHZ(n vdDQuMxj6F@b5p|-b4pW%7&c#5c46IoO*n#$u&V6}HyBx#@p9oeu8<1=t+y(S delta 143 zcmX>Xb0TJfEaTFRa;c20MdOH{TGBU?Zevx55oZmL3y#0syu+Dc1l1 diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/apps.v1beta1.Deployment.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/apps.v1beta1.Deployment.after_roundtrip.pb index b39600e3ea69f87a3f26eb9eedb511e726c16b2a..02269284983a01992217fa9d69459f12707ceba4 100644 GIT binary patch delta 151 zcmbOjGCgF1BGZT9&37167+E(4a4-r@UMT6yBsF>SZN^ka#osXA`GcPeWH7qfwG*yUU^KE4p*3GwsBiIP5+O2Sdk!2Y#7k=Z+*Z?W4F2Dc) delta 145 zcmbOpGBIR=BGaqj&37167+F^ba4-r@W>oTJlIq=jn=zGbb2(;$64UCK&37477+Ft8a4-r@Hk9;blA65v4r3}K*m|S5p0B2?NPYF$g+%=3%_xNTmUt^FAM+x delta 145 zcmcZ{b2esz64TO{&37477+H@-a4-r@-XP)2B-Ok54r3}K9UlA65vHe)Iy*ia+5p0B2?N+$K$g+%=3%_wjYycpXF023m delta 145 zcmbOn(i<{Ck?C3R<~xijjI7H8I2eT{Gb;HqN%d~N&6vu_xO}rCvj7)k`{vn70*s8t vlh-J#^Kf%<<|XE)h9%~drfzSZN^ka#osXA`GcPeWH7qfwG*yUU^KE4p*3GwsBiIP5+O2Sdk!2Y#7k=aJvjPA`pf8sI delta 145 zcmX>QyeoKuBGcsH&37167+D|rb1(``W>oTJlIq=jn=zGbb2(;$64UCK&37477+Ft8a4-r@Hk9;blA65v4r3}K*m|S5p0B2?NPYF$g+%=3%_xNTmUt^FAM+x delta 145 zcmcZ{b2esz64TO{&37477+H@-a4-r@-XP)2B-Ok54r3}KTaVcVg6w{`N%^Mg~7#Yt_Ze-MD?Ag4YF_n>HSs(|a0Fwmsq^F_n>HK_CaC0FwmsWJf7KRt-j@UVn(9 z<(sdt2yijBZ`M;0U}Q9&Y_F=$!_CE+mzbLxmY7qTx|vVbg>`ejXapNxH8SihOL(~m Kn6g7_79#*j=`Gm+ diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/batch.v1.Job.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/batch.v1.Job.after_roundtrip.pb index 5fc96f6c032d7658c2d7a561a13342fdff24960b..561e54c46b449179ed19cf58c696461a4d770583 100644 GIT binary patch delta 144 zcmcZ>dM9*(7~_GB;;D>`%O=+{MlenG-zbs7$hda14YL3jW9Mc)DFH@C)5!`v>U_Lh soOy}4sbPsZrKv&;n~~bg&T}4%Xqo)n*>xSrMZU@0Nh9@f&c&j delta 137 zcmcZ;dM$K<7~`&u;;D>`3ntexMlkjIZy($vj&lwDXiUl)#GBcx`R!VN~2CA?fXjaqz1nH>OE>M3jh diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/batch.v1beta1.CronJob.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/batch.v1beta1.CronJob.after_roundtrip.pb index f313b08e2f54c2dbb6ef53e9782713024d1b3be1..9f0643d069a1557d5198a182e1df55634ebd06ec 100644 GIT binary patch delta 157 zcmcZ@aXn&!JmaQ~3aN~YXD7EY>N53&Y*b8PWL!2`iaCO5vOk!!cJoaZ0WQYQ&H5?= zjEts}9aPo%c)2+95_40-5_3vZg%~#T%et^`E)tDkBcMu#on;v>7eSM@Yt3Q=06d5* AmjD0& delta 151 zcmcZ}aWP_oJmZ>;3aN~Y$0xTj>N2&3Y*b8PWLz*=iaCO**B{JTzWFAL02gEX=CjfQ zjEu&U@5!k1aC33yCFZ7vCFYc-ZZ;5@!;M$kg>`ed(hWwICA?htOaUs}t2K)e0C}%3 A)Bpeg diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/core.v1.Pod.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/core.v1.Pod.after_roundtrip.pb index e8478fc8b0661655ae96265c56ad825f1b1d2c3a..3aadd916dd89eacdd6078594e7fc0c8115670e6f 100644 GIT binary patch delta 255 zcmdlSy+2wo+oG6(i<66~%ut9qAU{QDM#klv%NYf@7~3~rR1jcfG@dM|tIosC z#hI6wn;MpwQ<}PYqofP#W+9;nHoR(N*jbkFa^W{+aQfn4Z$7W>h|Rjm UZo1}^Uuy~wP_ar|1+R)q02H-HkpKVy diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/core.v1.PodStatusResult.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/core.v1.PodStatusResult.after_roundtrip.pb new file mode 100644 index 0000000000000000000000000000000000000000..59180f35911261e27496a06d46e7f03b0b4de1d9 GIT binary patch literal 1947 zcmeHIzi-n(6t*Srjjr(S z#UxH-kIKZ4&7XDnQh+ii0ewLHgqr7fD5nvL>DJU`)yKOsB!e`>u1V@|-(h^HPBcpi z^OWUWh^Q1vgmE;IOmO9GEp|$!;}_rGEEw7*S}#xDqt%7}3Y2}~QeWPtBeRm4>V#`U zop3G?CnizbMsBTQ_ST_1WIQcwW%%tGnr4H9EDvN=Z|PBEn{nc^Lj7d1x8vVMLvt`0^*woi6sF9y7ohO)QOA&pJ7YqT`m72N?h-lS z_$HL&=^3*kl^&|Ng}HydJHgypm1ZTPL{7+bs;GoSuxa?*%FYKiE4xC*8(kIWKq$P4 z-Nq8HzrI2VI!DF4@F84;d0>=p+tO_94|5=bod5s; literal 0 HcmV?d00001 diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/core.v1.PodTemplate.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/core.v1.PodTemplate.after_roundtrip.pb index e2049b6d29a449a7859efe57fd044ebabb984f9a..e1b7af204a842af77c96e050095389d83d32ee5f 100644 GIT binary patch delta 140 zcmbOjG(Bj71k=yJ%?*qxjEs{v*E6OvGOpeHlu3Y#v2(Mvk^m#4>0}>ebv|A$&b-9j l)Ud>y(o`Xa&GpJItefkEBiIP5idVS7$g+%=3%_xbSOIraC^i59 delta 133 zcmbOpG%;v`1k>lh%?*qxjEudT>lsrS8JBN<$|S(W*uL3bNq~{jcyfTUIuAD&XI^4% jYFJ`UY3gQqX&2Vb4Z;y@c-6?Tvn=7|!f(ptlNx>iNb)8L diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/core.v1.ReplicationController.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/core.v1.ReplicationController.after_roundtrip.pb index dfb5ef6b416d4fcba0b3ca76a5348e75bfd1d6bf..2376a417ef301f5152240ed870e72f59db2b72a0 100644 GIT binary patch delta 146 zcmeAUo)|nqiRop~=CzC|jEp-bcQPt5PTstRF_n>V?Pein0WQYQ%^6ApjEts}E0xvx sc)2+95_40-5_3vZg%~!kQFdY7yjnPdjj*a7g&T}4%Xqo)8+V@-0MGO*;{X5v delta 139 zcmbOj+#NhYiRp3B=CzC|jEtKmcQPt5_HJIon99hwe6tX<02gEX<{TvfMn>bwwaV%| q++3V_iMgp^i8-aIn|-8RSU0Z~j$p&9Muweb2`?9ZQzn1Ym<<4ki7BuE diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/extensions.v1beta1.DaemonSet.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/extensions.v1beta1.DaemonSet.after_roundtrip.pb index 5fa61966d38168d068d055697929c06137aa43ad..9f37cc6f65902b2c3b01d3ace34107e34dbd58c8 100644 GIT binary patch delta 149 zcmeAO=?j^l#`Gw7^L@q?M&^|PT$2-ce3^tMZ@$Nv%E-8OvkS8T7h~tJo4?83VFu5bh!VO9GSZZNVeX%^SH=7#TNC?qdvMoV@uVV=5!#+Rg6F0$hxpo98MCFfy7>UZ<_E$NY=l)ERJg&&vW%Atzj0=40J-@tP5=M^ delta 139 zcmbOmGCgF1I@7D*%^SH=7#UYj?qdvM?A`p3F_n>V`DS-!0WQY&%?p(T7#WQx`$((v qaC33yCFZ7vCFYc-Zf=xzVcq;lID!qY8X0z$CA?htO_{8%`3V3KC@Rqa diff --git a/staging/src/k8s.io/api/testdata/v1.30.0/extensions.v1beta1.ReplicaSet.after_roundtrip.pb b/staging/src/k8s.io/api/testdata/v1.30.0/extensions.v1beta1.ReplicaSet.after_roundtrip.pb index e23f767d626c425e904b841694cc2c31001a6345..0522fa20b31c08eb6ecb4020320ae0d924696d1e 100644 GIT binary patch delta 146 zcmX>Qd@Oi^I@8SH%^SH=7#Uwo?qdvMoV@uVV=5!#+Rg6F0$hxpo98MCFfy7>UZ<_E$NY=l)ERJg&&vW%Atzj60j0o8;rCIA2c delta 139 zcmX>Wd?0v&I@9Ff%^SH=7#SZ;?qdvM?A`p3F_n>V`DS-!0WQY&%?p(T7#WQx`$((v qaC33yCFZ7vCFYc-Zf=xzVcq;lID!qY8X0z$CA?htO_{8%IU4{eyDF*x diff --git a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/resourceclaim.go b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/resourceclaim.go index a9d79ae3412..b00c6924857 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/resourceclaim.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/resourceclaim.go @@ -21,7 +21,8 @@ package v1 // ResourceClaimApplyConfiguration represents a declarative configuration of the ResourceClaim type for use // with apply. type ResourceClaimApplyConfiguration struct { - Name *string `json:"name,omitempty"` + Name *string `json:"name,omitempty"` + Request *string `json:"request,omitempty"` } // ResourceClaimApplyConfiguration constructs a declarative configuration of the ResourceClaim type for use with @@ -37,3 +38,11 @@ func (b *ResourceClaimApplyConfiguration) WithName(value string) *ResourceClaimA b.Name = &value return b } + +// WithRequest sets the Request field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Request field is set to the value of the last call. +func (b *ResourceClaimApplyConfiguration) WithRequest(value string) *ResourceClaimApplyConfiguration { + b.Request = &value + return b +} 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 36dd3698d6d..018530854c4 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go @@ -7432,6 +7432,9 @@ var schemaYAML = typed.YAMLObject(`types: type: scalar: string default: "" + - name: request + type: + scalar: string - name: io.k8s.api.core.v1.ResourceFieldSelector map: fields: @@ -12157,47 +12160,78 @@ var schemaYAML = typed.YAMLObject(`types: - name: io.k8s.api.resource.v1alpha3.AllocationResult map: fields: - - name: availableOnNodes - type: - namedType: io.k8s.api.core.v1.NodeSelector - - name: resourceHandles - type: - list: - elementType: - namedType: io.k8s.api.resource.v1alpha3.ResourceHandle - elementRelationship: atomic -- name: io.k8s.api.resource.v1alpha3.DriverAllocationResult - map: - fields: - - name: namedResources - type: - namedType: io.k8s.api.resource.v1alpha3.NamedResourcesAllocationResult - - name: vendorRequestParameters - type: - namedType: __untyped_atomic_ -- name: io.k8s.api.resource.v1alpha3.DriverRequests - map: - fields: - - name: driverName + - name: controller type: scalar: string - - name: requests + - name: devices type: - list: - elementType: - namedType: io.k8s.api.resource.v1alpha3.ResourceRequest - elementRelationship: atomic - - name: vendorParameters + namedType: io.k8s.api.resource.v1alpha3.DeviceAllocationResult + default: {} + - name: nodeSelector type: - namedType: __untyped_atomic_ -- name: io.k8s.api.resource.v1alpha3.NamedResourcesAllocationResult + namedType: io.k8s.api.core.v1.NodeSelector +- name: io.k8s.api.resource.v1alpha3.BasicDevice map: fields: + - name: attributes + type: + map: + elementType: + namedType: io.k8s.api.resource.v1alpha3.DeviceAttribute + - name: capacity + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.resource.v1alpha3.CELDeviceSelector + map: + fields: + - name: expression + type: + scalar: string + default: "" +- name: io.k8s.api.resource.v1alpha3.Device + map: + fields: + - name: basic + type: + namedType: io.k8s.api.resource.v1alpha3.BasicDevice - name: name type: scalar: string default: "" -- name: io.k8s.api.resource.v1alpha3.NamedResourcesAttribute +- name: io.k8s.api.resource.v1alpha3.DeviceAllocationConfiguration + map: + fields: + - name: opaque + type: + namedType: io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration + - name: requests + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: source + type: + scalar: string + default: "" +- name: io.k8s.api.resource.v1alpha3.DeviceAllocationResult + map: + fields: + - name: config + type: + list: + elementType: + namedType: io.k8s.api.resource.v1alpha3.DeviceAllocationConfiguration + elementRelationship: atomic + - name: results + type: + list: + elementType: + namedType: io.k8s.api.resource.v1alpha3.DeviceRequestAllocationResult + elementRelationship: atomic +- name: io.k8s.api.resource.v1alpha3.DeviceAttribute map: fields: - name: bool @@ -12206,79 +12240,160 @@ var schemaYAML = typed.YAMLObject(`types: - name: int type: scalar: numeric - - name: intSlice - type: - namedType: io.k8s.api.resource.v1alpha3.NamedResourcesIntSlice - - name: name - type: - scalar: string - default: "" - - name: quantity - type: - namedType: io.k8s.apimachinery.pkg.api.resource.Quantity - name: string type: scalar: string - - name: stringSlice - type: - namedType: io.k8s.api.resource.v1alpha3.NamedResourcesStringSlice - name: version type: scalar: string -- name: io.k8s.api.resource.v1alpha3.NamedResourcesFilter +- name: io.k8s.api.resource.v1alpha3.DeviceClaim map: fields: - - name: selector - type: - scalar: string - default: "" -- name: io.k8s.api.resource.v1alpha3.NamedResourcesInstance - map: - fields: - - name: attributes + - name: config type: list: elementType: - namedType: io.k8s.api.resource.v1alpha3.NamedResourcesAttribute + namedType: io.k8s.api.resource.v1alpha3.DeviceClaimConfiguration elementRelationship: atomic - - name: name - type: - scalar: string - default: "" -- name: io.k8s.api.resource.v1alpha3.NamedResourcesIntSlice - map: - fields: - - name: ints + - name: constraints type: list: elementType: - scalar: numeric + namedType: io.k8s.api.resource.v1alpha3.DeviceConstraint elementRelationship: atomic -- name: io.k8s.api.resource.v1alpha3.NamedResourcesRequest - map: - fields: - - name: selector - type: - scalar: string - default: "" -- name: io.k8s.api.resource.v1alpha3.NamedResourcesResources - map: - fields: - - name: instances + - name: requests type: list: elementType: - namedType: io.k8s.api.resource.v1alpha3.NamedResourcesInstance + namedType: io.k8s.api.resource.v1alpha3.DeviceRequest elementRelationship: atomic -- name: io.k8s.api.resource.v1alpha3.NamedResourcesStringSlice +- name: io.k8s.api.resource.v1alpha3.DeviceClaimConfiguration map: fields: - - name: strings + - name: opaque + type: + namedType: io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration + - name: requests type: list: elementType: scalar: string elementRelationship: atomic +- name: io.k8s.api.resource.v1alpha3.DeviceClass + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.resource.v1alpha3.DeviceClassSpec + default: {} +- name: io.k8s.api.resource.v1alpha3.DeviceClassConfiguration + map: + fields: + - name: opaque + type: + namedType: io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration +- name: io.k8s.api.resource.v1alpha3.DeviceClassSpec + map: + fields: + - name: config + type: + list: + elementType: + namedType: io.k8s.api.resource.v1alpha3.DeviceClassConfiguration + elementRelationship: atomic + - name: selectors + type: + list: + elementType: + namedType: io.k8s.api.resource.v1alpha3.DeviceSelector + elementRelationship: atomic + - name: suitableNodes + type: + namedType: io.k8s.api.core.v1.NodeSelector +- name: io.k8s.api.resource.v1alpha3.DeviceConstraint + map: + fields: + - name: matchAttribute + type: + scalar: string + - name: requests + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.resource.v1alpha3.DeviceRequest + map: + fields: + - name: adminAccess + type: + scalar: boolean + default: false + - name: allocationMode + type: + scalar: string + - name: count + type: + scalar: numeric + - name: deviceClassName + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" + - name: selectors + type: + list: + elementType: + namedType: io.k8s.api.resource.v1alpha3.DeviceSelector + elementRelationship: atomic +- name: io.k8s.api.resource.v1alpha3.DeviceRequestAllocationResult + map: + fields: + - name: device + type: + scalar: string + default: "" + - name: driver + type: + scalar: string + default: "" + - name: pool + type: + scalar: string + default: "" + - name: request + type: + scalar: string + default: "" +- name: io.k8s.api.resource.v1alpha3.DeviceSelector + map: + fields: + - name: cel + type: + namedType: io.k8s.api.resource.v1alpha3.CELDeviceSelector +- name: io.k8s.api.resource.v1alpha3.OpaqueDeviceConfiguration + map: + fields: + - name: driver + type: + scalar: string + default: "" + - name: parameters + type: + namedType: __untyped_atomic_ - name: io.k8s.api.resource.v1alpha3.PodSchedulingContext map: fields: @@ -12362,48 +12477,13 @@ var schemaYAML = typed.YAMLObject(`types: type: scalar: string default: "" -- name: io.k8s.api.resource.v1alpha3.ResourceClaimParameters - map: - fields: - - name: apiVersion - type: - scalar: string - - name: driverRequests - type: - list: - elementType: - namedType: io.k8s.api.resource.v1alpha3.DriverRequests - elementRelationship: atomic - - name: generatedFrom - type: - namedType: io.k8s.api.resource.v1alpha3.ResourceClaimParametersReference - - name: kind - type: - scalar: string - - name: metadata - type: - namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta - default: {} -- name: io.k8s.api.resource.v1alpha3.ResourceClaimParametersReference - map: - fields: - - name: apiGroup - type: - scalar: string - - name: kind - type: - scalar: string - default: "" - - name: name - type: - scalar: string - default: "" - name: io.k8s.api.resource.v1alpha3.ResourceClaimSchedulingStatus map: fields: - name: name type: scalar: string + default: "" - name: unsuitableNodes type: list: @@ -12413,13 +12493,13 @@ var schemaYAML = typed.YAMLObject(`types: - name: io.k8s.api.resource.v1alpha3.ResourceClaimSpec map: fields: - - name: parametersRef - type: - namedType: io.k8s.api.resource.v1alpha3.ResourceClaimParametersReference - - name: resourceClassName + - name: controller type: scalar: string - default: "" + - name: devices + type: + namedType: io.k8s.api.resource.v1alpha3.DeviceClaim + default: {} - name: io.k8s.api.resource.v1alpha3.ResourceClaimStatus map: fields: @@ -12429,9 +12509,6 @@ var schemaYAML = typed.YAMLObject(`types: - name: deallocationRequested type: scalar: boolean - - name: driverName - type: - scalar: string - name: reservedFor type: list: @@ -12468,118 +12545,27 @@ var schemaYAML = typed.YAMLObject(`types: type: namedType: io.k8s.api.resource.v1alpha3.ResourceClaimSpec default: {} -- name: io.k8s.api.resource.v1alpha3.ResourceClass +- name: io.k8s.api.resource.v1alpha3.ResourcePool map: fields: - - name: apiVersion + - name: generation type: - scalar: string - - name: driverName - type: - scalar: string - default: "" - - name: kind - type: - scalar: string - - name: metadata - type: - namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta - default: {} - - name: parametersRef - type: - namedType: io.k8s.api.resource.v1alpha3.ResourceClassParametersReference - - name: structuredParameters - type: - scalar: boolean - - name: suitableNodes - type: - namedType: io.k8s.api.core.v1.NodeSelector -- name: io.k8s.api.resource.v1alpha3.ResourceClassParameters - map: - fields: - - name: apiVersion - type: - scalar: string - - name: filters - type: - list: - elementType: - namedType: io.k8s.api.resource.v1alpha3.ResourceFilter - elementRelationship: atomic - - name: generatedFrom - type: - namedType: io.k8s.api.resource.v1alpha3.ResourceClassParametersReference - - name: kind - type: - scalar: string - - name: metadata - type: - namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta - default: {} - - name: vendorParameters - type: - list: - elementType: - namedType: io.k8s.api.resource.v1alpha3.VendorParameters - elementRelationship: atomic -- name: io.k8s.api.resource.v1alpha3.ResourceClassParametersReference - map: - fields: - - name: apiGroup - type: - scalar: string - - name: kind - type: - scalar: string - default: "" + scalar: numeric + default: 0 - name: name type: scalar: string default: "" - - name: namespace + - name: resourceSliceCount type: - scalar: string -- name: io.k8s.api.resource.v1alpha3.ResourceFilter - map: - fields: - - name: driverName - type: - scalar: string - - name: namedResources - type: - namedType: io.k8s.api.resource.v1alpha3.NamedResourcesFilter -- name: io.k8s.api.resource.v1alpha3.ResourceHandle - map: - fields: - - name: data - type: - scalar: string - - name: driverName - type: - scalar: string - default: "" - - name: structuredData - type: - namedType: io.k8s.api.resource.v1alpha3.StructuredResourceHandle -- name: io.k8s.api.resource.v1alpha3.ResourceRequest - map: - fields: - - name: namedResources - type: - namedType: io.k8s.api.resource.v1alpha3.NamedResourcesRequest - - name: vendorParameters - type: - namedType: __untyped_atomic_ + scalar: numeric + default: 0 - name: io.k8s.api.resource.v1alpha3.ResourceSlice map: fields: - name: apiVersion type: scalar: string - - name: driverName - type: - scalar: string - default: "" - name: kind type: scalar: string @@ -12587,39 +12573,36 @@ var schemaYAML = typed.YAMLObject(`types: type: namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta default: {} - - name: namedResources + - name: spec type: - namedType: io.k8s.api.resource.v1alpha3.NamedResourcesResources - - name: nodeName - type: - scalar: string -- name: io.k8s.api.resource.v1alpha3.StructuredResourceHandle + namedType: io.k8s.api.resource.v1alpha3.ResourceSliceSpec + default: {} +- name: io.k8s.api.resource.v1alpha3.ResourceSliceSpec map: fields: - - name: nodeName + - name: allNodes type: - scalar: string - - name: results + scalar: boolean + - name: devices type: list: elementType: - namedType: io.k8s.api.resource.v1alpha3.DriverAllocationResult + namedType: io.k8s.api.resource.v1alpha3.Device elementRelationship: atomic - - name: vendorClaimParameters - type: - namedType: __untyped_atomic_ - - name: vendorClassParameters - type: - namedType: __untyped_atomic_ -- name: io.k8s.api.resource.v1alpha3.VendorParameters - map: - fields: - - name: driverName + - name: driver type: scalar: string - - name: parameters + default: "" + - name: nodeName type: - namedType: __untyped_atomic_ + scalar: string + - name: nodeSelector + type: + namedType: io.k8s.api.core.v1.NodeSelector + - name: pool + type: + namedType: io.k8s.api.resource.v1alpha3.ResourcePool + default: {} - name: io.k8s.api.scheduling.v1.PriorityClass map: fields: diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/allocationresult.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/allocationresult.go index e6d1df8635e..3090b2f9d35 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/allocationresult.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/allocationresult.go @@ -25,8 +25,9 @@ import ( // AllocationResultApplyConfiguration represents a declarative configuration of the AllocationResult type for use // with apply. type AllocationResultApplyConfiguration struct { - ResourceHandles []ResourceHandleApplyConfiguration `json:"resourceHandles,omitempty"` - AvailableOnNodes *v1.NodeSelectorApplyConfiguration `json:"availableOnNodes,omitempty"` + Devices *DeviceAllocationResultApplyConfiguration `json:"devices,omitempty"` + NodeSelector *v1.NodeSelectorApplyConfiguration `json:"nodeSelector,omitempty"` + Controller *string `json:"controller,omitempty"` } // AllocationResultApplyConfiguration constructs a declarative configuration of the AllocationResult type for use with @@ -35,23 +36,26 @@ func AllocationResult() *AllocationResultApplyConfiguration { return &AllocationResultApplyConfiguration{} } -// WithResourceHandles adds the given value to the ResourceHandles field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the ResourceHandles field. -func (b *AllocationResultApplyConfiguration) WithResourceHandles(values ...*ResourceHandleApplyConfiguration) *AllocationResultApplyConfiguration { - for i := range values { - if values[i] == nil { - panic("nil value passed to WithResourceHandles") - } - b.ResourceHandles = append(b.ResourceHandles, *values[i]) - } +// WithDevices sets the Devices field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Devices field is set to the value of the last call. +func (b *AllocationResultApplyConfiguration) WithDevices(value *DeviceAllocationResultApplyConfiguration) *AllocationResultApplyConfiguration { + b.Devices = value return b } -// WithAvailableOnNodes sets the AvailableOnNodes field in the declarative configuration to the given value +// WithNodeSelector sets the NodeSelector field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the AvailableOnNodes field is set to the value of the last call. -func (b *AllocationResultApplyConfiguration) WithAvailableOnNodes(value *v1.NodeSelectorApplyConfiguration) *AllocationResultApplyConfiguration { - b.AvailableOnNodes = value +// If called multiple times, the NodeSelector field is set to the value of the last call. +func (b *AllocationResultApplyConfiguration) WithNodeSelector(value *v1.NodeSelectorApplyConfiguration) *AllocationResultApplyConfiguration { + b.NodeSelector = value + return b +} + +// WithController sets the Controller field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Controller field is set to the value of the last call. +func (b *AllocationResultApplyConfiguration) WithController(value string) *AllocationResultApplyConfiguration { + b.Controller = &value return b } diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/allocationresultmodel.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/allocationresultmodel.go deleted file mode 100644 index 197f882883f..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/allocationresultmodel.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// AllocationResultModelApplyConfiguration represents a declarative configuration of the AllocationResultModel type for use -// with apply. -type AllocationResultModelApplyConfiguration struct { - NamedResources *NamedResourcesAllocationResultApplyConfiguration `json:"namedResources,omitempty"` -} - -// AllocationResultModelApplyConfiguration constructs a declarative configuration of the AllocationResultModel type for use with -// apply. -func AllocationResultModel() *AllocationResultModelApplyConfiguration { - return &AllocationResultModelApplyConfiguration{} -} - -// WithNamedResources sets the NamedResources field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the NamedResources field is set to the value of the last call. -func (b *AllocationResultModelApplyConfiguration) WithNamedResources(value *NamedResourcesAllocationResultApplyConfiguration) *AllocationResultModelApplyConfiguration { - b.NamedResources = value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/basicdevice.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/basicdevice.go new file mode 100644 index 00000000000..e6b77450828 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/basicdevice.go @@ -0,0 +1,65 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +import ( + v1alpha3 "k8s.io/api/resource/v1alpha3" + resource "k8s.io/apimachinery/pkg/api/resource" +) + +// BasicDeviceApplyConfiguration represents a declarative configuration of the BasicDevice type for use +// with apply. +type BasicDeviceApplyConfiguration struct { + Attributes map[v1alpha3.QualifiedName]DeviceAttributeApplyConfiguration `json:"attributes,omitempty"` + Capacity map[v1alpha3.QualifiedName]resource.Quantity `json:"capacity,omitempty"` +} + +// BasicDeviceApplyConfiguration constructs a declarative configuration of the BasicDevice type for use with +// apply. +func BasicDevice() *BasicDeviceApplyConfiguration { + return &BasicDeviceApplyConfiguration{} +} + +// WithAttributes puts the entries into the Attributes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Attributes field, +// overwriting an existing map entries in Attributes field with the same key. +func (b *BasicDeviceApplyConfiguration) WithAttributes(entries map[v1alpha3.QualifiedName]DeviceAttributeApplyConfiguration) *BasicDeviceApplyConfiguration { + if b.Attributes == nil && len(entries) > 0 { + b.Attributes = make(map[v1alpha3.QualifiedName]DeviceAttributeApplyConfiguration, len(entries)) + } + for k, v := range entries { + b.Attributes[k] = v + } + return b +} + +// WithCapacity puts the entries into the Capacity field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Capacity field, +// overwriting an existing map entries in Capacity field with the same key. +func (b *BasicDeviceApplyConfiguration) WithCapacity(entries map[v1alpha3.QualifiedName]resource.Quantity) *BasicDeviceApplyConfiguration { + if b.Capacity == nil && len(entries) > 0 { + b.Capacity = make(map[v1alpha3.QualifiedName]resource.Quantity, len(entries)) + } + for k, v := range entries { + b.Capacity[k] = v + } + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesfilter.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/celdeviceselector.go similarity index 50% rename from staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesfilter.go rename to staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/celdeviceselector.go index 3a47beada47..c59b6a2e370 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesfilter.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/celdeviceselector.go @@ -18,22 +18,22 @@ limitations under the License. package v1alpha3 -// NamedResourcesFilterApplyConfiguration represents a declarative configuration of the NamedResourcesFilter type for use +// CELDeviceSelectorApplyConfiguration represents a declarative configuration of the CELDeviceSelector type for use // with apply. -type NamedResourcesFilterApplyConfiguration struct { - Selector *string `json:"selector,omitempty"` +type CELDeviceSelectorApplyConfiguration struct { + Expression *string `json:"expression,omitempty"` } -// NamedResourcesFilterApplyConfiguration constructs a declarative configuration of the NamedResourcesFilter type for use with +// CELDeviceSelectorApplyConfiguration constructs a declarative configuration of the CELDeviceSelector type for use with // apply. -func NamedResourcesFilter() *NamedResourcesFilterApplyConfiguration { - return &NamedResourcesFilterApplyConfiguration{} +func CELDeviceSelector() *CELDeviceSelectorApplyConfiguration { + return &CELDeviceSelectorApplyConfiguration{} } -// WithSelector sets the Selector field in the declarative configuration to the given value +// WithExpression sets the Expression field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Selector field is set to the value of the last call. -func (b *NamedResourcesFilterApplyConfiguration) WithSelector(value string) *NamedResourcesFilterApplyConfiguration { - b.Selector = &value +// If called multiple times, the Expression field is set to the value of the last call. +func (b *CELDeviceSelectorApplyConfiguration) WithExpression(value string) *CELDeviceSelectorApplyConfiguration { + b.Expression = &value return b } diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesallocationresult.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/device.go similarity index 51% rename from staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesallocationresult.go rename to staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/device.go index 89509eecb06..efdb5f37a9e 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesallocationresult.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/device.go @@ -18,22 +18,31 @@ limitations under the License. package v1alpha3 -// NamedResourcesAllocationResultApplyConfiguration represents a declarative configuration of the NamedResourcesAllocationResult type for use +// DeviceApplyConfiguration represents a declarative configuration of the Device type for use // with apply. -type NamedResourcesAllocationResultApplyConfiguration struct { - Name *string `json:"name,omitempty"` +type DeviceApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Basic *BasicDeviceApplyConfiguration `json:"basic,omitempty"` } -// NamedResourcesAllocationResultApplyConfiguration constructs a declarative configuration of the NamedResourcesAllocationResult type for use with +// DeviceApplyConfiguration constructs a declarative configuration of the Device type for use with // apply. -func NamedResourcesAllocationResult() *NamedResourcesAllocationResultApplyConfiguration { - return &NamedResourcesAllocationResultApplyConfiguration{} +func Device() *DeviceApplyConfiguration { + return &DeviceApplyConfiguration{} } // WithName sets the Name field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Name field is set to the value of the last call. -func (b *NamedResourcesAllocationResultApplyConfiguration) WithName(value string) *NamedResourcesAllocationResultApplyConfiguration { +func (b *DeviceApplyConfiguration) WithName(value string) *DeviceApplyConfiguration { b.Name = &value return b } + +// WithBasic sets the Basic field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Basic field is set to the value of the last call. +func (b *DeviceApplyConfiguration) WithBasic(value *BasicDeviceApplyConfiguration) *DeviceApplyConfiguration { + b.Basic = value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceallocationconfiguration.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceallocationconfiguration.go new file mode 100644 index 00000000000..342e724ef02 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceallocationconfiguration.go @@ -0,0 +1,63 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +import ( + v1alpha3 "k8s.io/api/resource/v1alpha3" +) + +// DeviceAllocationConfigurationApplyConfiguration represents a declarative configuration of the DeviceAllocationConfiguration type for use +// with apply. +type DeviceAllocationConfigurationApplyConfiguration struct { + Source *v1alpha3.AllocationConfigSource `json:"source,omitempty"` + Requests []string `json:"requests,omitempty"` + DeviceConfigurationApplyConfiguration `json:",inline"` +} + +// DeviceAllocationConfigurationApplyConfiguration constructs a declarative configuration of the DeviceAllocationConfiguration type for use with +// apply. +func DeviceAllocationConfiguration() *DeviceAllocationConfigurationApplyConfiguration { + return &DeviceAllocationConfigurationApplyConfiguration{} +} + +// WithSource sets the Source field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Source field is set to the value of the last call. +func (b *DeviceAllocationConfigurationApplyConfiguration) WithSource(value v1alpha3.AllocationConfigSource) *DeviceAllocationConfigurationApplyConfiguration { + b.Source = &value + return b +} + +// WithRequests adds the given value to the Requests field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Requests field. +func (b *DeviceAllocationConfigurationApplyConfiguration) WithRequests(values ...string) *DeviceAllocationConfigurationApplyConfiguration { + for i := range values { + b.Requests = append(b.Requests, values[i]) + } + return b +} + +// WithOpaque sets the Opaque field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Opaque field is set to the value of the last call. +func (b *DeviceAllocationConfigurationApplyConfiguration) WithOpaque(value *OpaqueDeviceConfigurationApplyConfiguration) *DeviceAllocationConfigurationApplyConfiguration { + b.Opaque = value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceallocationresult.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceallocationresult.go new file mode 100644 index 00000000000..0cfb264b4ea --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceallocationresult.go @@ -0,0 +1,58 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +// DeviceAllocationResultApplyConfiguration represents a declarative configuration of the DeviceAllocationResult type for use +// with apply. +type DeviceAllocationResultApplyConfiguration struct { + Results []DeviceRequestAllocationResultApplyConfiguration `json:"results,omitempty"` + Config []DeviceAllocationConfigurationApplyConfiguration `json:"config,omitempty"` +} + +// DeviceAllocationResultApplyConfiguration constructs a declarative configuration of the DeviceAllocationResult type for use with +// apply. +func DeviceAllocationResult() *DeviceAllocationResultApplyConfiguration { + return &DeviceAllocationResultApplyConfiguration{} +} + +// WithResults adds the given value to the Results field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Results field. +func (b *DeviceAllocationResultApplyConfiguration) WithResults(values ...*DeviceRequestAllocationResultApplyConfiguration) *DeviceAllocationResultApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithResults") + } + b.Results = append(b.Results, *values[i]) + } + return b +} + +// WithConfig adds the given value to the Config field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Config field. +func (b *DeviceAllocationResultApplyConfiguration) WithConfig(values ...*DeviceAllocationConfigurationApplyConfiguration) *DeviceAllocationResultApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConfig") + } + b.Config = append(b.Config, *values[i]) + } + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceattribute.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceattribute.go new file mode 100644 index 00000000000..6b0b7a40ac7 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceattribute.go @@ -0,0 +1,66 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +// DeviceAttributeApplyConfiguration represents a declarative configuration of the DeviceAttribute type for use +// with apply. +type DeviceAttributeApplyConfiguration struct { + IntValue *int64 `json:"int,omitempty"` + BoolValue *bool `json:"bool,omitempty"` + StringValue *string `json:"string,omitempty"` + VersionValue *string `json:"version,omitempty"` +} + +// DeviceAttributeApplyConfiguration constructs a declarative configuration of the DeviceAttribute type for use with +// apply. +func DeviceAttribute() *DeviceAttributeApplyConfiguration { + return &DeviceAttributeApplyConfiguration{} +} + +// WithIntValue sets the IntValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IntValue field is set to the value of the last call. +func (b *DeviceAttributeApplyConfiguration) WithIntValue(value int64) *DeviceAttributeApplyConfiguration { + b.IntValue = &value + return b +} + +// WithBoolValue sets the BoolValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the BoolValue field is set to the value of the last call. +func (b *DeviceAttributeApplyConfiguration) WithBoolValue(value bool) *DeviceAttributeApplyConfiguration { + b.BoolValue = &value + return b +} + +// WithStringValue sets the StringValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StringValue field is set to the value of the last call. +func (b *DeviceAttributeApplyConfiguration) WithStringValue(value string) *DeviceAttributeApplyConfiguration { + b.StringValue = &value + return b +} + +// WithVersionValue sets the VersionValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VersionValue field is set to the value of the last call. +func (b *DeviceAttributeApplyConfiguration) WithVersionValue(value string) *DeviceAttributeApplyConfiguration { + b.VersionValue = &value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclaim.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclaim.go new file mode 100644 index 00000000000..ce3ab56d8b7 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclaim.go @@ -0,0 +1,72 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +// DeviceClaimApplyConfiguration represents a declarative configuration of the DeviceClaim type for use +// with apply. +type DeviceClaimApplyConfiguration struct { + Requests []DeviceRequestApplyConfiguration `json:"requests,omitempty"` + Constraints []DeviceConstraintApplyConfiguration `json:"constraints,omitempty"` + Config []DeviceClaimConfigurationApplyConfiguration `json:"config,omitempty"` +} + +// DeviceClaimApplyConfiguration constructs a declarative configuration of the DeviceClaim type for use with +// apply. +func DeviceClaim() *DeviceClaimApplyConfiguration { + return &DeviceClaimApplyConfiguration{} +} + +// WithRequests adds the given value to the Requests field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Requests field. +func (b *DeviceClaimApplyConfiguration) WithRequests(values ...*DeviceRequestApplyConfiguration) *DeviceClaimApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRequests") + } + b.Requests = append(b.Requests, *values[i]) + } + return b +} + +// WithConstraints adds the given value to the Constraints field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Constraints field. +func (b *DeviceClaimApplyConfiguration) WithConstraints(values ...*DeviceConstraintApplyConfiguration) *DeviceClaimApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConstraints") + } + b.Constraints = append(b.Constraints, *values[i]) + } + return b +} + +// WithConfig adds the given value to the Config field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Config field. +func (b *DeviceClaimApplyConfiguration) WithConfig(values ...*DeviceClaimConfigurationApplyConfiguration) *DeviceClaimApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConfig") + } + b.Config = append(b.Config, *values[i]) + } + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclaimconfiguration.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclaimconfiguration.go new file mode 100644 index 00000000000..4cabe985997 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclaimconfiguration.go @@ -0,0 +1,50 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +// DeviceClaimConfigurationApplyConfiguration represents a declarative configuration of the DeviceClaimConfiguration type for use +// with apply. +type DeviceClaimConfigurationApplyConfiguration struct { + Requests []string `json:"requests,omitempty"` + DeviceConfigurationApplyConfiguration `json:",inline"` +} + +// DeviceClaimConfigurationApplyConfiguration constructs a declarative configuration of the DeviceClaimConfiguration type for use with +// apply. +func DeviceClaimConfiguration() *DeviceClaimConfigurationApplyConfiguration { + return &DeviceClaimConfigurationApplyConfiguration{} +} + +// WithRequests adds the given value to the Requests field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Requests field. +func (b *DeviceClaimConfigurationApplyConfiguration) WithRequests(values ...string) *DeviceClaimConfigurationApplyConfiguration { + for i := range values { + b.Requests = append(b.Requests, values[i]) + } + return b +} + +// WithOpaque sets the Opaque field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Opaque field is set to the value of the last call. +func (b *DeviceClaimConfigurationApplyConfiguration) WithOpaque(value *OpaqueDeviceConfigurationApplyConfiguration) *DeviceClaimConfigurationApplyConfiguration { + b.Opaque = value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimparameters.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclass.go similarity index 59% rename from staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimparameters.go rename to staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclass.go index fe00f1dad4f..abaadbb366f 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimparameters.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclass.go @@ -27,58 +27,55 @@ import ( v1 "k8s.io/client-go/applyconfigurations/meta/v1" ) -// ResourceClaimParametersApplyConfiguration represents a declarative configuration of the ResourceClaimParameters type for use +// DeviceClassApplyConfiguration represents a declarative configuration of the DeviceClass type for use // with apply. -type ResourceClaimParametersApplyConfiguration struct { +type DeviceClassApplyConfiguration struct { v1.TypeMetaApplyConfiguration `json:",inline"` *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` - GeneratedFrom *ResourceClaimParametersReferenceApplyConfiguration `json:"generatedFrom,omitempty"` - DriverRequests []DriverRequestsApplyConfiguration `json:"driverRequests,omitempty"` + Spec *DeviceClassSpecApplyConfiguration `json:"spec,omitempty"` } -// ResourceClaimParameters constructs a declarative configuration of the ResourceClaimParameters type for use with +// DeviceClass constructs a declarative configuration of the DeviceClass type for use with // apply. -func ResourceClaimParameters(name, namespace string) *ResourceClaimParametersApplyConfiguration { - b := &ResourceClaimParametersApplyConfiguration{} +func DeviceClass(name string) *DeviceClassApplyConfiguration { + b := &DeviceClassApplyConfiguration{} b.WithName(name) - b.WithNamespace(namespace) - b.WithKind("ResourceClaimParameters") + b.WithKind("DeviceClass") b.WithAPIVersion("resource.k8s.io/v1alpha3") return b } -// ExtractResourceClaimParameters extracts the applied configuration owned by fieldManager from -// resourceClaimParameters. If no managedFields are found in resourceClaimParameters for fieldManager, a -// ResourceClaimParametersApplyConfiguration is returned with only the Name, Namespace (if applicable), +// ExtractDeviceClass extracts the applied configuration owned by fieldManager from +// deviceClass. If no managedFields are found in deviceClass for fieldManager, a +// DeviceClassApplyConfiguration is returned with only the Name, Namespace (if applicable), // APIVersion and Kind populated. It is possible that no managed fields were found for because other // field managers have taken ownership of all the fields previously owned by fieldManager, or because // the fieldManager never owned fields any fields. -// resourceClaimParameters must be a unmodified ResourceClaimParameters API object that was retrieved from the Kubernetes API. -// ExtractResourceClaimParameters provides a way to perform a extract/modify-in-place/apply workflow. +// deviceClass must be a unmodified DeviceClass API object that was retrieved from the Kubernetes API. +// ExtractDeviceClass provides a way to perform a extract/modify-in-place/apply workflow. // Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously // applied if another fieldManager has updated or force applied any of the previously applied fields. // Experimental! -func ExtractResourceClaimParameters(resourceClaimParameters *resourcev1alpha3.ResourceClaimParameters, fieldManager string) (*ResourceClaimParametersApplyConfiguration, error) { - return extractResourceClaimParameters(resourceClaimParameters, fieldManager, "") +func ExtractDeviceClass(deviceClass *resourcev1alpha3.DeviceClass, fieldManager string) (*DeviceClassApplyConfiguration, error) { + return extractDeviceClass(deviceClass, fieldManager, "") } -// ExtractResourceClaimParametersStatus is the same as ExtractResourceClaimParameters except +// ExtractDeviceClassStatus is the same as ExtractDeviceClass except // that it extracts the status subresource applied configuration. // Experimental! -func ExtractResourceClaimParametersStatus(resourceClaimParameters *resourcev1alpha3.ResourceClaimParameters, fieldManager string) (*ResourceClaimParametersApplyConfiguration, error) { - return extractResourceClaimParameters(resourceClaimParameters, fieldManager, "status") +func ExtractDeviceClassStatus(deviceClass *resourcev1alpha3.DeviceClass, fieldManager string) (*DeviceClassApplyConfiguration, error) { + return extractDeviceClass(deviceClass, fieldManager, "status") } -func extractResourceClaimParameters(resourceClaimParameters *resourcev1alpha3.ResourceClaimParameters, fieldManager string, subresource string) (*ResourceClaimParametersApplyConfiguration, error) { - b := &ResourceClaimParametersApplyConfiguration{} - err := managedfields.ExtractInto(resourceClaimParameters, internal.Parser().Type("io.k8s.api.resource.v1alpha3.ResourceClaimParameters"), fieldManager, b, subresource) +func extractDeviceClass(deviceClass *resourcev1alpha3.DeviceClass, fieldManager string, subresource string) (*DeviceClassApplyConfiguration, error) { + b := &DeviceClassApplyConfiguration{} + err := managedfields.ExtractInto(deviceClass, internal.Parser().Type("io.k8s.api.resource.v1alpha3.DeviceClass"), fieldManager, b, subresource) if err != nil { return nil, err } - b.WithName(resourceClaimParameters.Name) - b.WithNamespace(resourceClaimParameters.Namespace) + b.WithName(deviceClass.Name) - b.WithKind("ResourceClaimParameters") + b.WithKind("DeviceClass") b.WithAPIVersion("resource.k8s.io/v1alpha3") return b, nil } @@ -86,7 +83,7 @@ func extractResourceClaimParameters(resourceClaimParameters *resourcev1alpha3.Re // WithKind sets the Kind field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Kind field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithKind(value string) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithKind(value string) *DeviceClassApplyConfiguration { b.Kind = &value return b } @@ -94,7 +91,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithKind(value string) *Reso // WithAPIVersion sets the APIVersion field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the APIVersion field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithAPIVersion(value string) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithAPIVersion(value string) *DeviceClassApplyConfiguration { b.APIVersion = &value return b } @@ -102,7 +99,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithAPIVersion(value string) // WithName sets the Name field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Name field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithName(value string) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithName(value string) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() b.Name = &value return b @@ -111,7 +108,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithName(value string) *Reso // WithGenerateName sets the GenerateName field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the GenerateName field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithGenerateName(value string) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithGenerateName(value string) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() b.GenerateName = &value return b @@ -120,7 +117,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithGenerateName(value strin // WithNamespace sets the Namespace field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Namespace field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithNamespace(value string) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithNamespace(value string) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() b.Namespace = &value return b @@ -129,7 +126,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithNamespace(value string) // WithUID sets the UID field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the UID field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithUID(value types.UID) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithUID(value types.UID) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() b.UID = &value return b @@ -138,7 +135,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithUID(value types.UID) *Re // WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the ResourceVersion field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithResourceVersion(value string) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithResourceVersion(value string) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() b.ResourceVersion = &value return b @@ -147,7 +144,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithResourceVersion(value st // WithGeneration sets the Generation field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Generation field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithGeneration(value int64) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithGeneration(value int64) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() b.Generation = &value return b @@ -156,7 +153,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithGeneration(value int64) // WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the CreationTimestamp field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() b.CreationTimestamp = &value return b @@ -165,7 +162,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithCreationTimestamp(value // WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the DeletionTimestamp field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() b.DeletionTimestamp = &value return b @@ -174,7 +171,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithDeletionTimestamp(value // WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() b.DeletionGracePeriodSeconds = &value return b @@ -184,7 +181,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithDeletionGracePeriodSecon // and returns the receiver, so that objects can be build by chaining "With" function invocations. // If called multiple times, the entries provided by each call will be put on the Labels field, // overwriting an existing map entries in Labels field with the same key. -func (b *ResourceClaimParametersApplyConfiguration) WithLabels(entries map[string]string) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithLabels(entries map[string]string) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() if b.Labels == nil && len(entries) > 0 { b.Labels = make(map[string]string, len(entries)) @@ -199,7 +196,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithLabels(entries map[strin // and returns the receiver, so that objects can be build by chaining "With" function invocations. // If called multiple times, the entries provided by each call will be put on the Annotations field, // overwriting an existing map entries in Annotations field with the same key. -func (b *ResourceClaimParametersApplyConfiguration) WithAnnotations(entries map[string]string) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithAnnotations(entries map[string]string) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() if b.Annotations == nil && len(entries) > 0 { b.Annotations = make(map[string]string, len(entries)) @@ -213,7 +210,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithAnnotations(entries map[ // WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration // and returns the receiver, so that objects can be build by chaining "With" function invocations. // If called multiple times, values provided by each call will be appended to the OwnerReferences field. -func (b *ResourceClaimParametersApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() for i := range values { if values[i] == nil { @@ -227,7 +224,7 @@ func (b *ResourceClaimParametersApplyConfiguration) WithOwnerReferences(values . // WithFinalizers adds the given value to the Finalizers field in the declarative configuration // and returns the receiver, so that objects can be build by chaining "With" function invocations. // If called multiple times, values provided by each call will be appended to the Finalizers field. -func (b *ResourceClaimParametersApplyConfiguration) WithFinalizers(values ...string) *ResourceClaimParametersApplyConfiguration { +func (b *DeviceClassApplyConfiguration) WithFinalizers(values ...string) *DeviceClassApplyConfiguration { b.ensureObjectMetaApplyConfigurationExists() for i := range values { b.Finalizers = append(b.Finalizers, values[i]) @@ -235,35 +232,22 @@ func (b *ResourceClaimParametersApplyConfiguration) WithFinalizers(values ...str return b } -func (b *ResourceClaimParametersApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { +func (b *DeviceClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { if b.ObjectMetaApplyConfiguration == nil { b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} } } -// WithGeneratedFrom sets the GeneratedFrom field in the declarative configuration to the given value +// WithSpec sets the Spec field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the GeneratedFrom field is set to the value of the last call. -func (b *ResourceClaimParametersApplyConfiguration) WithGeneratedFrom(value *ResourceClaimParametersReferenceApplyConfiguration) *ResourceClaimParametersApplyConfiguration { - b.GeneratedFrom = value - return b -} - -// WithDriverRequests adds the given value to the DriverRequests field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the DriverRequests field. -func (b *ResourceClaimParametersApplyConfiguration) WithDriverRequests(values ...*DriverRequestsApplyConfiguration) *ResourceClaimParametersApplyConfiguration { - for i := range values { - if values[i] == nil { - panic("nil value passed to WithDriverRequests") - } - b.DriverRequests = append(b.DriverRequests, *values[i]) - } +// If called multiple times, the Spec field is set to the value of the last call. +func (b *DeviceClassApplyConfiguration) WithSpec(value *DeviceClassSpecApplyConfiguration) *DeviceClassApplyConfiguration { + b.Spec = value return b } // GetName retrieves the value of the Name field in the declarative configuration. -func (b *ResourceClaimParametersApplyConfiguration) GetName() *string { +func (b *DeviceClassApplyConfiguration) GetName() *string { b.ensureObjectMetaApplyConfigurationExists() return b.Name } diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclassconfiguration.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclassconfiguration.go new file mode 100644 index 00000000000..cb3758a3e3e --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclassconfiguration.go @@ -0,0 +1,39 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +// DeviceClassConfigurationApplyConfiguration represents a declarative configuration of the DeviceClassConfiguration type for use +// with apply. +type DeviceClassConfigurationApplyConfiguration struct { + DeviceConfigurationApplyConfiguration `json:",inline"` +} + +// DeviceClassConfigurationApplyConfiguration constructs a declarative configuration of the DeviceClassConfiguration type for use with +// apply. +func DeviceClassConfiguration() *DeviceClassConfigurationApplyConfiguration { + return &DeviceClassConfigurationApplyConfiguration{} +} + +// WithOpaque sets the Opaque field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Opaque field is set to the value of the last call. +func (b *DeviceClassConfigurationApplyConfiguration) WithOpaque(value *OpaqueDeviceConfigurationApplyConfiguration) *DeviceClassConfigurationApplyConfiguration { + b.Opaque = value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclassspec.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclassspec.go new file mode 100644 index 00000000000..d40a43de66f --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceclassspec.go @@ -0,0 +1,71 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// DeviceClassSpecApplyConfiguration represents a declarative configuration of the DeviceClassSpec type for use +// with apply. +type DeviceClassSpecApplyConfiguration struct { + Selectors []DeviceSelectorApplyConfiguration `json:"selectors,omitempty"` + Config []DeviceClassConfigurationApplyConfiguration `json:"config,omitempty"` + SuitableNodes *v1.NodeSelectorApplyConfiguration `json:"suitableNodes,omitempty"` +} + +// DeviceClassSpecApplyConfiguration constructs a declarative configuration of the DeviceClassSpec type for use with +// apply. +func DeviceClassSpec() *DeviceClassSpecApplyConfiguration { + return &DeviceClassSpecApplyConfiguration{} +} + +// WithSelectors adds the given value to the Selectors field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Selectors field. +func (b *DeviceClassSpecApplyConfiguration) WithSelectors(values ...*DeviceSelectorApplyConfiguration) *DeviceClassSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSelectors") + } + b.Selectors = append(b.Selectors, *values[i]) + } + return b +} + +// WithConfig adds the given value to the Config field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Config field. +func (b *DeviceClassSpecApplyConfiguration) WithConfig(values ...*DeviceClassConfigurationApplyConfiguration) *DeviceClassSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConfig") + } + b.Config = append(b.Config, *values[i]) + } + return b +} + +// WithSuitableNodes sets the SuitableNodes field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SuitableNodes field is set to the value of the last call. +func (b *DeviceClassSpecApplyConfiguration) WithSuitableNodes(value *v1.NodeSelectorApplyConfiguration) *DeviceClassSpecApplyConfiguration { + b.SuitableNodes = value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceconfiguration.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceconfiguration.go new file mode 100644 index 00000000000..62c0d997de1 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceconfiguration.go @@ -0,0 +1,39 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +// DeviceConfigurationApplyConfiguration represents a declarative configuration of the DeviceConfiguration type for use +// with apply. +type DeviceConfigurationApplyConfiguration struct { + Opaque *OpaqueDeviceConfigurationApplyConfiguration `json:"opaque,omitempty"` +} + +// DeviceConfigurationApplyConfiguration constructs a declarative configuration of the DeviceConfiguration type for use with +// apply. +func DeviceConfiguration() *DeviceConfigurationApplyConfiguration { + return &DeviceConfigurationApplyConfiguration{} +} + +// WithOpaque sets the Opaque field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Opaque field is set to the value of the last call. +func (b *DeviceConfigurationApplyConfiguration) WithOpaque(value *OpaqueDeviceConfigurationApplyConfiguration) *DeviceConfigurationApplyConfiguration { + b.Opaque = value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceconstraint.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceconstraint.go new file mode 100644 index 00000000000..479acd57c2b --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceconstraint.go @@ -0,0 +1,54 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +import ( + v1alpha3 "k8s.io/api/resource/v1alpha3" +) + +// DeviceConstraintApplyConfiguration represents a declarative configuration of the DeviceConstraint type for use +// with apply. +type DeviceConstraintApplyConfiguration struct { + Requests []string `json:"requests,omitempty"` + MatchAttribute *v1alpha3.FullyQualifiedName `json:"matchAttribute,omitempty"` +} + +// DeviceConstraintApplyConfiguration constructs a declarative configuration of the DeviceConstraint type for use with +// apply. +func DeviceConstraint() *DeviceConstraintApplyConfiguration { + return &DeviceConstraintApplyConfiguration{} +} + +// WithRequests adds the given value to the Requests field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Requests field. +func (b *DeviceConstraintApplyConfiguration) WithRequests(values ...string) *DeviceConstraintApplyConfiguration { + for i := range values { + b.Requests = append(b.Requests, values[i]) + } + return b +} + +// WithMatchAttribute sets the MatchAttribute field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MatchAttribute field is set to the value of the last call. +func (b *DeviceConstraintApplyConfiguration) WithMatchAttribute(value v1alpha3.FullyQualifiedName) *DeviceConstraintApplyConfiguration { + b.MatchAttribute = &value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/devicerequest.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/devicerequest.go new file mode 100644 index 00000000000..e5c87efe475 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/devicerequest.go @@ -0,0 +1,93 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +import ( + resourcev1alpha3 "k8s.io/api/resource/v1alpha3" +) + +// DeviceRequestApplyConfiguration represents a declarative configuration of the DeviceRequest type for use +// with apply. +type DeviceRequestApplyConfiguration struct { + Name *string `json:"name,omitempty"` + DeviceClassName *string `json:"deviceClassName,omitempty"` + Selectors []DeviceSelectorApplyConfiguration `json:"selectors,omitempty"` + AllocationMode *resourcev1alpha3.DeviceAllocationMode `json:"allocationMode,omitempty"` + Count *int64 `json:"count,omitempty"` + AdminAccess *bool `json:"adminAccess,omitempty"` +} + +// DeviceRequestApplyConfiguration constructs a declarative configuration of the DeviceRequest type for use with +// apply. +func DeviceRequest() *DeviceRequestApplyConfiguration { + return &DeviceRequestApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *DeviceRequestApplyConfiguration) WithName(value string) *DeviceRequestApplyConfiguration { + b.Name = &value + return b +} + +// WithDeviceClassName sets the DeviceClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeviceClassName field is set to the value of the last call. +func (b *DeviceRequestApplyConfiguration) WithDeviceClassName(value string) *DeviceRequestApplyConfiguration { + b.DeviceClassName = &value + return b +} + +// WithSelectors adds the given value to the Selectors field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Selectors field. +func (b *DeviceRequestApplyConfiguration) WithSelectors(values ...*DeviceSelectorApplyConfiguration) *DeviceRequestApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSelectors") + } + b.Selectors = append(b.Selectors, *values[i]) + } + return b +} + +// WithAllocationMode sets the AllocationMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AllocationMode field is set to the value of the last call. +func (b *DeviceRequestApplyConfiguration) WithAllocationMode(value resourcev1alpha3.DeviceAllocationMode) *DeviceRequestApplyConfiguration { + b.AllocationMode = &value + return b +} + +// WithCount sets the Count field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Count field is set to the value of the last call. +func (b *DeviceRequestApplyConfiguration) WithCount(value int64) *DeviceRequestApplyConfiguration { + b.Count = &value + return b +} + +// WithAdminAccess sets the AdminAccess field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AdminAccess field is set to the value of the last call. +func (b *DeviceRequestApplyConfiguration) WithAdminAccess(value bool) *DeviceRequestApplyConfiguration { + b.AdminAccess = &value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/devicerequestallocationresult.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/devicerequestallocationresult.go new file mode 100644 index 00000000000..712b9bf9b18 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/devicerequestallocationresult.go @@ -0,0 +1,66 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +// DeviceRequestAllocationResultApplyConfiguration represents a declarative configuration of the DeviceRequestAllocationResult type for use +// with apply. +type DeviceRequestAllocationResultApplyConfiguration struct { + Request *string `json:"request,omitempty"` + Driver *string `json:"driver,omitempty"` + Pool *string `json:"pool,omitempty"` + Device *string `json:"device,omitempty"` +} + +// DeviceRequestAllocationResultApplyConfiguration constructs a declarative configuration of the DeviceRequestAllocationResult type for use with +// apply. +func DeviceRequestAllocationResult() *DeviceRequestAllocationResultApplyConfiguration { + return &DeviceRequestAllocationResultApplyConfiguration{} +} + +// WithRequest sets the Request field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Request field is set to the value of the last call. +func (b *DeviceRequestAllocationResultApplyConfiguration) WithRequest(value string) *DeviceRequestAllocationResultApplyConfiguration { + b.Request = &value + return b +} + +// WithDriver sets the Driver field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Driver field is set to the value of the last call. +func (b *DeviceRequestAllocationResultApplyConfiguration) WithDriver(value string) *DeviceRequestAllocationResultApplyConfiguration { + b.Driver = &value + return b +} + +// WithPool sets the Pool field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Pool field is set to the value of the last call. +func (b *DeviceRequestAllocationResultApplyConfiguration) WithPool(value string) *DeviceRequestAllocationResultApplyConfiguration { + b.Pool = &value + return b +} + +// WithDevice sets the Device field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Device field is set to the value of the last call. +func (b *DeviceRequestAllocationResultApplyConfiguration) WithDevice(value string) *DeviceRequestAllocationResultApplyConfiguration { + b.Device = &value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceselector.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceselector.go new file mode 100644 index 00000000000..574299d15e4 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/deviceselector.go @@ -0,0 +1,39 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +// DeviceSelectorApplyConfiguration represents a declarative configuration of the DeviceSelector type for use +// with apply. +type DeviceSelectorApplyConfiguration struct { + CEL *CELDeviceSelectorApplyConfiguration `json:"cel,omitempty"` +} + +// DeviceSelectorApplyConfiguration constructs a declarative configuration of the DeviceSelector type for use with +// apply. +func DeviceSelector() *DeviceSelectorApplyConfiguration { + return &DeviceSelectorApplyConfiguration{} +} + +// WithCEL sets the CEL field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CEL field is set to the value of the last call. +func (b *DeviceSelectorApplyConfiguration) WithCEL(value *CELDeviceSelectorApplyConfiguration) *DeviceSelectorApplyConfiguration { + b.CEL = value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/driverallocationresult.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/driverallocationresult.go deleted file mode 100644 index 787c02660cd..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/driverallocationresult.go +++ /dev/null @@ -1,52 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DriverAllocationResultApplyConfiguration represents a declarative configuration of the DriverAllocationResult type for use -// with apply. -type DriverAllocationResultApplyConfiguration struct { - VendorRequestParameters *runtime.RawExtension `json:"vendorRequestParameters,omitempty"` - AllocationResultModelApplyConfiguration `json:",inline"` -} - -// DriverAllocationResultApplyConfiguration constructs a declarative configuration of the DriverAllocationResult type for use with -// apply. -func DriverAllocationResult() *DriverAllocationResultApplyConfiguration { - return &DriverAllocationResultApplyConfiguration{} -} - -// WithVendorRequestParameters sets the VendorRequestParameters field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the VendorRequestParameters field is set to the value of the last call. -func (b *DriverAllocationResultApplyConfiguration) WithVendorRequestParameters(value runtime.RawExtension) *DriverAllocationResultApplyConfiguration { - b.VendorRequestParameters = &value - return b -} - -// WithNamedResources sets the NamedResources field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the NamedResources field is set to the value of the last call. -func (b *DriverAllocationResultApplyConfiguration) WithNamedResources(value *NamedResourcesAllocationResultApplyConfiguration) *DriverAllocationResultApplyConfiguration { - b.NamedResources = value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/driverrequests.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/driverrequests.go deleted file mode 100644 index f322e7930ac..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/driverrequests.go +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DriverRequestsApplyConfiguration represents a declarative configuration of the DriverRequests type for use -// with apply. -type DriverRequestsApplyConfiguration struct { - DriverName *string `json:"driverName,omitempty"` - VendorParameters *runtime.RawExtension `json:"vendorParameters,omitempty"` - Requests []ResourceRequestApplyConfiguration `json:"requests,omitempty"` -} - -// DriverRequestsApplyConfiguration constructs a declarative configuration of the DriverRequests type for use with -// apply. -func DriverRequests() *DriverRequestsApplyConfiguration { - return &DriverRequestsApplyConfiguration{} -} - -// WithDriverName sets the DriverName field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the DriverName field is set to the value of the last call. -func (b *DriverRequestsApplyConfiguration) WithDriverName(value string) *DriverRequestsApplyConfiguration { - b.DriverName = &value - return b -} - -// WithVendorParameters sets the VendorParameters field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the VendorParameters field is set to the value of the last call. -func (b *DriverRequestsApplyConfiguration) WithVendorParameters(value runtime.RawExtension) *DriverRequestsApplyConfiguration { - b.VendorParameters = &value - return b -} - -// WithRequests adds the given value to the Requests field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the Requests field. -func (b *DriverRequestsApplyConfiguration) WithRequests(values ...*ResourceRequestApplyConfiguration) *DriverRequestsApplyConfiguration { - for i := range values { - if values[i] == nil { - panic("nil value passed to WithRequests") - } - b.Requests = append(b.Requests, *values[i]) - } - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesattribute.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesattribute.go deleted file mode 100644 index 50285978122..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesattribute.go +++ /dev/null @@ -1,100 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - resource "k8s.io/apimachinery/pkg/api/resource" -) - -// NamedResourcesAttributeApplyConfiguration represents a declarative configuration of the NamedResourcesAttribute type for use -// with apply. -type NamedResourcesAttributeApplyConfiguration struct { - Name *string `json:"name,omitempty"` - NamedResourcesAttributeValueApplyConfiguration `json:",inline"` -} - -// NamedResourcesAttributeApplyConfiguration constructs a declarative configuration of the NamedResourcesAttribute type for use with -// apply. -func NamedResourcesAttribute() *NamedResourcesAttributeApplyConfiguration { - return &NamedResourcesAttributeApplyConfiguration{} -} - -// WithName sets the Name field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Name field is set to the value of the last call. -func (b *NamedResourcesAttributeApplyConfiguration) WithName(value string) *NamedResourcesAttributeApplyConfiguration { - b.Name = &value - return b -} - -// WithQuantityValue sets the QuantityValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the QuantityValue field is set to the value of the last call. -func (b *NamedResourcesAttributeApplyConfiguration) WithQuantityValue(value resource.Quantity) *NamedResourcesAttributeApplyConfiguration { - b.QuantityValue = &value - return b -} - -// WithBoolValue sets the BoolValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the BoolValue field is set to the value of the last call. -func (b *NamedResourcesAttributeApplyConfiguration) WithBoolValue(value bool) *NamedResourcesAttributeApplyConfiguration { - b.BoolValue = &value - return b -} - -// WithIntValue sets the IntValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the IntValue field is set to the value of the last call. -func (b *NamedResourcesAttributeApplyConfiguration) WithIntValue(value int64) *NamedResourcesAttributeApplyConfiguration { - b.IntValue = &value - return b -} - -// WithIntSliceValue sets the IntSliceValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the IntSliceValue field is set to the value of the last call. -func (b *NamedResourcesAttributeApplyConfiguration) WithIntSliceValue(value *NamedResourcesIntSliceApplyConfiguration) *NamedResourcesAttributeApplyConfiguration { - b.IntSliceValue = value - return b -} - -// WithStringValue sets the StringValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the StringValue field is set to the value of the last call. -func (b *NamedResourcesAttributeApplyConfiguration) WithStringValue(value string) *NamedResourcesAttributeApplyConfiguration { - b.StringValue = &value - return b -} - -// WithStringSliceValue sets the StringSliceValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the StringSliceValue field is set to the value of the last call. -func (b *NamedResourcesAttributeApplyConfiguration) WithStringSliceValue(value *NamedResourcesStringSliceApplyConfiguration) *NamedResourcesAttributeApplyConfiguration { - b.StringSliceValue = value - return b -} - -// WithVersionValue sets the VersionValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the VersionValue field is set to the value of the last call. -func (b *NamedResourcesAttributeApplyConfiguration) WithVersionValue(value string) *NamedResourcesAttributeApplyConfiguration { - b.VersionValue = &value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesattributevalue.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesattributevalue.go deleted file mode 100644 index 8b6d90d50cd..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesattributevalue.go +++ /dev/null @@ -1,97 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - resource "k8s.io/apimachinery/pkg/api/resource" -) - -// NamedResourcesAttributeValueApplyConfiguration represents a declarative configuration of the NamedResourcesAttributeValue type for use -// with apply. -type NamedResourcesAttributeValueApplyConfiguration struct { - QuantityValue *resource.Quantity `json:"quantity,omitempty"` - BoolValue *bool `json:"bool,omitempty"` - IntValue *int64 `json:"int,omitempty"` - IntSliceValue *NamedResourcesIntSliceApplyConfiguration `json:"intSlice,omitempty"` - StringValue *string `json:"string,omitempty"` - StringSliceValue *NamedResourcesStringSliceApplyConfiguration `json:"stringSlice,omitempty"` - VersionValue *string `json:"version,omitempty"` -} - -// NamedResourcesAttributeValueApplyConfiguration constructs a declarative configuration of the NamedResourcesAttributeValue type for use with -// apply. -func NamedResourcesAttributeValue() *NamedResourcesAttributeValueApplyConfiguration { - return &NamedResourcesAttributeValueApplyConfiguration{} -} - -// WithQuantityValue sets the QuantityValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the QuantityValue field is set to the value of the last call. -func (b *NamedResourcesAttributeValueApplyConfiguration) WithQuantityValue(value resource.Quantity) *NamedResourcesAttributeValueApplyConfiguration { - b.QuantityValue = &value - return b -} - -// WithBoolValue sets the BoolValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the BoolValue field is set to the value of the last call. -func (b *NamedResourcesAttributeValueApplyConfiguration) WithBoolValue(value bool) *NamedResourcesAttributeValueApplyConfiguration { - b.BoolValue = &value - return b -} - -// WithIntValue sets the IntValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the IntValue field is set to the value of the last call. -func (b *NamedResourcesAttributeValueApplyConfiguration) WithIntValue(value int64) *NamedResourcesAttributeValueApplyConfiguration { - b.IntValue = &value - return b -} - -// WithIntSliceValue sets the IntSliceValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the IntSliceValue field is set to the value of the last call. -func (b *NamedResourcesAttributeValueApplyConfiguration) WithIntSliceValue(value *NamedResourcesIntSliceApplyConfiguration) *NamedResourcesAttributeValueApplyConfiguration { - b.IntSliceValue = value - return b -} - -// WithStringValue sets the StringValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the StringValue field is set to the value of the last call. -func (b *NamedResourcesAttributeValueApplyConfiguration) WithStringValue(value string) *NamedResourcesAttributeValueApplyConfiguration { - b.StringValue = &value - return b -} - -// WithStringSliceValue sets the StringSliceValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the StringSliceValue field is set to the value of the last call. -func (b *NamedResourcesAttributeValueApplyConfiguration) WithStringSliceValue(value *NamedResourcesStringSliceApplyConfiguration) *NamedResourcesAttributeValueApplyConfiguration { - b.StringSliceValue = value - return b -} - -// WithVersionValue sets the VersionValue field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the VersionValue field is set to the value of the last call. -func (b *NamedResourcesAttributeValueApplyConfiguration) WithVersionValue(value string) *NamedResourcesAttributeValueApplyConfiguration { - b.VersionValue = &value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesinstance.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesinstance.go deleted file mode 100644 index ff028814dbe..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesinstance.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// NamedResourcesInstanceApplyConfiguration represents a declarative configuration of the NamedResourcesInstance type for use -// with apply. -type NamedResourcesInstanceApplyConfiguration struct { - Name *string `json:"name,omitempty"` - Attributes []NamedResourcesAttributeApplyConfiguration `json:"attributes,omitempty"` -} - -// NamedResourcesInstanceApplyConfiguration constructs a declarative configuration of the NamedResourcesInstance type for use with -// apply. -func NamedResourcesInstance() *NamedResourcesInstanceApplyConfiguration { - return &NamedResourcesInstanceApplyConfiguration{} -} - -// WithName sets the Name field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Name field is set to the value of the last call. -func (b *NamedResourcesInstanceApplyConfiguration) WithName(value string) *NamedResourcesInstanceApplyConfiguration { - b.Name = &value - return b -} - -// WithAttributes adds the given value to the Attributes field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the Attributes field. -func (b *NamedResourcesInstanceApplyConfiguration) WithAttributes(values ...*NamedResourcesAttributeApplyConfiguration) *NamedResourcesInstanceApplyConfiguration { - for i := range values { - if values[i] == nil { - panic("nil value passed to WithAttributes") - } - b.Attributes = append(b.Attributes, *values[i]) - } - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesintslice.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesintslice.go deleted file mode 100644 index fa336b4ae9a..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesintslice.go +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// NamedResourcesIntSliceApplyConfiguration represents a declarative configuration of the NamedResourcesIntSlice type for use -// with apply. -type NamedResourcesIntSliceApplyConfiguration struct { - Ints []int64 `json:"ints,omitempty"` -} - -// NamedResourcesIntSliceApplyConfiguration constructs a declarative configuration of the NamedResourcesIntSlice type for use with -// apply. -func NamedResourcesIntSlice() *NamedResourcesIntSliceApplyConfiguration { - return &NamedResourcesIntSliceApplyConfiguration{} -} - -// WithInts adds the given value to the Ints field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the Ints field. -func (b *NamedResourcesIntSliceApplyConfiguration) WithInts(values ...int64) *NamedResourcesIntSliceApplyConfiguration { - for i := range values { - b.Ints = append(b.Ints, values[i]) - } - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesrequest.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesrequest.go deleted file mode 100644 index da6ac3efcfe..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesrequest.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// NamedResourcesRequestApplyConfiguration represents a declarative configuration of the NamedResourcesRequest type for use -// with apply. -type NamedResourcesRequestApplyConfiguration struct { - Selector *string `json:"selector,omitempty"` -} - -// NamedResourcesRequestApplyConfiguration constructs a declarative configuration of the NamedResourcesRequest type for use with -// apply. -func NamedResourcesRequest() *NamedResourcesRequestApplyConfiguration { - return &NamedResourcesRequestApplyConfiguration{} -} - -// WithSelector sets the Selector field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Selector field is set to the value of the last call. -func (b *NamedResourcesRequestApplyConfiguration) WithSelector(value string) *NamedResourcesRequestApplyConfiguration { - b.Selector = &value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesresources.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesresources.go deleted file mode 100644 index 3e467922a4d..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesresources.go +++ /dev/null @@ -1,44 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// NamedResourcesResourcesApplyConfiguration represents a declarative configuration of the NamedResourcesResources type for use -// with apply. -type NamedResourcesResourcesApplyConfiguration struct { - Instances []NamedResourcesInstanceApplyConfiguration `json:"instances,omitempty"` -} - -// NamedResourcesResourcesApplyConfiguration constructs a declarative configuration of the NamedResourcesResources type for use with -// apply. -func NamedResourcesResources() *NamedResourcesResourcesApplyConfiguration { - return &NamedResourcesResourcesApplyConfiguration{} -} - -// WithInstances adds the given value to the Instances field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the Instances field. -func (b *NamedResourcesResourcesApplyConfiguration) WithInstances(values ...*NamedResourcesInstanceApplyConfiguration) *NamedResourcesResourcesApplyConfiguration { - for i := range values { - if values[i] == nil { - panic("nil value passed to WithInstances") - } - b.Instances = append(b.Instances, *values[i]) - } - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesstringslice.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesstringslice.go deleted file mode 100644 index 8f21f81905d..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/namedresourcesstringslice.go +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// NamedResourcesStringSliceApplyConfiguration represents a declarative configuration of the NamedResourcesStringSlice type for use -// with apply. -type NamedResourcesStringSliceApplyConfiguration struct { - Strings []string `json:"strings,omitempty"` -} - -// NamedResourcesStringSliceApplyConfiguration constructs a declarative configuration of the NamedResourcesStringSlice type for use with -// apply. -func NamedResourcesStringSlice() *NamedResourcesStringSliceApplyConfiguration { - return &NamedResourcesStringSliceApplyConfiguration{} -} - -// WithStrings adds the given value to the Strings field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the Strings field. -func (b *NamedResourcesStringSliceApplyConfiguration) WithStrings(values ...string) *NamedResourcesStringSliceApplyConfiguration { - for i := range values { - b.Strings = append(b.Strings, values[i]) - } - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/vendorparameters.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/opaquedeviceconfiguration.go similarity index 55% rename from staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/vendorparameters.go rename to staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/opaquedeviceconfiguration.go index 71f86a159c2..caf9d059c3f 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/vendorparameters.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/opaquedeviceconfiguration.go @@ -22,31 +22,31 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" ) -// VendorParametersApplyConfiguration represents a declarative configuration of the VendorParameters type for use +// OpaqueDeviceConfigurationApplyConfiguration represents a declarative configuration of the OpaqueDeviceConfiguration type for use // with apply. -type VendorParametersApplyConfiguration struct { - DriverName *string `json:"driverName,omitempty"` +type OpaqueDeviceConfigurationApplyConfiguration struct { + Driver *string `json:"driver,omitempty"` Parameters *runtime.RawExtension `json:"parameters,omitempty"` } -// VendorParametersApplyConfiguration constructs a declarative configuration of the VendorParameters type for use with +// OpaqueDeviceConfigurationApplyConfiguration constructs a declarative configuration of the OpaqueDeviceConfiguration type for use with // apply. -func VendorParameters() *VendorParametersApplyConfiguration { - return &VendorParametersApplyConfiguration{} +func OpaqueDeviceConfiguration() *OpaqueDeviceConfigurationApplyConfiguration { + return &OpaqueDeviceConfigurationApplyConfiguration{} } -// WithDriverName sets the DriverName field in the declarative configuration to the given value +// WithDriver sets the Driver field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the DriverName field is set to the value of the last call. -func (b *VendorParametersApplyConfiguration) WithDriverName(value string) *VendorParametersApplyConfiguration { - b.DriverName = &value +// If called multiple times, the Driver field is set to the value of the last call. +func (b *OpaqueDeviceConfigurationApplyConfiguration) WithDriver(value string) *OpaqueDeviceConfigurationApplyConfiguration { + b.Driver = &value return b } // WithParameters sets the Parameters field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Parameters field is set to the value of the last call. -func (b *VendorParametersApplyConfiguration) WithParameters(value runtime.RawExtension) *VendorParametersApplyConfiguration { +func (b *OpaqueDeviceConfigurationApplyConfiguration) WithParameters(value runtime.RawExtension) *OpaqueDeviceConfigurationApplyConfiguration { b.Parameters = &value return b } diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimparametersreference.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimparametersreference.go deleted file mode 100644 index 1d677011c15..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimparametersreference.go +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// ResourceClaimParametersReferenceApplyConfiguration represents a declarative configuration of the ResourceClaimParametersReference type for use -// with apply. -type ResourceClaimParametersReferenceApplyConfiguration struct { - APIGroup *string `json:"apiGroup,omitempty"` - Kind *string `json:"kind,omitempty"` - Name *string `json:"name,omitempty"` -} - -// ResourceClaimParametersReferenceApplyConfiguration constructs a declarative configuration of the ResourceClaimParametersReference type for use with -// apply. -func ResourceClaimParametersReference() *ResourceClaimParametersReferenceApplyConfiguration { - return &ResourceClaimParametersReferenceApplyConfiguration{} -} - -// WithAPIGroup sets the APIGroup field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the APIGroup field is set to the value of the last call. -func (b *ResourceClaimParametersReferenceApplyConfiguration) WithAPIGroup(value string) *ResourceClaimParametersReferenceApplyConfiguration { - b.APIGroup = &value - return b -} - -// WithKind sets the Kind field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Kind field is set to the value of the last call. -func (b *ResourceClaimParametersReferenceApplyConfiguration) WithKind(value string) *ResourceClaimParametersReferenceApplyConfiguration { - b.Kind = &value - return b -} - -// WithName sets the Name field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Name field is set to the value of the last call. -func (b *ResourceClaimParametersReferenceApplyConfiguration) WithName(value string) *ResourceClaimParametersReferenceApplyConfiguration { - b.Name = &value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimspec.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimspec.go index 38bd0c5578e..7c5b65681df 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimspec.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimspec.go @@ -21,8 +21,8 @@ package v1alpha3 // ResourceClaimSpecApplyConfiguration represents a declarative configuration of the ResourceClaimSpec type for use // with apply. type ResourceClaimSpecApplyConfiguration struct { - ResourceClassName *string `json:"resourceClassName,omitempty"` - ParametersRef *ResourceClaimParametersReferenceApplyConfiguration `json:"parametersRef,omitempty"` + Devices *DeviceClaimApplyConfiguration `json:"devices,omitempty"` + Controller *string `json:"controller,omitempty"` } // ResourceClaimSpecApplyConfiguration constructs a declarative configuration of the ResourceClaimSpec type for use with @@ -31,18 +31,18 @@ func ResourceClaimSpec() *ResourceClaimSpecApplyConfiguration { return &ResourceClaimSpecApplyConfiguration{} } -// WithResourceClassName sets the ResourceClassName field in the declarative configuration to the given value +// WithDevices sets the Devices field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the ResourceClassName field is set to the value of the last call. -func (b *ResourceClaimSpecApplyConfiguration) WithResourceClassName(value string) *ResourceClaimSpecApplyConfiguration { - b.ResourceClassName = &value +// If called multiple times, the Devices field is set to the value of the last call. +func (b *ResourceClaimSpecApplyConfiguration) WithDevices(value *DeviceClaimApplyConfiguration) *ResourceClaimSpecApplyConfiguration { + b.Devices = value return b } -// WithParametersRef sets the ParametersRef field in the declarative configuration to the given value +// WithController sets the Controller field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the ParametersRef field is set to the value of the last call. -func (b *ResourceClaimSpecApplyConfiguration) WithParametersRef(value *ResourceClaimParametersReferenceApplyConfiguration) *ResourceClaimSpecApplyConfiguration { - b.ParametersRef = value +// If called multiple times, the Controller field is set to the value of the last call. +func (b *ResourceClaimSpecApplyConfiguration) WithController(value string) *ResourceClaimSpecApplyConfiguration { + b.Controller = &value return b } diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimstatus.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimstatus.go index fa1545e52ab..a52af3ec366 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimstatus.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclaimstatus.go @@ -21,7 +21,6 @@ package v1alpha3 // ResourceClaimStatusApplyConfiguration represents a declarative configuration of the ResourceClaimStatus type for use // with apply. type ResourceClaimStatusApplyConfiguration struct { - DriverName *string `json:"driverName,omitempty"` Allocation *AllocationResultApplyConfiguration `json:"allocation,omitempty"` ReservedFor []ResourceClaimConsumerReferenceApplyConfiguration `json:"reservedFor,omitempty"` DeallocationRequested *bool `json:"deallocationRequested,omitempty"` @@ -33,14 +32,6 @@ func ResourceClaimStatus() *ResourceClaimStatusApplyConfiguration { return &ResourceClaimStatusApplyConfiguration{} } -// WithDriverName sets the DriverName field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the DriverName field is set to the value of the last call. -func (b *ResourceClaimStatusApplyConfiguration) WithDriverName(value string) *ResourceClaimStatusApplyConfiguration { - b.DriverName = &value - return b -} - // WithAllocation sets the Allocation field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Allocation field is set to the value of the last call. diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclass.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclass.go deleted file mode 100644 index a42ea74224b..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclass.go +++ /dev/null @@ -1,281 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - resourcev1alpha3 "k8s.io/api/resource/v1alpha3" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - managedfields "k8s.io/apimachinery/pkg/util/managedfields" - corev1 "k8s.io/client-go/applyconfigurations/core/v1" - internal "k8s.io/client-go/applyconfigurations/internal" - v1 "k8s.io/client-go/applyconfigurations/meta/v1" -) - -// ResourceClassApplyConfiguration represents a declarative configuration of the ResourceClass type for use -// with apply. -type ResourceClassApplyConfiguration struct { - v1.TypeMetaApplyConfiguration `json:",inline"` - *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` - DriverName *string `json:"driverName,omitempty"` - ParametersRef *ResourceClassParametersReferenceApplyConfiguration `json:"parametersRef,omitempty"` - SuitableNodes *corev1.NodeSelectorApplyConfiguration `json:"suitableNodes,omitempty"` - StructuredParameters *bool `json:"structuredParameters,omitempty"` -} - -// ResourceClass constructs a declarative configuration of the ResourceClass type for use with -// apply. -func ResourceClass(name string) *ResourceClassApplyConfiguration { - b := &ResourceClassApplyConfiguration{} - b.WithName(name) - b.WithKind("ResourceClass") - b.WithAPIVersion("resource.k8s.io/v1alpha3") - return b -} - -// ExtractResourceClass extracts the applied configuration owned by fieldManager from -// resourceClass. If no managedFields are found in resourceClass for fieldManager, a -// ResourceClassApplyConfiguration is returned with only the Name, Namespace (if applicable), -// APIVersion and Kind populated. It is possible that no managed fields were found for because other -// field managers have taken ownership of all the fields previously owned by fieldManager, or because -// the fieldManager never owned fields any fields. -// resourceClass must be a unmodified ResourceClass API object that was retrieved from the Kubernetes API. -// ExtractResourceClass provides a way to perform a extract/modify-in-place/apply workflow. -// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously -// applied if another fieldManager has updated or force applied any of the previously applied fields. -// Experimental! -func ExtractResourceClass(resourceClass *resourcev1alpha3.ResourceClass, fieldManager string) (*ResourceClassApplyConfiguration, error) { - return extractResourceClass(resourceClass, fieldManager, "") -} - -// ExtractResourceClassStatus is the same as ExtractResourceClass except -// that it extracts the status subresource applied configuration. -// Experimental! -func ExtractResourceClassStatus(resourceClass *resourcev1alpha3.ResourceClass, fieldManager string) (*ResourceClassApplyConfiguration, error) { - return extractResourceClass(resourceClass, fieldManager, "status") -} - -func extractResourceClass(resourceClass *resourcev1alpha3.ResourceClass, fieldManager string, subresource string) (*ResourceClassApplyConfiguration, error) { - b := &ResourceClassApplyConfiguration{} - err := managedfields.ExtractInto(resourceClass, internal.Parser().Type("io.k8s.api.resource.v1alpha3.ResourceClass"), fieldManager, b, subresource) - if err != nil { - return nil, err - } - b.WithName(resourceClass.Name) - - b.WithKind("ResourceClass") - b.WithAPIVersion("resource.k8s.io/v1alpha3") - return b, nil -} - -// WithKind sets the Kind field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Kind field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithKind(value string) *ResourceClassApplyConfiguration { - b.Kind = &value - return b -} - -// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the APIVersion field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithAPIVersion(value string) *ResourceClassApplyConfiguration { - b.APIVersion = &value - return b -} - -// WithName sets the Name field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Name field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithName(value string) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.Name = &value - return b -} - -// WithGenerateName sets the GenerateName field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the GenerateName field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithGenerateName(value string) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.GenerateName = &value - return b -} - -// WithNamespace sets the Namespace field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Namespace field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithNamespace(value string) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.Namespace = &value - return b -} - -// WithUID sets the UID field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the UID field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithUID(value types.UID) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.UID = &value - return b -} - -// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the ResourceVersion field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithResourceVersion(value string) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.ResourceVersion = &value - return b -} - -// WithGeneration sets the Generation field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Generation field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithGeneration(value int64) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.Generation = &value - return b -} - -// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the CreationTimestamp field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.CreationTimestamp = &value - return b -} - -// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the DeletionTimestamp field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.DeletionTimestamp = &value - return b -} - -// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.DeletionGracePeriodSeconds = &value - return b -} - -// WithLabels puts the entries into the Labels field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, the entries provided by each call will be put on the Labels field, -// overwriting an existing map entries in Labels field with the same key. -func (b *ResourceClassApplyConfiguration) WithLabels(entries map[string]string) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - if b.Labels == nil && len(entries) > 0 { - b.Labels = make(map[string]string, len(entries)) - } - for k, v := range entries { - b.Labels[k] = v - } - return b -} - -// WithAnnotations puts the entries into the Annotations field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, the entries provided by each call will be put on the Annotations field, -// overwriting an existing map entries in Annotations field with the same key. -func (b *ResourceClassApplyConfiguration) WithAnnotations(entries map[string]string) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - if b.Annotations == nil && len(entries) > 0 { - b.Annotations = make(map[string]string, len(entries)) - } - for k, v := range entries { - b.Annotations[k] = v - } - return b -} - -// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the OwnerReferences field. -func (b *ResourceClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - for i := range values { - if values[i] == nil { - panic("nil value passed to WithOwnerReferences") - } - b.OwnerReferences = append(b.OwnerReferences, *values[i]) - } - return b -} - -// WithFinalizers adds the given value to the Finalizers field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the Finalizers field. -func (b *ResourceClassApplyConfiguration) WithFinalizers(values ...string) *ResourceClassApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - for i := range values { - b.Finalizers = append(b.Finalizers, values[i]) - } - return b -} - -func (b *ResourceClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { - if b.ObjectMetaApplyConfiguration == nil { - b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} - } -} - -// WithDriverName sets the DriverName field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the DriverName field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithDriverName(value string) *ResourceClassApplyConfiguration { - b.DriverName = &value - return b -} - -// WithParametersRef sets the ParametersRef field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the ParametersRef field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithParametersRef(value *ResourceClassParametersReferenceApplyConfiguration) *ResourceClassApplyConfiguration { - b.ParametersRef = value - return b -} - -// WithSuitableNodes sets the SuitableNodes field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the SuitableNodes field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithSuitableNodes(value *corev1.NodeSelectorApplyConfiguration) *ResourceClassApplyConfiguration { - b.SuitableNodes = value - return b -} - -// WithStructuredParameters sets the StructuredParameters field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the StructuredParameters field is set to the value of the last call. -func (b *ResourceClassApplyConfiguration) WithStructuredParameters(value bool) *ResourceClassApplyConfiguration { - b.StructuredParameters = &value - return b -} - -// GetName retrieves the value of the Name field in the declarative configuration. -func (b *ResourceClassApplyConfiguration) GetName() *string { - b.ensureObjectMetaApplyConfigurationExists() - return b.Name -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclassparameters.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclassparameters.go deleted file mode 100644 index 7413fbfe7c6..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclassparameters.go +++ /dev/null @@ -1,283 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - resourcev1alpha3 "k8s.io/api/resource/v1alpha3" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - managedfields "k8s.io/apimachinery/pkg/util/managedfields" - internal "k8s.io/client-go/applyconfigurations/internal" - v1 "k8s.io/client-go/applyconfigurations/meta/v1" -) - -// ResourceClassParametersApplyConfiguration represents a declarative configuration of the ResourceClassParameters type for use -// with apply. -type ResourceClassParametersApplyConfiguration struct { - v1.TypeMetaApplyConfiguration `json:",inline"` - *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` - GeneratedFrom *ResourceClassParametersReferenceApplyConfiguration `json:"generatedFrom,omitempty"` - VendorParameters []VendorParametersApplyConfiguration `json:"vendorParameters,omitempty"` - Filters []ResourceFilterApplyConfiguration `json:"filters,omitempty"` -} - -// ResourceClassParameters constructs a declarative configuration of the ResourceClassParameters type for use with -// apply. -func ResourceClassParameters(name, namespace string) *ResourceClassParametersApplyConfiguration { - b := &ResourceClassParametersApplyConfiguration{} - b.WithName(name) - b.WithNamespace(namespace) - b.WithKind("ResourceClassParameters") - b.WithAPIVersion("resource.k8s.io/v1alpha3") - return b -} - -// ExtractResourceClassParameters extracts the applied configuration owned by fieldManager from -// resourceClassParameters. If no managedFields are found in resourceClassParameters for fieldManager, a -// ResourceClassParametersApplyConfiguration is returned with only the Name, Namespace (if applicable), -// APIVersion and Kind populated. It is possible that no managed fields were found for because other -// field managers have taken ownership of all the fields previously owned by fieldManager, or because -// the fieldManager never owned fields any fields. -// resourceClassParameters must be a unmodified ResourceClassParameters API object that was retrieved from the Kubernetes API. -// ExtractResourceClassParameters provides a way to perform a extract/modify-in-place/apply workflow. -// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously -// applied if another fieldManager has updated or force applied any of the previously applied fields. -// Experimental! -func ExtractResourceClassParameters(resourceClassParameters *resourcev1alpha3.ResourceClassParameters, fieldManager string) (*ResourceClassParametersApplyConfiguration, error) { - return extractResourceClassParameters(resourceClassParameters, fieldManager, "") -} - -// ExtractResourceClassParametersStatus is the same as ExtractResourceClassParameters except -// that it extracts the status subresource applied configuration. -// Experimental! -func ExtractResourceClassParametersStatus(resourceClassParameters *resourcev1alpha3.ResourceClassParameters, fieldManager string) (*ResourceClassParametersApplyConfiguration, error) { - return extractResourceClassParameters(resourceClassParameters, fieldManager, "status") -} - -func extractResourceClassParameters(resourceClassParameters *resourcev1alpha3.ResourceClassParameters, fieldManager string, subresource string) (*ResourceClassParametersApplyConfiguration, error) { - b := &ResourceClassParametersApplyConfiguration{} - err := managedfields.ExtractInto(resourceClassParameters, internal.Parser().Type("io.k8s.api.resource.v1alpha3.ResourceClassParameters"), fieldManager, b, subresource) - if err != nil { - return nil, err - } - b.WithName(resourceClassParameters.Name) - b.WithNamespace(resourceClassParameters.Namespace) - - b.WithKind("ResourceClassParameters") - b.WithAPIVersion("resource.k8s.io/v1alpha3") - return b, nil -} - -// WithKind sets the Kind field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Kind field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithKind(value string) *ResourceClassParametersApplyConfiguration { - b.Kind = &value - return b -} - -// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the APIVersion field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithAPIVersion(value string) *ResourceClassParametersApplyConfiguration { - b.APIVersion = &value - return b -} - -// WithName sets the Name field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Name field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithName(value string) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.Name = &value - return b -} - -// WithGenerateName sets the GenerateName field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the GenerateName field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithGenerateName(value string) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.GenerateName = &value - return b -} - -// WithNamespace sets the Namespace field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Namespace field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithNamespace(value string) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.Namespace = &value - return b -} - -// WithUID sets the UID field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the UID field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithUID(value types.UID) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.UID = &value - return b -} - -// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the ResourceVersion field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithResourceVersion(value string) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.ResourceVersion = &value - return b -} - -// WithGeneration sets the Generation field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Generation field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithGeneration(value int64) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.Generation = &value - return b -} - -// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the CreationTimestamp field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.CreationTimestamp = &value - return b -} - -// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the DeletionTimestamp field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.DeletionTimestamp = &value - return b -} - -// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - b.DeletionGracePeriodSeconds = &value - return b -} - -// WithLabels puts the entries into the Labels field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, the entries provided by each call will be put on the Labels field, -// overwriting an existing map entries in Labels field with the same key. -func (b *ResourceClassParametersApplyConfiguration) WithLabels(entries map[string]string) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - if b.Labels == nil && len(entries) > 0 { - b.Labels = make(map[string]string, len(entries)) - } - for k, v := range entries { - b.Labels[k] = v - } - return b -} - -// WithAnnotations puts the entries into the Annotations field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, the entries provided by each call will be put on the Annotations field, -// overwriting an existing map entries in Annotations field with the same key. -func (b *ResourceClassParametersApplyConfiguration) WithAnnotations(entries map[string]string) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - if b.Annotations == nil && len(entries) > 0 { - b.Annotations = make(map[string]string, len(entries)) - } - for k, v := range entries { - b.Annotations[k] = v - } - return b -} - -// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the OwnerReferences field. -func (b *ResourceClassParametersApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - for i := range values { - if values[i] == nil { - panic("nil value passed to WithOwnerReferences") - } - b.OwnerReferences = append(b.OwnerReferences, *values[i]) - } - return b -} - -// WithFinalizers adds the given value to the Finalizers field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the Finalizers field. -func (b *ResourceClassParametersApplyConfiguration) WithFinalizers(values ...string) *ResourceClassParametersApplyConfiguration { - b.ensureObjectMetaApplyConfigurationExists() - for i := range values { - b.Finalizers = append(b.Finalizers, values[i]) - } - return b -} - -func (b *ResourceClassParametersApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { - if b.ObjectMetaApplyConfiguration == nil { - b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} - } -} - -// WithGeneratedFrom sets the GeneratedFrom field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the GeneratedFrom field is set to the value of the last call. -func (b *ResourceClassParametersApplyConfiguration) WithGeneratedFrom(value *ResourceClassParametersReferenceApplyConfiguration) *ResourceClassParametersApplyConfiguration { - b.GeneratedFrom = value - return b -} - -// WithVendorParameters adds the given value to the VendorParameters field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the VendorParameters field. -func (b *ResourceClassParametersApplyConfiguration) WithVendorParameters(values ...*VendorParametersApplyConfiguration) *ResourceClassParametersApplyConfiguration { - for i := range values { - if values[i] == nil { - panic("nil value passed to WithVendorParameters") - } - b.VendorParameters = append(b.VendorParameters, *values[i]) - } - return b -} - -// WithFilters adds the given value to the Filters field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the Filters field. -func (b *ResourceClassParametersApplyConfiguration) WithFilters(values ...*ResourceFilterApplyConfiguration) *ResourceClassParametersApplyConfiguration { - for i := range values { - if values[i] == nil { - panic("nil value passed to WithFilters") - } - b.Filters = append(b.Filters, *values[i]) - } - return b -} - -// GetName retrieves the value of the Name field in the declarative configuration. -func (b *ResourceClassParametersApplyConfiguration) GetName() *string { - b.ensureObjectMetaApplyConfigurationExists() - return b.Name -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclassparametersreference.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclassparametersreference.go deleted file mode 100644 index db469e5eec0..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceclassparametersreference.go +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// ResourceClassParametersReferenceApplyConfiguration represents a declarative configuration of the ResourceClassParametersReference type for use -// with apply. -type ResourceClassParametersReferenceApplyConfiguration struct { - APIGroup *string `json:"apiGroup,omitempty"` - Kind *string `json:"kind,omitempty"` - Name *string `json:"name,omitempty"` - Namespace *string `json:"namespace,omitempty"` -} - -// ResourceClassParametersReferenceApplyConfiguration constructs a declarative configuration of the ResourceClassParametersReference type for use with -// apply. -func ResourceClassParametersReference() *ResourceClassParametersReferenceApplyConfiguration { - return &ResourceClassParametersReferenceApplyConfiguration{} -} - -// WithAPIGroup sets the APIGroup field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the APIGroup field is set to the value of the last call. -func (b *ResourceClassParametersReferenceApplyConfiguration) WithAPIGroup(value string) *ResourceClassParametersReferenceApplyConfiguration { - b.APIGroup = &value - return b -} - -// WithKind sets the Kind field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Kind field is set to the value of the last call. -func (b *ResourceClassParametersReferenceApplyConfiguration) WithKind(value string) *ResourceClassParametersReferenceApplyConfiguration { - b.Kind = &value - return b -} - -// WithName sets the Name field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Name field is set to the value of the last call. -func (b *ResourceClassParametersReferenceApplyConfiguration) WithName(value string) *ResourceClassParametersReferenceApplyConfiguration { - b.Name = &value - return b -} - -// WithNamespace sets the Namespace field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Namespace field is set to the value of the last call. -func (b *ResourceClassParametersReferenceApplyConfiguration) WithNamespace(value string) *ResourceClassParametersReferenceApplyConfiguration { - b.Namespace = &value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcefilter.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcefilter.go deleted file mode 100644 index 4c5542692cd..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcefilter.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// ResourceFilterApplyConfiguration represents a declarative configuration of the ResourceFilter type for use -// with apply. -type ResourceFilterApplyConfiguration struct { - DriverName *string `json:"driverName,omitempty"` - ResourceFilterModelApplyConfiguration `json:",inline"` -} - -// ResourceFilterApplyConfiguration constructs a declarative configuration of the ResourceFilter type for use with -// apply. -func ResourceFilter() *ResourceFilterApplyConfiguration { - return &ResourceFilterApplyConfiguration{} -} - -// WithDriverName sets the DriverName field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the DriverName field is set to the value of the last call. -func (b *ResourceFilterApplyConfiguration) WithDriverName(value string) *ResourceFilterApplyConfiguration { - b.DriverName = &value - return b -} - -// WithNamedResources sets the NamedResources field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the NamedResources field is set to the value of the last call. -func (b *ResourceFilterApplyConfiguration) WithNamedResources(value *NamedResourcesFilterApplyConfiguration) *ResourceFilterApplyConfiguration { - b.NamedResources = value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcefiltermodel.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcefiltermodel.go deleted file mode 100644 index 0de3f12f678..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcefiltermodel.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// ResourceFilterModelApplyConfiguration represents a declarative configuration of the ResourceFilterModel type for use -// with apply. -type ResourceFilterModelApplyConfiguration struct { - NamedResources *NamedResourcesFilterApplyConfiguration `json:"namedResources,omitempty"` -} - -// ResourceFilterModelApplyConfiguration constructs a declarative configuration of the ResourceFilterModel type for use with -// apply. -func ResourceFilterModel() *ResourceFilterModelApplyConfiguration { - return &ResourceFilterModelApplyConfiguration{} -} - -// WithNamedResources sets the NamedResources field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the NamedResources field is set to the value of the last call. -func (b *ResourceFilterModelApplyConfiguration) WithNamedResources(value *NamedResourcesFilterApplyConfiguration) *ResourceFilterModelApplyConfiguration { - b.NamedResources = value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcehandle.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcehandle.go deleted file mode 100644 index 6c8a697fa13..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcehandle.go +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// ResourceHandleApplyConfiguration represents a declarative configuration of the ResourceHandle type for use -// with apply. -type ResourceHandleApplyConfiguration struct { - DriverName *string `json:"driverName,omitempty"` - Data *string `json:"data,omitempty"` - StructuredData *StructuredResourceHandleApplyConfiguration `json:"structuredData,omitempty"` -} - -// ResourceHandleApplyConfiguration constructs a declarative configuration of the ResourceHandle type for use with -// apply. -func ResourceHandle() *ResourceHandleApplyConfiguration { - return &ResourceHandleApplyConfiguration{} -} - -// WithDriverName sets the DriverName field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the DriverName field is set to the value of the last call. -func (b *ResourceHandleApplyConfiguration) WithDriverName(value string) *ResourceHandleApplyConfiguration { - b.DriverName = &value - return b -} - -// WithData sets the Data field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Data field is set to the value of the last call. -func (b *ResourceHandleApplyConfiguration) WithData(value string) *ResourceHandleApplyConfiguration { - b.Data = &value - return b -} - -// WithStructuredData sets the StructuredData field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the StructuredData field is set to the value of the last call. -func (b *ResourceHandleApplyConfiguration) WithStructuredData(value *StructuredResourceHandleApplyConfiguration) *ResourceHandleApplyConfiguration { - b.StructuredData = value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcemodel.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcemodel.go deleted file mode 100644 index 2999d447df1..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcemodel.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// ResourceModelApplyConfiguration represents a declarative configuration of the ResourceModel type for use -// with apply. -type ResourceModelApplyConfiguration struct { - NamedResources *NamedResourcesResourcesApplyConfiguration `json:"namedResources,omitempty"` -} - -// ResourceModelApplyConfiguration constructs a declarative configuration of the ResourceModel type for use with -// apply. -func ResourceModel() *ResourceModelApplyConfiguration { - return &ResourceModelApplyConfiguration{} -} - -// WithNamedResources sets the NamedResources field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the NamedResources field is set to the value of the last call. -func (b *ResourceModelApplyConfiguration) WithNamedResources(value *NamedResourcesResourcesApplyConfiguration) *ResourceModelApplyConfiguration { - b.NamedResources = value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcepool.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcepool.go new file mode 100644 index 00000000000..23825d137f9 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcepool.go @@ -0,0 +1,57 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +// ResourcePoolApplyConfiguration represents a declarative configuration of the ResourcePool type for use +// with apply. +type ResourcePoolApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Generation *int64 `json:"generation,omitempty"` + ResourceSliceCount *int64 `json:"resourceSliceCount,omitempty"` +} + +// ResourcePoolApplyConfiguration constructs a declarative configuration of the ResourcePool type for use with +// apply. +func ResourcePool() *ResourcePoolApplyConfiguration { + return &ResourcePoolApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ResourcePoolApplyConfiguration) WithName(value string) *ResourcePoolApplyConfiguration { + b.Name = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ResourcePoolApplyConfiguration) WithGeneration(value int64) *ResourcePoolApplyConfiguration { + b.Generation = &value + return b +} + +// WithResourceSliceCount sets the ResourceSliceCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceSliceCount field is set to the value of the last call. +func (b *ResourcePoolApplyConfiguration) WithResourceSliceCount(value int64) *ResourcePoolApplyConfiguration { + b.ResourceSliceCount = &value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcerequest.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcerequest.go deleted file mode 100644 index d0d047e752c..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcerequest.go +++ /dev/null @@ -1,52 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// ResourceRequestApplyConfiguration represents a declarative configuration of the ResourceRequest type for use -// with apply. -type ResourceRequestApplyConfiguration struct { - VendorParameters *runtime.RawExtension `json:"vendorParameters,omitempty"` - ResourceRequestModelApplyConfiguration `json:",inline"` -} - -// ResourceRequestApplyConfiguration constructs a declarative configuration of the ResourceRequest type for use with -// apply. -func ResourceRequest() *ResourceRequestApplyConfiguration { - return &ResourceRequestApplyConfiguration{} -} - -// WithVendorParameters sets the VendorParameters field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the VendorParameters field is set to the value of the last call. -func (b *ResourceRequestApplyConfiguration) WithVendorParameters(value runtime.RawExtension) *ResourceRequestApplyConfiguration { - b.VendorParameters = &value - return b -} - -// WithNamedResources sets the NamedResources field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the NamedResources field is set to the value of the last call. -func (b *ResourceRequestApplyConfiguration) WithNamedResources(value *NamedResourcesRequestApplyConfiguration) *ResourceRequestApplyConfiguration { - b.NamedResources = value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcerequestmodel.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcerequestmodel.go deleted file mode 100644 index 35d18253199..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcerequestmodel.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -// ResourceRequestModelApplyConfiguration represents a declarative configuration of the ResourceRequestModel type for use -// with apply. -type ResourceRequestModelApplyConfiguration struct { - NamedResources *NamedResourcesRequestApplyConfiguration `json:"namedResources,omitempty"` -} - -// ResourceRequestModelApplyConfiguration constructs a declarative configuration of the ResourceRequestModel type for use with -// apply. -func ResourceRequestModel() *ResourceRequestModelApplyConfiguration { - return &ResourceRequestModelApplyConfiguration{} -} - -// WithNamedResources sets the NamedResources field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the NamedResources field is set to the value of the last call. -func (b *ResourceRequestModelApplyConfiguration) WithNamedResources(value *NamedResourcesRequestApplyConfiguration) *ResourceRequestModelApplyConfiguration { - b.NamedResources = value - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceslice.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceslice.go index 7486e75c82a..aaad68612ec 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceslice.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceslice.go @@ -32,9 +32,7 @@ import ( type ResourceSliceApplyConfiguration struct { v1.TypeMetaApplyConfiguration `json:",inline"` *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` - NodeName *string `json:"nodeName,omitempty"` - DriverName *string `json:"driverName,omitempty"` - ResourceModelApplyConfiguration `json:",inline"` + Spec *ResourceSliceSpecApplyConfiguration `json:"spec,omitempty"` } // ResourceSlice constructs a declarative configuration of the ResourceSlice type for use with @@ -240,27 +238,11 @@ func (b *ResourceSliceApplyConfiguration) ensureObjectMetaApplyConfigurationExis } } -// WithNodeName sets the NodeName field in the declarative configuration to the given value +// WithSpec sets the Spec field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the NodeName field is set to the value of the last call. -func (b *ResourceSliceApplyConfiguration) WithNodeName(value string) *ResourceSliceApplyConfiguration { - b.NodeName = &value - return b -} - -// WithDriverName sets the DriverName field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the DriverName field is set to the value of the last call. -func (b *ResourceSliceApplyConfiguration) WithDriverName(value string) *ResourceSliceApplyConfiguration { - b.DriverName = &value - return b -} - -// WithNamedResources sets the NamedResources field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the NamedResources field is set to the value of the last call. -func (b *ResourceSliceApplyConfiguration) WithNamedResources(value *NamedResourcesResourcesApplyConfiguration) *ResourceSliceApplyConfiguration { - b.NamedResources = value +// If called multiple times, the Spec field is set to the value of the last call. +func (b *ResourceSliceApplyConfiguration) WithSpec(value *ResourceSliceSpecApplyConfiguration) *ResourceSliceApplyConfiguration { + b.Spec = value return b } diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceslicespec.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceslicespec.go new file mode 100644 index 00000000000..2ded7590739 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourceslicespec.go @@ -0,0 +1,93 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha3 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// ResourceSliceSpecApplyConfiguration represents a declarative configuration of the ResourceSliceSpec type for use +// with apply. +type ResourceSliceSpecApplyConfiguration struct { + Driver *string `json:"driver,omitempty"` + Pool *ResourcePoolApplyConfiguration `json:"pool,omitempty"` + NodeName *string `json:"nodeName,omitempty"` + NodeSelector *v1.NodeSelectorApplyConfiguration `json:"nodeSelector,omitempty"` + AllNodes *bool `json:"allNodes,omitempty"` + Devices []DeviceApplyConfiguration `json:"devices,omitempty"` +} + +// ResourceSliceSpecApplyConfiguration constructs a declarative configuration of the ResourceSliceSpec type for use with +// apply. +func ResourceSliceSpec() *ResourceSliceSpecApplyConfiguration { + return &ResourceSliceSpecApplyConfiguration{} +} + +// WithDriver sets the Driver field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Driver field is set to the value of the last call. +func (b *ResourceSliceSpecApplyConfiguration) WithDriver(value string) *ResourceSliceSpecApplyConfiguration { + b.Driver = &value + return b +} + +// WithPool sets the Pool field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Pool field is set to the value of the last call. +func (b *ResourceSliceSpecApplyConfiguration) WithPool(value *ResourcePoolApplyConfiguration) *ResourceSliceSpecApplyConfiguration { + b.Pool = value + return b +} + +// WithNodeName sets the NodeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeName field is set to the value of the last call. +func (b *ResourceSliceSpecApplyConfiguration) WithNodeName(value string) *ResourceSliceSpecApplyConfiguration { + b.NodeName = &value + return b +} + +// WithNodeSelector sets the NodeSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeSelector field is set to the value of the last call. +func (b *ResourceSliceSpecApplyConfiguration) WithNodeSelector(value *v1.NodeSelectorApplyConfiguration) *ResourceSliceSpecApplyConfiguration { + b.NodeSelector = value + return b +} + +// WithAllNodes sets the AllNodes field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AllNodes field is set to the value of the last call. +func (b *ResourceSliceSpecApplyConfiguration) WithAllNodes(value bool) *ResourceSliceSpecApplyConfiguration { + b.AllNodes = &value + return b +} + +// WithDevices adds the given value to the Devices field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Devices field. +func (b *ResourceSliceSpecApplyConfiguration) WithDevices(values ...*DeviceApplyConfiguration) *ResourceSliceSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithDevices") + } + b.Devices = append(b.Devices, *values[i]) + } + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/structuredresourcehandle.go b/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/structuredresourcehandle.go deleted file mode 100644 index 0d58994c942..00000000000 --- a/staging/src/k8s.io/client-go/applyconfigurations/resource/v1alpha3/structuredresourcehandle.go +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by applyconfiguration-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// StructuredResourceHandleApplyConfiguration represents a declarative configuration of the StructuredResourceHandle type for use -// with apply. -type StructuredResourceHandleApplyConfiguration struct { - VendorClassParameters *runtime.RawExtension `json:"vendorClassParameters,omitempty"` - VendorClaimParameters *runtime.RawExtension `json:"vendorClaimParameters,omitempty"` - NodeName *string `json:"nodeName,omitempty"` - Results []DriverAllocationResultApplyConfiguration `json:"results,omitempty"` -} - -// StructuredResourceHandleApplyConfiguration constructs a declarative configuration of the StructuredResourceHandle type for use with -// apply. -func StructuredResourceHandle() *StructuredResourceHandleApplyConfiguration { - return &StructuredResourceHandleApplyConfiguration{} -} - -// WithVendorClassParameters sets the VendorClassParameters field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the VendorClassParameters field is set to the value of the last call. -func (b *StructuredResourceHandleApplyConfiguration) WithVendorClassParameters(value runtime.RawExtension) *StructuredResourceHandleApplyConfiguration { - b.VendorClassParameters = &value - return b -} - -// WithVendorClaimParameters sets the VendorClaimParameters field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the VendorClaimParameters field is set to the value of the last call. -func (b *StructuredResourceHandleApplyConfiguration) WithVendorClaimParameters(value runtime.RawExtension) *StructuredResourceHandleApplyConfiguration { - b.VendorClaimParameters = &value - return b -} - -// WithNodeName sets the NodeName field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the NodeName field is set to the value of the last call. -func (b *StructuredResourceHandleApplyConfiguration) WithNodeName(value string) *StructuredResourceHandleApplyConfiguration { - b.NodeName = &value - return b -} - -// WithResults adds the given value to the Results field in the declarative configuration -// and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, values provided by each call will be appended to the Results field. -func (b *StructuredResourceHandleApplyConfiguration) WithResults(values ...*DriverAllocationResultApplyConfiguration) *StructuredResourceHandleApplyConfiguration { - for i := range values { - if values[i] == nil { - panic("nil value passed to WithResults") - } - b.Results = append(b.Results, *values[i]) - } - return b -} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/utils.go b/staging/src/k8s.io/client-go/applyconfigurations/utils.go index 0bc1607a42b..64ffaa9f479 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/utils.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/utils.go @@ -1556,30 +1556,40 @@ func ForKind(kind schema.GroupVersionKind) interface{} { // Group=resource.k8s.io, Version=v1alpha3 case v1alpha3.SchemeGroupVersion.WithKind("AllocationResult"): return &resourcev1alpha3.AllocationResultApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("AllocationResultModel"): - return &resourcev1alpha3.AllocationResultModelApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("DriverAllocationResult"): - return &resourcev1alpha3.DriverAllocationResultApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("DriverRequests"): - return &resourcev1alpha3.DriverRequestsApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("NamedResourcesAllocationResult"): - return &resourcev1alpha3.NamedResourcesAllocationResultApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("NamedResourcesAttribute"): - return &resourcev1alpha3.NamedResourcesAttributeApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("NamedResourcesAttributeValue"): - return &resourcev1alpha3.NamedResourcesAttributeValueApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("NamedResourcesFilter"): - return &resourcev1alpha3.NamedResourcesFilterApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("NamedResourcesInstance"): - return &resourcev1alpha3.NamedResourcesInstanceApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("NamedResourcesIntSlice"): - return &resourcev1alpha3.NamedResourcesIntSliceApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("NamedResourcesRequest"): - return &resourcev1alpha3.NamedResourcesRequestApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("NamedResourcesResources"): - return &resourcev1alpha3.NamedResourcesResourcesApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("NamedResourcesStringSlice"): - return &resourcev1alpha3.NamedResourcesStringSliceApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("BasicDevice"): + return &resourcev1alpha3.BasicDeviceApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("CELDeviceSelector"): + return &resourcev1alpha3.CELDeviceSelectorApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("Device"): + return &resourcev1alpha3.DeviceApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceAllocationConfiguration"): + return &resourcev1alpha3.DeviceAllocationConfigurationApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceAllocationResult"): + return &resourcev1alpha3.DeviceAllocationResultApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceAttribute"): + return &resourcev1alpha3.DeviceAttributeApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceClaim"): + return &resourcev1alpha3.DeviceClaimApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceClaimConfiguration"): + return &resourcev1alpha3.DeviceClaimConfigurationApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceClass"): + return &resourcev1alpha3.DeviceClassApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceClassConfiguration"): + return &resourcev1alpha3.DeviceClassConfigurationApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceClassSpec"): + return &resourcev1alpha3.DeviceClassSpecApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceConfiguration"): + return &resourcev1alpha3.DeviceConfigurationApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceConstraint"): + return &resourcev1alpha3.DeviceConstraintApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceRequest"): + return &resourcev1alpha3.DeviceRequestApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceRequestAllocationResult"): + return &resourcev1alpha3.DeviceRequestAllocationResultApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("DeviceSelector"): + return &resourcev1alpha3.DeviceSelectorApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("OpaqueDeviceConfiguration"): + return &resourcev1alpha3.OpaqueDeviceConfigurationApplyConfiguration{} case v1alpha3.SchemeGroupVersion.WithKind("PodSchedulingContext"): return &resourcev1alpha3.PodSchedulingContextApplyConfiguration{} case v1alpha3.SchemeGroupVersion.WithKind("PodSchedulingContextSpec"): @@ -1590,10 +1600,6 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &resourcev1alpha3.ResourceClaimApplyConfiguration{} case v1alpha3.SchemeGroupVersion.WithKind("ResourceClaimConsumerReference"): return &resourcev1alpha3.ResourceClaimConsumerReferenceApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("ResourceClaimParameters"): - return &resourcev1alpha3.ResourceClaimParametersApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("ResourceClaimParametersReference"): - return &resourcev1alpha3.ResourceClaimParametersReferenceApplyConfiguration{} case v1alpha3.SchemeGroupVersion.WithKind("ResourceClaimSchedulingStatus"): return &resourcev1alpha3.ResourceClaimSchedulingStatusApplyConfiguration{} case v1alpha3.SchemeGroupVersion.WithKind("ResourceClaimSpec"): @@ -1604,30 +1610,12 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &resourcev1alpha3.ResourceClaimTemplateApplyConfiguration{} case v1alpha3.SchemeGroupVersion.WithKind("ResourceClaimTemplateSpec"): return &resourcev1alpha3.ResourceClaimTemplateSpecApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("ResourceClass"): - return &resourcev1alpha3.ResourceClassApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("ResourceClassParameters"): - return &resourcev1alpha3.ResourceClassParametersApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("ResourceClassParametersReference"): - return &resourcev1alpha3.ResourceClassParametersReferenceApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("ResourceFilter"): - return &resourcev1alpha3.ResourceFilterApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("ResourceFilterModel"): - return &resourcev1alpha3.ResourceFilterModelApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("ResourceHandle"): - return &resourcev1alpha3.ResourceHandleApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("ResourceModel"): - return &resourcev1alpha3.ResourceModelApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("ResourceRequest"): - return &resourcev1alpha3.ResourceRequestApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("ResourceRequestModel"): - return &resourcev1alpha3.ResourceRequestModelApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("ResourcePool"): + return &resourcev1alpha3.ResourcePoolApplyConfiguration{} case v1alpha3.SchemeGroupVersion.WithKind("ResourceSlice"): return &resourcev1alpha3.ResourceSliceApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("StructuredResourceHandle"): - return &resourcev1alpha3.StructuredResourceHandleApplyConfiguration{} - case v1alpha3.SchemeGroupVersion.WithKind("VendorParameters"): - return &resourcev1alpha3.VendorParametersApplyConfiguration{} + case v1alpha3.SchemeGroupVersion.WithKind("ResourceSliceSpec"): + return &resourcev1alpha3.ResourceSliceSpecApplyConfiguration{} // Group=scheduling.k8s.io, Version=v1 case schedulingv1.SchemeGroupVersion.WithKind("PriorityClass"): diff --git a/staging/src/k8s.io/client-go/informers/generic.go b/staging/src/k8s.io/client-go/informers/generic.go index 42c8f22aab5..c7df13f2525 100644 --- a/staging/src/k8s.io/client-go/informers/generic.go +++ b/staging/src/k8s.io/client-go/informers/generic.go @@ -367,18 +367,14 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1beta1().RoleBindings().Informer()}, nil // Group=resource.k8s.io, Version=v1alpha3 + case v1alpha3.SchemeGroupVersion.WithResource("deviceclasses"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Resource().V1alpha3().DeviceClasses().Informer()}, nil case v1alpha3.SchemeGroupVersion.WithResource("podschedulingcontexts"): return &genericInformer{resource: resource.GroupResource(), informer: f.Resource().V1alpha3().PodSchedulingContexts().Informer()}, nil case v1alpha3.SchemeGroupVersion.WithResource("resourceclaims"): return &genericInformer{resource: resource.GroupResource(), informer: f.Resource().V1alpha3().ResourceClaims().Informer()}, nil - case v1alpha3.SchemeGroupVersion.WithResource("resourceclaimparameters"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Resource().V1alpha3().ResourceClaimParameters().Informer()}, nil case v1alpha3.SchemeGroupVersion.WithResource("resourceclaimtemplates"): return &genericInformer{resource: resource.GroupResource(), informer: f.Resource().V1alpha3().ResourceClaimTemplates().Informer()}, nil - case v1alpha3.SchemeGroupVersion.WithResource("resourceclasses"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Resource().V1alpha3().ResourceClasses().Informer()}, nil - case v1alpha3.SchemeGroupVersion.WithResource("resourceclassparameters"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Resource().V1alpha3().ResourceClassParameters().Informer()}, nil case v1alpha3.SchemeGroupVersion.WithResource("resourceslices"): return &genericInformer{resource: resource.GroupResource(), informer: f.Resource().V1alpha3().ResourceSlices().Informer()}, nil diff --git a/staging/src/k8s.io/client-go/informers/resource/v1alpha3/resourceclass.go b/staging/src/k8s.io/client-go/informers/resource/v1alpha3/deviceclass.go similarity index 55% rename from staging/src/k8s.io/client-go/informers/resource/v1alpha3/resourceclass.go rename to staging/src/k8s.io/client-go/informers/resource/v1alpha3/deviceclass.go index f63141a70e0..c0bcbd1905c 100644 --- a/staging/src/k8s.io/client-go/informers/resource/v1alpha3/resourceclass.go +++ b/staging/src/k8s.io/client-go/informers/resource/v1alpha3/deviceclass.go @@ -32,58 +32,58 @@ import ( cache "k8s.io/client-go/tools/cache" ) -// ResourceClassInformer provides access to a shared informer and lister for -// ResourceClasses. -type ResourceClassInformer interface { +// DeviceClassInformer provides access to a shared informer and lister for +// DeviceClasses. +type DeviceClassInformer interface { Informer() cache.SharedIndexInformer - Lister() v1alpha3.ResourceClassLister + Lister() v1alpha3.DeviceClassLister } -type resourceClassInformer struct { +type deviceClassInformer struct { factory internalinterfaces.SharedInformerFactory tweakListOptions internalinterfaces.TweakListOptionsFunc } -// NewResourceClassInformer constructs a new informer for ResourceClass type. +// NewDeviceClassInformer constructs a new informer for DeviceClass type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewResourceClassInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredResourceClassInformer(client, resyncPeriod, indexers, nil) +func NewDeviceClassInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredDeviceClassInformer(client, resyncPeriod, indexers, nil) } -// NewFilteredResourceClassInformer constructs a new informer for ResourceClass type. +// NewFilteredDeviceClassInformer constructs a new informer for DeviceClass type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewFilteredResourceClassInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { +func NewFilteredDeviceClassInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options v1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.ResourceV1alpha3().ResourceClasses().List(context.TODO(), options) + return client.ResourceV1alpha3().DeviceClasses().List(context.TODO(), options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.ResourceV1alpha3().ResourceClasses().Watch(context.TODO(), options) + return client.ResourceV1alpha3().DeviceClasses().Watch(context.TODO(), options) }, }, - &resourcev1alpha3.ResourceClass{}, + &resourcev1alpha3.DeviceClass{}, resyncPeriod, indexers, ) } -func (f *resourceClassInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredResourceClassInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +func (f *deviceClassInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredDeviceClassInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) } -func (f *resourceClassInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&resourcev1alpha3.ResourceClass{}, f.defaultInformer) +func (f *deviceClassInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&resourcev1alpha3.DeviceClass{}, f.defaultInformer) } -func (f *resourceClassInformer) Lister() v1alpha3.ResourceClassLister { - return v1alpha3.NewResourceClassLister(f.Informer().GetIndexer()) +func (f *deviceClassInformer) Lister() v1alpha3.DeviceClassLister { + return v1alpha3.NewDeviceClassLister(f.Informer().GetIndexer()) } diff --git a/staging/src/k8s.io/client-go/informers/resource/v1alpha3/interface.go b/staging/src/k8s.io/client-go/informers/resource/v1alpha3/interface.go index 36b9f1c7824..481a7de4518 100644 --- a/staging/src/k8s.io/client-go/informers/resource/v1alpha3/interface.go +++ b/staging/src/k8s.io/client-go/informers/resource/v1alpha3/interface.go @@ -24,18 +24,14 @@ import ( // Interface provides access to all the informers in this group version. type Interface interface { + // DeviceClasses returns a DeviceClassInformer. + DeviceClasses() DeviceClassInformer // PodSchedulingContexts returns a PodSchedulingContextInformer. PodSchedulingContexts() PodSchedulingContextInformer // ResourceClaims returns a ResourceClaimInformer. ResourceClaims() ResourceClaimInformer - // ResourceClaimParameters returns a ResourceClaimParametersInformer. - ResourceClaimParameters() ResourceClaimParametersInformer // ResourceClaimTemplates returns a ResourceClaimTemplateInformer. ResourceClaimTemplates() ResourceClaimTemplateInformer - // ResourceClasses returns a ResourceClassInformer. - ResourceClasses() ResourceClassInformer - // ResourceClassParameters returns a ResourceClassParametersInformer. - ResourceClassParameters() ResourceClassParametersInformer // ResourceSlices returns a ResourceSliceInformer. ResourceSlices() ResourceSliceInformer } @@ -51,6 +47,11 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } +// DeviceClasses returns a DeviceClassInformer. +func (v *version) DeviceClasses() DeviceClassInformer { + return &deviceClassInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} +} + // PodSchedulingContexts returns a PodSchedulingContextInformer. func (v *version) PodSchedulingContexts() PodSchedulingContextInformer { return &podSchedulingContextInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} @@ -61,26 +62,11 @@ func (v *version) ResourceClaims() ResourceClaimInformer { return &resourceClaimInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } -// ResourceClaimParameters returns a ResourceClaimParametersInformer. -func (v *version) ResourceClaimParameters() ResourceClaimParametersInformer { - return &resourceClaimParametersInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} -} - // ResourceClaimTemplates returns a ResourceClaimTemplateInformer. func (v *version) ResourceClaimTemplates() ResourceClaimTemplateInformer { return &resourceClaimTemplateInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } -// ResourceClasses returns a ResourceClassInformer. -func (v *version) ResourceClasses() ResourceClassInformer { - return &resourceClassInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} -} - -// ResourceClassParameters returns a ResourceClassParametersInformer. -func (v *version) ResourceClassParameters() ResourceClassParametersInformer { - return &resourceClassParametersInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} -} - // ResourceSlices returns a ResourceSliceInformer. func (v *version) ResourceSlices() ResourceSliceInformer { return &resourceSliceInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} diff --git a/staging/src/k8s.io/client-go/informers/resource/v1alpha3/resourceclaimparameters.go b/staging/src/k8s.io/client-go/informers/resource/v1alpha3/resourceclaimparameters.go deleted file mode 100644 index 86df716241a..00000000000 --- a/staging/src/k8s.io/client-go/informers/resource/v1alpha3/resourceclaimparameters.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by informer-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - "context" - time "time" - - resourcev1alpha3 "k8s.io/api/resource/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" - watch "k8s.io/apimachinery/pkg/watch" - internalinterfaces "k8s.io/client-go/informers/internalinterfaces" - kubernetes "k8s.io/client-go/kubernetes" - v1alpha3 "k8s.io/client-go/listers/resource/v1alpha3" - cache "k8s.io/client-go/tools/cache" -) - -// ResourceClaimParametersInformer provides access to a shared informer and lister for -// ResourceClaimParameters. -type ResourceClaimParametersInformer interface { - Informer() cache.SharedIndexInformer - Lister() v1alpha3.ResourceClaimParametersLister -} - -type resourceClaimParametersInformer struct { - factory internalinterfaces.SharedInformerFactory - tweakListOptions internalinterfaces.TweakListOptionsFunc - namespace string -} - -// NewResourceClaimParametersInformer constructs a new informer for ResourceClaimParameters type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewResourceClaimParametersInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredResourceClaimParametersInformer(client, namespace, resyncPeriod, indexers, nil) -} - -// NewFilteredResourceClaimParametersInformer constructs a new informer for ResourceClaimParameters type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewFilteredResourceClaimParametersInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { - return cache.NewSharedIndexInformer( - &cache.ListWatch{ - ListFunc: func(options v1.ListOptions) (runtime.Object, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.ResourceV1alpha3().ResourceClaimParameters(namespace).List(context.TODO(), options) - }, - WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.ResourceV1alpha3().ResourceClaimParameters(namespace).Watch(context.TODO(), options) - }, - }, - &resourcev1alpha3.ResourceClaimParameters{}, - resyncPeriod, - indexers, - ) -} - -func (f *resourceClaimParametersInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredResourceClaimParametersInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) -} - -func (f *resourceClaimParametersInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&resourcev1alpha3.ResourceClaimParameters{}, f.defaultInformer) -} - -func (f *resourceClaimParametersInformer) Lister() v1alpha3.ResourceClaimParametersLister { - return v1alpha3.NewResourceClaimParametersLister(f.Informer().GetIndexer()) -} diff --git a/staging/src/k8s.io/client-go/informers/resource/v1alpha3/resourceclassparameters.go b/staging/src/k8s.io/client-go/informers/resource/v1alpha3/resourceclassparameters.go deleted file mode 100644 index cb2172f5c0d..00000000000 --- a/staging/src/k8s.io/client-go/informers/resource/v1alpha3/resourceclassparameters.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by informer-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - "context" - time "time" - - resourcev1alpha3 "k8s.io/api/resource/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" - watch "k8s.io/apimachinery/pkg/watch" - internalinterfaces "k8s.io/client-go/informers/internalinterfaces" - kubernetes "k8s.io/client-go/kubernetes" - v1alpha3 "k8s.io/client-go/listers/resource/v1alpha3" - cache "k8s.io/client-go/tools/cache" -) - -// ResourceClassParametersInformer provides access to a shared informer and lister for -// ResourceClassParameters. -type ResourceClassParametersInformer interface { - Informer() cache.SharedIndexInformer - Lister() v1alpha3.ResourceClassParametersLister -} - -type resourceClassParametersInformer struct { - factory internalinterfaces.SharedInformerFactory - tweakListOptions internalinterfaces.TweakListOptionsFunc - namespace string -} - -// NewResourceClassParametersInformer constructs a new informer for ResourceClassParameters type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewResourceClassParametersInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredResourceClassParametersInformer(client, namespace, resyncPeriod, indexers, nil) -} - -// NewFilteredResourceClassParametersInformer constructs a new informer for ResourceClassParameters type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewFilteredResourceClassParametersInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { - return cache.NewSharedIndexInformer( - &cache.ListWatch{ - ListFunc: func(options v1.ListOptions) (runtime.Object, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.ResourceV1alpha3().ResourceClassParameters(namespace).List(context.TODO(), options) - }, - WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.ResourceV1alpha3().ResourceClassParameters(namespace).Watch(context.TODO(), options) - }, - }, - &resourcev1alpha3.ResourceClassParameters{}, - resyncPeriod, - indexers, - ) -} - -func (f *resourceClassParametersInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredResourceClassParametersInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) -} - -func (f *resourceClassParametersInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&resourcev1alpha3.ResourceClassParameters{}, f.defaultInformer) -} - -func (f *resourceClassParametersInformer) Lister() v1alpha3.ResourceClassParametersLister { - return v1alpha3.NewResourceClassParametersLister(f.Informer().GetIndexer()) -} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/deviceclass.go b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/deviceclass.go new file mode 100644 index 00000000000..35455dfa357 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/deviceclass.go @@ -0,0 +1,69 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha3 + +import ( + "context" + + v1alpha3 "k8s.io/api/resource/v1alpha3" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + resourcev1alpha3 "k8s.io/client-go/applyconfigurations/resource/v1alpha3" + gentype "k8s.io/client-go/gentype" + scheme "k8s.io/client-go/kubernetes/scheme" +) + +// DeviceClassesGetter has a method to return a DeviceClassInterface. +// A group's client should implement this interface. +type DeviceClassesGetter interface { + DeviceClasses() DeviceClassInterface +} + +// DeviceClassInterface has methods to work with DeviceClass resources. +type DeviceClassInterface interface { + Create(ctx context.Context, deviceClass *v1alpha3.DeviceClass, opts v1.CreateOptions) (*v1alpha3.DeviceClass, error) + Update(ctx context.Context, deviceClass *v1alpha3.DeviceClass, opts v1.UpdateOptions) (*v1alpha3.DeviceClass, error) + Delete(ctx context.Context, name string, opts v1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error + Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha3.DeviceClass, error) + List(ctx context.Context, opts v1.ListOptions) (*v1alpha3.DeviceClassList, error) + Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.DeviceClass, err error) + Apply(ctx context.Context, deviceClass *resourcev1alpha3.DeviceClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha3.DeviceClass, err error) + DeviceClassExpansion +} + +// deviceClasses implements DeviceClassInterface +type deviceClasses struct { + *gentype.ClientWithListAndApply[*v1alpha3.DeviceClass, *v1alpha3.DeviceClassList, *resourcev1alpha3.DeviceClassApplyConfiguration] +} + +// newDeviceClasses returns a DeviceClasses +func newDeviceClasses(c *ResourceV1alpha3Client) *deviceClasses { + return &deviceClasses{ + gentype.NewClientWithListAndApply[*v1alpha3.DeviceClass, *v1alpha3.DeviceClassList, *resourcev1alpha3.DeviceClassApplyConfiguration]( + "deviceclasses", + c.RESTClient(), + scheme.ParameterCodec, + "", + func() *v1alpha3.DeviceClass { return &v1alpha3.DeviceClass{} }, + func() *v1alpha3.DeviceClassList { return &v1alpha3.DeviceClassList{} }), + } +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_deviceclass.go b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_deviceclass.go new file mode 100644 index 00000000000..d96cbd22198 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_deviceclass.go @@ -0,0 +1,151 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + "context" + json "encoding/json" + "fmt" + + v1alpha3 "k8s.io/api/resource/v1alpha3" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + resourcev1alpha3 "k8s.io/client-go/applyconfigurations/resource/v1alpha3" + testing "k8s.io/client-go/testing" +) + +// FakeDeviceClasses implements DeviceClassInterface +type FakeDeviceClasses struct { + Fake *FakeResourceV1alpha3 +} + +var deviceclassesResource = v1alpha3.SchemeGroupVersion.WithResource("deviceclasses") + +var deviceclassesKind = v1alpha3.SchemeGroupVersion.WithKind("DeviceClass") + +// Get takes name of the deviceClass, and returns the corresponding deviceClass object, and an error if there is any. +func (c *FakeDeviceClasses) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha3.DeviceClass, err error) { + emptyResult := &v1alpha3.DeviceClass{} + obj, err := c.Fake. + Invokes(testing.NewRootGetActionWithOptions(deviceclassesResource, name, options), emptyResult) + if obj == nil { + return emptyResult, err + } + return obj.(*v1alpha3.DeviceClass), err +} + +// List takes label and field selectors, and returns the list of DeviceClasses that match those selectors. +func (c *FakeDeviceClasses) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha3.DeviceClassList, err error) { + emptyResult := &v1alpha3.DeviceClassList{} + obj, err := c.Fake. + Invokes(testing.NewRootListActionWithOptions(deviceclassesResource, deviceclassesKind, opts), emptyResult) + if obj == nil { + return emptyResult, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha3.DeviceClassList{ListMeta: obj.(*v1alpha3.DeviceClassList).ListMeta} + for _, item := range obj.(*v1alpha3.DeviceClassList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested deviceClasses. +func (c *FakeDeviceClasses) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewRootWatchActionWithOptions(deviceclassesResource, opts)) +} + +// Create takes the representation of a deviceClass and creates it. Returns the server's representation of the deviceClass, and an error, if there is any. +func (c *FakeDeviceClasses) Create(ctx context.Context, deviceClass *v1alpha3.DeviceClass, opts v1.CreateOptions) (result *v1alpha3.DeviceClass, err error) { + emptyResult := &v1alpha3.DeviceClass{} + obj, err := c.Fake. + Invokes(testing.NewRootCreateActionWithOptions(deviceclassesResource, deviceClass, opts), emptyResult) + if obj == nil { + return emptyResult, err + } + return obj.(*v1alpha3.DeviceClass), err +} + +// Update takes the representation of a deviceClass and updates it. Returns the server's representation of the deviceClass, and an error, if there is any. +func (c *FakeDeviceClasses) Update(ctx context.Context, deviceClass *v1alpha3.DeviceClass, opts v1.UpdateOptions) (result *v1alpha3.DeviceClass, err error) { + emptyResult := &v1alpha3.DeviceClass{} + obj, err := c.Fake. + Invokes(testing.NewRootUpdateActionWithOptions(deviceclassesResource, deviceClass, opts), emptyResult) + if obj == nil { + return emptyResult, err + } + return obj.(*v1alpha3.DeviceClass), err +} + +// Delete takes name of the deviceClass and deletes it. Returns an error if one occurs. +func (c *FakeDeviceClasses) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewRootDeleteActionWithOptions(deviceclassesResource, name, opts), &v1alpha3.DeviceClass{}) + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeDeviceClasses) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewRootDeleteCollectionActionWithOptions(deviceclassesResource, opts, listOpts) + + _, err := c.Fake.Invokes(action, &v1alpha3.DeviceClassList{}) + return err +} + +// Patch applies the patch and returns the patched deviceClass. +func (c *FakeDeviceClasses) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.DeviceClass, err error) { + emptyResult := &v1alpha3.DeviceClass{} + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceActionWithOptions(deviceclassesResource, name, pt, data, opts, subresources...), emptyResult) + if obj == nil { + return emptyResult, err + } + return obj.(*v1alpha3.DeviceClass), err +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied deviceClass. +func (c *FakeDeviceClasses) Apply(ctx context.Context, deviceClass *resourcev1alpha3.DeviceClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha3.DeviceClass, err error) { + if deviceClass == nil { + return nil, fmt.Errorf("deviceClass provided to Apply must not be nil") + } + data, err := json.Marshal(deviceClass) + if err != nil { + return nil, err + } + name := deviceClass.Name + if name == nil { + return nil, fmt.Errorf("deviceClass.Name must be provided to Apply") + } + emptyResult := &v1alpha3.DeviceClass{} + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceActionWithOptions(deviceclassesResource, *name, types.ApplyPatchType, data, opts.ToPatchOptions()), emptyResult) + if obj == nil { + return emptyResult, err + } + return obj.(*v1alpha3.DeviceClass), err +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resource_client.go b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resource_client.go index d01b28c66a2..4523d9f09cd 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resource_client.go +++ b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resource_client.go @@ -28,6 +28,10 @@ type FakeResourceV1alpha3 struct { *testing.Fake } +func (c *FakeResourceV1alpha3) DeviceClasses() v1alpha3.DeviceClassInterface { + return &FakeDeviceClasses{c} +} + func (c *FakeResourceV1alpha3) PodSchedulingContexts(namespace string) v1alpha3.PodSchedulingContextInterface { return &FakePodSchedulingContexts{c, namespace} } @@ -36,22 +40,10 @@ func (c *FakeResourceV1alpha3) ResourceClaims(namespace string) v1alpha3.Resourc return &FakeResourceClaims{c, namespace} } -func (c *FakeResourceV1alpha3) ResourceClaimParameters(namespace string) v1alpha3.ResourceClaimParametersInterface { - return &FakeResourceClaimParameters{c, namespace} -} - func (c *FakeResourceV1alpha3) ResourceClaimTemplates(namespace string) v1alpha3.ResourceClaimTemplateInterface { return &FakeResourceClaimTemplates{c, namespace} } -func (c *FakeResourceV1alpha3) ResourceClasses() v1alpha3.ResourceClassInterface { - return &FakeResourceClasses{c} -} - -func (c *FakeResourceV1alpha3) ResourceClassParameters(namespace string) v1alpha3.ResourceClassParametersInterface { - return &FakeResourceClassParameters{c, namespace} -} - func (c *FakeResourceV1alpha3) ResourceSlices() v1alpha3.ResourceSliceInterface { return &FakeResourceSlices{c} } diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclaimparameters.go b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclaimparameters.go deleted file mode 100644 index 1f646101e57..00000000000 --- a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclaimparameters.go +++ /dev/null @@ -1,160 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - "context" - json "encoding/json" - "fmt" - - v1alpha3 "k8s.io/api/resource/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - resourcev1alpha3 "k8s.io/client-go/applyconfigurations/resource/v1alpha3" - testing "k8s.io/client-go/testing" -) - -// FakeResourceClaimParameters implements ResourceClaimParametersInterface -type FakeResourceClaimParameters struct { - Fake *FakeResourceV1alpha3 - ns string -} - -var resourceclaimparametersResource = v1alpha3.SchemeGroupVersion.WithResource("resourceclaimparameters") - -var resourceclaimparametersKind = v1alpha3.SchemeGroupVersion.WithKind("ResourceClaimParameters") - -// Get takes name of the resourceClaimParameters, and returns the corresponding resourceClaimParameters object, and an error if there is any. -func (c *FakeResourceClaimParameters) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha3.ResourceClaimParameters, err error) { - emptyResult := &v1alpha3.ResourceClaimParameters{} - obj, err := c.Fake. - Invokes(testing.NewGetActionWithOptions(resourceclaimparametersResource, c.ns, name, options), emptyResult) - - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClaimParameters), err -} - -// List takes label and field selectors, and returns the list of ResourceClaimParameters that match those selectors. -func (c *FakeResourceClaimParameters) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha3.ResourceClaimParametersList, err error) { - emptyResult := &v1alpha3.ResourceClaimParametersList{} - obj, err := c.Fake. - Invokes(testing.NewListActionWithOptions(resourceclaimparametersResource, resourceclaimparametersKind, c.ns, opts), emptyResult) - - if obj == nil { - return emptyResult, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha3.ResourceClaimParametersList{ListMeta: obj.(*v1alpha3.ResourceClaimParametersList).ListMeta} - for _, item := range obj.(*v1alpha3.ResourceClaimParametersList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested resourceClaimParameters. -func (c *FakeResourceClaimParameters) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchActionWithOptions(resourceclaimparametersResource, c.ns, opts)) - -} - -// Create takes the representation of a resourceClaimParameters and creates it. Returns the server's representation of the resourceClaimParameters, and an error, if there is any. -func (c *FakeResourceClaimParameters) Create(ctx context.Context, resourceClaimParameters *v1alpha3.ResourceClaimParameters, opts v1.CreateOptions) (result *v1alpha3.ResourceClaimParameters, err error) { - emptyResult := &v1alpha3.ResourceClaimParameters{} - obj, err := c.Fake. - Invokes(testing.NewCreateActionWithOptions(resourceclaimparametersResource, c.ns, resourceClaimParameters, opts), emptyResult) - - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClaimParameters), err -} - -// Update takes the representation of a resourceClaimParameters and updates it. Returns the server's representation of the resourceClaimParameters, and an error, if there is any. -func (c *FakeResourceClaimParameters) Update(ctx context.Context, resourceClaimParameters *v1alpha3.ResourceClaimParameters, opts v1.UpdateOptions) (result *v1alpha3.ResourceClaimParameters, err error) { - emptyResult := &v1alpha3.ResourceClaimParameters{} - obj, err := c.Fake. - Invokes(testing.NewUpdateActionWithOptions(resourceclaimparametersResource, c.ns, resourceClaimParameters, opts), emptyResult) - - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClaimParameters), err -} - -// Delete takes name of the resourceClaimParameters and deletes it. Returns an error if one occurs. -func (c *FakeResourceClaimParameters) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteActionWithOptions(resourceclaimparametersResource, c.ns, name, opts), &v1alpha3.ResourceClaimParameters{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeResourceClaimParameters) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { - action := testing.NewDeleteCollectionActionWithOptions(resourceclaimparametersResource, c.ns, opts, listOpts) - - _, err := c.Fake.Invokes(action, &v1alpha3.ResourceClaimParametersList{}) - return err -} - -// Patch applies the patch and returns the patched resourceClaimParameters. -func (c *FakeResourceClaimParameters) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.ResourceClaimParameters, err error) { - emptyResult := &v1alpha3.ResourceClaimParameters{} - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceActionWithOptions(resourceclaimparametersResource, c.ns, name, pt, data, opts, subresources...), emptyResult) - - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClaimParameters), err -} - -// Apply takes the given apply declarative configuration, applies it and returns the applied resourceClaimParameters. -func (c *FakeResourceClaimParameters) Apply(ctx context.Context, resourceClaimParameters *resourcev1alpha3.ResourceClaimParametersApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha3.ResourceClaimParameters, err error) { - if resourceClaimParameters == nil { - return nil, fmt.Errorf("resourceClaimParameters provided to Apply must not be nil") - } - data, err := json.Marshal(resourceClaimParameters) - if err != nil { - return nil, err - } - name := resourceClaimParameters.Name - if name == nil { - return nil, fmt.Errorf("resourceClaimParameters.Name must be provided to Apply") - } - emptyResult := &v1alpha3.ResourceClaimParameters{} - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceActionWithOptions(resourceclaimparametersResource, c.ns, *name, types.ApplyPatchType, data, opts.ToPatchOptions()), emptyResult) - - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClaimParameters), err -} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclass.go b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclass.go deleted file mode 100644 index 7de19088651..00000000000 --- a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclass.go +++ /dev/null @@ -1,151 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - "context" - json "encoding/json" - "fmt" - - v1alpha3 "k8s.io/api/resource/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - resourcev1alpha3 "k8s.io/client-go/applyconfigurations/resource/v1alpha3" - testing "k8s.io/client-go/testing" -) - -// FakeResourceClasses implements ResourceClassInterface -type FakeResourceClasses struct { - Fake *FakeResourceV1alpha3 -} - -var resourceclassesResource = v1alpha3.SchemeGroupVersion.WithResource("resourceclasses") - -var resourceclassesKind = v1alpha3.SchemeGroupVersion.WithKind("ResourceClass") - -// Get takes name of the resourceClass, and returns the corresponding resourceClass object, and an error if there is any. -func (c *FakeResourceClasses) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha3.ResourceClass, err error) { - emptyResult := &v1alpha3.ResourceClass{} - obj, err := c.Fake. - Invokes(testing.NewRootGetActionWithOptions(resourceclassesResource, name, options), emptyResult) - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClass), err -} - -// List takes label and field selectors, and returns the list of ResourceClasses that match those selectors. -func (c *FakeResourceClasses) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha3.ResourceClassList, err error) { - emptyResult := &v1alpha3.ResourceClassList{} - obj, err := c.Fake. - Invokes(testing.NewRootListActionWithOptions(resourceclassesResource, resourceclassesKind, opts), emptyResult) - if obj == nil { - return emptyResult, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha3.ResourceClassList{ListMeta: obj.(*v1alpha3.ResourceClassList).ListMeta} - for _, item := range obj.(*v1alpha3.ResourceClassList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested resourceClasses. -func (c *FakeResourceClasses) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewRootWatchActionWithOptions(resourceclassesResource, opts)) -} - -// Create takes the representation of a resourceClass and creates it. Returns the server's representation of the resourceClass, and an error, if there is any. -func (c *FakeResourceClasses) Create(ctx context.Context, resourceClass *v1alpha3.ResourceClass, opts v1.CreateOptions) (result *v1alpha3.ResourceClass, err error) { - emptyResult := &v1alpha3.ResourceClass{} - obj, err := c.Fake. - Invokes(testing.NewRootCreateActionWithOptions(resourceclassesResource, resourceClass, opts), emptyResult) - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClass), err -} - -// Update takes the representation of a resourceClass and updates it. Returns the server's representation of the resourceClass, and an error, if there is any. -func (c *FakeResourceClasses) Update(ctx context.Context, resourceClass *v1alpha3.ResourceClass, opts v1.UpdateOptions) (result *v1alpha3.ResourceClass, err error) { - emptyResult := &v1alpha3.ResourceClass{} - obj, err := c.Fake. - Invokes(testing.NewRootUpdateActionWithOptions(resourceclassesResource, resourceClass, opts), emptyResult) - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClass), err -} - -// Delete takes name of the resourceClass and deletes it. Returns an error if one occurs. -func (c *FakeResourceClasses) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewRootDeleteActionWithOptions(resourceclassesResource, name, opts), &v1alpha3.ResourceClass{}) - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeResourceClasses) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { - action := testing.NewRootDeleteCollectionActionWithOptions(resourceclassesResource, opts, listOpts) - - _, err := c.Fake.Invokes(action, &v1alpha3.ResourceClassList{}) - return err -} - -// Patch applies the patch and returns the patched resourceClass. -func (c *FakeResourceClasses) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.ResourceClass, err error) { - emptyResult := &v1alpha3.ResourceClass{} - obj, err := c.Fake. - Invokes(testing.NewRootPatchSubresourceActionWithOptions(resourceclassesResource, name, pt, data, opts, subresources...), emptyResult) - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClass), err -} - -// Apply takes the given apply declarative configuration, applies it and returns the applied resourceClass. -func (c *FakeResourceClasses) Apply(ctx context.Context, resourceClass *resourcev1alpha3.ResourceClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha3.ResourceClass, err error) { - if resourceClass == nil { - return nil, fmt.Errorf("resourceClass provided to Apply must not be nil") - } - data, err := json.Marshal(resourceClass) - if err != nil { - return nil, err - } - name := resourceClass.Name - if name == nil { - return nil, fmt.Errorf("resourceClass.Name must be provided to Apply") - } - emptyResult := &v1alpha3.ResourceClass{} - obj, err := c.Fake. - Invokes(testing.NewRootPatchSubresourceActionWithOptions(resourceclassesResource, *name, types.ApplyPatchType, data, opts.ToPatchOptions()), emptyResult) - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClass), err -} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclassparameters.go b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclassparameters.go deleted file mode 100644 index c61412de534..00000000000 --- a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourceclassparameters.go +++ /dev/null @@ -1,160 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - "context" - json "encoding/json" - "fmt" - - v1alpha3 "k8s.io/api/resource/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - resourcev1alpha3 "k8s.io/client-go/applyconfigurations/resource/v1alpha3" - testing "k8s.io/client-go/testing" -) - -// FakeResourceClassParameters implements ResourceClassParametersInterface -type FakeResourceClassParameters struct { - Fake *FakeResourceV1alpha3 - ns string -} - -var resourceclassparametersResource = v1alpha3.SchemeGroupVersion.WithResource("resourceclassparameters") - -var resourceclassparametersKind = v1alpha3.SchemeGroupVersion.WithKind("ResourceClassParameters") - -// Get takes name of the resourceClassParameters, and returns the corresponding resourceClassParameters object, and an error if there is any. -func (c *FakeResourceClassParameters) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha3.ResourceClassParameters, err error) { - emptyResult := &v1alpha3.ResourceClassParameters{} - obj, err := c.Fake. - Invokes(testing.NewGetActionWithOptions(resourceclassparametersResource, c.ns, name, options), emptyResult) - - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClassParameters), err -} - -// List takes label and field selectors, and returns the list of ResourceClassParameters that match those selectors. -func (c *FakeResourceClassParameters) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha3.ResourceClassParametersList, err error) { - emptyResult := &v1alpha3.ResourceClassParametersList{} - obj, err := c.Fake. - Invokes(testing.NewListActionWithOptions(resourceclassparametersResource, resourceclassparametersKind, c.ns, opts), emptyResult) - - if obj == nil { - return emptyResult, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha3.ResourceClassParametersList{ListMeta: obj.(*v1alpha3.ResourceClassParametersList).ListMeta} - for _, item := range obj.(*v1alpha3.ResourceClassParametersList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested resourceClassParameters. -func (c *FakeResourceClassParameters) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchActionWithOptions(resourceclassparametersResource, c.ns, opts)) - -} - -// Create takes the representation of a resourceClassParameters and creates it. Returns the server's representation of the resourceClassParameters, and an error, if there is any. -func (c *FakeResourceClassParameters) Create(ctx context.Context, resourceClassParameters *v1alpha3.ResourceClassParameters, opts v1.CreateOptions) (result *v1alpha3.ResourceClassParameters, err error) { - emptyResult := &v1alpha3.ResourceClassParameters{} - obj, err := c.Fake. - Invokes(testing.NewCreateActionWithOptions(resourceclassparametersResource, c.ns, resourceClassParameters, opts), emptyResult) - - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClassParameters), err -} - -// Update takes the representation of a resourceClassParameters and updates it. Returns the server's representation of the resourceClassParameters, and an error, if there is any. -func (c *FakeResourceClassParameters) Update(ctx context.Context, resourceClassParameters *v1alpha3.ResourceClassParameters, opts v1.UpdateOptions) (result *v1alpha3.ResourceClassParameters, err error) { - emptyResult := &v1alpha3.ResourceClassParameters{} - obj, err := c.Fake. - Invokes(testing.NewUpdateActionWithOptions(resourceclassparametersResource, c.ns, resourceClassParameters, opts), emptyResult) - - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClassParameters), err -} - -// Delete takes name of the resourceClassParameters and deletes it. Returns an error if one occurs. -func (c *FakeResourceClassParameters) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteActionWithOptions(resourceclassparametersResource, c.ns, name, opts), &v1alpha3.ResourceClassParameters{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeResourceClassParameters) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { - action := testing.NewDeleteCollectionActionWithOptions(resourceclassparametersResource, c.ns, opts, listOpts) - - _, err := c.Fake.Invokes(action, &v1alpha3.ResourceClassParametersList{}) - return err -} - -// Patch applies the patch and returns the patched resourceClassParameters. -func (c *FakeResourceClassParameters) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.ResourceClassParameters, err error) { - emptyResult := &v1alpha3.ResourceClassParameters{} - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceActionWithOptions(resourceclassparametersResource, c.ns, name, pt, data, opts, subresources...), emptyResult) - - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClassParameters), err -} - -// Apply takes the given apply declarative configuration, applies it and returns the applied resourceClassParameters. -func (c *FakeResourceClassParameters) Apply(ctx context.Context, resourceClassParameters *resourcev1alpha3.ResourceClassParametersApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha3.ResourceClassParameters, err error) { - if resourceClassParameters == nil { - return nil, fmt.Errorf("resourceClassParameters provided to Apply must not be nil") - } - data, err := json.Marshal(resourceClassParameters) - if err != nil { - return nil, err - } - name := resourceClassParameters.Name - if name == nil { - return nil, fmt.Errorf("resourceClassParameters.Name must be provided to Apply") - } - emptyResult := &v1alpha3.ResourceClassParameters{} - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceActionWithOptions(resourceclassparametersResource, c.ns, *name, types.ApplyPatchType, data, opts.ToPatchOptions()), emptyResult) - - if obj == nil { - return emptyResult, err - } - return obj.(*v1alpha3.ResourceClassParameters), err -} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/generated_expansion.go b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/generated_expansion.go index 2f5289dabf6..747e564b769 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/generated_expansion.go +++ b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/generated_expansion.go @@ -18,16 +18,12 @@ limitations under the License. package v1alpha3 +type DeviceClassExpansion interface{} + type PodSchedulingContextExpansion interface{} type ResourceClaimExpansion interface{} -type ResourceClaimParametersExpansion interface{} - type ResourceClaimTemplateExpansion interface{} -type ResourceClassExpansion interface{} - -type ResourceClassParametersExpansion interface{} - type ResourceSliceExpansion interface{} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resource_client.go b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resource_client.go index 4cc6238b16a..879f0990d73 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resource_client.go +++ b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resource_client.go @@ -28,12 +28,10 @@ import ( type ResourceV1alpha3Interface interface { RESTClient() rest.Interface + DeviceClassesGetter PodSchedulingContextsGetter ResourceClaimsGetter - ResourceClaimParametersGetter ResourceClaimTemplatesGetter - ResourceClassesGetter - ResourceClassParametersGetter ResourceSlicesGetter } @@ -42,6 +40,10 @@ type ResourceV1alpha3Client struct { restClient rest.Interface } +func (c *ResourceV1alpha3Client) DeviceClasses() DeviceClassInterface { + return newDeviceClasses(c) +} + func (c *ResourceV1alpha3Client) PodSchedulingContexts(namespace string) PodSchedulingContextInterface { return newPodSchedulingContexts(c, namespace) } @@ -50,22 +52,10 @@ func (c *ResourceV1alpha3Client) ResourceClaims(namespace string) ResourceClaimI return newResourceClaims(c, namespace) } -func (c *ResourceV1alpha3Client) ResourceClaimParameters(namespace string) ResourceClaimParametersInterface { - return newResourceClaimParameters(c, namespace) -} - func (c *ResourceV1alpha3Client) ResourceClaimTemplates(namespace string) ResourceClaimTemplateInterface { return newResourceClaimTemplates(c, namespace) } -func (c *ResourceV1alpha3Client) ResourceClasses() ResourceClassInterface { - return newResourceClasses(c) -} - -func (c *ResourceV1alpha3Client) ResourceClassParameters(namespace string) ResourceClassParametersInterface { - return newResourceClassParameters(c, namespace) -} - func (c *ResourceV1alpha3Client) ResourceSlices() ResourceSliceInterface { return newResourceSlices(c) } diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclaimparameters.go b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclaimparameters.go deleted file mode 100644 index 8ae3476f612..00000000000 --- a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclaimparameters.go +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - "context" - - v1alpha3 "k8s.io/api/resource/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - resourcev1alpha3 "k8s.io/client-go/applyconfigurations/resource/v1alpha3" - gentype "k8s.io/client-go/gentype" - scheme "k8s.io/client-go/kubernetes/scheme" -) - -// ResourceClaimParametersGetter has a method to return a ResourceClaimParametersInterface. -// A group's client should implement this interface. -type ResourceClaimParametersGetter interface { - ResourceClaimParameters(namespace string) ResourceClaimParametersInterface -} - -// ResourceClaimParametersInterface has methods to work with ResourceClaimParameters resources. -type ResourceClaimParametersInterface interface { - Create(ctx context.Context, resourceClaimParameters *v1alpha3.ResourceClaimParameters, opts v1.CreateOptions) (*v1alpha3.ResourceClaimParameters, error) - Update(ctx context.Context, resourceClaimParameters *v1alpha3.ResourceClaimParameters, opts v1.UpdateOptions) (*v1alpha3.ResourceClaimParameters, error) - Delete(ctx context.Context, name string, opts v1.DeleteOptions) error - DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error - Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha3.ResourceClaimParameters, error) - List(ctx context.Context, opts v1.ListOptions) (*v1alpha3.ResourceClaimParametersList, error) - Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) - Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.ResourceClaimParameters, err error) - Apply(ctx context.Context, resourceClaimParameters *resourcev1alpha3.ResourceClaimParametersApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha3.ResourceClaimParameters, err error) - ResourceClaimParametersExpansion -} - -// resourceClaimParameters implements ResourceClaimParametersInterface -type resourceClaimParameters struct { - *gentype.ClientWithListAndApply[*v1alpha3.ResourceClaimParameters, *v1alpha3.ResourceClaimParametersList, *resourcev1alpha3.ResourceClaimParametersApplyConfiguration] -} - -// newResourceClaimParameters returns a ResourceClaimParameters -func newResourceClaimParameters(c *ResourceV1alpha3Client, namespace string) *resourceClaimParameters { - return &resourceClaimParameters{ - gentype.NewClientWithListAndApply[*v1alpha3.ResourceClaimParameters, *v1alpha3.ResourceClaimParametersList, *resourcev1alpha3.ResourceClaimParametersApplyConfiguration]( - "resourceclaimparameters", - c.RESTClient(), - scheme.ParameterCodec, - namespace, - func() *v1alpha3.ResourceClaimParameters { return &v1alpha3.ResourceClaimParameters{} }, - func() *v1alpha3.ResourceClaimParametersList { return &v1alpha3.ResourceClaimParametersList{} }), - } -} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclass.go b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclass.go deleted file mode 100644 index 0d88e96edf3..00000000000 --- a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclass.go +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - "context" - - v1alpha3 "k8s.io/api/resource/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - resourcev1alpha3 "k8s.io/client-go/applyconfigurations/resource/v1alpha3" - gentype "k8s.io/client-go/gentype" - scheme "k8s.io/client-go/kubernetes/scheme" -) - -// ResourceClassesGetter has a method to return a ResourceClassInterface. -// A group's client should implement this interface. -type ResourceClassesGetter interface { - ResourceClasses() ResourceClassInterface -} - -// ResourceClassInterface has methods to work with ResourceClass resources. -type ResourceClassInterface interface { - Create(ctx context.Context, resourceClass *v1alpha3.ResourceClass, opts v1.CreateOptions) (*v1alpha3.ResourceClass, error) - Update(ctx context.Context, resourceClass *v1alpha3.ResourceClass, opts v1.UpdateOptions) (*v1alpha3.ResourceClass, error) - Delete(ctx context.Context, name string, opts v1.DeleteOptions) error - DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error - Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha3.ResourceClass, error) - List(ctx context.Context, opts v1.ListOptions) (*v1alpha3.ResourceClassList, error) - Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) - Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.ResourceClass, err error) - Apply(ctx context.Context, resourceClass *resourcev1alpha3.ResourceClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha3.ResourceClass, err error) - ResourceClassExpansion -} - -// resourceClasses implements ResourceClassInterface -type resourceClasses struct { - *gentype.ClientWithListAndApply[*v1alpha3.ResourceClass, *v1alpha3.ResourceClassList, *resourcev1alpha3.ResourceClassApplyConfiguration] -} - -// newResourceClasses returns a ResourceClasses -func newResourceClasses(c *ResourceV1alpha3Client) *resourceClasses { - return &resourceClasses{ - gentype.NewClientWithListAndApply[*v1alpha3.ResourceClass, *v1alpha3.ResourceClassList, *resourcev1alpha3.ResourceClassApplyConfiguration]( - "resourceclasses", - c.RESTClient(), - scheme.ParameterCodec, - "", - func() *v1alpha3.ResourceClass { return &v1alpha3.ResourceClass{} }, - func() *v1alpha3.ResourceClassList { return &v1alpha3.ResourceClassList{} }), - } -} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclassparameters.go b/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclassparameters.go deleted file mode 100644 index 42db8f70592..00000000000 --- a/staging/src/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourceclassparameters.go +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - "context" - - v1alpha3 "k8s.io/api/resource/v1alpha3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - resourcev1alpha3 "k8s.io/client-go/applyconfigurations/resource/v1alpha3" - gentype "k8s.io/client-go/gentype" - scheme "k8s.io/client-go/kubernetes/scheme" -) - -// ResourceClassParametersGetter has a method to return a ResourceClassParametersInterface. -// A group's client should implement this interface. -type ResourceClassParametersGetter interface { - ResourceClassParameters(namespace string) ResourceClassParametersInterface -} - -// ResourceClassParametersInterface has methods to work with ResourceClassParameters resources. -type ResourceClassParametersInterface interface { - Create(ctx context.Context, resourceClassParameters *v1alpha3.ResourceClassParameters, opts v1.CreateOptions) (*v1alpha3.ResourceClassParameters, error) - Update(ctx context.Context, resourceClassParameters *v1alpha3.ResourceClassParameters, opts v1.UpdateOptions) (*v1alpha3.ResourceClassParameters, error) - Delete(ctx context.Context, name string, opts v1.DeleteOptions) error - DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error - Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha3.ResourceClassParameters, error) - List(ctx context.Context, opts v1.ListOptions) (*v1alpha3.ResourceClassParametersList, error) - Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) - Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.ResourceClassParameters, err error) - Apply(ctx context.Context, resourceClassParameters *resourcev1alpha3.ResourceClassParametersApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha3.ResourceClassParameters, err error) - ResourceClassParametersExpansion -} - -// resourceClassParameters implements ResourceClassParametersInterface -type resourceClassParameters struct { - *gentype.ClientWithListAndApply[*v1alpha3.ResourceClassParameters, *v1alpha3.ResourceClassParametersList, *resourcev1alpha3.ResourceClassParametersApplyConfiguration] -} - -// newResourceClassParameters returns a ResourceClassParameters -func newResourceClassParameters(c *ResourceV1alpha3Client, namespace string) *resourceClassParameters { - return &resourceClassParameters{ - gentype.NewClientWithListAndApply[*v1alpha3.ResourceClassParameters, *v1alpha3.ResourceClassParametersList, *resourcev1alpha3.ResourceClassParametersApplyConfiguration]( - "resourceclassparameters", - c.RESTClient(), - scheme.ParameterCodec, - namespace, - func() *v1alpha3.ResourceClassParameters { return &v1alpha3.ResourceClassParameters{} }, - func() *v1alpha3.ResourceClassParametersList { return &v1alpha3.ResourceClassParametersList{} }), - } -} diff --git a/staging/src/k8s.io/client-go/listers/resource/v1alpha3/resourceclass.go b/staging/src/k8s.io/client-go/listers/resource/v1alpha3/deviceclass.go similarity index 55% rename from staging/src/k8s.io/client-go/listers/resource/v1alpha3/resourceclass.go rename to staging/src/k8s.io/client-go/listers/resource/v1alpha3/deviceclass.go index 0c911003b0c..0950691e2b0 100644 --- a/staging/src/k8s.io/client-go/listers/resource/v1alpha3/resourceclass.go +++ b/staging/src/k8s.io/client-go/listers/resource/v1alpha3/deviceclass.go @@ -25,24 +25,24 @@ import ( "k8s.io/client-go/tools/cache" ) -// ResourceClassLister helps list ResourceClasses. +// DeviceClassLister helps list DeviceClasses. // All objects returned here must be treated as read-only. -type ResourceClassLister interface { - // List lists all ResourceClasses in the indexer. +type DeviceClassLister interface { + // List lists all DeviceClasses in the indexer. // Objects returned here must be treated as read-only. - List(selector labels.Selector) (ret []*v1alpha3.ResourceClass, err error) - // Get retrieves the ResourceClass from the index for a given name. + List(selector labels.Selector) (ret []*v1alpha3.DeviceClass, err error) + // Get retrieves the DeviceClass from the index for a given name. // Objects returned here must be treated as read-only. - Get(name string) (*v1alpha3.ResourceClass, error) - ResourceClassListerExpansion + Get(name string) (*v1alpha3.DeviceClass, error) + DeviceClassListerExpansion } -// resourceClassLister implements the ResourceClassLister interface. -type resourceClassLister struct { - listers.ResourceIndexer[*v1alpha3.ResourceClass] +// deviceClassLister implements the DeviceClassLister interface. +type deviceClassLister struct { + listers.ResourceIndexer[*v1alpha3.DeviceClass] } -// NewResourceClassLister returns a new ResourceClassLister. -func NewResourceClassLister(indexer cache.Indexer) ResourceClassLister { - return &resourceClassLister{listers.New[*v1alpha3.ResourceClass](indexer, v1alpha3.Resource("resourceclass"))} +// NewDeviceClassLister returns a new DeviceClassLister. +func NewDeviceClassLister(indexer cache.Indexer) DeviceClassLister { + return &deviceClassLister{listers.New[*v1alpha3.DeviceClass](indexer, v1alpha3.Resource("deviceclass"))} } diff --git a/staging/src/k8s.io/client-go/listers/resource/v1alpha3/expansion_generated.go b/staging/src/k8s.io/client-go/listers/resource/v1alpha3/expansion_generated.go index bc580e3d233..b6642f635f9 100644 --- a/staging/src/k8s.io/client-go/listers/resource/v1alpha3/expansion_generated.go +++ b/staging/src/k8s.io/client-go/listers/resource/v1alpha3/expansion_generated.go @@ -18,6 +18,10 @@ limitations under the License. package v1alpha3 +// DeviceClassListerExpansion allows custom methods to be added to +// DeviceClassLister. +type DeviceClassListerExpansion interface{} + // PodSchedulingContextListerExpansion allows custom methods to be added to // PodSchedulingContextLister. type PodSchedulingContextListerExpansion interface{} @@ -34,14 +38,6 @@ type ResourceClaimListerExpansion interface{} // ResourceClaimNamespaceLister. type ResourceClaimNamespaceListerExpansion interface{} -// ResourceClaimParametersListerExpansion allows custom methods to be added to -// ResourceClaimParametersLister. -type ResourceClaimParametersListerExpansion interface{} - -// ResourceClaimParametersNamespaceListerExpansion allows custom methods to be added to -// ResourceClaimParametersNamespaceLister. -type ResourceClaimParametersNamespaceListerExpansion interface{} - // ResourceClaimTemplateListerExpansion allows custom methods to be added to // ResourceClaimTemplateLister. type ResourceClaimTemplateListerExpansion interface{} @@ -50,18 +46,6 @@ type ResourceClaimTemplateListerExpansion interface{} // ResourceClaimTemplateNamespaceLister. type ResourceClaimTemplateNamespaceListerExpansion interface{} -// ResourceClassListerExpansion allows custom methods to be added to -// ResourceClassLister. -type ResourceClassListerExpansion interface{} - -// ResourceClassParametersListerExpansion allows custom methods to be added to -// ResourceClassParametersLister. -type ResourceClassParametersListerExpansion interface{} - -// ResourceClassParametersNamespaceListerExpansion allows custom methods to be added to -// ResourceClassParametersNamespaceLister. -type ResourceClassParametersNamespaceListerExpansion interface{} - // ResourceSliceListerExpansion allows custom methods to be added to // ResourceSliceLister. type ResourceSliceListerExpansion interface{} diff --git a/staging/src/k8s.io/client-go/listers/resource/v1alpha3/resourceclaimparameters.go b/staging/src/k8s.io/client-go/listers/resource/v1alpha3/resourceclaimparameters.go deleted file mode 100644 index aa5636b33d6..00000000000 --- a/staging/src/k8s.io/client-go/listers/resource/v1alpha3/resourceclaimparameters.go +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by lister-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "k8s.io/api/resource/v1alpha3" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/listers" - "k8s.io/client-go/tools/cache" -) - -// ResourceClaimParametersLister helps list ResourceClaimParameters. -// All objects returned here must be treated as read-only. -type ResourceClaimParametersLister interface { - // List lists all ResourceClaimParameters in the indexer. - // Objects returned here must be treated as read-only. - List(selector labels.Selector) (ret []*v1alpha3.ResourceClaimParameters, err error) - // ResourceClaimParameters returns an object that can list and get ResourceClaimParameters. - ResourceClaimParameters(namespace string) ResourceClaimParametersNamespaceLister - ResourceClaimParametersListerExpansion -} - -// resourceClaimParametersLister implements the ResourceClaimParametersLister interface. -type resourceClaimParametersLister struct { - listers.ResourceIndexer[*v1alpha3.ResourceClaimParameters] -} - -// NewResourceClaimParametersLister returns a new ResourceClaimParametersLister. -func NewResourceClaimParametersLister(indexer cache.Indexer) ResourceClaimParametersLister { - return &resourceClaimParametersLister{listers.New[*v1alpha3.ResourceClaimParameters](indexer, v1alpha3.Resource("resourceclaimparameters"))} -} - -// ResourceClaimParameters returns an object that can list and get ResourceClaimParameters. -func (s *resourceClaimParametersLister) ResourceClaimParameters(namespace string) ResourceClaimParametersNamespaceLister { - return resourceClaimParametersNamespaceLister{listers.NewNamespaced[*v1alpha3.ResourceClaimParameters](s.ResourceIndexer, namespace)} -} - -// ResourceClaimParametersNamespaceLister helps list and get ResourceClaimParameters. -// All objects returned here must be treated as read-only. -type ResourceClaimParametersNamespaceLister interface { - // List lists all ResourceClaimParameters in the indexer for a given namespace. - // Objects returned here must be treated as read-only. - List(selector labels.Selector) (ret []*v1alpha3.ResourceClaimParameters, err error) - // Get retrieves the ResourceClaimParameters from the indexer for a given namespace and name. - // Objects returned here must be treated as read-only. - Get(name string) (*v1alpha3.ResourceClaimParameters, error) - ResourceClaimParametersNamespaceListerExpansion -} - -// resourceClaimParametersNamespaceLister implements the ResourceClaimParametersNamespaceLister -// interface. -type resourceClaimParametersNamespaceLister struct { - listers.ResourceIndexer[*v1alpha3.ResourceClaimParameters] -} diff --git a/staging/src/k8s.io/client-go/listers/resource/v1alpha3/resourceclassparameters.go b/staging/src/k8s.io/client-go/listers/resource/v1alpha3/resourceclassparameters.go deleted file mode 100644 index beb0645a9ed..00000000000 --- a/staging/src/k8s.io/client-go/listers/resource/v1alpha3/resourceclassparameters.go +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright 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. -*/ - -// Code generated by lister-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1alpha3 "k8s.io/api/resource/v1alpha3" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/listers" - "k8s.io/client-go/tools/cache" -) - -// ResourceClassParametersLister helps list ResourceClassParameters. -// All objects returned here must be treated as read-only. -type ResourceClassParametersLister interface { - // List lists all ResourceClassParameters in the indexer. - // Objects returned here must be treated as read-only. - List(selector labels.Selector) (ret []*v1alpha3.ResourceClassParameters, err error) - // ResourceClassParameters returns an object that can list and get ResourceClassParameters. - ResourceClassParameters(namespace string) ResourceClassParametersNamespaceLister - ResourceClassParametersListerExpansion -} - -// resourceClassParametersLister implements the ResourceClassParametersLister interface. -type resourceClassParametersLister struct { - listers.ResourceIndexer[*v1alpha3.ResourceClassParameters] -} - -// NewResourceClassParametersLister returns a new ResourceClassParametersLister. -func NewResourceClassParametersLister(indexer cache.Indexer) ResourceClassParametersLister { - return &resourceClassParametersLister{listers.New[*v1alpha3.ResourceClassParameters](indexer, v1alpha3.Resource("resourceclassparameters"))} -} - -// ResourceClassParameters returns an object that can list and get ResourceClassParameters. -func (s *resourceClassParametersLister) ResourceClassParameters(namespace string) ResourceClassParametersNamespaceLister { - return resourceClassParametersNamespaceLister{listers.NewNamespaced[*v1alpha3.ResourceClassParameters](s.ResourceIndexer, namespace)} -} - -// ResourceClassParametersNamespaceLister helps list and get ResourceClassParameters. -// All objects returned here must be treated as read-only. -type ResourceClassParametersNamespaceLister interface { - // List lists all ResourceClassParameters in the indexer for a given namespace. - // Objects returned here must be treated as read-only. - List(selector labels.Selector) (ret []*v1alpha3.ResourceClassParameters, err error) - // Get retrieves the ResourceClassParameters from the indexer for a given namespace and name. - // Objects returned here must be treated as read-only. - Get(name string) (*v1alpha3.ResourceClassParameters, error) - ResourceClassParametersNamespaceListerExpansion -} - -// resourceClassParametersNamespaceLister implements the ResourceClassParametersNamespaceLister -// interface. -type resourceClassParametersNamespaceLister struct { - listers.ResourceIndexer[*v1alpha3.ResourceClassParameters] -} diff --git a/staging/src/k8s.io/dynamic-resource-allocation/cel/compile.go b/staging/src/k8s.io/dynamic-resource-allocation/cel/compile.go new file mode 100644 index 00000000000..7cad34651e2 --- /dev/null +++ b/staging/src/k8s.io/dynamic-resource-allocation/cel/compile.go @@ -0,0 +1,295 @@ +/* +Copyright 2022 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 cel + +import ( + "context" + "errors" + "fmt" + "reflect" + "strings" + "sync" + + "github.com/blang/semver/v4" + "github.com/google/cel-go/cel" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" + "github.com/google/cel-go/common/types/traits" + "github.com/google/cel-go/ext" + + resourceapi "k8s.io/api/resource/v1alpha3" + "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/apimachinery/pkg/util/version" + celconfig "k8s.io/apiserver/pkg/apis/cel" + apiservercel "k8s.io/apiserver/pkg/cel" + "k8s.io/apiserver/pkg/cel/environment" +) + +const ( + deviceVar = "device" + driverVar = "driver" + attributesVar = "attributes" + capacityVar = "capacity" +) + +var ( + lazyCompilerInit sync.Once + lazyCompiler *compiler +) + +func GetCompiler() *compiler { + lazyCompilerInit.Do(func() { + lazyCompiler = newCompiler() + }) + return lazyCompiler +} + +// CompilationResult represents a compiled expression. +type CompilationResult struct { + Program cel.Program + Error *apiservercel.Error + Expression string + OutputType *cel.Type + Environment *cel.Env + + emptyMapVal ref.Val +} + +// Device defines the input values for a CEL selector expression. +type Device struct { + // Driver gets used as domain for any attribute which does not already + // have a domain prefix. If set, then it is also made available as a + // string attribute. + Driver string + Attributes map[resourceapi.QualifiedName]resourceapi.DeviceAttribute + Capacity map[resourceapi.QualifiedName]resource.Quantity +} + +type compiler struct { + envset *environment.EnvSet +} + +func newCompiler() *compiler { + return &compiler{envset: mustBuildEnv()} +} + +// CompileCELExpression returns a compiled CEL expression. It evaluates to bool. +// +// TODO (https://github.com/kubernetes/kubernetes/issues/125826): validate AST to detect invalid attribute names. +func (c compiler) CompileCELExpression(expression string, envType environment.Type) CompilationResult { + resultError := func(errorString string, errType apiservercel.ErrorType) CompilationResult { + return CompilationResult{ + Error: &apiservercel.Error{ + Type: errType, + Detail: errorString, + }, + Expression: expression, + } + } + + env, err := c.envset.Env(envType) + if err != nil { + return resultError(fmt.Sprintf("unexpected error loading CEL environment: %v", err), apiservercel.ErrorTypeInternal) + } + + ast, issues := env.Compile(expression) + if issues != nil { + return resultError("compilation failed: "+issues.String(), apiservercel.ErrorTypeInvalid) + } + expectedReturnType := cel.BoolType + if ast.OutputType() != expectedReturnType && + ast.OutputType() != cel.AnyType { + return resultError(fmt.Sprintf("must evaluate to %v or the unknown type, not %v", expectedReturnType.String(), ast.OutputType().String()), apiservercel.ErrorTypeInvalid) + } + _, err = cel.AstToCheckedExpr(ast) + if err != nil { + // should be impossible since env.Compile returned no issues + return resultError("unexpected compilation error: "+err.Error(), apiservercel.ErrorTypeInternal) + } + prog, err := env.Program(ast, + cel.InterruptCheckFrequency(celconfig.CheckFrequency), + ) + if err != nil { + return resultError("program instantiation failed: "+err.Error(), apiservercel.ErrorTypeInternal) + } + return CompilationResult{ + Program: prog, + Expression: expression, + OutputType: ast.OutputType(), + Environment: env, + emptyMapVal: env.CELTypeAdapter().NativeToValue(map[string]any{}), + } +} + +// getAttributeValue returns the native representation of the one value that +// should be stored in the attribute, otherwise an error. An error is +// also returned when there is no supported value. +func getAttributeValue(attr resourceapi.DeviceAttribute) (any, error) { + switch { + case attr.IntValue != nil: + return *attr.IntValue, nil + case attr.BoolValue != nil: + return *attr.BoolValue, nil + case attr.StringValue != nil: + return *attr.StringValue, nil + case attr.VersionValue != nil: + v, err := semver.Parse(*attr.VersionValue) + if err != nil { + return nil, fmt.Errorf("parse semantic version: %w", err) + } + return Semver{Version: v}, nil + default: + return nil, errors.New("unsupported attribute value") + } +} + +var boolType = reflect.TypeOf(true) + +func (c CompilationResult) DeviceMatches(ctx context.Context, input Device) (bool, error) { + // TODO (future): avoid building these maps and instead use a proxy + // which wraps the underlying maps and directly looks up values. + attributes := make(map[string]any) + for name, attr := range input.Attributes { + value, err := getAttributeValue(attr) + if err != nil { + return false, fmt.Errorf("attribute %s: %w", name, err) + } + domain, id := parseQualifiedName(name, input.Driver) + if attributes[domain] == nil { + attributes[domain] = make(map[string]any) + } + attributes[domain].(map[string]any)[id] = value + } + + capacity := make(map[string]any) + for name, quantity := range input.Capacity { + domain, id := parseQualifiedName(name, input.Driver) + if capacity[domain] == nil { + capacity[domain] = make(map[string]apiservercel.Quantity) + } + capacity[domain].(map[string]apiservercel.Quantity)[id] = apiservercel.Quantity{Quantity: &quantity} + } + + variables := map[string]any{ + deviceVar: map[string]any{ + driverVar: input.Driver, + attributesVar: newStringInterfaceMapWithDefault(c.Environment.CELTypeAdapter(), attributes, c.emptyMapVal), + capacityVar: newStringInterfaceMapWithDefault(c.Environment.CELTypeAdapter(), capacity, c.emptyMapVal), + }, + } + + result, _, err := c.Program.ContextEval(ctx, variables) + if err != nil { + return false, err + } + resultAny, err := result.ConvertToNative(boolType) + if err != nil { + return false, fmt.Errorf("CEL result of type %s could not be converted to bool: %w", result.Type().TypeName(), err) + } + resultBool, ok := resultAny.(bool) + if !ok { + return false, fmt.Errorf("CEL native result value should have been a bool, got instead: %T", resultAny) + } + return resultBool, nil +} + +func mustBuildEnv() *environment.EnvSet { + envset := environment.MustBaseEnvSet(environment.DefaultCompatibilityVersion(), false /* strictCost */) + field := func(name string, declType *apiservercel.DeclType, required bool) *apiservercel.DeclField { + return apiservercel.NewDeclField(name, declType, required, nil, nil) + } + fields := func(fields ...*apiservercel.DeclField) map[string]*apiservercel.DeclField { + result := make(map[string]*apiservercel.DeclField, len(fields)) + for _, f := range fields { + result[f.Name] = f + } + return result + } + deviceType := apiservercel.NewObjectType("kubernetes.DRADevice", fields( + field(driverVar, apiservercel.StringType, true), + field(attributesVar, apiservercel.NewMapType(apiservercel.StringType, apiservercel.NewMapType(apiservercel.StringType, apiservercel.AnyType, resourceapi.ResourceSliceMaxAttributesAndCapacitiesPerDevice), resourceapi.ResourceSliceMaxAttributesAndCapacitiesPerDevice), true), + field(capacityVar, apiservercel.NewMapType(apiservercel.StringType, apiservercel.NewMapType(apiservercel.StringType, apiservercel.QuantityDeclType, resourceapi.ResourceSliceMaxAttributesAndCapacitiesPerDevice), resourceapi.ResourceSliceMaxAttributesAndCapacitiesPerDevice), true), + )) + + versioned := []environment.VersionedOptions{ + { + // Feature epoch was actually 1.31, but we artificially set it to 1.0 because these + // options should always be present. + // + // TODO (https://github.com/kubernetes/kubernetes/issues/123687): set this + // version properly before going to beta. + IntroducedVersion: version.MajorMinor(1, 0), + EnvOptions: []cel.EnvOption{ + cel.Variable(deviceVar, deviceType.CelType()), + + SemverLib(), + + // https://pkg.go.dev/github.com/google/cel-go/ext#Bindings + // + // This is useful to simplify attribute lookups because the + // domain only needs to be given once: + // + // cel.bind(dra, device.attributes["dra.example.com"], dra.oneBool && dra.anotherBool) + ext.Bindings(), + }, + DeclTypes: []*apiservercel.DeclType{ + deviceType, + }, + }, + } + envset, err := envset.Extend(versioned...) + if err != nil { + panic(fmt.Errorf("internal error building CEL environment: %w", err)) + } + return envset +} + +// parseQualifiedName splits into domain and identified, using the default domain +// if the name does not contain one. +func parseQualifiedName(name resourceapi.QualifiedName, defaultDomain string) (string, string) { + sep := strings.Index(string(name), "/") + if sep == -1 { + return defaultDomain, string(name) + } + return string(name[0:sep]), string(name[sep+1:]) +} + +// newStringInterfaceMapWithDefault is like +// https://pkg.go.dev/github.com/google/cel-go@v0.20.1/common/types#NewStringInterfaceMap, +// except that looking up an unknown key returns a default value. +func newStringInterfaceMapWithDefault(adapter types.Adapter, value map[string]any, defaultValue ref.Val) traits.Mapper { + return mapper{ + Mapper: types.NewStringInterfaceMap(adapter, value), + defaultValue: defaultValue, + } +} + +type mapper struct { + traits.Mapper + defaultValue ref.Val +} + +// Find wraps the mapper's Find so that a default empty map is returned when +// the lookup did not find the entry. +func (m mapper) Find(key ref.Val) (ref.Val, bool) { + value, found := m.Mapper.Find(key) + if found { + return value, true + } + + return m.defaultValue, true +} diff --git a/staging/src/k8s.io/dynamic-resource-allocation/cel/compile_test.go b/staging/src/k8s.io/dynamic-resource-allocation/cel/compile_test.go new file mode 100644 index 00000000000..8a97813867d --- /dev/null +++ b/staging/src/k8s.io/dynamic-resource-allocation/cel/compile_test.go @@ -0,0 +1,212 @@ +/* +Copyright 2022 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 cel + +import ( + "strings" + "testing" + + resourceapi "k8s.io/api/resource/v1alpha3" + "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/apiserver/pkg/cel/environment" + "k8s.io/klog/v2/ktesting" + "k8s.io/utils/ptr" +) + +func TestCompile(t *testing.T) { + for name, scenario := range map[string]struct { + expression string + driver string + attributes map[resourceapi.QualifiedName]resourceapi.DeviceAttribute + capacity map[resourceapi.QualifiedName]resource.Quantity + expectCompileError string + expectMatchError string + expectMatch bool + }{ + "true": { + expression: "true", + expectMatch: true, + }, + "false": { + expression: "false", + expectMatch: false, + }, + "syntax-error": { + expression: "?!", + expectCompileError: "Syntax error", + }, + "type-error": { + expression: `1`, + expectCompileError: "must evaluate to bool or the unknown type, not int", + }, + "runtime-error-lookup-identifier": { + expression: `device.attributes["no-such-domain"].noSuchAttr.isGreaterThan(quantity("0"))`, + expectMatchError: "no such key: noSuchAttr", + }, + "runtime-error-lookup-map": { + expression: `device.attributes["no-such-domain"]["noSuchAttr"].isGreaterThan(quantity("0"))`, + expectMatchError: "no such key: noSuchAttr", + }, + "domain-check-negative": { + expression: `"no-such-domain" in device.attributes`, + expectMatch: false, + }, + "domain-check-positive": { + expression: `"dra.example.com" in device.attributes`, + attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{"dra.example.com/something": {BoolValue: ptr.To(true)}}, + expectMatch: true, + }, + "empty-driver-name": { + expression: `device.driver == ""`, + expectMatch: true, + }, + "real-driver-name": { + expression: `device.driver == "dra.example.com"`, + driver: "dra.example.com", + expectMatch: true, + }, + "driver-name-qualifier": { + expression: `device.attributes["dra.example.com"].name`, + driver: "dra.example.com", + attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{"name": {BoolValue: ptr.To(true)}}, + expectMatch: true, + }, + "driver-name-qualifier-map-lookup": { + expression: `device.attributes["dra.example.com"]["name"]`, + driver: "dra.example.com", + attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{"name": {BoolValue: ptr.To(true)}}, + expectMatch: true, + }, + "bind": { + expression: `cel.bind(dra, device.attributes["dra.example.com"], dra.name)`, + driver: "dra.example.com", + attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{"name": {BoolValue: ptr.To(true)}}, + expectMatch: true, + }, + "qualified-attribute-name": { + expression: `device.attributes["other.example.com"].name`, + driver: "dra.example.com", + attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{"other.example.com/name": {BoolValue: ptr.To(true)}}, + expectMatch: true, + }, + "bool": { + expression: `device.attributes["dra.example.com"].name`, + attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{"name": {BoolValue: ptr.To(true)}}, + driver: "dra.example.com", + expectMatch: true, + }, + "int": { + expression: `device.attributes["dra.example.com"].name > 0`, + attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{"name": {IntValue: ptr.To(int64(1))}}, + driver: "dra.example.com", + expectMatch: true, + }, + "string": { + expression: `device.attributes["dra.example.com"].name == "fish"`, + attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{"name": {StringValue: ptr.To("fish")}}, + driver: "dra.example.com", + expectMatch: true, + }, + "version": { + expression: `device.attributes["dra.example.com"].name.isGreaterThan(semver("0.0.1"))`, + attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{"name": {VersionValue: ptr.To("1.0.0")}}, + driver: "dra.example.com", + expectMatch: true, + }, + "quantity": { + expression: `device.capacity["dra.example.com"].name.isGreaterThan(quantity("1Ki"))`, + capacity: map[resourceapi.QualifiedName]resource.Quantity{"name": resource.MustParse("1Mi")}, + driver: "dra.example.com", + expectMatch: true, + }, + "check-positive": { + expression: `"name" in device.capacity["dra.example.com"] && device.capacity["dra.example.com"].name.isGreaterThan(quantity("1Ki"))`, + capacity: map[resourceapi.QualifiedName]resource.Quantity{"name": resource.MustParse("1Mi")}, + driver: "dra.example.com", + expectMatch: true, + }, + "check-negative": { + expression: `!("name" in device.capacity["dra.example.com"]) || device.capacity["dra.example.com"].name.isGreaterThan(quantity("1Ki"))`, + expectMatch: true, + }, + "all": { + expression: ` +device.capacity["dra.example.com"].quantity.isGreaterThan(quantity("1Ki")) && +device.attributes["dra.example.com"].bool && +device.attributes["dra.example.com"].int > 0 && +device.attributes["dra.example.com"].string == "fish" && +device.attributes["dra.example.com"].version.isGreaterThan(semver("0.0.1")) && +device.capacity["dra.example.com"]["quantity"].isGreaterThan(quantity("1Ki")) && +device.attributes["dra.example.com"]["bool"] && +device.attributes["dra.example.com"]["int"] > 0 && +device.attributes["dra.example.com"]["string"] == "fish" && +device.attributes["dra.example.com"]["version"].isGreaterThan(semver("0.0.1")) +`, + attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{ + "bool": {BoolValue: ptr.To(true)}, + "int": {IntValue: ptr.To(int64(1))}, + "string": {StringValue: ptr.To("fish")}, + "version": {VersionValue: ptr.To("1.0.0")}, + }, + capacity: map[resourceapi.QualifiedName]resource.Quantity{ + "quantity": resource.MustParse("1Mi"), + }, + driver: "dra.example.com", + expectMatch: true, + }, + "many": { + expression: `device.attributes["dra.example.com"].a && device.attributes["dra.example.com"].b && device.attributes["dra.example.com"].c`, + attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{ + "a": {BoolValue: ptr.To(true)}, + "b": {BoolValue: ptr.To(true)}, + "c": {BoolValue: ptr.To(true)}, + }, + driver: "dra.example.com", + expectMatch: true, + }, + } { + t.Run(name, func(t *testing.T) { + _, ctx := ktesting.NewTestContext(t) + result := GetCompiler().CompileCELExpression(scenario.expression, environment.StoredExpressions) + if scenario.expectCompileError != "" && result.Error == nil { + t.Fatalf("expected compile error %q, got none", scenario.expectCompileError) + } + if result.Error != nil { + if scenario.expectCompileError == "" { + t.Fatalf("unexpected compile error: %v", result.Error) + } + if !strings.Contains(result.Error.Error(), scenario.expectCompileError) { + t.Fatalf("expected compile error to contain %q, but got instead: %v", scenario.expectCompileError, result.Error) + } + return + } + match, err := result.DeviceMatches(ctx, Device{Attributes: scenario.attributes, Capacity: scenario.capacity, Driver: scenario.driver}) + if err != nil { + if scenario.expectMatchError == "" { + t.Fatalf("unexpected evaluation error: %v", err) + } + if !strings.Contains(err.Error(), scenario.expectMatchError) { + t.Fatalf("expected evaluation error to contain %q, but got instead: %v", scenario.expectMatchError, err) + } + return + } + if match != scenario.expectMatch { + t.Fatalf("expected result %v, got %v", scenario.expectMatch, match) + } + }) + } +} diff --git a/staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/semver.go b/staging/src/k8s.io/dynamic-resource-allocation/cel/semver.go similarity index 100% rename from staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/semver.go rename to staging/src/k8s.io/dynamic-resource-allocation/cel/semver.go diff --git a/staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/semver_test.go b/staging/src/k8s.io/dynamic-resource-allocation/cel/semver_test.go similarity index 98% rename from staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/semver_test.go rename to staging/src/k8s.io/dynamic-resource-allocation/cel/semver_test.go index 38f43d15fb1..d71cfdf91ff 100644 --- a/staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/semver_test.go +++ b/staging/src/k8s.io/dynamic-resource-allocation/cel/semver_test.go @@ -27,7 +27,7 @@ import ( "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/util/sets" - library "k8s.io/dynamic-resource-allocation/structured/namedresources/cel" + library "k8s.io/dynamic-resource-allocation/cel" ) func testSemver(t *testing.T, expr string, expectResult ref.Val, expectRuntimeErrPattern string, expectCompileErrs []string) { diff --git a/staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/semverlib.go b/staging/src/k8s.io/dynamic-resource-allocation/cel/semverlib.go similarity index 100% rename from staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/semverlib.go rename to staging/src/k8s.io/dynamic-resource-allocation/cel/semverlib.go diff --git a/staging/src/k8s.io/dynamic-resource-allocation/resourceclaim/resourceclaim.go b/staging/src/k8s.io/dynamic-resource-allocation/resourceclaim/resourceclaim.go index a9a0e3d739f..11f820fcded 100644 --- a/staging/src/k8s.io/dynamic-resource-allocation/resourceclaim/resourceclaim.go +++ b/staging/src/k8s.io/dynamic-resource-allocation/resourceclaim/resourceclaim.go @@ -187,13 +187,5 @@ func CanBeReserved(claim *resourceapi.ResourceClaim) bool { // IsAllocatedWithStructuredParameters checks whether the claim is allocated // and the allocation was done with structured parameters. func IsAllocatedWithStructuredParameters(claim *resourceapi.ResourceClaim) bool { - if claim.Status.Allocation == nil { - return false - } - for _, handle := range claim.Status.Allocation.ResourceHandles { - if handle.StructuredData != nil { - return true - } - } - return false + return claim.Status.Allocation != nil && claim.Status.Allocation.Controller == "" } diff --git a/staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/compile.go b/staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/compile.go deleted file mode 100644 index d94282c21c7..00000000000 --- a/staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/compile.go +++ /dev/null @@ -1,243 +0,0 @@ -/* -Copyright 2022 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 cel - -import ( - "context" - "fmt" - "reflect" - "sync" - - "github.com/blang/semver/v4" - "github.com/google/cel-go/cel" - "github.com/google/cel-go/common/types" - "github.com/google/cel-go/common/types/traits" - - resourceapi "k8s.io/api/resource/v1alpha3" - "k8s.io/apimachinery/pkg/util/version" - celconfig "k8s.io/apiserver/pkg/apis/cel" - apiservercel "k8s.io/apiserver/pkg/cel" - "k8s.io/apiserver/pkg/cel/environment" -) - -const ( - attributesVarPrefix = "attributes." -) - -var ( - lazyCompilerInit sync.Once - lazyCompiler *compiler -) - -func GetCompiler() *compiler { - lazyCompilerInit.Do(func() { - lazyCompiler = newCompiler() - }) - return lazyCompiler -} - -// CompilationResult represents a compiled expression. -type CompilationResult struct { - Program cel.Program - Error *apiservercel.Error - Expression string - OutputType *cel.Type - Environment *cel.Env -} - -type compiler struct { - envset *environment.EnvSet -} - -func newCompiler() *compiler { - return &compiler{envset: mustBuildEnv()} -} - -// CompileCELExpression returns a compiled CEL expression. It evaluates to bool. -func (c compiler) CompileCELExpression(expression string, envType environment.Type) CompilationResult { - resultError := func(errorString string, errType apiservercel.ErrorType) CompilationResult { - return CompilationResult{ - Error: &apiservercel.Error{ - Type: errType, - Detail: errorString, - }, - Expression: expression, - } - } - - env, err := c.envset.Env(envType) - if err != nil { - return resultError(fmt.Sprintf("unexpected error loading CEL environment: %v", err), apiservercel.ErrorTypeInternal) - } - - ast, issues := env.Compile(expression) - if issues != nil { - return resultError("compilation failed: "+issues.String(), apiservercel.ErrorTypeInvalid) - } - expectedReturnType := cel.BoolType - if ast.OutputType() != expectedReturnType { - return resultError(fmt.Sprintf("must evaluate to %v", expectedReturnType.String()), apiservercel.ErrorTypeInvalid) - } - _, err = cel.AstToCheckedExpr(ast) - if err != nil { - // should be impossible since env.Compile returned no issues - return resultError("unexpected compilation error: "+err.Error(), apiservercel.ErrorTypeInternal) - } - prog, err := env.Program(ast, - cel.InterruptCheckFrequency(celconfig.CheckFrequency), - ) - if err != nil { - return resultError("program instantiation failed: "+err.Error(), apiservercel.ErrorTypeInternal) - } - return CompilationResult{ - Program: prog, - Expression: expression, - OutputType: ast.OutputType(), - Environment: env, - } -} - -var valueTypes = map[string]struct { - celType *cel.Type - // get returns nil if the attribute doesn't have the type, otherwise - // the value of that type. - get func(attr resourceapi.NamedResourcesAttribute) (any, error) -}{ - "quantity": {apiservercel.QuantityType, func(attr resourceapi.NamedResourcesAttribute) (any, error) { - if attr.QuantityValue == nil { - return nil, nil - } - return apiservercel.Quantity{Quantity: attr.QuantityValue}, nil - }}, - "bool": {cel.BoolType, func(attr resourceapi.NamedResourcesAttribute) (any, error) { - if attr.BoolValue == nil { - return nil, nil - } - return *attr.BoolValue, nil - }}, - "int": {cel.IntType, func(attr resourceapi.NamedResourcesAttribute) (any, error) { - if attr.IntValue == nil { - return nil, nil - } - return *attr.IntValue, nil - }}, - "intslice": {types.NewListType(cel.IntType), func(attr resourceapi.NamedResourcesAttribute) (any, error) { - if attr.IntSliceValue == nil { - return nil, nil - } - return attr.IntSliceValue.Ints, nil - }}, - "string": {cel.StringType, func(attr resourceapi.NamedResourcesAttribute) (any, error) { - if attr.StringValue == nil { - return nil, nil - } - return *attr.StringValue, nil - }}, - "stringslice": {types.NewListType(cel.StringType), func(attr resourceapi.NamedResourcesAttribute) (any, error) { - if attr.StringSliceValue == nil { - return nil, nil - } - return attr.StringSliceValue.Strings, nil - }}, - "version": {SemverType, func(attr resourceapi.NamedResourcesAttribute) (any, error) { - if attr.VersionValue == nil { - return nil, nil - } - v, err := semver.Parse(*attr.VersionValue) - if err != nil { - return nil, fmt.Errorf("parse semantic version: %v", err) - } - - return Semver{Version: v}, nil - }}, -} - -var boolType = reflect.TypeOf(true) - -func (c CompilationResult) Evaluate(ctx context.Context, attributes []resourceapi.NamedResourcesAttribute) (bool, error) { - variables := make(map[string]any, len(valueTypes)) - for name, valueType := range valueTypes { - m, err := buildValueMapper(c.Environment.CELTypeAdapter(), attributes, valueType.get) - if err != nil { - return false, fmt.Errorf("extract attributes with type %s: %v", name, err) - } - variables[attributesVarPrefix+name] = m - } - result, _, err := c.Program.ContextEval(ctx, variables) - if err != nil { - return false, err - } - resultAny, err := result.ConvertToNative(boolType) - if err != nil { - return false, fmt.Errorf("CEL result of type %s could not be converted to bool: %w", result.Type().TypeName(), err) - } - resultBool, ok := resultAny.(bool) - if !ok { - return false, fmt.Errorf("CEL native result value should have been a bool, got instead: %T", resultAny) - } - return resultBool, nil -} - -func mustBuildEnv() *environment.EnvSet { - // strictCost is always true to enforce cost limits. - envset := environment.MustBaseEnvSet(environment.DefaultCompatibilityVersion(), true) - versioned := []environment.VersionedOptions{ - { - // Feature epoch was actually 1.30, but we artificially set it to 1.0 because these - // options should always be present. - // - // TODO (https://github.com/kubernetes/kubernetes/issues/123687): set this - // version properly before going to beta. - IntroducedVersion: version.MajorMinor(1, 0), - EnvOptions: append(buildVersionedAttributes(), - SemverLib(), - ), - }, - } - envset, err := envset.Extend(versioned...) - if err != nil { - panic(fmt.Errorf("internal error building CEL environment: %w", err)) - } - return envset -} - -func buildVersionedAttributes() []cel.EnvOption { - options := make([]cel.EnvOption, 0, len(valueTypes)) - for name, valueType := range valueTypes { - options = append(options, cel.Variable(attributesVarPrefix+name, types.NewMapType(cel.StringType, valueType.celType))) - } - return options -} - -func buildValueMapper(adapter types.Adapter, attributes []resourceapi.NamedResourcesAttribute, get func(resourceapi.NamedResourcesAttribute) (any, error)) (traits.Mapper, error) { - // This implementation constructs a map and then let's cel handle the - // lookup and iteration. This is done for the sake of simplicity. - // Whether it's faster than writing a custom mapper depends on - // real-world attribute sets and CEL expressions and would have to be - // benchmarked. - valueMap := make(map[string]any) - for name, attribute := range attributes { - value, err := get(attribute) - if err != nil { - return nil, fmt.Errorf("attribute %q: %v", name, err) - } - if value != nil { - valueMap[attribute.Name] = value - } - } - return types.NewStringInterfaceMap(adapter, valueMap), nil -} diff --git a/staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/compile_test.go b/staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/compile_test.go deleted file mode 100644 index 1f124515c0d..00000000000 --- a/staging/src/k8s.io/dynamic-resource-allocation/structured/namedresources/cel/compile_test.go +++ /dev/null @@ -1,155 +0,0 @@ -/* -Copyright 2022 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 cel - -import ( - "strings" - "testing" - - resourceapi "k8s.io/api/resource/v1alpha3" - "k8s.io/apimachinery/pkg/api/resource" - "k8s.io/apiserver/pkg/cel/environment" - "k8s.io/klog/v2/ktesting" - "k8s.io/utils/ptr" -) - -func TestCompile(t *testing.T) { - for name, scenario := range map[string]struct { - expression string - attributes []resourceapi.NamedResourcesAttribute - expectCompileError string - expectMatchError string - expectMatch bool - }{ - "true": { - expression: "true", - expectMatch: true, - }, - "false": { - expression: "false", - expectMatch: false, - }, - "syntax-error": { - expression: "?!", - expectCompileError: "Syntax error", - }, - "type-error": { - expression: `attributes.quantity["no-such-attr"]`, - expectCompileError: "must evaluate to bool", - }, - "runtime-error": { - expression: `attributes.quantity["no-such-attr"].isGreaterThan(quantity("0"))`, - expectMatchError: "no such key: no-such-attr", - }, - "quantity": { - expression: `attributes.quantity["name"].isGreaterThan(quantity("0"))`, - attributes: []resourceapi.NamedResourcesAttribute{{Name: "name", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{QuantityValue: ptr.To(resource.MustParse("1"))}}}, - expectMatch: true, - }, - "bool": { - expression: `attributes.bool["name"]`, - attributes: []resourceapi.NamedResourcesAttribute{{Name: "name", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{BoolValue: ptr.To(true)}}}, - expectMatch: true, - }, - "int": { - expression: `attributes.int["name"] > 0`, - attributes: []resourceapi.NamedResourcesAttribute{{Name: "name", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{IntValue: ptr.To(int64(1))}}}, - expectMatch: true, - }, - "intslice": { - expression: `attributes.intslice["name"].isSorted() && attributes.intslice["name"].indexOf(3) == 2`, - attributes: []resourceapi.NamedResourcesAttribute{{Name: "name", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{IntSliceValue: &resourceapi.NamedResourcesIntSlice{Ints: []int64{1, 2, 3}}}}}, - expectMatch: true, - }, - "empty-intslice": { - expression: `size(attributes.intslice["name"]) == 0`, - attributes: []resourceapi.NamedResourcesAttribute{{Name: "name", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{IntSliceValue: &resourceapi.NamedResourcesIntSlice{}}}}, - expectMatch: true, - }, - "string": { - expression: `attributes.string["name"] == "fish"`, - attributes: []resourceapi.NamedResourcesAttribute{{Name: "name", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{StringValue: ptr.To("fish")}}}, - expectMatch: true, - }, - "stringslice": { - expression: `attributes.stringslice["name"].isSorted() && attributes.stringslice["name"].indexOf("a") == 0`, - attributes: []resourceapi.NamedResourcesAttribute{{Name: "name", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{StringSliceValue: &resourceapi.NamedResourcesStringSlice{Strings: []string{"a", "b", "c"}}}}}, - expectMatch: true, - }, - "empty-stringslice": { - expression: `size(attributes.stringslice["name"]) == 0`, - attributes: []resourceapi.NamedResourcesAttribute{{Name: "name", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{StringSliceValue: &resourceapi.NamedResourcesStringSlice{}}}}, - expectMatch: true, - }, - "all": { - expression: `attributes.quantity["quantity"].isGreaterThan(quantity("0")) && -attributes.bool["bool"] && -attributes.int["int"] > 0 && -attributes.intslice["intslice"].isSorted() && -attributes.string["string"] == "fish" && -attributes.stringslice["stringslice"].isSorted()`, - attributes: []resourceapi.NamedResourcesAttribute{ - {Name: "quantity", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{QuantityValue: ptr.To(resource.MustParse("1"))}}, - {Name: "bool", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{BoolValue: ptr.To(true)}}, - {Name: "int", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{IntValue: ptr.To(int64(1))}}, - {Name: "intslice", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{IntSliceValue: &resourceapi.NamedResourcesIntSlice{Ints: []int64{1, 2, 3}}}}, - {Name: "string", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{StringValue: ptr.To("fish")}}, - {Name: "stringslice", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{StringSliceValue: &resourceapi.NamedResourcesStringSlice{Strings: []string{"a", "b", "c"}}}}, - }, - expectMatch: true, - }, - "many": { - expression: `attributes.bool["a"] && attributes.bool["b"] && attributes.bool["c"]`, - attributes: []resourceapi.NamedResourcesAttribute{ - {Name: "a", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{BoolValue: ptr.To(true)}}, - {Name: "b", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{BoolValue: ptr.To(true)}}, - {Name: "c", NamedResourcesAttributeValue: resourceapi.NamedResourcesAttributeValue{BoolValue: ptr.To(true)}}, - }, - expectMatch: true, - }, - } { - t.Run(name, func(t *testing.T) { - _, ctx := ktesting.NewTestContext(t) - result := GetCompiler().CompileCELExpression(scenario.expression, environment.StoredExpressions) - if scenario.expectCompileError != "" && result.Error == nil { - t.Fatalf("expected compile error %q, got none", scenario.expectCompileError) - } - if result.Error != nil { - if scenario.expectCompileError == "" { - t.Fatalf("unexpected compile error: %v", result.Error) - } - if !strings.Contains(result.Error.Error(), scenario.expectCompileError) { - t.Fatalf("expected compile error to contain %q, but got instead: %v", scenario.expectCompileError, result.Error) - } - return - } - match, err := result.Evaluate(ctx, scenario.attributes) - if err != nil { - if scenario.expectMatchError == "" { - t.Fatalf("unexpected evaluation error: %v", err) - } - if !strings.Contains(err.Error(), scenario.expectMatchError) { - t.Fatalf("expected evaluation error to contain %q, but got instead: %v", scenario.expectMatchError, err) - } - return - } - if match != scenario.expectMatch { - t.Fatalf("expected result %v, got %v", scenario.expectMatch, match) - } - }) - } -} diff --git a/test/integration/apiserver/apply/reset_fields_test.go b/test/integration/apiserver/apply/reset_fields_test.go index 84b978d671e..b1f7de70f8c 100644 --- a/test/integration/apiserver/apply/reset_fields_test.go +++ b/test/integration/apiserver/apply/reset_fields_test.go @@ -60,7 +60,7 @@ var resetFieldsStatusData = map[schema.GroupVersionResource]string{ gvr("policy", "v1", "poddisruptionbudgets"): `{"status": {"currentHealthy": 25}}`, gvr("policy", "v1beta1", "poddisruptionbudgets"): `{"status": {"currentHealthy": 25}}`, gvr("resource.k8s.io", "v1alpha3", "podschedulingcontexts"): `{"status": {"resourceClaims": [{"name": "my-claim", "unsuitableNodes": ["node2"]}]}}`, // Not really a conflict with status_test.go: Apply just stores both nodes. Conflict testing therefore gets disabled for podschedulingcontexts. - gvr("resource.k8s.io", "v1alpha3", "resourceclaims"): `{"status": {"driverName": "other.example.com"}}`, + gvr("resource.k8s.io", "v1alpha3", "resourceclaims"): `{"status": {"allocation": {"controller": "other.example.com"}}}`, gvr("internal.apiserver.k8s.io", "v1alpha1", "storageversions"): `{"status": {"commonEncodingVersion":"v1","storageVersions":[{"apiServerID":"1","decodableVersions":["v1","v2"],"encodingVersion":"v1"}],"conditions":[{"type":"AllEncodingVersionsEqual","status":"False","lastTransitionTime":"2020-01-01T00:00:00Z","reason":"allEncodingVersionsEqual","message":"all encoding versions are set to v1"}]}}`, // standard for []metav1.Condition gvr("admissionregistration.k8s.io", "v1alpha1", "validatingadmissionpolicies"): `{"status": {"conditions":[{"type":"Accepted","status":"True","lastTransitionTime":"2020-01-01T00:00:00Z","reason":"RuleApplied","message":"Rule was applied"}]}}`, @@ -153,8 +153,8 @@ var resetFieldsSpecData = map[schema.GroupVersionResource]string{ gvr("apiregistration.k8s.io", "v1beta1", "apiservices"): `{"metadata": {"labels": {"a":"c"}}, "spec": {"group": "foo2.com"}}`, gvr("apiregistration.k8s.io", "v1", "apiservices"): `{"metadata": {"labels": {"a":"c"}}, "spec": {"group": "foo2.com"}}`, gvr("resource.k8s.io", "v1alpha3", "podschedulingcontexts"): `{"spec": {"selectedNode": "node2name"}}`, - gvr("resource.k8s.io", "v1alpha3", "resourceclasses"): `{"driverName": "other.example.com"}`, - gvr("resource.k8s.io", "v1alpha3", "resourceclaims"): `{"spec": {"resourceClassName": "class2name"}}`, // ResourceClassName is immutable, but that doesn't matter for the test. + gvr("resource.k8s.io", "v1alpha3", "deviceclasses"): `{"metadata": {"labels":{"a":"c"}}}`, + gvr("resource.k8s.io", "v1alpha3", "resourceclaims"): `{"spec": {"devices": {"requests": [{"name": "req-0", "deviceClassName": "other-class"}]}}}`, // spec is immutable, but that doesn't matter for the test. gvr("resource.k8s.io", "v1alpha3", "resourceclaimtemplates"): `{"spec": {"spec": {"resourceClassName": "class2name"}}}`, gvr("internal.apiserver.k8s.io", "v1alpha1", "storageversions"): `{}`, gvr("admissionregistration.k8s.io", "v1alpha1", "validatingadmissionpolicies"): `{"metadata": {"labels": {"a":"c"}}, "spec": {"paramKind": {"apiVersion": "apps/v1", "kind": "Deployment"}}}`, diff --git a/test/integration/apiserver/apply/status_test.go b/test/integration/apiserver/apply/status_test.go index 8accd1ebf6e..c715a96836d 100644 --- a/test/integration/apiserver/apply/status_test.go +++ b/test/integration/apiserver/apply/status_test.go @@ -53,7 +53,7 @@ var statusData = map[schema.GroupVersionResource]string{ gvr("policy", "v1", "poddisruptionbudgets"): `{"status": {"currentHealthy": 5}}`, gvr("policy", "v1beta1", "poddisruptionbudgets"): `{"status": {"currentHealthy": 5}}`, gvr("resource.k8s.io", "v1alpha3", "podschedulingcontexts"): `{"status": {"resourceClaims": [{"name": "my-claim", "unsuitableNodes": ["node1"]}]}}`, - gvr("resource.k8s.io", "v1alpha3", "resourceclaims"): `{"status": {"driverName": "example.com"}}`, + gvr("resource.k8s.io", "v1alpha3", "resourceclaims"): `{"status": {"allocation": {"controller": "example.com"}}}`, gvr("internal.apiserver.k8s.io", "v1alpha1", "storageversions"): `{"status": {"commonEncodingVersion":"v1","storageVersions":[{"apiServerID":"1","decodableVersions":["v1","v2"],"encodingVersion":"v1"}],"conditions":[{"type":"AllEncodingVersionsEqual","status":"True","lastTransitionTime":"2020-01-01T00:00:00Z","reason":"allEncodingVersionsEqual","message":"all encoding versions are set to v1"}]}}`, // standard for []metav1.Condition gvr("admissionregistration.k8s.io", "v1alpha1", "validatingadmissionpolicies"): `{"status": {"conditions":[{"type":"Accepted","status":"False","lastTransitionTime":"2020-01-01T00:00:00Z","reason":"RuleApplied","message":"Rule was applied"}]}}`, diff --git a/test/integration/apiserver/cel/authorizerselector/helper.go b/test/integration/apiserver/cel/authorizerselector/helper.go index aeb82897e66..5828fa7f333 100644 --- a/test/integration/apiserver/cel/authorizerselector/helper.go +++ b/test/integration/apiserver/cel/authorizerselector/helper.go @@ -24,7 +24,7 @@ import ( "testing" admissionregistrationv1 "k8s.io/api/admissionregistration/v1" - resourcev1alpha2 "k8s.io/api/resource/v1alpha2" + resourcev1alpha3 "k8s.io/api/resource/v1alpha3" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" extclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -49,7 +49,7 @@ func RunAuthzSelectorsLibraryTests(t *testing.T, featureEnabled bool) { // Start the server with the desired feature enablement server, err := apiservertesting.StartTestServer(t, nil, []string{ fmt.Sprintf("--feature-gates=AuthorizeWithSelectors=%v", featureEnabled), - "--runtime-config=resource.k8s.io/v1alpha2=true", + "--runtime-config=resource.k8s.io/v1alpha3=true", }, framework.SharedEtcd()) if err != nil { t.Fatal(err) @@ -161,21 +161,30 @@ func RunAuthzSelectorsLibraryTests(t *testing.T, featureEnabled bool) { }, }, { - name: "ResourceClaimParameters", + name: "ResourceClaim", createObject: func() error { - obj := &resourcev1alpha2.ResourceClaimParameters{ + obj := &resourcev1alpha3.ResourceClaim{ ObjectMeta: metav1.ObjectMeta{Name: "test"}, - DriverRequests: []resourcev1alpha2.DriverRequests{{ - DriverName: "example.com", - Requests: []resourcev1alpha2.ResourceRequest{{ - ResourceRequestModel: resourcev1alpha2.ResourceRequestModel{ - NamedResources: &resourcev1alpha2.NamedResourcesRequest{Selector: boolFieldSelectorExpression}}}}}}} - _, err := c.ResourceV1alpha2().ResourceClaimParameters("default").Create(context.TODO(), obj, metav1.CreateOptions{}) + Spec: resourcev1alpha3.ResourceClaimSpec{ + Devices: resourcev1alpha3.DeviceClaim{ + Requests: []resourcev1alpha3.DeviceRequest{{ + Name: "req-0", + DeviceClassName: "example-class", + Selectors: []resourcev1alpha3.DeviceSelector{{ + CEL: &resourcev1alpha3.CELDeviceSelector{ + Expression: boolFieldSelectorExpression, + }, + }}, + }}, + }, + }, + } + _, err := c.ResourceV1alpha3().ResourceClaims("default").Create(context.TODO(), obj, metav1.CreateOptions{}) return err }, // authorizer is not available to resource APIs - expectErrorsWhenEnabled: []*regexp.Regexp{regexp.MustCompile(`driverRequests\[0\]\.requests\[0\]\.namedResources\.selector:.*undeclared reference to 'authorizer'`)}, - expectErrorsWhenDisabled: []*regexp.Regexp{regexp.MustCompile(`driverRequests\[0\]\.requests\[0\]\.namedResources\.selector:.*undeclared reference to 'authorizer'`)}, + expectErrorsWhenEnabled: []*regexp.Regexp{regexp.MustCompile(`spec\.devices\.requests\[0\]\.selectors\[0\].cel\.expression:.*undeclared reference to 'authorizer'`)}, + expectErrorsWhenDisabled: []*regexp.Regexp{regexp.MustCompile(`spec\.devices\.requests\[0\]\.selectors\[0\].cel\.expression:.*undeclared reference to 'authorizer'`)}, }, { name: "CustomResourceDefinition - rule", diff --git a/test/integration/auth/node_test.go b/test/integration/auth/node_test.go index e2bab8d440d..96a4f51233d 100644 --- a/test/integration/auth/node_test.go +++ b/test/integration/auth/node_test.go @@ -108,17 +108,16 @@ func TestNodeAuthorizer(t *testing.T) { if _, err := superuserClient.CoreV1().ConfigMaps("ns").Create(context.TODO(), &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: "myconfigmap"}}, metav1.CreateOptions{}); err != nil { t.Fatal(err) } - if _, err := superuserClient.ResourceV1alpha3().ResourceClaims("ns").Create(context.TODO(), &resourceapi.ResourceClaim{ObjectMeta: metav1.ObjectMeta{Name: "mynamedresourceclaim"}, Spec: resourceapi.ResourceClaimSpec{ResourceClassName: "example.com"}}, metav1.CreateOptions{}); err != nil { + if _, err := superuserClient.ResourceV1alpha3().ResourceClaims("ns").Create(context.TODO(), &resourceapi.ResourceClaim{ObjectMeta: metav1.ObjectMeta{Name: "mynamedresourceclaim"}}, metav1.CreateOptions{}); err != nil { t.Fatal(err) } - if _, err := superuserClient.ResourceV1alpha3().ResourceClaims("ns").Create(context.TODO(), &resourceapi.ResourceClaim{ObjectMeta: metav1.ObjectMeta{Name: "mytemplatizedresourceclaim"}, Spec: resourceapi.ResourceClaimSpec{ResourceClassName: "example.com"}}, metav1.CreateOptions{}); err != nil { + if _, err := superuserClient.ResourceV1alpha3().ResourceClaims("ns").Create(context.TODO(), &resourceapi.ResourceClaim{ObjectMeta: metav1.ObjectMeta{Name: "mytemplatizedresourceclaim"}}, metav1.CreateOptions{}); err != nil { t.Fatal(err) } - model := resourceapi.ResourceModel{NamedResources: &resourceapi.NamedResourcesResources{}} - if _, err := superuserClient.ResourceV1alpha3().ResourceSlices().Create(context.TODO(), &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "myslice1"}, NodeName: "node1", DriverName: "dra.example.com", ResourceModel: model}, metav1.CreateOptions{}); err != nil { + if _, err := superuserClient.ResourceV1alpha3().ResourceSlices().Create(context.TODO(), &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "myslice1"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "node1", Driver: "dra.example.com", Pool: resourceapi.ResourcePool{Name: "node1-slice", ResourceSliceCount: 1}}}, metav1.CreateOptions{}); err != nil { t.Fatal(err) } - if _, err := superuserClient.ResourceV1alpha3().ResourceSlices().Create(context.TODO(), &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "myslice2"}, NodeName: "node2", DriverName: "dra.example.com", ResourceModel: model}, metav1.CreateOptions{}); err != nil { + if _, err := superuserClient.ResourceV1alpha3().ResourceSlices().Create(context.TODO(), &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "myslice2"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "node2", Driver: "dra.example.com", Pool: resourceapi.ResourcePool{Name: "node2-slice", ResourceSliceCount: 1}}}, metav1.CreateOptions{}); err != nil { t.Fatal(err) } @@ -207,7 +206,7 @@ func TestNodeAuthorizer(t *testing.T) { return func() error { var listOptions metav1.ListOptions if nodeName != nil { - listOptions.FieldSelector = "nodeName=" + *nodeName + listOptions.FieldSelector = resourceapi.ResourceSliceSelectorNodeName + "=" + *nodeName } return client.ResourceV1alpha3().ResourceSlices().DeleteCollection(context.TODO(), metav1.DeleteOptions{}, listOptions) } @@ -670,7 +669,7 @@ func TestNodeAuthorizer(t *testing.T) { if len(slices.Items) != 1 { t.Fatalf("unexpected slices: %v", slices.Items) } - if slices.Items[0].NodeName != "node2" { + if slices.Items[0].Spec.NodeName != "node2" { t.Fatal("wrong slice deleted") } diff --git a/test/integration/etcd/data.go b/test/integration/etcd/data.go index 1661de7392c..1bf63b2d4ce 100644 --- a/test/integration/etcd/data.go +++ b/test/integration/etcd/data.go @@ -404,32 +404,24 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes // -- // k8s.io/kubernetes/pkg/apis/resource/v1alpha3 - gvr("resource.k8s.io", "v1alpha3", "resourceclasses"): { - Stub: `{"metadata": {"name": "class1name"}, "driverName": "example.com"}`, - ExpectedEtcdPath: "/registry/resourceclasses/class1name", + gvr("resource.k8s.io", "v1alpha3", "deviceclasses"): { + Stub: `{"metadata": {"name": "class1name"}}`, + ExpectedEtcdPath: "/registry/deviceclasses/class1name", }, gvr("resource.k8s.io", "v1alpha3", "resourceclaims"): { - Stub: `{"metadata": {"name": "claim1name"}, "spec": {"resourceClassName": "class1name"}}`, + Stub: `{"metadata": {"name": "claim1name"}, "spec": {"devices": {"requests": [{"name": "req-0", "deviceClassName": "example-class", "allocationMode": "ExactCount", "count": 1}]}}}`, ExpectedEtcdPath: "/registry/resourceclaims/" + namespace + "/claim1name", }, gvr("resource.k8s.io", "v1alpha3", "resourceclaimtemplates"): { - Stub: `{"metadata": {"name": "claimtemplate1name"}, "spec": {"spec": {"resourceClassName": "class1name"}}}`, + Stub: `{"metadata": {"name": "claimtemplate1name"}, "spec": {"spec": {"devices": {"requests": [{"name": "req-0", "deviceClassName": "example-class", "allocationMode": "ExactCount", "count": 1}]}}}}`, ExpectedEtcdPath: "/registry/resourceclaimtemplates/" + namespace + "/claimtemplate1name", }, gvr("resource.k8s.io", "v1alpha3", "podschedulingcontexts"): { Stub: `{"metadata": {"name": "pod1name"}, "spec": {"selectedNode": "node1name", "potentialNodes": ["node1name", "node2name"]}}`, ExpectedEtcdPath: "/registry/podschedulingcontexts/" + namespace + "/pod1name", }, - gvr("resource.k8s.io", "v1alpha3", "resourceclassparameters"): { - Stub: `{"metadata": {"name": "class1parameters"}}`, - ExpectedEtcdPath: "/registry/resourceclassparameters/" + namespace + "/class1parameters", - }, - gvr("resource.k8s.io", "v1alpha3", "resourceclaimparameters"): { - Stub: `{"metadata": {"name": "claim1parameters"}}`, - ExpectedEtcdPath: "/registry/resourceclaimparameters/" + namespace + "/claim1parameters", - }, gvr("resource.k8s.io", "v1alpha3", "resourceslices"): { - Stub: `{"metadata": {"name": "node1slice"}, "nodeName": "worker1", "driverName": "dra.example.com", "namedResources": {}}`, + Stub: `{"metadata": {"name": "node1slice"}, "spec": {"nodeName": "worker1", "driver": "dra.example.com", "pool": {"name": "worker1", "resourceSliceCount": 1}}}`, ExpectedEtcdPath: "/registry/resourceslices/node1slice", }, // --