Skip to content

Commit eaf2b42

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

11 files changed

+357
-136
lines changed

api/v1beta1/ibmpowervs_conversion.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,8 @@ 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+
// CAPI V1Beta2 was added in CAPIBM v1beta2
219+
return autoConvert_v1beta2_IBMPowerVSImageStatus_To_v1beta1_IBMPowerVSImageStatus(in, out, s)
220+
}

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: 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 = clusterv1beta1.ReadyV1Beta2Condition
304+
305+
// IBMPowerVSClusterReadyV1Beta2Reason surfaces when the IBMPowerVSCluster readiness criteria is met.
306+
IBMPowerVSImageReadyV1Beta2Reason = clusterv1beta1.ReadyV1Beta2Reason
307+
308+
// IBMPowerVSClusterNotReadyV1Beta2Reason surfaces when the IBMPowerVSCluster readiness criteria is not met.
309+
IBMPowerVSImageNotReadyV1Beta2Reason = clusterv1beta1.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 = clusterv1beta1.ReadyUnknownV1Beta2Reason
314+
)

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: 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.

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: 19 additions & 47 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,10 +53,7 @@ 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
61-
56+
Client client.Client
6257
IBMPowerVSClient powervs.PowerVS
6358
IBMPowerVSImage *infrav1.IBMPowerVSImage
6459
ServiceEndpoint []endpoints.ServiceEndpoint
@@ -83,23 +78,9 @@ func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageSc
8378
if params.Logger == (logr.Logger{}) {
8479
params.Logger = klog.Background()
8580
}
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
9481

9582
// Create Resource Controller client.
9683
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-
}
10384

10485
rc, err := resourcecontroller.NewService(serviceOption)
10586
if err != nil {
@@ -150,7 +131,7 @@ func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageSc
150131
// Fetch the service endpoint.
151132
if svcEndpoint := endpoints.FetchPVSEndpoint(endpoints.ConstructRegionFromZone(*res.RegionID), params.ServiceEndpoint); svcEndpoint != "" {
152133
options.IBMPIOptions.URL = svcEndpoint
153-
scope.Logger.V(3).Info("overriding the default powervs service endpoint")
134+
params.Logger.V(3).Info("overriding the default powervs service endpoint", "serviceEndpoint", svcEndpoint)
154135
}
155136

156137
c, err := powervs.NewService(options)
@@ -179,58 +160,49 @@ func (i *PowerVSImageScope) ensureImageUnique(imageName string) (*models.ImageRe
179160
}
180161

181162
// CreateImageCOSBucket creates a power vs image.
182-
func (i *PowerVSImageScope) CreateImageCOSBucket() (*models.ImageReference, *models.JobReference, error) {
183-
s := i.IBMPowerVSImage.Spec
163+
func (i *PowerVSImageScope) CreateImageCOSBucket(ctx context.Context) (*models.ImageReference, *models.JobReference, error) {
164+
log := ctrl.LoggerFrom(ctx)
165+
imageSpec := i.IBMPowerVSImage.Spec
184166
m := i.IBMPowerVSImage.ObjectMeta
185167

186168
imageReply, err := i.ensureImageUnique(m.Name)
187169
if err != nil {
188170
record.Warnf(i.IBMPowerVSImage, "FailedRetrieveImage", "Failed to retrieve image %q", m.Name)
189171
return nil, nil, err
190172
} else if imageReply != nil {
191-
i.Info("Image already exists")
173+
log.Info("Image already exists")
192174
return imageReply, nil, nil
193175
}
194176

195177
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)
178+
if *lastJob.Status.State != string(infrav1beta2.PowerVSImageStateCompleted) && *lastJob.Status.State != string(infrav1beta2.PowerVSImageStateFailed) {
179+
log.Info("Previous import job not yet finished", "state", *lastJob.Status.State)
198180
return nil, nil, nil
199181
}
200182
}
201183

202184
body := &models.CreateCosImageImportJob{
203185
ImageName: &m.Name,
204-
BucketName: s.Bucket,
186+
BucketName: imageSpec.Bucket,
205187
BucketAccess: core.StringPtr(BucketAccess),
206-
Region: s.Region,
207-
ImageFilename: s.Object,
208-
StorageType: s.StorageType,
188+
Region: imageSpec.Region,
189+
ImageFilename: imageSpec.Object,
190+
StorageType: imageSpec.StorageType,
209191
}
210192

211193
jobRef, err := i.IBMPowerVSClient.CreateCosImage(body)
212194
if err != nil {
213-
i.Info("Unable to create new import job request")
195+
log.Info("Unable to create new import job request")
214196
record.Warnf(i.IBMPowerVSImage, "FailedCreateImageImportJob", "Failed image import job creation - %v", err)
215197
return nil, nil, err
216198
}
217-
i.Info("New import job request created")
199+
log.Info("New import job request created")
218200
record.Eventf(i.IBMPowerVSImage, "SuccessfulCreateImageImportJob", "Created image import job %q", *jobRef.ID)
219201
return nil, jobRef, nil
220202
}
221203

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-
232204
// DeleteImage will delete the image.
233-
func (i *PowerVSImageScope) DeleteImage() error {
205+
func (i *PowerVSImageScope) DeleteImage(ctx context.Context) error {
234206
if err := i.IBMPowerVSClient.DeleteImage(i.IBMPowerVSImage.Status.ImageID); err != nil {
235207
record.Warnf(i.IBMPowerVSImage, "FailedDeleteImage", "Failed image deletion - %v", err)
236208
return err
@@ -245,7 +217,7 @@ func (i *PowerVSImageScope) GetImportJob() (*models.Job, error) {
245217
}
246218

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

0 commit comments

Comments
 (0)