Skip to content

Commit a3756f6

Browse files
committed
Add v1beta2 changes to IBMPowerVSImage
1 parent d86f699 commit a3756f6

File tree

7 files changed

+240
-128
lines changed

7 files changed

+240
-128
lines changed

api/v1beta2/conditions_consts.go

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

api/v1beta2/ibmpowervsimage_types.go

Lines changed: 15 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

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: 21 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,18 @@ 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-
v1beta1patch "sigs.k8s.io/cluster-api/util/deprecated/v1beta1/patch" //nolint:staticcheck
36-
3734
infrav1 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
35+
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
3836
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/powervs"
3937
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/resourcecontroller"
4038
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
@@ -55,9 +53,9 @@ type PowerVSImageScopeParams struct {
5553

5654
// PowerVSImageScope defines a scope defined around a Power VS Cluster.
5755
type PowerVSImageScope struct {
58-
logr.Logger
59-
Client client.Client
60-
patchHelper *v1beta1patch.Helper
56+
//logr.Logger
57+
Client client.Client
58+
//patchHelper *patch.Helper
6159

6260
IBMPowerVSClient powervs.PowerVS
6361
IBMPowerVSImage *infrav1.IBMPowerVSImage
@@ -83,23 +81,9 @@ func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageSc
8381
if params.Logger == (logr.Logger{}) {
8482
params.Logger = klog.Background()
8583
}
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
9484

9585
// Create Resource Controller client.
9686
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-
}
10387

10488
rc, err := resourcecontroller.NewService(serviceOption)
10589
if err != nil {
@@ -150,7 +134,7 @@ func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageSc
150134
// Fetch the service endpoint.
151135
if svcEndpoint := endpoints.FetchPVSEndpoint(endpoints.ConstructRegionFromZone(*res.RegionID), params.ServiceEndpoint); svcEndpoint != "" {
152136
options.IBMPIOptions.URL = svcEndpoint
153-
scope.Logger.V(3).Info("overriding the default powervs service endpoint")
137+
params.Logger.V(3).Info("overriding the default powervs service endpoint", "serviceEndpoint", svcEndpoint)
154138
}
155139

156140
c, err := powervs.NewService(options)
@@ -179,58 +163,49 @@ func (i *PowerVSImageScope) ensureImageUnique(imageName string) (*models.ImageRe
179163
}
180164

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

186171
imageReply, err := i.ensureImageUnique(m.Name)
187172
if err != nil {
188173
record.Warnf(i.IBMPowerVSImage, "FailedRetrieveImage", "Failed to retrieve image %q", m.Name)
189174
return nil, nil, err
190175
} else if imageReply != nil {
191-
i.Info("Image already exists")
176+
log.Info("Image already exists")
192177
return imageReply, nil, nil
193178
}
194179

195180
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)
181+
if *lastJob.Status.State != string(infrav1beta2.PowerVSImageStateCompleted) && *lastJob.Status.State != string(infrav1beta2.PowerVSImageStateFailed) {
182+
log.Info("Previous import job not yet finished", "state", *lastJob.Status.State)
198183
return nil, nil, nil
199184
}
200185
}
201186

202187
body := &models.CreateCosImageImportJob{
203188
ImageName: &m.Name,
204-
BucketName: s.Bucket,
189+
BucketName: imageSpec.Bucket,
205190
BucketAccess: core.StringPtr(BucketAccess),
206-
Region: s.Region,
207-
ImageFilename: s.Object,
208-
StorageType: s.StorageType,
191+
Region: imageSpec.Region,
192+
ImageFilename: imageSpec.Object,
193+
StorageType: imageSpec.StorageType,
209194
}
210195

211196
jobRef, err := i.IBMPowerVSClient.CreateCosImage(body)
212197
if err != nil {
213-
i.Info("Unable to create new import job request")
198+
log.Info("Unable to create new import job request")
214199
record.Warnf(i.IBMPowerVSImage, "FailedCreateImageImportJob", "Failed image import job creation - %v", err)
215200
return nil, nil, err
216201
}
217-
i.Info("New import job request created")
202+
log.Info("New import job request created")
218203
record.Eventf(i.IBMPowerVSImage, "SuccessfulCreateImageImportJob", "Created image import job %q", *jobRef.ID)
219204
return nil, jobRef, nil
220205
}
221206

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-
232207
// DeleteImage will delete the image.
233-
func (i *PowerVSImageScope) DeleteImage() error {
208+
func (i *PowerVSImageScope) DeleteImage(ctx context.Context) error {
234209
if err := i.IBMPowerVSClient.DeleteImage(i.IBMPowerVSImage.Status.ImageID); err != nil {
235210
record.Warnf(i.IBMPowerVSImage, "FailedDeleteImage", "Failed image deletion - %v", err)
236211
return err
@@ -245,7 +220,7 @@ func (i *PowerVSImageScope) GetImportJob() (*models.Job, error) {
245220
}
246221

247222
// DeleteImportJob will delete the image import job.
248-
func (i *PowerVSImageScope) DeleteImportJob() error {
223+
func (i *PowerVSImageScope) DeleteImportJob(ctx context.Context) error {
249224
if err := i.IBMPowerVSClient.DeleteJob(i.IBMPowerVSImage.Status.JobID); err != nil {
250225
record.Warnf(i.IBMPowerVSImage, "FailedDeleteImageImportJob", "Failed image import job deletion - %v", err)
251226
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)