Skip to content

Commit 0a725fc

Browse files
authored
handle image import job properly (#537)
1 parent 8bd59cc commit 0a725fc

File tree

6 files changed

+63
-21
lines changed

6 files changed

+63
-21
lines changed

api/v1beta1/conditions_consts.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,15 @@ const (
4545
const (
4646
// ImageNotReadyReason used when the image is in a queued state.
4747
ImageNotReadyReason = "ImageNotReady"
48+
49+
// ImageImportFailedReason used when the image import is failed.
50+
ImageImportFailedReason = "ImageImportFailed"
4851
)
4952

5053
const (
5154
// ImageReadyCondition reports on current status of the image. Ready indicates the image is in a active state.
5255
ImageReadyCondition clusterv1.ConditionType = "ImageReady"
56+
57+
// ImageImportedCondition reports on current status of the image import job. Ready indicates the import job is finished.
58+
ImageImportedCondition clusterv1.ConditionType = "ImageImported"
5359
)

api/v1beta1/ibmpowervsimage_types.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ type IBMPowerVSImageStatus struct {
6060

6161
// Ready is true when the provider resource is ready.
6262
// +optional
63-
Ready bool `json:"ready,omitempty"`
63+
Ready bool `json:"ready"`
6464

6565
// ImageID is the id of the imported image
6666
ImageID string `json:"imageID,omitempty"`
@@ -69,6 +69,10 @@ type IBMPowerVSImageStatus struct {
6969
// +optional
7070
ImageState PowerVSImageState `json:"imageState,omitempty"`
7171

72+
// JobID is the job ID of an import operation
73+
// +optional
74+
JobID string `json:"jobID,omitempty"`
75+
7276
// Conditions defines current service state of the IBMPowerVSImage.
7377
// +optional
7478
Conditions clusterv1.Conditions `json:"conditions,omitempty"`

api/v1beta1/types.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,14 @@ var (
4040
// PowerVSImageStateACTIVE is the string representing an image in a active state.
4141
PowerVSImageStateACTIVE = PowerVSImageState("active")
4242

43-
// PowerVSInstanceStateQue is the string representing an image in a queued state.
44-
PowerVSInstanceStateQue = PowerVSImageState("queued")
43+
// PowerVSImageStateQue is the string representing an image in a queued state.
44+
PowerVSImageStateQue = PowerVSImageState("queued")
45+
46+
// PowerVSImageStateFailed is the string representing an image in a failed state.
47+
PowerVSImageStateFailed = PowerVSImageState("failed")
48+
49+
// PowerVSImageStateImporting is the string representing an image in a failed state.
50+
PowerVSImageStateImporting = PowerVSImageState("importing")
4551
)
4652

4753
// NetworkInterface holds the network interface information like subnet id.

cloud/scope/powervs_image.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,10 +229,18 @@ func (i *PowerVSImageScope) GetImageID() string {
229229
return i.IBMPowerVSImage.Status.ImageID
230230
}
231231

232-
func (i *PowerVSImageScope) SetImageState(status *string) {
233-
i.IBMPowerVSImage.Status.ImageState = v1beta1.PowerVSImageState(*status)
232+
func (i *PowerVSImageScope) SetImageState(status string) {
233+
i.IBMPowerVSImage.Status.ImageState = v1beta1.PowerVSImageState(status)
234234
}
235235

236236
func (i *PowerVSImageScope) GetImageState() v1beta1.PowerVSImageState {
237237
return i.IBMPowerVSImage.Status.ImageState
238238
}
239+
240+
func (i *PowerVSImageScope) SetJobID(id string) {
241+
i.IBMPowerVSImage.Status.JobID = id
242+
}
243+
244+
func (i *PowerVSImageScope) GetJobID() string {
245+
return i.IBMPowerVSImage.Status.JobID
246+
}

config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsimages.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ spec:
131131
imageState:
132132
description: ImageState is the status of the imported image
133133
type: string
134+
jobID:
135+
description: JobID is the job ID of an import operation
136+
type: string
134137
ready:
135138
description: Ready is true when the provider resource is ready.
136139
type: boolean

controllers/ibmpowervsimage_controller.go

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ package controllers
1818

1919
import (
2020
"context"
21+
"fmt"
2122
"time"
2223

2324
"github.com/IBM-Cloud/power-go-client/power/models"
2425
"github.com/go-logr/logr"
2526
"github.com/pkg/errors"
2627

27-
"github.com/IBM/go-sdk-core/v5/core"
2828
apierrors "k8s.io/apimachinery/pkg/api/errors"
2929
"k8s.io/apimachinery/pkg/runtime"
3030
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -108,26 +108,41 @@ func (r *IBMPowerVSImageReconciler) reconcile(ctx context.Context, cluster *v1be
108108
return ctrl.Result{}, nil
109109
}
110110

111+
if jobID := imageScope.GetJobID(); jobID != "" {
112+
job, err := imageScope.IBMPowerVSClient.GetJob(jobID)
113+
if err != nil {
114+
imageScope.Info("Unable to get job details")
115+
return ctrl.Result{RequeueAfter: 2 * time.Minute}, err
116+
}
117+
switch *job.Status.State {
118+
case "completed":
119+
conditions.MarkTrue(imageScope.IBMPowerVSImage, v1beta1.ImageImportedCondition)
120+
case "failed":
121+
imageScope.SetNotReady()
122+
imageScope.SetImageState(string(v1beta1.PowerVSImageStateFailed))
123+
conditions.MarkFalse(imageScope.IBMPowerVSImage, v1beta1.ImageImportedCondition, v1beta1.ImageImportFailedReason, clusterv1.ConditionSeverityError, job.Status.Message)
124+
return ctrl.Result{RequeueAfter: 2 * time.Minute}, fmt.Errorf("failed to import image, message: %s", job.Status.Message)
125+
case "queued":
126+
imageScope.SetNotReady()
127+
imageScope.SetImageState(string(v1beta1.PowerVSImageStateQue))
128+
conditions.MarkFalse(imageScope.IBMPowerVSImage, v1beta1.ImageImportedCondition, string(v1beta1.PowerVSImageStateQue), clusterv1.ConditionSeverityInfo, job.Status.Message)
129+
return ctrl.Result{RequeueAfter: 2 * time.Minute}, nil
130+
default:
131+
imageScope.SetNotReady()
132+
imageScope.SetImageState(string(v1beta1.PowerVSImageStateImporting))
133+
conditions.MarkFalse(imageScope.IBMPowerVSImage, v1beta1.ImageImportedCondition, *job.Status.State, clusterv1.ConditionSeverityInfo, job.Status.Message)
134+
return ctrl.Result{RequeueAfter: 2 * time.Minute}, nil
135+
}
136+
}
137+
111138
img, jobRef, err := r.getOrCreate(imageScope)
112139
if err != nil {
113140
imageScope.Error(err, "Unable to import image")
114141
return ctrl.Result{}, errors.Wrapf(err, "failed to reconcile Image for IBMPowerVSImage %s/%s", imageScope.IBMPowerVSImage.Namespace, imageScope.IBMPowerVSImage.Name)
115142
}
116143

117144
if jobRef != nil {
118-
job, err := imageScope.IBMPowerVSClient.GetJob(*jobRef.ID)
119-
if err != nil {
120-
imageScope.Info("Unable to get job details")
121-
return ctrl.Result{RequeueAfter: 2 * time.Minute}, err
122-
}
123-
124-
if *job.Status.State != "completed" && *job.Status.State != "failed" {
125-
imageScope.Info("Import job not yet finished - " + *job.Status.State)
126-
imageScope.SetNotReady()
127-
imageScope.SetImageState(core.StringPtr(""))
128-
conditions.MarkFalse(imageScope.IBMPowerVSImage, v1beta1.ImageReadyCondition, v1beta1.ImageNotReadyReason, clusterv1.ConditionSeverityWarning, "")
129-
return ctrl.Result{}, nil
130-
}
145+
imageScope.SetJobID(*jobRef.ID)
131146
}
132147
return reconcileImage(img, imageScope)
133148
}
@@ -142,11 +157,11 @@ func reconcileImage(img *models.ImageReference, imageScope *scope.PowerVSImageSc
142157

143158
imageScope.SetImageID(image.ImageID)
144159
imageScope.Info("ImageID - " + imageScope.GetImageID())
145-
imageScope.SetImageState(&image.State)
160+
imageScope.SetImageState(image.State)
146161
imageScope.Info("ImageState - " + image.State)
147162

148163
switch imageScope.GetImageState() {
149-
case v1beta1.PowerVSInstanceStateQue:
164+
case v1beta1.PowerVSImageStateQue:
150165
imageScope.Info("Image is in queued state")
151166
imageScope.SetNotReady()
152167
conditions.MarkFalse(imageScope.IBMPowerVSImage, v1beta1.ImageReadyCondition, v1beta1.ImageNotReadyReason, clusterv1.ConditionSeverityWarning, "")

0 commit comments

Comments
 (0)