From 74987c658d6c0ead195bff3f90efedbba51d820b Mon Sep 17 00:00:00 2001
From: Isteb4k <dmitry.rakitin@flant.com>
Date: Wed, 26 Jun 2024 12:39:00 +0200
Subject: [PATCH] fix(vd,vi,cvi): fix capacity and cdrom

Signed-off-by: Isteb4k <dmitry.rakitin@flant.com>
---
 api/core/v1alpha2/image_status.go             |  2 +-
 api/core/v1alpha2/zz_generated.deepcopy.go    |  9 ++-
 .../generated/openapi/zz_generated.openapi.go | 66 ++++++++-----------
 .../pkg/controller/common/util.go             |  5 ++
 .../pkg/controller/service/disk_service.go    |  4 ++
 .../controller/vd/internal/source/blank.go    |  2 +-
 .../pkg/controller/vd/internal/source/http.go |  2 +-
 .../vd/internal/source/object_ref.go          |  2 +-
 .../controller/vd/internal/source/registry.go |  2 +-
 .../controller/vd/internal/source/upload.go   |  2 +-
 10 files changed, 49 insertions(+), 47 deletions(-)

diff --git a/api/core/v1alpha2/image_status.go b/api/core/v1alpha2/image_status.go
index bc35efc1fc..e03d4cf7a7 100644
--- a/api/core/v1alpha2/image_status.go
+++ b/api/core/v1alpha2/image_status.go
@@ -33,7 +33,7 @@ type ImageStatus struct {
 	Format        string           `json:"format,omitempty"`
 	// FIXME: create ClusterImageStatus without Capacity and PersistentVolumeClaim.
 	Capacity      string            `json:"capacity,omitempty"`
-	CDROM         bool              `json:"cdrom,omitempty"`
+	CDROM         bool              `json:"cdrom"`
 	Target        ImageStatusTarget `json:"target"`
 	Phase         ImagePhase        `json:"phase,omitempty"`
 	Progress      string            `json:"progress,omitempty"`
diff --git a/api/core/v1alpha2/zz_generated.deepcopy.go b/api/core/v1alpha2/zz_generated.deepcopy.go
index 80623c6e7b..77ab9444c0 100644
--- a/api/core/v1alpha2/zz_generated.deepcopy.go
+++ b/api/core/v1alpha2/zz_generated.deepcopy.go
@@ -764,7 +764,7 @@ func (in *VirtualImage) DeepCopyInto(out *VirtualImage) {
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
 	in.Spec.DeepCopyInto(&out.Spec)
-	out.Status = in.Status
+	in.Status.DeepCopyInto(&out.Status)
 	return
 }
 
@@ -909,6 +909,13 @@ func (in *VirtualImageSpec) DeepCopy() *VirtualImageSpec {
 func (in *VirtualImageStatus) DeepCopyInto(out *VirtualImageStatus) {
 	*out = *in
 	out.ImageStatus = in.ImageStatus
+	if in.Conditions != nil {
+		in, out := &in.Conditions, &out.Conditions
+		*out = make([]v1.Condition, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
 	return
 }
 
diff --git a/api/pkg/apiserver/api/generated/openapi/zz_generated.openapi.go b/api/pkg/apiserver/api/generated/openapi/zz_generated.openapi.go
index 6a3f397205..516fd657e0 100644
--- a/api/pkg/apiserver/api/generated/openapi/zz_generated.openapi.go
+++ b/api/pkg/apiserver/api/generated/openapi/zz_generated.openapi.go
@@ -1003,8 +1003,9 @@ func schema_virtualization_api_core_v1alpha2_ClusterVirtualImageStatus(ref commo
 					},
 					"cdrom": {
 						SchemaProps: spec.SchemaProps{
-							Type:   []string{"boolean"},
-							Format: "",
+							Default: false,
+							Type:    []string{"boolean"},
+							Format:  "",
 						},
 					},
 					"target": {
@@ -1031,18 +1032,6 @@ func schema_virtualization_api_core_v1alpha2_ClusterVirtualImageStatus(ref commo
 							Format: "",
 						},
 					},
-					"failureReason": {
-						SchemaProps: spec.SchemaProps{
-							Type:   []string{"string"},
-							Format: "",
-						},
-					},
-					"failureMessage": {
-						SchemaProps: spec.SchemaProps{
-							Type:   []string{"string"},
-							Format: "",
-						},
-					},
 					"conditions": {
 						SchemaProps: spec.SchemaProps{
 							Type: []string{"array"},
@@ -1063,7 +1052,7 @@ func schema_virtualization_api_core_v1alpha2_ClusterVirtualImageStatus(ref commo
 						},
 					},
 				},
-				Required: []string{"downloadSpeed", "size", "target"},
+				Required: []string{"downloadSpeed", "size", "cdrom", "target"},
 			},
 		},
 		Dependencies: []string{
@@ -1237,8 +1226,9 @@ func schema_virtualization_api_core_v1alpha2_ImageStatus(ref common.ReferenceCal
 					},
 					"cdrom": {
 						SchemaProps: spec.SchemaProps{
-							Type:   []string{"boolean"},
-							Format: "",
+							Default: false,
+							Type:    []string{"boolean"},
+							Format:  "",
 						},
 					},
 					"target": {
@@ -1265,20 +1255,8 @@ func schema_virtualization_api_core_v1alpha2_ImageStatus(ref common.ReferenceCal
 							Format: "",
 						},
 					},
-					"failureReason": {
-						SchemaProps: spec.SchemaProps{
-							Type:   []string{"string"},
-							Format: "",
-						},
-					},
-					"failureMessage": {
-						SchemaProps: spec.SchemaProps{
-							Type:   []string{"string"},
-							Format: "",
-						},
-					},
 				},
-				Required: []string{"downloadSpeed", "size", "target"},
+				Required: []string{"downloadSpeed", "size", "cdrom", "target"},
 			},
 		},
 		Dependencies: []string{
@@ -2153,8 +2131,9 @@ func schema_virtualization_api_core_v1alpha2_VirtualImageStatus(ref common.Refer
 					},
 					"cdrom": {
 						SchemaProps: spec.SchemaProps{
-							Type:   []string{"boolean"},
-							Format: "",
+							Default: false,
+							Type:    []string{"boolean"},
+							Format:  "",
 						},
 					},
 					"target": {
@@ -2181,24 +2160,31 @@ func schema_virtualization_api_core_v1alpha2_VirtualImageStatus(ref common.Refer
 							Format: "",
 						},
 					},
-					"failureReason": {
+					"conditions": {
 						SchemaProps: spec.SchemaProps{
-							Type:   []string{"string"},
-							Format: "",
+							Type: []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("k8s.io/apimachinery/pkg/apis/meta/v1.Condition"),
+									},
+								},
+							},
 						},
 					},
-					"failureMessage": {
+					"observedGeneration": {
 						SchemaProps: spec.SchemaProps{
-							Type:   []string{"string"},
-							Format: "",
+							Type:   []string{"integer"},
+							Format: "int64",
 						},
 					},
 				},
-				Required: []string{"downloadSpeed", "size", "target"},
+				Required: []string{"downloadSpeed", "size", "cdrom", "target"},
 			},
 		},
 		Dependencies: []string{
-			"github.com/deckhouse/virtualization/api/core/v1alpha2.ImageStatusSize", "github.com/deckhouse/virtualization/api/core/v1alpha2.ImageStatusSpeed", "github.com/deckhouse/virtualization/api/core/v1alpha2.ImageStatusTarget"},
+			"github.com/deckhouse/virtualization/api/core/v1alpha2.ImageStatusSize", "github.com/deckhouse/virtualization/api/core/v1alpha2.ImageStatusSpeed", "github.com/deckhouse/virtualization/api/core/v1alpha2.ImageStatusTarget", "k8s.io/apimachinery/pkg/apis/meta/v1.Condition"},
 	}
 }
 
diff --git a/images/virtualization-artifact/pkg/controller/common/util.go b/images/virtualization-artifact/pkg/controller/common/util.go
index 5098ec1efc..63e0c26256 100644
--- a/images/virtualization-artifact/pkg/controller/common/util.go
+++ b/images/virtualization-artifact/pkg/controller/common/util.go
@@ -374,6 +374,11 @@ func IsDataVolumeComplete(dv *cdiv1.DataVolume) bool {
 	return dv != nil && dv.Status.Phase == cdiv1.Succeeded
 }
 
+// IsPVCBound returns true if a PersistentVolumeClaim is in 'Bound' phase, false if not.
+func IsPVCBound(pvc *corev1.PersistentVolumeClaim) bool {
+	return pvc != nil && pvc.Status.Phase == corev1.ClaimBound
+}
+
 func IsTerminating(obj client.Object) bool {
 	return !reflect.ValueOf(obj).IsNil() && obj.GetDeletionTimestamp() != nil
 }
diff --git a/images/virtualization-artifact/pkg/controller/service/disk_service.go b/images/virtualization-artifact/pkg/controller/service/disk_service.go
index 6e82f13554..c788ad04ff 100644
--- a/images/virtualization-artifact/pkg/controller/service/disk_service.go
+++ b/images/virtualization-artifact/pkg/controller/service/disk_service.go
@@ -194,6 +194,10 @@ func (s DiskService) Resize(ctx context.Context, pvc *corev1.PersistentVolumeCla
 	}
 }
 
+func (s DiskService) IsImportDone(dv *cdiv1.DataVolume, pvc *corev1.PersistentVolumeClaim) bool {
+	return common.IsDataVolumeComplete(dv) && common.IsPVCBound(pvc)
+}
+
 func (s DiskService) GetProgress(dv *cdiv1.DataVolume, prevProgress string, opts ...GetProgressOption) string {
 	if dv == nil {
 		return prevProgress
diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/blank.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/blank.go
index 83db6f731b..40189e72e3 100644
--- a/images/virtualization-artifact/pkg/controller/vd/internal/source/blank.go
+++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/blank.go
@@ -127,7 +127,7 @@ func (ds BlankDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (boo
 		ds.logger.Info("Create data volume...", "vd", vd.Name, "progress", vd.Status.Progress, "dv.phase", "nil")
 
 		return true, nil
-	case common.IsDataVolumeComplete(dv):
+	case ds.diskService.IsImportDone(dv, pvc):
 		vd.Status.Phase = virtv2.DiskReady
 		condition.Status = metav1.ConditionTrue
 		condition.Reason = vdcondition.Ready
diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/http.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/http.go
index 885ed7decb..4e57c84eec 100644
--- a/images/virtualization-artifact/pkg/controller/vd/internal/source/http.go
+++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/http.go
@@ -216,7 +216,7 @@ func (ds HTTPDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (bool
 		ds.logger.Info("Create data volume...", "vd", vd.Name, "progress", vd.Status.Progress, "dv.phase", "nil")
 
 		return true, nil
-	case common.IsDataVolumeComplete(dv):
+	case ds.diskService.IsImportDone(dv, pvc):
 		vd.Status.Phase = virtv2.DiskReady
 		condition.Status = metav1.ConditionTrue
 		condition.Reason = vdcondition.Ready
diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref.go
index 8e9f00e256..8bd7923012 100644
--- a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref.go
+++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref.go
@@ -140,7 +140,7 @@ func (ds ObjectRefDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk)
 		ds.logger.Info("Create data volume...", "vd", vd.Name, "progress", vd.Status.Progress, "dv.phase", "nil")
 
 		return true, nil
-	case common.IsDataVolumeComplete(dv):
+	case ds.diskService.IsImportDone(dv, pvc):
 		vd.Status.Phase = virtv2.DiskReady
 		condition.Status = metav1.ConditionTrue
 		condition.Reason = vdcondition.Ready
diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/registry.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/registry.go
index dddb669939..f471b08fe3 100644
--- a/images/virtualization-artifact/pkg/controller/vd/internal/source/registry.go
+++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/registry.go
@@ -221,7 +221,7 @@ func (ds RegistryDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (
 		ds.logger.Info("Create data volume...", "vd", vd.Name, "progress", vd.Status.Progress, "dv.phase", "nil")
 
 		return true, nil
-	case common.IsDataVolumeComplete(dv):
+	case ds.diskService.IsImportDone(dv, pvc):
 		vd.Status.Phase = virtv2.DiskReady
 		condition.Status = metav1.ConditionTrue
 		condition.Reason = vdcondition.Ready
diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/upload.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/upload.go
index 41643b1f53..1c2c56dfc5 100644
--- a/images/virtualization-artifact/pkg/controller/vd/internal/source/upload.go
+++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/upload.go
@@ -243,7 +243,7 @@ func (ds UploadDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (bo
 		ds.logger.Info("Create data volume...", "vd", vd.Name, "progress", vd.Status.Progress, "dv.phase", "nil")
 
 		return true, nil
-	case common.IsDataVolumeComplete(dv):
+	case ds.diskService.IsImportDone(dv, pvc):
 		vd.Status.Phase = virtv2.DiskReady
 		condition.Status = metav1.ConditionTrue
 		condition.Reason = vdcondition.Ready