Skip to content

Commit 9632fae

Browse files
committed
Add v1beta2 changes to IBMPowerVSImage
1 parent c070673 commit 9632fae

File tree

7 files changed

+246
-119
lines changed

7 files changed

+246
-119
lines changed

api/v1beta2/conditions_consts.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,3 +297,20 @@ const (
297297
// COSInstanceDeletingV1Beta2Reason surfaces when the COS instance is being deleted.
298298
COSInstanceDeletingV1Beta2Reason = capiv1beta1.DeletingV1Beta2Reason
299299
)
300+
301+
// IBMPowerVSCluster's Ready condition and corresponding reasons that will be used in v1Beta2 API version.
302+
const (
303+
// IBMPowerVSClusterReadyV1Beta2Condition is true if the IBMPowerVSCluster's deletionTimestamp is not set, IBMPowerVSCluster's
304+
// FailureDomainsReady, VCenterAvailable and ClusterModulesReady conditions are true.
305+
IBMPowerVSImageReadyV1Beta2Condition = capiv1beta1.ReadyV1Beta2Condition
306+
307+
// IBMPowerVSClusterReadyV1Beta2Reason surfaces when the IBMPowerVSCluster readiness criteria is met.
308+
IBMPowerVSImageReadyV1Beta2Reason = capiv1beta1.ReadyV1Beta2Reason
309+
310+
// IBMPowerVSClusterNotReadyV1Beta2Reason surfaces when the IBMPowerVSCluster readiness criteria is not met.
311+
IBMPowerVSImageNotReadyV1Beta2Reason = capiv1beta1.NotReadyV1Beta2Reason
312+
313+
// IBMPowerVSClusterReadyUnknownV1Beta2Reason surfaces when at least one of the IBMPowerVSCluster readiness criteria is unknown
314+
// and none of the IBMPowerVSCluster readiness criteria is met.
315+
IBMPowerVSImageReadyUnknownV1Beta2Reason = capiv1beta1.ReadyUnknownV1Beta2Reason
316+
)

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 clusterv1.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) SetV1Beta1Conditions(conditions clusterv1.Conditions)
121136
r.Status.Conditions = conditions
122137
}
123138

139+
// GetConditions returns the set of conditions for this object.
140+
func (r *IBMPowerVSImage) GetConditions() []metav1.Condition {
141+
if r.Status.V1Beta2 == nil {
142+
return nil
143+
}
144+
return r.Status.V1Beta2.Conditions
145+
}
146+
147+
// SetConditions sets conditions for an API object.
148+
func (r *IBMPowerVSImage) SetConditions(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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ var (
6464

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

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

cloud/scope/powervs_image.go

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,16 @@ 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"
30-
28+
"github.com/go-logr/logr"
3129
"k8s.io/klog/v2"
3230

31+
ctrl "sigs.k8s.io/controller-runtime"
3332
"sigs.k8s.io/controller-runtime/pkg/client"
3433

35-
"sigs.k8s.io/cluster-api/util/patch"
36-
3734
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
3835
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/powervs"
3936
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/resourcecontroller"
@@ -55,9 +52,9 @@ type PowerVSImageScopeParams struct {
5552

5653
// PowerVSImageScope defines a scope defined around a Power VS Cluster.
5754
type PowerVSImageScope struct {
58-
logr.Logger
59-
Client client.Client
60-
patchHelper *patch.Helper
55+
//logr.Logger
56+
Client client.Client
57+
//patchHelper *patch.Helper
6158

6259
IBMPowerVSClient powervs.PowerVS
6360
IBMPowerVSImage *infrav1beta2.IBMPowerVSImage
@@ -83,23 +80,9 @@ func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageSc
8380
if params.Logger == (logr.Logger{}) {
8481
params.Logger = klog.Background()
8582
}
86-
scope.Logger = params.Logger
87-
88-
helper, err := patch.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
9483

9584
// Create Resource Controller client.
9685
var serviceOption resourcecontroller.ServiceOptions
97-
// Fetch the resource controller endpoint.
98-
rcEndpoint := endpoints.FetchEndpoints(string(endpoints.RC), params.ServiceEndpoint)
99-
if rcEndpoint != "" {
100-
serviceOption.URL = rcEndpoint
101-
params.Logger.V(3).Info("Overriding the default resource controller endpoint", "ResourceControllerEndpoint", rcEndpoint)
102-
}
10386

10487
rc, err := resourcecontroller.NewService(serviceOption)
10588
if err != nil {
@@ -150,7 +133,7 @@ func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageSc
150133
// Fetch the service endpoint.
151134
if svcEndpoint := endpoints.FetchPVSEndpoint(endpoints.ConstructRegionFromZone(*res.RegionID), params.ServiceEndpoint); svcEndpoint != "" {
152135
options.IBMPIOptions.URL = svcEndpoint
153-
scope.Logger.V(3).Info("overriding the default powervs service endpoint")
136+
params.Logger.V(3).Info("overriding the default powervs service endpoint", "serviceEndpoint", svcEndpoint)
154137
}
155138

156139
c, err := powervs.NewService(options)
@@ -179,58 +162,49 @@ func (i *PowerVSImageScope) ensureImageUnique(imageName string) (*models.ImageRe
179162
}
180163

181164
// CreateImageCOSBucket creates a power vs image.
182-
func (i *PowerVSImageScope) CreateImageCOSBucket() (*models.ImageReference, *models.JobReference, error) {
183-
s := i.IBMPowerVSImage.Spec
165+
func (i *PowerVSImageScope) CreateImageCOSBucket(ctx context.Context) (*models.ImageReference, *models.JobReference, error) {
166+
log := ctrl.LoggerFrom(ctx)
167+
imageSpec := i.IBMPowerVSImage.Spec
184168
m := i.IBMPowerVSImage.ObjectMeta
185169

186170
imageReply, err := i.ensureImageUnique(m.Name)
187171
if err != nil {
188172
record.Warnf(i.IBMPowerVSImage, "FailedRetrieveImage", "Failed to retrieve image %q", m.Name)
189173
return nil, nil, err
190174
} else if imageReply != nil {
191-
i.Info("Image already exists")
175+
log.Info("Image already exists")
192176
return imageReply, nil, nil
193177
}
194178

195179
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)
180+
if *lastJob.Status.State != string(infrav1beta2.PowerVSImageStateCompleted) && *lastJob.Status.State != string(infrav1beta2.PowerVSImageStateFailed) {
181+
log.Info("Previous import job not yet finished", "state", *lastJob.Status.State)
198182
return nil, nil, nil
199183
}
200184
}
201185

202186
body := &models.CreateCosImageImportJob{
203187
ImageName: &m.Name,
204-
BucketName: s.Bucket,
188+
BucketName: imageSpec.Bucket,
205189
BucketAccess: core.StringPtr(BucketAccess),
206-
Region: s.Region,
207-
ImageFilename: s.Object,
208-
StorageType: s.StorageType,
190+
Region: imageSpec.Region,
191+
ImageFilename: imageSpec.Object,
192+
StorageType: imageSpec.StorageType,
209193
}
210194

211195
jobRef, err := i.IBMPowerVSClient.CreateCosImage(body)
212196
if err != nil {
213-
i.Info("Unable to create new import job request")
197+
log.Info("Unable to create new import job request")
214198
record.Warnf(i.IBMPowerVSImage, "FailedCreateImageImportJob", "Failed image import job creation - %v", err)
215199
return nil, nil, err
216200
}
217-
i.Info("New import job request created")
201+
log.Info("New import job request created")
218202
record.Eventf(i.IBMPowerVSImage, "SuccessfulCreateImageImportJob", "Created image import job %q", *jobRef.ID)
219203
return nil, jobRef, nil
220204
}
221205

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-
232206
// DeleteImage will delete the image.
233-
func (i *PowerVSImageScope) DeleteImage() error {
207+
func (i *PowerVSImageScope) DeleteImage(ctx context.Context) error {
234208
if err := i.IBMPowerVSClient.DeleteImage(i.IBMPowerVSImage.Status.ImageID); err != nil {
235209
record.Warnf(i.IBMPowerVSImage, "FailedDeleteImage", "Failed image deletion - %v", err)
236210
return err
@@ -245,7 +219,7 @@ func (i *PowerVSImageScope) GetImportJob() (*models.Job, error) {
245219
}
246220

247221
// DeleteImportJob will delete the image import job.
248-
func (i *PowerVSImageScope) DeleteImportJob() error {
222+
func (i *PowerVSImageScope) DeleteImportJob(ctx context.Context) error {
249223
if err := i.IBMPowerVSClient.DeleteJob(i.IBMPowerVSImage.Status.JobID); err != nil {
250224
record.Warnf(i.IBMPowerVSImage, "FailedDeleteImageImportJob", "Failed image import job deletion - %v", err)
251225
return err

cloud/scope/powervs_image_test.go

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727

2828
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2929
"k8s.io/client-go/kubernetes/scheme"
30-
"k8s.io/klog/v2"
3130
"sigs.k8s.io/controller-runtime/pkg/client"
3231
"sigs.k8s.io/controller-runtime/pkg/client/fake"
3332

@@ -63,7 +62,6 @@ func setupPowerVSImageScope(imageName string, mockpowervs *mock.MockPowerVS) *Po
6362
client := fake.NewClientBuilder().WithScheme(scheme.Scheme).WithObjects(initObjects...).Build()
6463
return &PowerVSImageScope{
6564
Client: client,
66-
Logger: klog.Background(),
6765
IBMPowerVSClient: mockpowervs,
6866
IBMPowerVSImage: powervsImage,
6967
}
@@ -148,7 +146,7 @@ func TestCreateImageCOSBucket(t *testing.T) {
148146
mockpowervs.EXPECT().GetAllImage().Return(images, nil)
149147
mockpowervs.EXPECT().GetCosImages(gomock.AssignableToTypeOf(serviceInstanceID)).Return(job, nil)
150148
mockpowervs.EXPECT().CreateCosImage(gomock.AssignableToTypeOf(body)).Return(jobReference, nil)
151-
_, out, err := scope.CreateImageCOSBucket()
149+
_, out, err := scope.CreateImageCOSBucket(ctx)
152150
g.Expect(err).To(BeNil())
153151
require.Equal(t, jobReference, out)
154152
})
@@ -162,7 +160,7 @@ func TestCreateImageCOSBucket(t *testing.T) {
162160
}
163161
scope := setupPowerVSImageScope("foo-image-1", mockpowervs)
164162
mockpowervs.EXPECT().GetAllImage().Return(images, nil)
165-
out, _, err := scope.CreateImageCOSBucket()
163+
out, _, err := scope.CreateImageCOSBucket(ctx)
166164
g.Expect(err).To(BeNil())
167165
require.Equal(t, imageReference, out)
168166
})
@@ -173,7 +171,7 @@ func TestCreateImageCOSBucket(t *testing.T) {
173171
t.Cleanup(teardown)
174172
scope := setupPowerVSImageScope(pvsImage, mockpowervs)
175173
mockpowervs.EXPECT().GetAllImage().Return(images, errors.New("Failed to list images"))
176-
_, _, err := scope.CreateImageCOSBucket()
174+
_, _, err := scope.CreateImageCOSBucket(ctx)
177175
g.Expect(err).To(Not(BeNil()))
178176
})
179177

@@ -189,7 +187,7 @@ func TestCreateImageCOSBucket(t *testing.T) {
189187
scope := setupPowerVSImageScope(pvsImage, mockpowervs)
190188
mockpowervs.EXPECT().GetAllImage().Return(images, nil)
191189
mockpowervs.EXPECT().GetCosImages(gomock.AssignableToTypeOf(serviceInstanceID)).Return(job, nil)
192-
_, _, err := scope.CreateImageCOSBucket()
190+
_, _, err := scope.CreateImageCOSBucket(ctx)
193191
g.Expect(err).To(BeNil())
194192
})
195193

@@ -201,7 +199,7 @@ func TestCreateImageCOSBucket(t *testing.T) {
201199
mockpowervs.EXPECT().GetAllImage().Return(images, nil)
202200
mockpowervs.EXPECT().GetCosImages(gomock.AssignableToTypeOf(serviceInstanceID)).Return(job, nil)
203201
mockpowervs.EXPECT().CreateCosImage(gomock.AssignableToTypeOf(body)).Return(jobReference, errors.New("Failed to create image import job"))
204-
_, _, err := scope.CreateImageCOSBucket()
202+
_, _, err := scope.CreateImageCOSBucket(ctx)
205203
g.Expect(err).To((Not(BeNil())))
206204
})
207205
})
@@ -231,7 +229,7 @@ func TestDeleteImage(t *testing.T) {
231229
scope := setupPowerVSImageScope(pvsImage, mockpowervs)
232230
scope.IBMPowerVSImage.Status.ImageID = pvsImage + idSuffix
233231
mockpowervs.EXPECT().DeleteImage(gomock.AssignableToTypeOf(id)).Return(nil)
234-
err := scope.DeleteImage()
232+
err := scope.DeleteImage(ctx)
235233
g.Expect(err).To(BeNil())
236234
})
237235

@@ -242,7 +240,7 @@ func TestDeleteImage(t *testing.T) {
242240
scope := setupPowerVSImageScope(pvsImage, mockpowervs)
243241
scope.IBMPowerVSImage.Status.ImageID = pvsImage + idSuffix
244242
mockpowervs.EXPECT().DeleteImage(gomock.AssignableToTypeOf(id)).Return(errors.New("Failed to delete image"))
245-
err := scope.DeleteImage()
243+
err := scope.DeleteImage(ctx)
246244
g.Expect(err).To(Not(BeNil()))
247245
})
248246
})
@@ -272,7 +270,7 @@ func TestDeleteImportJob(t *testing.T) {
272270
scope := setupPowerVSImageScope(pvsImage, mockpowervs)
273271
scope.IBMPowerVSImage.Status.JobID = "foo-job-id"
274272
mockpowervs.EXPECT().DeleteJob(gomock.AssignableToTypeOf(id)).Return(nil)
275-
err := scope.DeleteImportJob()
273+
err := scope.DeleteImportJob(ctx)
276274
g.Expect(err).To(BeNil())
277275
})
278276

@@ -283,7 +281,7 @@ func TestDeleteImportJob(t *testing.T) {
283281
scope := setupPowerVSImageScope(pvsImage, mockpowervs)
284282
scope.IBMPowerVSImage.Status.JobID = "foo-job-id"
285283
mockpowervs.EXPECT().DeleteJob(gomock.AssignableToTypeOf(id)).Return(errors.New("Failed to delete image import job"))
286-
err := scope.DeleteImportJob()
284+
err := scope.DeleteImportJob(ctx)
287285
g.Expect(err).To(Not(BeNil()))
288286
})
289287
})

0 commit comments

Comments
 (0)