Don't generate empty structure.

VolumeInfo contains several sub-structures. They are filled for
different scenarios. Do not generate empty structure for the
not filled sub-structures.

Signed-off-by: Xun Jiang <jxun@vmware.com>
This commit is contained in:
Xun Jiang
2023-12-21 14:53:03 +08:00
parent 89cbdac0a3
commit 9be8eb0c6d
7 changed files with 132 additions and 75 deletions
+37 -22
View File
@@ -42,6 +42,10 @@ const (
CSISnapshot VolumeBackupMethod = "CSISnapshot"
)
const (
FieldValueIsUnknown string = "unknown"
)
type VolumeInfo struct {
// The PVC's name.
PVCName string `json:"pvcName,omitempty"`
@@ -72,14 +76,11 @@ type VolumeInfo struct {
// Snapshot starts timestamp.
StartTimestamp *metav1.Time `json:"startTimestamp,omitempty"`
// The Async Operation's ID.
OperationID string `json:"operationID,omitempty"`
CSISnapshotInfo CSISnapshotInfo `json:"csiSnapshotInfo,omitempty"`
SnapshotDataMovementInfo SnapshotDataMovementInfo `json:"snapshotDataMovementInfo,omitempty"`
NativeSnapshotInfo NativeSnapshotInfo `json:"nativeSnapshotInfo,omitempty"`
PVBInfo PodVolumeBackupInfo `json:"pvbInfo,omitempty"`
PVInfo PVInfo `json:"pvInfo,omitempty"`
CSISnapshotInfo *CSISnapshotInfo `json:"csiSnapshotInfo,omitempty"`
SnapshotDataMovementInfo *SnapshotDataMovementInfo `json:"snapshotDataMovementInfo,omitempty"`
NativeSnapshotInfo *NativeSnapshotInfo `json:"nativeSnapshotInfo,omitempty"`
PVBInfo *PodVolumeBackupInfo `json:"pvbInfo,omitempty"`
PVInfo *PVInfo `json:"pvInfo,omitempty"`
}
// CSISnapshotInfo is used for displaying the CSI snapshot status
@@ -95,6 +96,9 @@ type CSISnapshotInfo struct {
// The name of the VolumeSnapshotContent.
VSCName string `json:"vscName"`
// The Async Operation's ID.
OperationID string `json:"operationID"`
}
// SnapshotDataMovementInfo is used for displaying the snapshot data mover status.
@@ -112,6 +116,9 @@ type SnapshotDataMovementInfo struct {
// It's the filesystem repository's snapshot ID.
SnapshotHandle string `json:"snapshotHandle"`
// The Async Operation's ID.
OperationID string `json:"operationID"`
}
// NativeSnapshotInfo is used for displaying the Velero native snapshot status.
@@ -244,7 +251,7 @@ func (v *VolumesInformation) generateVolumeInfoForSkippedPV() {
SnapshotDataMoved: false,
Skipped: true,
SkippedReason: skippedReason,
PVInfo: PVInfo{
PVInfo: &PVInfo{
ReclaimPolicy: string(pvcPVInfo.PV.Spec.PersistentVolumeReclaimPolicy),
Labels: pvcPVInfo.PV.Labels,
},
@@ -277,13 +284,13 @@ func (v *VolumesInformation) generateVolumeInfoForVeleroNativeSnapshot() {
PVName: pvcPVInfo.PV.Name,
SnapshotDataMoved: false,
Skipped: false,
NativeSnapshotInfo: NativeSnapshotInfo{
NativeSnapshotInfo: &NativeSnapshotInfo{
SnapshotHandle: nativeSnapshot.Status.ProviderSnapshotID,
VolumeType: nativeSnapshot.Spec.VolumeType,
VolumeAZ: nativeSnapshot.Spec.VolumeAZ,
IOPS: strconv.FormatInt(iops, 10),
},
PVInfo: PVInfo{
PVInfo: &PVInfo{
ReclaimPolicy: string(pvcPVInfo.PV.Spec.PersistentVolumeReclaimPolicy),
Labels: pvcPVInfo.PV.Labels,
},
@@ -372,15 +379,15 @@ func (v *VolumesInformation) generateVolumeInfoForCSIVolumeSnapshot() {
Skipped: false,
SnapshotDataMoved: false,
PreserveLocalSnapshot: true,
OperationID: operation.Spec.OperationID,
StartTimestamp: &(volumeSnapshot.CreationTimestamp),
CSISnapshotInfo: CSISnapshotInfo{
CSISnapshotInfo: &CSISnapshotInfo{
VSCName: *volumeSnapshot.Status.BoundVolumeSnapshotContentName,
Size: size,
Driver: volumeSnapshotClass.Driver,
SnapshotHandle: snapshotHandle,
OperationID: operation.Spec.OperationID,
},
PVInfo: PVInfo{
PVInfo: &PVInfo{
ReclaimPolicy: string(pvcPVInfo.PV.Spec.PersistentVolumeReclaimPolicy),
Labels: pvcPVInfo.PV.Labels,
},
@@ -406,7 +413,7 @@ func (v *VolumesInformation) generateVolumeInfoFromPVB() {
SnapshotDataMoved: false,
Skipped: false,
StartTimestamp: pvb.Status.StartTimestamp,
PVBInfo: PodVolumeBackupInfo{
PVBInfo: &PodVolumeBackupInfo{
SnapshotHandle: pvb.Status.SnapshotID,
Size: pvb.Status.Progress.TotalBytes,
UploaderType: pvb.Spec.UploaderType,
@@ -435,7 +442,7 @@ func (v *VolumesInformation) generateVolumeInfoFromPVB() {
volumeInfo.PVCName = pvcPVInfo.PVCName
volumeInfo.PVCNamespace = pvcPVInfo.PVCNamespace
volumeInfo.PVName = pvcPVInfo.PV.Name
volumeInfo.PVInfo = PVInfo{
volumeInfo.PVInfo = &PVInfo{
ReclaimPolicy: string(pvcPVInfo.PV.Spec.PersistentVolumeReclaimPolicy),
Labels: pvcPVInfo.PV.Labels,
}
@@ -498,6 +505,11 @@ func (v *VolumesInformation) generateVolumeInfoFromDataUpload() {
}
if pvcPVInfo := v.retrievePvcPvInfo("", operation.Spec.ResourceIdentifier.Name, operation.Spec.ResourceIdentifier.Namespace); pvcPVInfo != nil {
dataMover := "velero"
if dataUpload.Spec.DataMover != "" {
dataMover = dataUpload.Spec.DataMover
}
volumeInfo := &VolumeInfo{
BackupMethod: CSISnapshot,
PVCName: pvcPVInfo.PVCName,
@@ -505,16 +517,19 @@ func (v *VolumesInformation) generateVolumeInfoFromDataUpload() {
PVName: pvcPVInfo.PV.Name,
SnapshotDataMoved: true,
Skipped: false,
OperationID: operation.Spec.OperationID,
StartTimestamp: operation.Status.Created,
CSISnapshotInfo: CSISnapshotInfo{
Driver: driverUsedByVSClass,
CSISnapshotInfo: &CSISnapshotInfo{
SnapshotHandle: FieldValueIsUnknown,
VSCName: FieldValueIsUnknown,
OperationID: FieldValueIsUnknown,
Driver: driverUsedByVSClass,
},
SnapshotDataMovementInfo: SnapshotDataMovementInfo{
DataMover: dataUpload.Spec.DataMover,
SnapshotDataMovementInfo: &SnapshotDataMovementInfo{
DataMover: dataMover,
UploaderType: "kopia",
OperationID: operation.Spec.OperationID,
},
PVInfo: PVInfo{
PVInfo: &PVInfo{
ReclaimPolicy: string(pvcPVInfo.PV.Spec.PersistentVolumeReclaimPolicy),
Labels: pvcPVInfo.PV.Labels,
},
+27 -17
View File
@@ -103,7 +103,7 @@ func TestGenerateVolumeInfoForSkippedPV(t *testing.T) {
PVName: "testPV",
Skipped: true,
SkippedReason: "CSI: skipped for PodVolumeBackup",
PVInfo: PVInfo{
PVInfo: &PVInfo{
ReclaimPolicy: "Delete",
Labels: map[string]string{
"a": "b",
@@ -229,13 +229,13 @@ func TestGenerateVolumeInfoForVeleroNativeSnapshot(t *testing.T) {
PVCNamespace: "velero",
PVName: "testPV",
BackupMethod: NativeSnapshot,
PVInfo: PVInfo{
PVInfo: &PVInfo{
ReclaimPolicy: "Delete",
Labels: map[string]string{
"a": "b",
},
},
NativeSnapshotInfo: NativeSnapshotInfo{
NativeSnapshotInfo: &NativeSnapshotInfo{
SnapshotHandle: "pvc-b31e3386-4bbb-4937-95d-7934cd62-b0a1-494b-95d7-0687440e8d0c",
VolumeType: "ssd",
VolumeAZ: "us-central1-a",
@@ -411,16 +411,16 @@ func TestGenerateVolumeInfoForCSIVolumeSnapshot(t *testing.T) {
PVCNamespace: "velero",
PVName: "testPV",
BackupMethod: CSISnapshot,
OperationID: "testID",
StartTimestamp: &now,
PreserveLocalSnapshot: true,
CSISnapshotInfo: CSISnapshotInfo{
CSISnapshotInfo: &CSISnapshotInfo{
Driver: "pd.csi.storage.gke.io",
SnapshotHandle: "testSnapshotHandle",
Size: 107374182400,
VSCName: "testContent",
OperationID: "testID",
},
PVInfo: PVInfo{
PVInfo: &PVInfo{
ReclaimPolicy: "Delete",
Labels: map[string]string{
"a": "b",
@@ -495,7 +495,7 @@ func TestGenerateVolumeInfoFromPVB(t *testing.T) {
PVCNamespace: "",
PVName: "",
BackupMethod: PodVolumeBackup,
PVBInfo: PodVolumeBackupInfo{
PVBInfo: &PodVolumeBackupInfo{
PodName: "testPod",
PodNamespace: "velero",
},
@@ -567,11 +567,11 @@ func TestGenerateVolumeInfoFromPVB(t *testing.T) {
PVCNamespace: "velero",
PVName: "testPV",
BackupMethod: PodVolumeBackup,
PVBInfo: PodVolumeBackupInfo{
PVBInfo: &PodVolumeBackupInfo{
PodName: "testPod",
PodNamespace: "velero",
},
PVInfo: PVInfo{
PVInfo: &PVInfo{
ReclaimPolicy: string(corev1api.PersistentVolumeReclaimDelete),
Labels: map[string]string{"a": "b"},
},
@@ -729,12 +729,18 @@ func TestGenerateVolumeInfoFromDataUpload(t *testing.T) {
PVName: "testPV",
BackupMethod: CSISnapshot,
SnapshotDataMoved: true,
OperationID: "testOperation",
SnapshotDataMovementInfo: SnapshotDataMovementInfo{
CSISnapshotInfo: &CSISnapshotInfo{
SnapshotHandle: FieldValueIsUnknown,
VSCName: FieldValueIsUnknown,
OperationID: FieldValueIsUnknown,
Size: 0,
},
SnapshotDataMovementInfo: &SnapshotDataMovementInfo{
DataMover: "velero",
UploaderType: "kopia",
OperationID: "testOperation",
},
PVInfo: PVInfo{
PVInfo: &PVInfo{
ReclaimPolicy: string(corev1api.PersistentVolumeReclaimDelete),
Labels: map[string]string{"a": "b"},
},
@@ -796,16 +802,20 @@ func TestGenerateVolumeInfoFromDataUpload(t *testing.T) {
PVName: "testPV",
BackupMethod: CSISnapshot,
SnapshotDataMoved: true,
OperationID: "testOperation",
StartTimestamp: &now,
CSISnapshotInfo: CSISnapshotInfo{
Driver: "pd.csi.storage.gke.io",
CSISnapshotInfo: &CSISnapshotInfo{
VSCName: FieldValueIsUnknown,
SnapshotHandle: FieldValueIsUnknown,
OperationID: FieldValueIsUnknown,
Size: 0,
Driver: "pd.csi.storage.gke.io",
},
SnapshotDataMovementInfo: SnapshotDataMovementInfo{
SnapshotDataMovementInfo: &SnapshotDataMovementInfo{
DataMover: "velero",
UploaderType: "kopia",
OperationID: "testOperation",
},
PVInfo: PVInfo{
PVInfo: &PVInfo{
ReclaimPolicy: string(corev1api.PersistentVolumeReclaimDelete),
Labels: map[string]string{"a": "b"},
},