Skip to content

Commit e6945d2

Browse files
committed
Add v1beta2 changes to IBMPowerVSImage
1 parent 7876385 commit e6945d2

11 files changed

+506
-151
lines changed

api/v1beta1/ibmpowervs_conversion.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,7 @@ func Convert_v1beta2_IBMPowerVSMachineStatus_To_v1beta1_IBMPowerVSMachineStatus(
213213
// CAPI V1Beta2 was added in CAPIBM v1beta2
214214
return autoConvert_v1beta2_IBMPowerVSMachineStatus_To_v1beta1_IBMPowerVSMachineStatus(in, out, s)
215215
}
216+
217+
func Convert_v1beta2_IBMPowerVSImageStatus_To_v1beta1_IBMPowerVSImageStatus(in *infrav1.IBMPowerVSImageStatus, out *IBMPowerVSImageStatus, s apiconversion.Scope) error {
218+
return autoConvert_v1beta2_IBMPowerVSImageStatus_To_v1beta1_IBMPowerVSImageStatus(in, out, s)
219+
}

api/v1beta1/zz_generated.conversion.go

Lines changed: 6 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta2/conditions_consts.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,17 @@ const (
142142
)
143143

144144
const (
145-
// ImageNotReadyReason used when the image is in a queued state.
145+
// ImageNotReadyReason used when the image is not ready.
146146
ImageNotReadyReason = "ImageNotReady"
147147

148148
// ImageImportFailedReason used when the image import is failed.
149149
ImageImportFailedReason = "ImageImportFailed"
150150

151151
// ImageReconciliationFailedReason used when an error occurs during VPC Custom Image reconciliation.
152152
ImageReconciliationFailedReason = "ImageReconciliationFailed"
153+
154+
// ImageQueuedReason used when the image is in queued state.
155+
ImageQueuedReason = "ImageQueued"
153156
)
154157

155158
const (
@@ -158,6 +161,9 @@ const (
158161

159162
// ImageImportedCondition reports on current status of the image import job. Ready indicates the import job is finished.
160163
ImageImportedCondition clusterv1beta1.ConditionType = "ImageImported"
164+
165+
// IBMPowerVSImageDeletingV1Beta2Reason surfaces when the image is in deleting state.
166+
IBMPowerVSImageDeletingV1Beta2Reason = clusterv1beta1.DeletingV1Beta2Reason
161167
)
162168

163169
const (
@@ -353,3 +359,22 @@ const (
353359
// COSInstanceDeletingV1Beta2Reason surfaces when the COS instance is being deleted.
354360
COSInstanceDeletingV1Beta2Reason = clusterv1beta1.DeletingV1Beta2Reason
355361
)
362+
363+
// IBMPowerVSImage's Ready condition and corresponding reasons that will be used in v1Beta2 API version.
364+
const (
365+
// IBMPowerVSImageReadyCondition is true if the IBMPowerVSImage's deletionTimestamp is not set, IBMPowerVSImage's IBMPowerVSImageReadyV1Beta2Condition is true.
366+
IBMPowerVSImageReadyCondition = clusterv1beta1.ReadyV1Beta2Condition
367+
368+
// IBMPowerVSImageReadyV1Beta2Condition documents the Ready status of the image.
369+
IBMPowerVSImageReadyV1Beta2Condition = "ImageReady"
370+
371+
// IBMPowerVSImageReadyV1Beta2Reason surfaces when the IBMPowerVSImage readiness criteria is met.
372+
IBMPowerVSImageReadyV1Beta2Reason = clusterv1beta1.ReadyV1Beta2Reason
373+
374+
// IBMPowerVSImageNotReadyV1Beta2Reason surfaces when the IBMPowerVSImage readiness criteria is not met.
375+
IBMPowerVSImageNotReadyV1Beta2Reason = clusterv1beta1.NotReadyV1Beta2Reason
376+
377+
// IBMPowerVSImageReadyUnknownV1Beta2Reason surfaces when at least one of the IBMPowerVSImage readiness criteria is unknown
378+
// and none of the IBMPowerVSImage readiness criteria is met.
379+
IBMPowerVSImageReadyUnknownV1Beta2Reason = clusterv1beta1.ReadyUnknownV1Beta2Reason
380+
)

api/v1beta2/ibmpowervsimage_types.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,21 @@ type IBMPowerVSImageStatus struct {
9494
// Conditions defines current service state of the IBMPowerVSImage.
9595
// +optional
9696
Conditions clusterv1beta1.Conditions `json:"conditions,omitempty"`
97+
98+
// v1beta2 groups all the fields that will be added or modified in IBMPowerVSCluster's status with the V1Beta2 version.
99+
// +optional
100+
V1Beta2 *IBMPowerVSImageV1Beta2Status `json:"v1beta2,omitempty"`
101+
}
102+
103+
// IBMPowerVSImageV1Beta2Status groups all the fields that will be added or modified in IBMPowerVSCluster with the V1Beta2 version.
104+
// See https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more context.
105+
type IBMPowerVSImageV1Beta2Status struct {
106+
// conditions represents the observations of a DevCluster's current state.
107+
// +optional
108+
// +listType=map
109+
// +listMapKey=type
110+
// +kubebuilder:validation:MaxItems=32
111+
Conditions []metav1.Condition `json:"conditions,omitempty"`
97112
}
98113

99114
//+kubebuilder:object:root=true
@@ -121,6 +136,22 @@ func (r *IBMPowerVSImage) SetConditions(conditions clusterv1beta1.Conditions) {
121136
r.Status.Conditions = conditions
122137
}
123138

139+
// GetV1Beta2Conditions returns the set of conditions for this object.
140+
func (r *IBMPowerVSImage) GetV1Beta2Conditions() []metav1.Condition {
141+
if r.Status.V1Beta2 == nil {
142+
return nil
143+
}
144+
return r.Status.V1Beta2.Conditions
145+
}
146+
147+
// SetV1Beta2Conditions sets conditions for an API object.
148+
func (r *IBMPowerVSImage) SetV1Beta2Conditions(conditions []metav1.Condition) {
149+
if r.Status.V1Beta2 == nil {
150+
r.Status.V1Beta2 = &IBMPowerVSImageV1Beta2Status{}
151+
}
152+
r.Status.V1Beta2.Conditions = conditions
153+
}
154+
124155
//+kubebuilder:object:root=true
125156

126157
// IBMPowerVSImageList contains a list of IBMPowerVSImage.

api/v1beta2/types.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,17 @@ var (
5656
// PowerVSImageStateACTIVE is the string representing an image in a active state.
5757
PowerVSImageStateACTIVE = PowerVSImageState("active")
5858

59-
// PowerVSImageStateQue is the string representing an image in a queued state.
60-
PowerVSImageStateQue = PowerVSImageState("queued")
59+
// PowerVSImageStateQueued is the string representing an image in a queued state.
60+
PowerVSImageStateQueued = PowerVSImageState("queued")
6161

6262
// PowerVSImageStateFailed is the string representing an image in a failed state.
6363
PowerVSImageStateFailed = PowerVSImageState("failed")
6464

6565
// PowerVSImageStateImporting is the string representing an image in a failed state.
6666
PowerVSImageStateImporting = PowerVSImageState("importing")
67+
68+
// PowerVSImageStateCompleted is the string representing an image in a completed state.
69+
PowerVSImageStateCompleted = PowerVSImageState("completed")
6770
)
6871

6972
// ServiceInstanceState describes the state of a service instance.

api/v1beta2/zz_generated.deepcopy.go

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cloud/scope/powervs_image.go

Lines changed: 26 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,14 @@ import (
2121
"errors"
2222
"fmt"
2323

24-
"github.com/go-logr/logr"
25-
2624
"github.com/IBM-Cloud/power-go-client/ibmpisession"
2725
"github.com/IBM-Cloud/power-go-client/power/models"
2826
"github.com/IBM/go-sdk-core/v5/core"
2927
"github.com/IBM/platform-services-go-sdk/resourcecontrollerv2"
3028

31-
"k8s.io/klog/v2"
32-
29+
ctrl "sigs.k8s.io/controller-runtime"
3330
"sigs.k8s.io/controller-runtime/pkg/client"
3431

35-
v1beta1patch "sigs.k8s.io/cluster-api/util/deprecated/v1beta1/patch" //nolint:staticcheck
36-
3732
infrav1 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
3833
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/powervs"
3934
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/resourcecontroller"
@@ -44,28 +39,30 @@ import (
4439
// BucketAccess indicates if the bucket has public or private access public access.
4540
const BucketAccess = "public"
4641

42+
var (
43+
// ErrServiceInsanceNotInActiveState indicates error if serviceInstance is inactive.
44+
ErrServiceInsanceNotInActiveState = errors.New("service instance is not in active state")
45+
)
46+
4747
// PowerVSImageScopeParams defines the input parameters used to create a new PowerVSImageScope.
4848
type PowerVSImageScopeParams struct {
4949
Client client.Client
50-
Logger logr.Logger
5150
IBMPowerVSImage *infrav1.IBMPowerVSImage
5251
ServiceEndpoint []endpoints.ServiceEndpoint
5352
Zone *string
5453
}
5554

5655
// PowerVSImageScope defines a scope defined around a Power VS Cluster.
5756
type PowerVSImageScope struct {
58-
logr.Logger
59-
Client client.Client
60-
patchHelper *v1beta1patch.Helper
61-
57+
Client client.Client
6258
IBMPowerVSClient powervs.PowerVS
6359
IBMPowerVSImage *infrav1.IBMPowerVSImage
6460
ServiceEndpoint []endpoints.ServiceEndpoint
6561
}
6662

6763
// NewPowerVSImageScope creates a new PowerVSImageScope from the supplied parameters.
68-
func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageScope, err error) {
64+
func NewPowerVSImageScope(ctx context.Context, params PowerVSImageScopeParams) (scope *PowerVSImageScope, err error) {
65+
log := ctrl.LoggerFrom(ctx)
6966
scope = &PowerVSImageScope{}
7067

7168
if params.Client == nil {
@@ -80,25 +77,13 @@ func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageSc
8077
}
8178
scope.IBMPowerVSImage = params.IBMPowerVSImage
8279

83-
if params.Logger == (logr.Logger{}) {
84-
params.Logger = klog.Background()
85-
}
86-
scope.Logger = params.Logger
87-
88-
helper, err := v1beta1patch.NewHelper(params.IBMPowerVSImage, params.Client)
89-
if err != nil {
90-
err = fmt.Errorf("failed to init patch helper: %w", err)
91-
return nil, err
92-
}
93-
scope.patchHelper = helper
94-
9580
// Create Resource Controller client.
9681
var serviceOption resourcecontroller.ServiceOptions
9782
// Fetch the resource controller endpoint.
9883
rcEndpoint := endpoints.FetchEndpoints(string(endpoints.RC), params.ServiceEndpoint)
9984
if rcEndpoint != "" {
10085
serviceOption.URL = rcEndpoint
101-
params.Logger.V(3).Info("Overriding the default resource controller endpoint", "ResourceControllerEndpoint", rcEndpoint)
86+
log.V(3).Info("Overriding the default resource controller endpoint", "ResourceControllerEndpoint", rcEndpoint)
10287
}
10388

10489
rc, err := resourcecontroller.NewService(serviceOption)
@@ -119,14 +104,14 @@ func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageSc
119104
}
120105
serviceInstance, err := rc.GetServiceInstance("", name, params.Zone)
121106
if err != nil {
122-
params.Logger.Error(err, "error failed to get service instance id from name", "name", name)
107+
log.Error(err, "error failed to get service instance id from name", "name", name)
123108
return nil, err
124109
}
125110
if serviceInstance == nil {
126111
return nil, fmt.Errorf("service instance %s is not yet created", name)
127112
}
128113
if *serviceInstance.State != string(infrav1.ServiceInstanceStateActive) {
129-
return nil, fmt.Errorf("service instance %s is not in active state", name)
114+
return scope, ErrServiceInsanceNotInActiveState
130115
}
131116
serviceInstanceID = *serviceInstance.GUID
132117
}
@@ -142,15 +127,15 @@ func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageSc
142127

143128
options := powervs.ServiceOptions{
144129
IBMPIOptions: &ibmpisession.IBMPIOptions{
145-
Debug: params.Logger.V(DEBUGLEVEL).Enabled(),
130+
Debug: log.V(DEBUGLEVEL).Enabled(),
146131
Zone: *res.RegionID,
147132
},
148133
}
149134

150135
// Fetch the service endpoint.
151136
if svcEndpoint := endpoints.FetchPVSEndpoint(endpoints.ConstructRegionFromZone(*res.RegionID), params.ServiceEndpoint); svcEndpoint != "" {
152137
options.IBMPIOptions.URL = svcEndpoint
153-
scope.Logger.V(3).Info("overriding the default powervs service endpoint")
138+
log.V(3).Info("Overriding the default PowerVS service endpoint", "serviceEndpoint", svcEndpoint)
154139
}
155140

156141
c, err := powervs.NewService(options)
@@ -179,56 +164,47 @@ func (i *PowerVSImageScope) ensureImageUnique(imageName string) (*models.ImageRe
179164
}
180165

181166
// CreateImageCOSBucket creates a power vs image.
182-
func (i *PowerVSImageScope) CreateImageCOSBucket() (*models.ImageReference, *models.JobReference, error) {
183-
s := i.IBMPowerVSImage.Spec
167+
func (i *PowerVSImageScope) CreateImageCOSBucket(ctx context.Context) (*models.ImageReference, *models.JobReference, error) {
168+
log := ctrl.LoggerFrom(ctx)
169+
imageSpec := i.IBMPowerVSImage.Spec
184170
m := i.IBMPowerVSImage.ObjectMeta
185171

186172
imageReply, err := i.ensureImageUnique(m.Name)
187173
if err != nil {
188174
record.Warnf(i.IBMPowerVSImage, "FailedRetrieveImage", "Failed to retrieve image %q", m.Name)
189175
return nil, nil, err
190176
} else if imageReply != nil {
191-
i.Info("Image already exists")
177+
log.Info("Image already exists", "imageName", m.Name)
192178
return imageReply, nil, nil
193179
}
194180

195181
if lastJob, _ := i.GetImportJob(); lastJob != nil {
196-
if *lastJob.Status.State != "completed" && *lastJob.Status.State != "failed" {
197-
i.Info("Previous import job not yet finished", "state", *lastJob.Status.State)
182+
if *lastJob.Status.State != string(infrav1.PowerVSImageStateCompleted) && *lastJob.Status.State != string(infrav1.PowerVSImageStateFailed) {
183+
log.Info("Previous import job not yet finished", "state", *lastJob.Status.State)
198184
return nil, nil, nil
199185
}
200186
}
201187

202188
body := &models.CreateCosImageImportJob{
203189
ImageName: &m.Name,
204-
BucketName: s.Bucket,
190+
BucketName: imageSpec.Bucket,
205191
BucketAccess: core.StringPtr(BucketAccess),
206-
Region: s.Region,
207-
ImageFilename: s.Object,
208-
StorageType: s.StorageType,
192+
Region: imageSpec.Region,
193+
ImageFilename: imageSpec.Object,
194+
StorageType: imageSpec.StorageType,
209195
}
210196

211197
jobRef, err := i.IBMPowerVSClient.CreateCosImage(body)
212198
if err != nil {
213-
i.Info("Unable to create new import job request")
199+
log.Info("Unable to create new import job request")
214200
record.Warnf(i.IBMPowerVSImage, "FailedCreateImageImportJob", "Failed image import job creation - %v", err)
215201
return nil, nil, err
216202
}
217-
i.Info("New import job request created")
203+
log.Info("New import job request created")
218204
record.Eventf(i.IBMPowerVSImage, "SuccessfulCreateImageImportJob", "Created image import job %q", *jobRef.ID)
219205
return nil, jobRef, nil
220206
}
221207

222-
// PatchObject persists the cluster configuration and status.
223-
func (i *PowerVSImageScope) PatchObject() error {
224-
return i.patchHelper.Patch(context.TODO(), i.IBMPowerVSImage)
225-
}
226-
227-
// Close closes the current scope persisting the cluster configuration and status.
228-
func (i *PowerVSImageScope) Close() error {
229-
return i.PatchObject()
230-
}
231-
232208
// DeleteImage will delete the image.
233209
func (i *PowerVSImageScope) DeleteImage() error {
234210
if err := i.IBMPowerVSClient.DeleteImage(i.IBMPowerVSImage.Status.ImageID); err != nil {

0 commit comments

Comments
 (0)