From ada506c53f76a75311a9e573cd456f4e9b6e2422 Mon Sep 17 00:00:00 2001 From: Raunak Pradip Shah Date: Mon, 6 Mar 2023 11:14:39 +0530 Subject: [PATCH] Address comments and re generate code --- .../volumegroupsnapshot/v1alpha1/types.go | 100 +++++++++++++----- .../v1alpha1/zz_generated.deepcopy.go | 24 ++--- ...age.k8s.io_volumegroupsnapshotclasses.yaml | 19 ++-- ...ge.k8s.io_volumegroupsnapshotcontents.yaml | 48 +++++---- ...t.storage.k8s.io_volumegroupsnapshots.yaml | 22 ++-- 5 files changed, 136 insertions(+), 77 deletions(-) diff --git a/client/apis/volumegroupsnapshot/v1alpha1/types.go b/client/apis/volumegroupsnapshot/v1alpha1/types.go index 0be8574a..b961dd9a 100644 --- a/client/apis/volumegroupsnapshot/v1alpha1/types.go +++ b/client/apis/volumegroupsnapshot/v1alpha1/types.go @@ -32,7 +32,8 @@ type VolumeGroupSnapshotSpec struct { // is created, the existing group snapshots won't be modified. // Once a VolumeGroupSnapshotContent is created and the sidecar starts to process // it, the volume list will not change with retries. - Selector *metav1.LabelSelector `json:"selector" protobuf:"bytes,1,opt,name=selector"` + // Required. + Selector metav1.LabelSelector `json:"selector" protobuf:"bytes,1,opt,name=selector"` // VolumeGroupSnapshotClassName is the name of the VolumeGroupSnapshotClass // requested by the VolumeGroupSnapshot. @@ -65,7 +66,11 @@ type VolumeGroupSnapshotStatus struct { // ReadyToUse indicates if all the individual snapshots in the group are ready // to be used to restore a volume. + // ReadyToUse becomes true when ReadyToUse of all individual snapshots become true. // If not specified, it means the readiness of a group snapshot is unknown. + // The format of this field is a Unix nanoseconds time encoded as an int64. + // On Unix, the command date +%s%N returns the current time in nanoseconds + // since 1970-01-01 00:00:00 UTC. // +optional ReadyToUse *bool `json:"readyToUse,omitempty" protobuf:"varint,3,opt,name=readyToUse"` @@ -86,41 +91,57 @@ type VolumeGroupSnapshotStatus struct { } //+genclient -//+k8s:deepcopy-gen=true //+k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -//+kubebuilder:resource:scope=Namespaced,shortName=vgs -//+kubebuilder:subresource:status // VolumeGroupSnapshot is a user's request for creating either a point-in-time // group snapshot or binding to a pre-existing group snapshot. // +kubebuilder:object:root=true +// +kubebuilder:resource:scope=Namespaced,shortName=vgs // +kubebuilder:subresource:status type VolumeGroupSnapshot struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - Spec VolumeGroupSnapshotSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"` - Status VolumeGroupSnapshotStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` + // Spec defines the desired characteristics of a group snapshot requested by a user. + // Required. + Spec VolumeGroupSnapshotSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"` + // Status represents the current information of a group snapshot. + // Consumers must verify binding between VolumeGroupSnapshot and + // VolumeGroupSnapshotContent objects is successful (by validating that both + // VolumeGroupSnapshot and VolumeGroupSnapshotContent point to each other) before + // using this object. + // +optional + Status *VolumeGroupSnapshotStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// VolumeGroupSnapshotList contains a list of VolumeGroupSnapshot +// VolumeGroupSnapshotList contains a list of VolumeGroupSnapshot objects. type VolumeGroupSnapshotList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []VolumeGroupSnapshot `json:"items"` + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // Items is the list of VolumeGroupSnapshots. + Items []VolumeGroupSnapshot `json:"items" protobuf:"bytes,2,rep,name=items"` } //+genclient //+genclient:nonNamespaced //+k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// VolumeGroupSnapshotClass is the Schema for the volumegroupsnapshotclass API +// VolumeGroupSnapshotClass specifies parameters that a underlying storage system +// uses when creating a volume group snapshot. A specific VolumeGroupSnapshotClass +// is used by specifying its name in a VolumeGroupSnapshot object. +// VolumeGroupSnapshotClasses are non-namespaced. // +kubebuilder:object:root=true -// +kubebuilder:subresource:status -// +kubebuilder:resource:scope=Cluster,shortName=vsgclass;vsgclasses +// +kubebuilder:resource:scope=Cluster,shortName=vgsclass;vgsclasses type VolumeGroupSnapshotClass struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Driver is the name of the storage driver expected to handle this VolumeGroupSnapshotClass. @@ -129,8 +150,7 @@ type VolumeGroupSnapshotClass struct { // Parameters is a key-value map with storage driver specific parameters for // creating group snapshots. - // These values are opaque to the system and are passed directly - // to the driver. + // These values are opaque to Kubernetes and are passed directly to the driver. // +optional Parameters map[string]string `json:"parameters,omitempty" protobuf:"bytes,3,rep,name=parameters"` @@ -138,8 +158,12 @@ type VolumeGroupSnapshotClass struct { // through the VolumeGroupSnapshotClass should be deleted when its bound // VolumeGroupSnapshot is deleted. // Supported values are "Retain" and "Delete". + // "Retain" means that the VolumeGroupSnapshotContent and its physical group + // snapshot on underlying storage system are kept. + // "Delete" means that the VolumeGroupSnapshotContent and its physical group + // snapshot on underlying storage system are deleted. // Required. - DeletionPolicy *snapshotv1.DeletionPolicy `json:"deletionPolicy" protobuf:"bytes,4,opt,name=deletionPolicy"` + DeletionPolicy snapshotv1.DeletionPolicy `json:"deletionPolicy" protobuf:"bytes,4,opt,name=deletionPolicy"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -148,9 +172,12 @@ type VolumeGroupSnapshotClass struct { // +kubebuilder:object:root=true type VolumeGroupSnapshotClassList struct { metav1.TypeMeta `json:",inline"` + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // Items is the list of VolumeGroupSnapshotClass + // Items is the list of VolumeGroupSnapshotClasses. Items []VolumeGroupSnapshotClass `json:"items" protobuf:"bytes,2,rep,name=items"` } @@ -161,14 +188,21 @@ type VolumeGroupSnapshotClassList struct { // VolumeGroupSnapshotContent represents the actual "on-disk" group snapshot object // in the underlying storage system // +kubebuilder:object:root=true -// +kubebuilder:resource:scope=Cluster,shortName=vsc;vgscs +// +kubebuilder:resource:scope=Cluster,shortName=vgsc;vgscs // +kubebuilder:subresource:status type VolumeGroupSnapshotContent struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - Spec VolumeGroupSnapshotContentSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"` - Status VolumeGroupSnapshotContentStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` + // Spec defines properties of a VolumeGroupSnapshotContent created by the underlying storage system. + // Required. + Spec VolumeGroupSnapshotContentSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"` + // status represents the current information of a group snapshot. + // +optional + Status *VolumeGroupSnapshotContentStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -177,10 +211,12 @@ type VolumeGroupSnapshotContent struct { // +kubebuilder:object:root=true type VolumeGroupSnapshotContentList struct { metav1.TypeMeta `json:",inline"` + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata // +optional metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // items is the list of VolumeGroupSnapshotContent + // Items is the list of VolumeGroupSnapshotContents. Items []VolumeGroupSnapshotContent `json:"items" protobuf:"bytes,2,rep,name=items"` } @@ -197,9 +233,13 @@ type VolumeGroupSnapshotContentSpec struct { VolumeGroupSnapshotRef core_v1.ObjectReference `json:"volumeGroupSnapshotRef" protobuf:"bytes,1,opt,name=volumeGroupSnapshotRef"` // DeletionPolicy determines whether this VolumeGroupSnapshotContent and the - // physical snapshots on the underlying storage system should be deleted when - // the bound VolumeGroupSnapshot is deleted. + // physical group snapshot on the underlying storage system should be deleted + // when the bound VolumeGroupSnapshot is deleted. // Supported values are "Retain" and "Delete". + // "Retain" means that the VolumeGroupSnapshotContent and its physical group + // snapshot on underlying storage system are kept. + // "Delete" means that the VolumeGroupSnapshotContent and its physical group + // snapshot on underlying storage system are deleted. // For dynamically provisioned group snapshots, this field will automatically // be filled in by the CSI snapshotter sidecar with the "DeletionPolicy" field // defined in the corresponding VolumeGroupSnapshotClass. @@ -249,7 +289,11 @@ type VolumeGroupSnapshotContentStatus struct { // ReadyToUse indicates if all the individual snapshots in the group are ready to be // used to restore a volume. + // ReadyToUse becomes true when ReadyToUse of all individual snapshots become true. // If not specified, it means the readiness of a group snapshot is unknown. + // The format of this field is a Unix nanoseconds time encoded as an int64. + // On Unix, the command date +%s%N returns the current time in nanoseconds + // since 1970-01-01 00:00:00 UTC. // +optional ReadyToUse *bool `json:"readyToUse,omitempty" protobuf:"varint,3,opt,name=readyToUse"` @@ -270,13 +314,13 @@ type VolumeGroupSnapshotContentStatus struct { // Members in VolumeGroupSnapshotContentSource are immutable. type VolumeGroupSnapshotContentSource struct { // PersistentVolumeNames is a list of names of PersistentVolumes to be snapshotted - // together. Signifies dynamic provisioning of the VolumeGroupSnapshot. + // together. It is specified for dynamic provisioning of the VolumeGroupSnapshot. // This field is immutable. // +optional PersistentVolumeNames []string `json:"persistentVolumeNames,omitempty" protobuf:"bytes,1,opt,name=persistentVolumeNames"` - // VolumeGroupSnapshotHandle specifies the CSI "snapshot_id" of a pre-existing - // snapshot on the underlying storage system for which a Kubernetes object + // VolumeGroupSnapshotHandle specifies the CSI "group_snapshot_id" of a pre-existing + // group snapshot on the underlying storage system for which a Kubernetes object // representation was (or should be) created. // This field is immutable. // +optional diff --git a/client/apis/volumegroupsnapshot/v1alpha1/zz_generated.deepcopy.go b/client/apis/volumegroupsnapshot/v1alpha1/zz_generated.deepcopy.go index 87938352..03d172fc 100644 --- a/client/apis/volumegroupsnapshot/v1alpha1/zz_generated.deepcopy.go +++ b/client/apis/volumegroupsnapshot/v1alpha1/zz_generated.deepcopy.go @@ -24,7 +24,6 @@ package v1alpha1 import ( v1 "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1" corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -34,7 +33,11 @@ func (in *VolumeGroupSnapshot) DeepCopyInto(out *VolumeGroupSnapshot) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) + if in.Status != nil { + in, out := &in.Status, &out.Status + *out = new(VolumeGroupSnapshotStatus) + (*in).DeepCopyInto(*out) + } return } @@ -68,11 +71,6 @@ func (in *VolumeGroupSnapshotClass) DeepCopyInto(out *VolumeGroupSnapshotClass) (*out)[key] = val } } - if in.DeletionPolicy != nil { - in, out := &in.DeletionPolicy, &out.DeletionPolicy - *out = new(v1.DeletionPolicy) - **out = **in - } return } @@ -133,7 +131,11 @@ func (in *VolumeGroupSnapshotContent) DeepCopyInto(out *VolumeGroupSnapshotConte out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) + if in.Status != nil { + in, out := &in.Status, &out.Status + *out = new(VolumeGroupSnapshotContentStatus) + (*in).DeepCopyInto(*out) + } return } @@ -314,11 +316,7 @@ func (in *VolumeGroupSnapshotList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *VolumeGroupSnapshotSpec) DeepCopyInto(out *VolumeGroupSnapshotSpec) { *out = *in - if in.Selector != nil { - in, out := &in.Selector, &out.Selector - *out = new(metav1.LabelSelector) - (*in).DeepCopyInto(*out) - } + in.Selector.DeepCopyInto(&out.Selector) if in.VolumeGroupSnapshotClassName != nil { in, out := &in.VolumeGroupSnapshotClassName, &out.VolumeGroupSnapshotClassName *out = new(string) diff --git a/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshotclasses.yaml b/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshotclasses.yaml index 16fbd5ee..bbdf7629 100644 --- a/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshotclasses.yaml +++ b/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshotclasses.yaml @@ -14,16 +14,18 @@ spec: listKind: VolumeGroupSnapshotClassList plural: volumegroupsnapshotclasses shortNames: - - vsgclass - - vsgclasses + - vgsclass + - vgsclasses singular: volumegroupsnapshotclass scope: Cluster versions: - name: v1alpha1 schema: openAPIV3Schema: - description: VolumeGroupSnapshotClass is the Schema for the volumegroupsnapshotclass - API + description: VolumeGroupSnapshotClass specifies parameters that a underlying + storage system uses when creating a volume group snapshot. A specific VolumeGroupSnapshotClass + is used by specifying its name in a VolumeGroupSnapshot object. VolumeGroupSnapshotClasses + are non-namespaced. properties: apiVersion: description: 'APIVersion defines the versioned schema of this representation @@ -34,7 +36,10 @@ spec: description: DeletionPolicy determines whether a VolumeGroupSnapshotContent created through the VolumeGroupSnapshotClass should be deleted when its bound VolumeGroupSnapshot is deleted. Supported values are "Retain" - and "Delete". Required. + and "Delete". "Retain" means that the VolumeGroupSnapshotContent and + its physical group snapshot on underlying storage system are kept. "Delete" + means that the VolumeGroupSnapshotContent and its physical group snapshot + on underlying storage system are deleted. Required. enum: - Delete - Retain @@ -53,7 +58,7 @@ spec: type: string description: Parameters is a key-value map with storage driver specific parameters for creating group snapshots. These values are opaque to - the system and are passed directly to the driver. + Kubernetes and are passed directly to the driver. type: object required: - deletionPolicy @@ -61,5 +66,3 @@ spec: type: object served: true storage: true - subresources: - status: {} diff --git a/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshotcontents.yaml b/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshotcontents.yaml index 80e0e3d3..7edb4329 100644 --- a/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshotcontents.yaml +++ b/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshotcontents.yaml @@ -14,7 +14,7 @@ spec: listKind: VolumeGroupSnapshotContentList plural: volumegroupsnapshotcontents shortNames: - - vsc + - vgsc - vgscs singular: volumegroupsnapshotcontent scope: Cluster @@ -36,19 +36,22 @@ spec: 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 spec: - description: VolumeGroupSnapshotContentSpec describes the common attributes - of a group snapshot content + description: Spec defines properties of a VolumeGroupSnapshotContent created + by the underlying storage system. Required. properties: deletionPolicy: description: DeletionPolicy determines whether this VolumeGroupSnapshotContent - and the physical snapshots on the underlying storage system should - be deleted when the bound VolumeGroupSnapshot is deleted. Supported - values are "Retain" and "Delete". For dynamically provisioned group - snapshots, this field will automatically be filled in by the CSI - snapshotter sidecar with the "DeletionPolicy" field defined in the - corresponding VolumeGroupSnapshotClass. For pre-existing snapshots, - users MUST specify this field when creating the VolumeGroupSnapshotContent - object. Required. + and the physical group snapshot on the underlying storage system + should be deleted when the bound VolumeGroupSnapshot is deleted. + Supported values are "Retain" and "Delete". "Retain" means that + the VolumeGroupSnapshotContent and its physical group snapshot on + underlying storage system are kept. "Delete" means that the VolumeGroupSnapshotContent + and its physical group snapshot on underlying storage system are + deleted. For dynamically provisioned group snapshots, this field + will automatically be filled in by the CSI snapshotter sidecar with + the "DeletionPolicy" field defined in the corresponding VolumeGroupSnapshotClass. + For pre-existing snapshots, users MUST specify this field when creating + the VolumeGroupSnapshotContent object. Required. enum: - Delete - Retain @@ -66,14 +69,14 @@ spec: properties: persistentVolumeNames: description: PersistentVolumeNames is a list of names of PersistentVolumes - to be snapshotted together. Signifies dynamic provisioning of - the VolumeGroupSnapshot. This field is immutable. + to be snapshotted together. It is specified for dynamic provisioning + of the VolumeGroupSnapshot. This field is immutable. items: type: string type: array volumeGroupSnapshotHandle: - description: VolumeGroupSnapshotHandle specifies the CSI "snapshot_id" - of a pre-existing snapshot on the underlying storage system + description: VolumeGroupSnapshotHandle specifies the CSI "group_snapshot_id" + of a pre-existing group snapshot on the underlying storage system for which a Kubernetes object representation was (or should be) created. This field is immutable. type: string @@ -141,8 +144,7 @@ spec: - volumeGroupSnapshotRef type: object status: - description: VolumeGroupSnapshotContentStatus defines the observed state - of VolumeGroupSnapshotContent. + description: status represents the current information of a group snapshot. properties: creationTime: description: CreationTime is the timestamp when the point-in-time @@ -156,19 +158,23 @@ spec: be cleared. properties: message: - description: 'Message is a string detailing the encountered error + description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.' type: string time: - description: Time is the timestamp when the error was encountered. + description: time is the timestamp when the error was encountered. format: date-time type: string type: object readyToUse: description: ReadyToUse indicates if all the individual snapshots - in the group are ready to be used to restore a volume. If not specified, - it means the readiness of a group snapshot is unknown. + in the group are ready to be used to restore a volume. ReadyToUse + becomes true when ReadyToUse of all individual snapshots become + true. If not specified, it means the readiness of a group snapshot + is unknown. The format of this field is a Unix nanoseconds time + encoded as an int64. On Unix, the command date +%s%N returns the + current time in nanoseconds since 1970-01-01 00:00:00 UTC. type: boolean volumeGroupSnapshotHandle: description: VolumeGroupSnapshotHandle is a unique id returned by diff --git a/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshots.yaml b/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshots.yaml index bd6d72ac..10ff2f25 100644 --- a/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshots.yaml +++ b/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshots.yaml @@ -35,7 +35,8 @@ spec: 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 spec: - description: VolumeGroupSnapshotSpec defines the desired state of VolumeGroupSnapshot + description: Spec defines the desired characteristics of a group snapshot + requested by a user. Required. properties: selector: description: Selector is a label query over PersistentVolumeClaims @@ -44,7 +45,7 @@ spec: added or removed to a volume after a group snapshot is created, the existing group snapshots won't be modified. Once a VolumeGroupSnapshotContent is created and the sidecar starts to process it, the volume list - will not change with retries. + will not change with retries. Required. properties: matchExpressions: description: matchExpressions is a list of label selector requirements. @@ -98,7 +99,10 @@ spec: - selector type: object status: - description: VolumeGroupSnapshotStatus defines the observed state of VolumeGroupSnapshot + description: Status represents the current information of a group snapshot. + Consumers must verify binding between VolumeGroupSnapshot and VolumeGroupSnapshotContent + objects is successful (by validating that both VolumeGroupSnapshot and + VolumeGroupSnapshotContent point to each other) before using this object. properties: boundVolumeGroupSnapshotContentName: description: 'BoundVolumeGroupSnapshotContentName is the name of the @@ -128,19 +132,23 @@ spec: this error field will be cleared. properties: message: - description: 'Message is a string detailing the encountered error + description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.' type: string time: - description: Time is the timestamp when the error was encountered. + description: time is the timestamp when the error was encountered. format: date-time type: string type: object readyToUse: description: ReadyToUse indicates if all the individual snapshots - in the group are ready to be used to restore a volume. If not specified, - it means the readiness of a group snapshot is unknown. + in the group are ready to be used to restore a volume. ReadyToUse + becomes true when ReadyToUse of all individual snapshots become + true. If not specified, it means the readiness of a group snapshot + is unknown. The format of this field is a Unix nanoseconds time + encoded as an int64. On Unix, the command date +%s%N returns the + current time in nanoseconds since 1970-01-01 00:00:00 UTC. type: boolean volumeSnapshotRefList: description: VolumeSnapshotRefList is the list of volume snapshot