1/*
2Copyright The Kubernetes Authors.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17
18// This file was autogenerated by go-to-protobuf. Do not edit it manually!
19
20syntax = "proto2";
21
22package k8s.io.api.storage.v1beta1;
23
24import "k8s.io/api/core/v1/generated.proto";
25import "k8s.io/apimachinery/pkg/api/resource/generated.proto";
26import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto";
27import "k8s.io/apimachinery/pkg/runtime/generated.proto";
28import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";
29
30// Package-wide variables from generator "generated".
31option go_package = "k8s.io/api/storage/v1beta1";
32
33// CSIDriver captures information about a Container Storage Interface (CSI)
34// volume driver deployed on the cluster.
35// CSI drivers do not need to create the CSIDriver object directly. Instead they may use the
36// cluster-driver-registrar sidecar container. When deployed with a CSI driver it automatically
37// creates a CSIDriver object representing the driver.
38// Kubernetes attach detach controller uses this object to determine whether attach is required.
39// Kubelet uses this object to determine whether pod information needs to be passed on mount.
40// CSIDriver objects are non-namespaced.
41message CSIDriver {
42 // Standard object metadata.
43 // metadata.Name indicates the name of the CSI driver that this object
44 // refers to; it MUST be the same name returned by the CSI GetPluginName()
45 // call for that driver.
46 // The driver name must be 63 characters or less, beginning and ending with
47 // an alphanumeric character ([a-z0-9A-Z]) with dashes (-), dots (.), and
48 // alphanumerics between.
49 // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
50 optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1;
51
52 // spec represents the specification of the CSI Driver.
53 optional CSIDriverSpec spec = 2;
54}
55
56// CSIDriverList is a collection of CSIDriver objects.
57message CSIDriverList {
58 // Standard list metadata
59 // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
60 // +optional
61 optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1;
62
63 // items is the list of CSIDriver
64 repeated CSIDriver items = 2;
65}
66
67// CSIDriverSpec is the specification of a CSIDriver.
68message CSIDriverSpec {
69 // attachRequired indicates this CSI volume driver requires an attach
70 // operation (because it implements the CSI ControllerPublishVolume()
71 // method), and that the Kubernetes attach detach controller should call
72 // the attach volume interface which checks the volumeattachment status
73 // and waits until the volume is attached before proceeding to mounting.
74 // The CSI external-attacher coordinates with CSI volume driver and updates
75 // the volumeattachment status when the attach operation is complete.
76 // If the CSIDriverRegistry feature gate is enabled and the value is
77 // specified to false, the attach operation will be skipped.
78 // Otherwise the attach operation will be called.
79 //
80 // This field is immutable.
81 //
82 // +optional
83 optional bool attachRequired = 1;
84
85 // podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.)
86 // during mount operations, if set to true.
87 // If set to false, pod information will not be passed on mount.
88 // Default is false.
89 //
90 // The CSI driver specifies podInfoOnMount as part of driver deployment.
91 // If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls.
92 // The CSI driver is responsible for parsing and validating the information passed in as VolumeContext.
93 //
94 // The following VolumeContext will be passed if podInfoOnMount is set to true.
95 // This list might grow, but the prefix will be used.
96 // "csi.storage.k8s.io/pod.name": pod.Name
97 // "csi.storage.k8s.io/pod.namespace": pod.Namespace
98 // "csi.storage.k8s.io/pod.uid": string(pod.UID)
99 // "csi.storage.k8s.io/ephemeral": "true" if the volume is an ephemeral inline volume
100 // defined by a CSIVolumeSource, otherwise "false"
101 //
102 // "csi.storage.k8s.io/ephemeral" is a new feature in Kubernetes 1.16. It is only
103 // required for drivers which support both the "Persistent" and "Ephemeral" VolumeLifecycleMode.
104 // Other drivers can leave pod info disabled and/or ignore this field.
105 // As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when
106 // deployed on such a cluster and the deployment determines which mode that is, for example
107 // via a command line parameter of the driver.
108 //
109 // This field is immutable.
110 //
111 // +optional
112 optional bool podInfoOnMount = 2;
113
114 // volumeLifecycleModes defines what kind of volumes this CSI volume driver supports.
115 // The default if the list is empty is "Persistent", which is the usage defined by the
116 // CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism.
117 //
118 // The other mode is "Ephemeral". In this mode, volumes are defined inline inside the pod spec
119 // with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod.
120 // A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume.
121 //
122 // For more information about implementing this mode, see
123 // https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html
124 // A driver can support one or more of these modes and
125 // more modes may be added in the future.
126 //
127 // This field is immutable.
128 //
129 // +optional
130 // +listType=atomic
131 repeated string volumeLifecycleModes = 3;
132
133 // storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage
134 // capacity that the driver deployment will report by creating
135 // CSIStorageCapacity objects with capacity information, if set to true.
136 //
137 // The check can be enabled immediately when deploying a driver.
138 // In that case, provisioning new volumes with late binding
139 // will pause until the driver deployment has published
140 // some suitable CSIStorageCapacity object.
141 //
142 // Alternatively, the driver can be deployed with the field
143 // unset or false and it can be flipped later when storage
144 // capacity information has been published.
145 //
146 // This field was immutable in Kubernetes <= 1.22 and now is mutable.
147 //
148 // +optional
149 optional bool storageCapacity = 4;
150
151 // fsGroupPolicy defines if the underlying volume supports changing ownership and
152 // permission of the volume before being mounted.
153 // Refer to the specific FSGroupPolicy values for additional details.
154 //
155 // This field is immutable.
156 //
157 // Defaults to ReadWriteOnceWithFSType, which will examine each volume
158 // to determine if Kubernetes should modify ownership and permissions of the volume.
159 // With the default policy the defined fsGroup will only be applied
160 // if a fstype is defined and the volume's access mode contains ReadWriteOnce.
161 //
162 // +optional
163 optional string fsGroupPolicy = 5;
164
165 // tokenRequests indicates the CSI driver needs pods' service account
166 // tokens it is mounting volume for to do necessary authentication. Kubelet
167 // will pass the tokens in VolumeContext in the CSI NodePublishVolume calls.
168 // The CSI driver should parse and validate the following VolumeContext:
169 // "csi.storage.k8s.io/serviceAccount.tokens": {
170 // "<audience>": {
171 // "token": <token>,
172 // "expirationTimestamp": <expiration timestamp in RFC3339>,
173 // },
174 // ...
175 // }
176 //
177 // Note: Audience in each TokenRequest should be different and at
178 // most one token is empty string. To receive a new token after expiry,
179 // RequiresRepublish can be used to trigger NodePublishVolume periodically.
180 //
181 // +optional
182 // +listType=atomic
183 repeated TokenRequest tokenRequests = 6;
184
185 // requiresRepublish indicates the CSI driver wants `NodePublishVolume`
186 // being periodically called to reflect any possible change in the mounted
187 // volume. This field defaults to false.
188 //
189 // Note: After a successful initial NodePublishVolume call, subsequent calls
190 // to NodePublishVolume should only update the contents of the volume. New
191 // mount points will not be seen by a running container.
192 //
193 // +optional
194 optional bool requiresRepublish = 7;
195
196 // seLinuxMount specifies if the CSI driver supports "-o context"
197 // mount option.
198 //
199 // When "true", the CSI driver must ensure that all volumes provided by this CSI
200 // driver can be mounted separately with different `-o context` options. This is
201 // typical for storage backends that provide volumes as filesystems on block
202 // devices or as independent shared volumes.
203 // Kubernetes will call NodeStage / NodePublish with "-o context=xyz" mount
204 // option when mounting a ReadWriteOncePod volume used in Pod that has
205 // explicitly set SELinux context. In the future, it may be expanded to other
206 // volume AccessModes. In any case, Kubernetes will ensure that the volume is
207 // mounted only with a single SELinux context.
208 //
209 // When "false", Kubernetes won't pass any special SELinux mount options to the driver.
210 // This is typical for volumes that represent subdirectories of a bigger shared filesystem.
211 //
212 // Default is "false".
213 //
214 // +featureGate=SELinuxMountReadWriteOncePod
215 // +optional
216 optional bool seLinuxMount = 8;
217}
218
219// DEPRECATED - This group version of CSINode is deprecated by storage/v1/CSINode.
220// See the release notes for more information.
221// CSINode holds information about all CSI drivers installed on a node.
222// CSI drivers do not need to create the CSINode object directly. As long as
223// they use the node-driver-registrar sidecar container, the kubelet will
224// automatically populate the CSINode object for the CSI driver as part of
225// kubelet plugin registration.
226// CSINode has the same name as a node. If the object is missing, it means either
227// there are no CSI Drivers available on the node, or the Kubelet version is low
228// enough that it doesn't create this object.
229// CSINode has an OwnerReference that points to the corresponding node object.
230message CSINode {
231 // metadata.name must be the Kubernetes node name.
232 optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1;
233
234 // spec is the specification of CSINode
235 optional CSINodeSpec spec = 2;
236}
237
238// CSINodeDriver holds information about the specification of one CSI driver installed on a node
239message CSINodeDriver {
240 // name represents the name of the CSI driver that this object refers to.
241 // This MUST be the same name returned by the CSI GetPluginName() call for
242 // that driver.
243 optional string name = 1;
244
245 // nodeID of the node from the driver point of view.
246 // This field enables Kubernetes to communicate with storage systems that do
247 // not share the same nomenclature for nodes. For example, Kubernetes may
248 // refer to a given node as "node1", but the storage system may refer to
249 // the same node as "nodeA". When Kubernetes issues a command to the storage
250 // system to attach a volume to a specific node, it can use this field to
251 // refer to the node name using the ID that the storage system will
252 // understand, e.g. "nodeA" instead of "node1". This field is required.
253 optional string nodeID = 2;
254
255 // topologyKeys is the list of keys supported by the driver.
256 // When a driver is initialized on a cluster, it provides a set of topology
257 // keys that it understands (e.g. "company.com/zone", "company.com/region").
258 // When a driver is initialized on a node, it provides the same topology keys
259 // along with values. Kubelet will expose these topology keys as labels
260 // on its own node object.
261 // When Kubernetes does topology aware provisioning, it can use this list to
262 // determine which labels it should retrieve from the node object and pass
263 // back to the driver.
264 // It is possible for different nodes to use different topology keys.
265 // This can be empty if driver does not support topology.
266 // +optional
267 // +listType=atomic
268 repeated string topologyKeys = 3;
269
270 // allocatable represents the volume resources of a node that are available for scheduling.
271 // +optional
272 optional VolumeNodeResources allocatable = 4;
273}
274
275// CSINodeList is a collection of CSINode objects.
276message CSINodeList {
277 // Standard list metadata
278 // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
279 // +optional
280 optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1;
281
282 // items is the list of CSINode
283 repeated CSINode items = 2;
284}
285
286// CSINodeSpec holds information about the specification of all CSI drivers installed on a node
287message CSINodeSpec {
288 // drivers is a list of information of all CSI Drivers existing on a node.
289 // If all drivers in the list are uninstalled, this can become empty.
290 // +patchMergeKey=name
291 // +patchStrategy=merge
292 // +listType=map
293 // +listMapKey=name
294 repeated CSINodeDriver drivers = 1;
295}
296
297// CSIStorageCapacity stores the result of one CSI GetCapacity call.
298// For a given StorageClass, this describes the available capacity in a
299// particular topology segment. This can be used when considering where to
300// instantiate new PersistentVolumes.
301//
302// For example this can express things like:
303// - StorageClass "standard" has "1234 GiB" available in "topology.kubernetes.io/zone=us-east1"
304// - StorageClass "localssd" has "10 GiB" available in "kubernetes.io/hostname=knode-abc123"
305//
306// The following three cases all imply that no capacity is available for
307// a certain combination:
308// - no object exists with suitable topology and storage class name
309// - such an object exists, but the capacity is unset
310// - such an object exists, but the capacity is zero
311//
312// The producer of these objects can decide which approach is more suitable.
313//
314// They are consumed by the kube-scheduler when a CSI driver opts into
315// capacity-aware scheduling with CSIDriverSpec.StorageCapacity. The scheduler
316// compares the MaximumVolumeSize against the requested size of pending volumes
317// to filter out unsuitable nodes. If MaximumVolumeSize is unset, it falls back
318// to a comparison against the less precise Capacity. If that is also unset,
319// the scheduler assumes that capacity is insufficient and tries some other
320// node.
321message CSIStorageCapacity {
322 // Standard object's metadata. The name has no particular meaning. It must be
323 // be a DNS subdomain (dots allowed, 253 characters). To ensure that
324 // there are no conflicts with other CSI drivers on the cluster, the recommendation
325 // is to use csisc-<uuid>, a generated name, or a reverse-domain name which ends
326 // with the unique CSI driver name.
327 //
328 // Objects are namespaced.
329 //
330 // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
331 // +optional
332 optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1;
333
334 // nodeTopology defines which nodes have access to the storage
335 // for which capacity was reported. If not set, the storage is
336 // not accessible from any node in the cluster. If empty, the
337 // storage is accessible from all nodes. This field is
338 // immutable.
339 //
340 // +optional
341 optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector nodeTopology = 2;
342
343 // storageClassName represents the name of the StorageClass that the reported capacity applies to.
344 // It must meet the same requirements as the name of a StorageClass
345 // object (non-empty, DNS subdomain). If that object no longer exists,
346 // the CSIStorageCapacity object is obsolete and should be removed by its
347 // creator.
348 // This field is immutable.
349 optional string storageClassName = 3;
350
351 // capacity is the value reported by the CSI driver in its GetCapacityResponse
352 // for a GetCapacityRequest with topology and parameters that match the
353 // previous fields.
354 //
355 // The semantic is currently (CSI spec 1.2) defined as:
356 // The available capacity, in bytes, of the storage that can be used
357 // to provision volumes. If not set, that information is currently
358 // unavailable.
359 //
360 // +optional
361 optional k8s.io.apimachinery.pkg.api.resource.Quantity capacity = 4;
362
363 // maximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse
364 // for a GetCapacityRequest with topology and parameters that match the
365 // previous fields.
366 //
367 // This is defined since CSI spec 1.4.0 as the largest size
368 // that may be used in a
369 // CreateVolumeRequest.capacity_range.required_bytes field to
370 // create a volume with the same parameters as those in
371 // GetCapacityRequest. The corresponding value in the Kubernetes
372 // API is ResourceRequirements.Requests in a volume claim.
373 //
374 // +optional
375 optional k8s.io.apimachinery.pkg.api.resource.Quantity maximumVolumeSize = 5;
376}
377
378// CSIStorageCapacityList is a collection of CSIStorageCapacity objects.
379message CSIStorageCapacityList {
380 // Standard list metadata
381 // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
382 // +optional
383 optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1;
384
385 // items is the list of CSIStorageCapacity objects.
386 repeated CSIStorageCapacity items = 2;
387}
388
389// StorageClass describes the parameters for a class of storage for
390// which PersistentVolumes can be dynamically provisioned.
391//
392// StorageClasses are non-namespaced; the name of the storage class
393// according to etcd is in ObjectMeta.Name.
394message StorageClass {
395 // Standard object's metadata.
396 // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
397 // +optional
398 optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1;
399
400 // provisioner indicates the type of the provisioner.
401 optional string provisioner = 2;
402
403 // parameters holds the parameters for the provisioner that should
404 // create volumes of this storage class.
405 // +optional
406 map<string, string> parameters = 3;
407
408 // reclaimPolicy controls the reclaimPolicy for dynamically provisioned PersistentVolumes of this storage class.
409 // Defaults to Delete.
410 // +optional
411 optional string reclaimPolicy = 4;
412
413 // mountOptions controls the mountOptions for dynamically provisioned PersistentVolumes of this storage class.
414 // e.g. ["ro", "soft"]. Not validated -
415 // mount of the PVs will simply fail if one is invalid.
416 // +optional
417 // +listType=atomic
418 repeated string mountOptions = 5;
419
420 // allowVolumeExpansion shows whether the storage class allow volume expand
421 // +optional
422 optional bool allowVolumeExpansion = 6;
423
424 // volumeBindingMode indicates how PersistentVolumeClaims should be
425 // provisioned and bound. When unset, VolumeBindingImmediate is used.
426 // This field is only honored by servers that enable the VolumeScheduling feature.
427 // +optional
428 optional string volumeBindingMode = 7;
429
430 // allowedTopologies restrict the node topologies where volumes can be dynamically provisioned.
431 // Each volume plugin defines its own supported topology specifications.
432 // An empty TopologySelectorTerm list means there is no topology restriction.
433 // This field is only honored by servers that enable the VolumeScheduling feature.
434 // +optional
435 // +listType=atomic
436 repeated k8s.io.api.core.v1.TopologySelectorTerm allowedTopologies = 8;
437}
438
439// StorageClassList is a collection of storage classes.
440message StorageClassList {
441 // Standard list metadata
442 // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
443 // +optional
444 optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1;
445
446 // items is the list of StorageClasses
447 repeated StorageClass items = 2;
448}
449
450// TokenRequest contains parameters of a service account token.
451message TokenRequest {
452 // audience is the intended audience of the token in "TokenRequestSpec".
453 // It will default to the audiences of kube apiserver.
454 optional string audience = 1;
455
456 // expirationSeconds is the duration of validity of the token in "TokenRequestSpec".
457 // It has the same default value of "ExpirationSeconds" in "TokenRequestSpec"
458 //
459 // +optional
460 optional int64 expirationSeconds = 2;
461}
462
463// VolumeAttachment captures the intent to attach or detach the specified volume
464// to/from the specified node.
465//
466// VolumeAttachment objects are non-namespaced.
467message VolumeAttachment {
468 // Standard object metadata.
469 // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
470 // +optional
471 optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1;
472
473 // spec represents specification of the desired attach/detach volume behavior.
474 // Populated by the Kubernetes system.
475 optional VolumeAttachmentSpec spec = 2;
476
477 // status represents status of the VolumeAttachment request.
478 // Populated by the entity completing the attach or detach
479 // operation, i.e. the external-attacher.
480 // +optional
481 optional VolumeAttachmentStatus status = 3;
482}
483
484// VolumeAttachmentList is a collection of VolumeAttachment objects.
485message VolumeAttachmentList {
486 // Standard list metadata
487 // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
488 // +optional
489 optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1;
490
491 // items is the list of VolumeAttachments
492 repeated VolumeAttachment items = 2;
493}
494
495// VolumeAttachmentSource represents a volume that should be attached.
496// Right now only PersistenVolumes can be attached via external attacher,
497// in future we may allow also inline volumes in pods.
498// Exactly one member can be set.
499message VolumeAttachmentSource {
500 // persistentVolumeName represents the name of the persistent volume to attach.
501 // +optional
502 optional string persistentVolumeName = 1;
503
504 // inlineVolumeSpec contains all the information necessary to attach
505 // a persistent volume defined by a pod's inline VolumeSource. This field
506 // is populated only for the CSIMigration feature. It contains
507 // translated fields from a pod's inline VolumeSource to a
508 // PersistentVolumeSpec. This field is beta-level and is only
509 // honored by servers that enabled the CSIMigration feature.
510 // +optional
511 optional k8s.io.api.core.v1.PersistentVolumeSpec inlineVolumeSpec = 2;
512}
513
514// VolumeAttachmentSpec is the specification of a VolumeAttachment request.
515message VolumeAttachmentSpec {
516 // attacher indicates the name of the volume driver that MUST handle this
517 // request. This is the name returned by GetPluginName().
518 optional string attacher = 1;
519
520 // source represents the volume that should be attached.
521 optional VolumeAttachmentSource source = 2;
522
523 // nodeName represents the node that the volume should be attached to.
524 optional string nodeName = 3;
525}
526
527// VolumeAttachmentStatus is the status of a VolumeAttachment request.
528message VolumeAttachmentStatus {
529 // attached indicates the volume is successfully attached.
530 // This field must only be set by the entity completing the attach
531 // operation, i.e. the external-attacher.
532 optional bool attached = 1;
533
534 // attachmentMetadata is populated with any
535 // information returned by the attach operation, upon successful attach, that must be passed
536 // into subsequent WaitForAttach or Mount calls.
537 // This field must only be set by the entity completing the attach
538 // operation, i.e. the external-attacher.
539 // +optional
540 map<string, string> attachmentMetadata = 2;
541
542 // attachError represents the last error encountered during attach operation, if any.
543 // This field must only be set by the entity completing the attach
544 // operation, i.e. the external-attacher.
545 // +optional
546 optional VolumeError attachError = 3;
547
548 // detachError represents the last error encountered during detach operation, if any.
549 // This field must only be set by the entity completing the detach
550 // operation, i.e. the external-attacher.
551 // +optional
552 optional VolumeError detachError = 4;
553}
554
555// VolumeError captures an error encountered during a volume operation.
556message VolumeError {
557 // time represents the time the error was encountered.
558 // +optional
559 optional k8s.io.apimachinery.pkg.apis.meta.v1.Time time = 1;
560
561 // message represents the error encountered during Attach or Detach operation.
562 // This string may be logged, so it should not contain sensitive
563 // information.
564 // +optional
565 optional string message = 2;
566}
567
568// VolumeNodeResources is a set of resource limits for scheduling of volumes.
569message VolumeNodeResources {
570 // count indicates the maximum number of unique volumes managed by the CSI driver that can be used on a node.
571 // A volume that is both attached and mounted on a node is considered to be used once, not twice.
572 // The same rule applies for a unique volume that is shared among multiple pods on the same node.
573 // If this field is nil, then the supported number of volumes on this node is unbounded.
574 // +optional
575 optional int32 count = 1;
576}
577
View as plain text