1/*
2Copyright 2016 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
17package v1beta1
18
19import (
20	"k8s.io/api/core/v1"
21	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
22)
23
24// +genclient
25// +genclient:nonNamespaced
26// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
27
28// StorageClass describes the parameters for a class of storage for
29// which PersistentVolumes can be dynamically provisioned.
30//
31// StorageClasses are non-namespaced; the name of the storage class
32// according to etcd is in ObjectMeta.Name.
33type StorageClass struct {
34	metav1.TypeMeta `json:",inline"`
35	// Standard object's metadata.
36	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
37	// +optional
38	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
39
40	// Provisioner indicates the type of the provisioner.
41	Provisioner string `json:"provisioner" protobuf:"bytes,2,opt,name=provisioner"`
42
43	// Parameters holds the parameters for the provisioner that should
44	// create volumes of this storage class.
45	// +optional
46	Parameters map[string]string `json:"parameters,omitempty" protobuf:"bytes,3,rep,name=parameters"`
47
48	// Dynamically provisioned PersistentVolumes of this storage class are
49	// created with this reclaimPolicy. Defaults to Delete.
50	// +optional
51	ReclaimPolicy *v1.PersistentVolumeReclaimPolicy `json:"reclaimPolicy,omitempty" protobuf:"bytes,4,opt,name=reclaimPolicy,casttype=k8s.io/api/core/v1.PersistentVolumeReclaimPolicy"`
52
53	// Dynamically provisioned PersistentVolumes of this storage class are
54	// created with these mountOptions, e.g. ["ro", "soft"]. Not validated -
55	// mount of the PVs will simply fail if one is invalid.
56	// +optional
57	MountOptions []string `json:"mountOptions,omitempty" protobuf:"bytes,5,opt,name=mountOptions"`
58
59	// AllowVolumeExpansion shows whether the storage class allow volume expand
60	// +optional
61	AllowVolumeExpansion *bool `json:"allowVolumeExpansion,omitempty" protobuf:"varint,6,opt,name=allowVolumeExpansion"`
62
63	// VolumeBindingMode indicates how PersistentVolumeClaims should be
64	// provisioned and bound.  When unset, VolumeBindingImmediate is used.
65	// This field is only honored by servers that enable the VolumeScheduling feature.
66	// +optional
67	VolumeBindingMode *VolumeBindingMode `json:"volumeBindingMode,omitempty" protobuf:"bytes,7,opt,name=volumeBindingMode"`
68
69	// Restrict the node topologies where volumes can be dynamically provisioned.
70	// Each volume plugin defines its own supported topology specifications.
71	// An empty TopologySelectorTerm list means there is no topology restriction.
72	// This field is only honored by servers that enable the VolumeScheduling feature.
73	// +optional
74	AllowedTopologies []v1.TopologySelectorTerm `json:"allowedTopologies,omitempty" protobuf:"bytes,8,rep,name=allowedTopologies"`
75}
76
77// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
78
79// StorageClassList is a collection of storage classes.
80type StorageClassList struct {
81	metav1.TypeMeta `json:",inline"`
82	// Standard list metadata
83	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
84	// +optional
85	metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
86
87	// Items is the list of StorageClasses
88	Items []StorageClass `json:"items" protobuf:"bytes,2,rep,name=items"`
89}
90
91// VolumeBindingMode indicates how PersistentVolumeClaims should be bound.
92type VolumeBindingMode string
93
94const (
95	// VolumeBindingImmediate indicates that PersistentVolumeClaims should be
96	// immediately provisioned and bound.  This is the default mode.
97	VolumeBindingImmediate VolumeBindingMode = "Immediate"
98
99	// VolumeBindingWaitForFirstConsumer indicates that PersistentVolumeClaims
100	// should not be provisioned and bound until the first Pod is created that
101	// references the PeristentVolumeClaim.  The volume provisioning and
102	// binding will occur during Pod scheduing.
103	VolumeBindingWaitForFirstConsumer VolumeBindingMode = "WaitForFirstConsumer"
104)
105
106// +genclient
107// +genclient:nonNamespaced
108// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
109
110// VolumeAttachment captures the intent to attach or detach the specified volume
111// to/from the specified node.
112//
113// VolumeAttachment objects are non-namespaced.
114type VolumeAttachment struct {
115	metav1.TypeMeta `json:",inline"`
116
117	// Standard object metadata.
118	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
119	// +optional
120	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
121
122	// Specification of the desired attach/detach volume behavior.
123	// Populated by the Kubernetes system.
124	Spec VolumeAttachmentSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
125
126	// Status of the VolumeAttachment request.
127	// Populated by the entity completing the attach or detach
128	// operation, i.e. the external-attacher.
129	// +optional
130	Status VolumeAttachmentStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
131}
132
133// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
134
135// VolumeAttachmentList is a collection of VolumeAttachment objects.
136type VolumeAttachmentList struct {
137	metav1.TypeMeta `json:",inline"`
138	// Standard list metadata
139	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
140	// +optional
141	metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
142
143	// Items is the list of VolumeAttachments
144	Items []VolumeAttachment `json:"items" protobuf:"bytes,2,rep,name=items"`
145}
146
147// VolumeAttachmentSpec is the specification of a VolumeAttachment request.
148type VolumeAttachmentSpec struct {
149	// Attacher indicates the name of the volume driver that MUST handle this
150	// request. This is the name returned by GetPluginName().
151	Attacher string `json:"attacher" protobuf:"bytes,1,opt,name=attacher"`
152
153	// Source represents the volume that should be attached.
154	Source VolumeAttachmentSource `json:"source" protobuf:"bytes,2,opt,name=source"`
155
156	// The node that the volume should be attached to.
157	NodeName string `json:"nodeName" protobuf:"bytes,3,opt,name=nodeName"`
158}
159
160// VolumeAttachmentSource represents a volume that should be attached.
161// Right now only PersistenVolumes can be attached via external attacher,
162// in future we may allow also inline volumes in pods.
163// Exactly one member can be set.
164type VolumeAttachmentSource struct {
165	// Name of the persistent volume to attach.
166	// +optional
167	PersistentVolumeName *string `json:"persistentVolumeName,omitempty" protobuf:"bytes,1,opt,name=persistentVolumeName"`
168
169	// Placeholder for *VolumeSource to accommodate inline volumes in pods.
170}
171
172// VolumeAttachmentStatus is the status of a VolumeAttachment request.
173type VolumeAttachmentStatus struct {
174	// Indicates the volume is successfully attached.
175	// This field must only be set by the entity completing the attach
176	// operation, i.e. the external-attacher.
177	Attached bool `json:"attached" protobuf:"varint,1,opt,name=attached"`
178
179	// Upon successful attach, this field is populated with any
180	// information returned by the attach operation that must be passed
181	// into subsequent WaitForAttach or Mount calls.
182	// This field must only be set by the entity completing the attach
183	// operation, i.e. the external-attacher.
184	// +optional
185	AttachmentMetadata map[string]string `json:"attachmentMetadata,omitempty" protobuf:"bytes,2,rep,name=attachmentMetadata"`
186
187	// The last error encountered during attach operation, if any.
188	// This field must only be set by the entity completing the attach
189	// operation, i.e. the external-attacher.
190	// +optional
191	AttachError *VolumeError `json:"attachError,omitempty" protobuf:"bytes,3,opt,name=attachError,casttype=VolumeError"`
192
193	// The last error encountered during detach operation, if any.
194	// This field must only be set by the entity completing the detach
195	// operation, i.e. the external-attacher.
196	// +optional
197	DetachError *VolumeError `json:"detachError,omitempty" protobuf:"bytes,4,opt,name=detachError,casttype=VolumeError"`
198}
199
200// VolumeError captures an error encountered during a volume operation.
201type VolumeError struct {
202	// Time the error was encountered.
203	// +optional
204	Time metav1.Time `json:"time,omitempty" protobuf:"bytes,1,opt,name=time"`
205
206	// String detailing the error encountered during Attach or Detach operation.
207	// This string may be logged, so it should not contain sensitive
208	// information.
209	// +optional
210	Message string `json:"message,omitempty" protobuf:"bytes,2,opt,name=message"`
211}
212
213// +genclient
214// +genclient:nonNamespaced
215// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
216
217// CSIDriver captures information about a Container Storage Interface (CSI)
218// volume driver deployed on the cluster.
219// CSI drivers do not need to create the CSIDriver object directly. Instead they may use the
220// cluster-driver-registrar sidecar container. When deployed with a CSI driver it automatically
221// creates a CSIDriver object representing the driver.
222// Kubernetes attach detach controller uses this object to determine whether attach is required.
223// Kubelet uses this object to determine whether pod information needs to be passed on mount.
224// CSIDriver objects are non-namespaced.
225type CSIDriver struct {
226	metav1.TypeMeta `json:",inline"`
227
228	// Standard object metadata.
229	// metadata.Name indicates the name of the CSI driver that this object
230	// refers to; it MUST be the same name returned by the CSI GetPluginName()
231	// call for that driver.
232	// The driver name must be 63 characters or less, beginning and ending with
233	// an alphanumeric character ([a-z0-9A-Z]) with dashes (-), dots (.), and
234	// alphanumerics between.
235	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
236	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
237
238	// Specification of the CSI Driver.
239	Spec CSIDriverSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
240}
241
242// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
243
244// CSIDriverList is a collection of CSIDriver objects.
245type CSIDriverList struct {
246	metav1.TypeMeta `json:",inline"`
247
248	// Standard list metadata
249	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
250	// +optional
251	metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
252
253	// items is the list of CSIDriver
254	Items []CSIDriver `json:"items" protobuf:"bytes,2,rep,name=items"`
255}
256
257// CSIDriverSpec is the specification of a CSIDriver.
258type CSIDriverSpec struct {
259	// attachRequired indicates this CSI volume driver requires an attach
260	// operation (because it implements the CSI ControllerPublishVolume()
261	// method), and that the Kubernetes attach detach controller should call
262	// the attach volume interface which checks the volumeattachment status
263	// and waits until the volume is attached before proceeding to mounting.
264	// The CSI external-attacher coordinates with CSI volume driver and updates
265	// the volumeattachment status when the attach operation is complete.
266	// If the CSIDriverRegistry feature gate is enabled and the value is
267	// specified to false, the attach operation will be skipped.
268	// Otherwise the attach operation will be called.
269	// +optional
270	AttachRequired *bool `json:"attachRequired,omitempty" protobuf:"varint,1,opt,name=attachRequired"`
271
272	// If set to true, podInfoOnMount indicates this CSI volume driver
273	// requires additional pod information (like podName, podUID, etc.) during
274	// mount operations.
275	// If set to false, pod information will not be passed on mount.
276	// Default is false.
277	// The CSI driver specifies podInfoOnMount as part of driver deployment.
278	// If true, Kubelet will pass pod information as VolumeContext in the CSI
279	// NodePublishVolume() calls.
280	// The CSI driver is responsible for parsing and validating the information
281	// passed in as VolumeContext.
282	// The following VolumeConext will be passed if podInfoOnMount is set to true.
283	// This list might grow, but the prefix will be used.
284	// "csi.storage.k8s.io/pod.name": pod.Name
285	// "csi.storage.k8s.io/pod.namespace": pod.Namespace
286	// "csi.storage.k8s.io/pod.uid": string(pod.UID)
287	// +optional
288	PodInfoOnMount *bool `json:"podInfoOnMount,omitempty" protobuf:"bytes,2,opt,name=podInfoOnMount"`
289}
290
291// +genclient
292// +genclient:nonNamespaced
293// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
294
295// CSINode holds information about all CSI drivers installed on a node.
296// CSI drivers do not need to create the CSINode object directly. As long as
297// they use the node-driver-registrar sidecar container, the kubelet will
298// automatically populate the CSINode object for the CSI driver as part of
299// kubelet plugin registration.
300// CSINode has the same name as a node. If the object is missing, it means either
301// there are no CSI Drivers available on the node, or the Kubelet version is low
302// enough that it doesn't create this object.
303// CSINode has an OwnerReference that points to the corresponding node object.
304type CSINode struct {
305	metav1.TypeMeta `json:",inline"`
306
307	// metadata.name must be the Kubernetes node name.
308	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
309
310	// spec is the specification of CSINode
311	Spec CSINodeSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
312}
313
314// CSINodeSpec holds information about the specification of all CSI drivers installed on a node
315type CSINodeSpec struct {
316	// drivers is a list of information of all CSI Drivers existing on a node.
317	// If all drivers in the list are uninstalled, this can become empty.
318	// +patchMergeKey=name
319	// +patchStrategy=merge
320	Drivers []CSINodeDriver `json:"drivers" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,1,rep,name=drivers"`
321}
322
323// CSINodeDriver holds information about the specification of one CSI driver installed on a node
324type CSINodeDriver struct {
325	// This is the name of the CSI driver that this object refers to.
326	// This MUST be the same name returned by the CSI GetPluginName() call for
327	// that driver.
328	Name string `json:"name" protobuf:"bytes,1,opt,name=name"`
329
330	// nodeID of the node from the driver point of view.
331	// This field enables Kubernetes to communicate with storage systems that do
332	// not share the same nomenclature for nodes. For example, Kubernetes may
333	// refer to a given node as "node1", but the storage system may refer to
334	// the same node as "nodeA". When Kubernetes issues a command to the storage
335	// system to attach a volume to a specific node, it can use this field to
336	// refer to the node name using the ID that the storage system will
337	// understand, e.g. "nodeA" instead of "node1". This field is required.
338	NodeID string `json:"nodeID" protobuf:"bytes,2,opt,name=nodeID"`
339
340	// topologyKeys is the list of keys supported by the driver.
341	// When a driver is initialized on a cluster, it provides a set of topology
342	// keys that it understands (e.g. "company.com/zone", "company.com/region").
343	// When a driver is initialized on a node, it provides the same topology keys
344	// along with values. Kubelet will expose these topology keys as labels
345	// on its own node object.
346	// When Kubernetes does topology aware provisioning, it can use this list to
347	// determine which labels it should retrieve from the node object and pass
348	// back to the driver.
349	// It is possible for different nodes to use different topology keys.
350	// This can be empty if driver does not support topology.
351	// +optional
352	TopologyKeys []string `json:"topologyKeys" protobuf:"bytes,3,rep,name=topologyKeys"`
353}
354
355// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
356
357// CSINodeList is a collection of CSINode objects.
358type CSINodeList struct {
359	metav1.TypeMeta `json:",inline"`
360
361	// Standard list metadata
362	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
363	// +optional
364	metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
365
366	// items is the list of CSINode
367	Items []CSINode `json:"items" protobuf:"bytes,2,rep,name=items"`
368}
369