Skip to content

Commit dd45f93

Browse files
committed
Enhance UT for ReconcileCOSInstance method
1 parent cbdb255 commit dd45f93

File tree

4 files changed

+112
-5
lines changed

4 files changed

+112
-5
lines changed

cloud/scope/powervs_cluster.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2307,7 +2307,7 @@ func (s *PowerVSClusterScope) ReconcileCOSInstance(ctx context.Context) error {
23072307
},
23082308
}
23092309

2310-
cosClient, err := cos.NewService(cosOptions, apiKey, *cosServiceInstanceStatus.GUID)
2310+
cosClient, err := cos.NewServiceWrapper(cosOptions, apiKey, *cosServiceInstanceStatus.GUID)
23112311
if err != nil {
23122312
return fmt.Errorf("failed to create COS client: %w", err)
23132313
}

cloud/scope/powervs_cluster_test.go

Lines changed: 101 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"errors"
2121
"fmt"
2222
"os"
23+
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/cos"
2324
"testing"
2425

2526
"github.com/IBM-Cloud/power-go-client/power/models"
@@ -5722,11 +5723,13 @@ func TestDeleteTransitGatewayConnections(t *testing.T) {
57225723
func TestReconcileCOSInstance(t *testing.T) {
57235724
var (
57245725
mockResourceController *mockRC.MockResourceController
5726+
mockCOSController *mockcos.MockCos
57255727
mockCtrl *gomock.Controller
57265728
)
57275729
setup := func(t *testing.T) {
57285730
t.Helper()
57295731
mockCtrl = gomock.NewController(t)
5732+
mockCOSController = mockcos.NewMockCos(mockCtrl)
57305733
mockResourceController = mockRC.NewMockResourceController(mockCtrl)
57315734
}
57325735
teardown := func() {
@@ -5986,14 +5989,110 @@ func TestReconcileCOSInstance(t *testing.T) {
59865989
Name: ptr.To("test-resource-instance-name"),
59875990
}, nil, nil)
59885991

5992+
mockCOSController.EXPECT().GetBucketByName(gomock.Any()).Return(nil, fmt.Errorf("failed to get bucket by name"))
5993+
5994+
cos.NewServiceFunc = func(_ cos.ServiceOptions, _, _ string) (cos.Cos, error) {
5995+
return mockCOSController, nil
5996+
}
5997+
59895998
err = clusterScope.ReconcileCOSInstance(ctx)
59905999
g.Expect(err).ToNot(BeNil())
59916000
g.Expect(clusterScope.IBMPowerVSCluster.Status.COSInstance.ID).To(Equal(ptr.To("test-resource-instance-guid")))
59926001
g.Expect(clusterScope.IBMPowerVSCluster.Status.COSInstance.ControllerCreated).To(Equal(ptr.To(true)))
59936002
})
6003+
t.Run("When create COS bucket fails", func(t *testing.T) {
6004+
g := NewWithT(t)
6005+
setup(t)
6006+
t.Cleanup(teardown)
6007+
err := os.Setenv("IBMCLOUD_APIKEY", "test-api-key")
6008+
g.Expect(err).To(BeNil())
6009+
defer os.Unsetenv("IBMCLOUD_APIKEY")
6010+
6011+
clusterScope := PowerVSClusterScope{
6012+
ResourceClient: mockResourceController,
6013+
IBMPowerVSCluster: &infrav1beta2.IBMPowerVSCluster{
6014+
Spec: infrav1beta2.IBMPowerVSClusterSpec{
6015+
CosInstance: &infrav1beta2.CosInstance{
6016+
BucketRegion: "test-bucket-region",
6017+
},
6018+
ResourceGroup: &infrav1beta2.IBMPowerVSResourceReference{
6019+
ID: ptr.To("test-resource-group-id"),
6020+
},
6021+
},
6022+
Status: infrav1beta2.IBMPowerVSClusterStatus{
6023+
ServiceInstance: &infrav1beta2.ResourceReference{
6024+
ID: ptr.To("test-serviceinstance-id"),
6025+
},
6026+
},
6027+
},
6028+
}
6029+
mockResourceController.EXPECT().GetInstanceByName(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, nil)
6030+
6031+
mockResourceController.EXPECT().CreateResourceInstance(gomock.Any()).Return(&resourcecontrollerv2.ResourceInstance{
6032+
ID: ptr.To("test-resource-instance-id"),
6033+
GUID: ptr.To("test-resource-instance-guid"),
6034+
Name: ptr.To("test-resource-instance-name"),
6035+
}, nil, nil)
6036+
6037+
mockCOSController.EXPECT().GetBucketByName(gomock.Any()).Return(nil, awserr.New(s3.ErrCodeNoSuchBucket, "bucket does not exist", nil))
6038+
mockCOSController.EXPECT().CreateBucket(gomock.Any()).Return(nil, fmt.Errorf("failed to create bucket"))
59946039

5995-
//TODO: Complete cases to cover control flow on checkCOSBucket and createCOSBucket
5996-
// Github issue: https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud/issues/2034
6040+
cos.NewServiceFunc = func(_ cos.ServiceOptions, _, _ string) (cos.Cos, error) {
6041+
return mockCOSController, nil
6042+
}
6043+
6044+
err = clusterScope.ReconcileCOSInstance(ctx)
6045+
g.Expect(err).ToNot(BeNil())
6046+
g.Expect(clusterScope.IBMPowerVSCluster.Status.COSInstance.ID).To(Equal(ptr.To("test-resource-instance-guid")))
6047+
g.Expect(clusterScope.IBMPowerVSCluster.Status.COSInstance.ControllerCreated).To(Equal(ptr.To(true)))
6048+
})
6049+
6050+
t.Run("When create COS bucket succeeds", func(t *testing.T) {
6051+
g := NewWithT(t)
6052+
setup(t)
6053+
t.Cleanup(teardown)
6054+
err := os.Setenv("IBMCLOUD_APIKEY", "test-api-key")
6055+
g.Expect(err).To(BeNil())
6056+
defer os.Unsetenv("IBMCLOUD_APIKEY")
6057+
6058+
clusterScope := PowerVSClusterScope{
6059+
ResourceClient: mockResourceController,
6060+
IBMPowerVSCluster: &infrav1beta2.IBMPowerVSCluster{
6061+
Spec: infrav1beta2.IBMPowerVSClusterSpec{
6062+
CosInstance: &infrav1beta2.CosInstance{
6063+
BucketRegion: "test-bucket-region",
6064+
},
6065+
ResourceGroup: &infrav1beta2.IBMPowerVSResourceReference{
6066+
ID: ptr.To("test-resource-group-id"),
6067+
},
6068+
},
6069+
Status: infrav1beta2.IBMPowerVSClusterStatus{
6070+
ServiceInstance: &infrav1beta2.ResourceReference{
6071+
ID: ptr.To("test-serviceinstance-id"),
6072+
},
6073+
},
6074+
},
6075+
}
6076+
mockResourceController.EXPECT().GetInstanceByName(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, nil)
6077+
6078+
mockResourceController.EXPECT().CreateResourceInstance(gomock.Any()).Return(&resourcecontrollerv2.ResourceInstance{
6079+
ID: ptr.To("test-resource-instance-id"),
6080+
GUID: ptr.To("test-resource-instance-guid"),
6081+
Name: ptr.To("test-resource-instance-name"),
6082+
}, nil, nil)
6083+
6084+
mockCOSController.EXPECT().GetBucketByName(gomock.Any()).Return(nil, awserr.New(s3.ErrCodeNoSuchBucket, "bucket does not exist", nil))
6085+
mockCOSController.EXPECT().CreateBucket(gomock.Any()).Return(nil, nil)
6086+
6087+
cos.NewServiceFunc = func(_ cos.ServiceOptions, _, _ string) (cos.Cos, error) {
6088+
return mockCOSController, nil
6089+
}
6090+
6091+
err = clusterScope.ReconcileCOSInstance(ctx)
6092+
g.Expect(err).To(BeNil())
6093+
g.Expect(clusterScope.IBMPowerVSCluster.Status.COSInstance.ID).To(Equal(ptr.To("test-resource-instance-guid")))
6094+
g.Expect(clusterScope.IBMPowerVSCluster.Status.COSInstance.ControllerCreated).To(Equal(ptr.To(true)))
6095+
})
59976096
}
59986097

59996098
func TestCheckCOSServiceInstance(t *testing.T) {

cloud/scope/powervs_machine.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ func (m *PowerVSMachineScope) DeleteMachineIgnition(ctx context.Context) error {
548548
}
549549

550550
// createCOSClient creates a new cosClient from the supplied parameters.
551-
func (m *PowerVSMachineScope) createCOSClient(ctx context.Context) (*cos.Service, error) {
551+
func (m *PowerVSMachineScope) createCOSClient(ctx context.Context) (cos.Cos, error) {
552552
log := ctrl.LoggerFrom(ctx)
553553
var cosInstanceName string
554554
if m.IBMPowerVSCluster.Spec.CosInstance == nil || m.IBMPowerVSCluster.Spec.CosInstance.Name == "" {

pkg/cloud/services/cos/service.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,16 @@ func (s *Service) PutPublicAccessBlock(input *s3.PutPublicAccessBlockInput) (*s3
9090
return s.client.PutPublicAccessBlock(input)
9191
}
9292

93+
// NewServiceFunc is a variable that will hold the function reference.
94+
var NewServiceFunc = NewService // Default to the original function
95+
96+
// NewServiceWrapper returns a new service for the IBM Cloud COS api client, useful in unit testing.
97+
func NewServiceWrapper(options ServiceOptions, apikey, serviceInstance string) (Cos, error) {
98+
return NewServiceFunc(options, apikey, serviceInstance)
99+
}
100+
93101
// NewService returns a new service for the IBM Cloud Resource Controller api client.
94-
func NewService(options ServiceOptions, apikey, serviceInstance string) (*Service, error) {
102+
func NewService(options ServiceOptions, apikey, serviceInstance string) (Cos, error) {
95103
if options.Options == nil {
96104
options.Options = &cosSession.Options{}
97105
}

0 commit comments

Comments
 (0)