@@ -4,9 +4,11 @@ import (
44 "context"
55
66 v1 "k8s.io/api/core/v1"
7- "k8s.io/apimachinery/pkg/api/errors"
7+ kubeerrors "k8s.io/apimachinery/pkg/api/errors"
88 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+ "k8s.io/apimachinery/pkg/runtime"
910 kubeclientset "k8s.io/client-go/kubernetes"
11+ "k8s.io/client-go/tools/record"
1012 "k8s.io/klog/v2"
1113 "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1214
@@ -17,18 +19,20 @@ import (
1719 "sigs.k8s.io/container-object-storage-interface-controller/pkg/util"
1820)
1921
20- // bucketClaimListener is a resource handler for bucket requests objects
21- type bucketClaimListener struct {
22+ // BucketClaimListener is a resource handler for bucket requests objects
23+ type BucketClaimListener struct {
24+ eventRecorder record.EventRecorder
25+
2226 kubeClient kubeclientset.Interface
2327 bucketClient bucketclientset.Interface
2428}
2529
26- func NewBucketClaimListener () * bucketClaimListener {
27- return & bucketClaimListener {}
30+ func NewBucketClaimListener () * BucketClaimListener {
31+ return & BucketClaimListener {}
2832}
2933
3034// Add creates a bucket in response to a bucketClaim
31- func (b * bucketClaimListener ) Add (ctx context.Context , bucketClaim * v1alpha1.BucketClaim ) error {
35+ func (b * BucketClaimListener ) Add (ctx context.Context , bucketClaim * v1alpha1.BucketClaim ) error {
3236 klog .V (3 ).InfoS ("Add BucketClaim" ,
3337 "name" , bucketClaim .ObjectMeta .Name ,
3438 "ns" , bucketClaim .ObjectMeta .Namespace ,
@@ -65,7 +69,7 @@ func (b *bucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.Buc
6569}
6670
6771// update processes any updates made to the bucket request
68- func (b * bucketClaimListener ) Update (ctx context.Context , old , new * v1alpha1.BucketClaim ) error {
72+ func (b * BucketClaimListener ) Update (ctx context.Context , old , new * v1alpha1.BucketClaim ) error {
6973 klog .V (3 ).InfoS ("Update BucketClaim" ,
7074 "name" , old .Name ,
7175 "ns" , old .Namespace )
@@ -94,7 +98,7 @@ func (b *bucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.Buc
9498}
9599
96100// Delete processes a bucket for which bucket request is deleted
97- func (b * bucketClaimListener ) Delete (ctx context.Context , bucketClaim * v1alpha1.BucketClaim ) error {
101+ func (b * BucketClaimListener ) Delete (ctx context.Context , bucketClaim * v1alpha1.BucketClaim ) error {
98102 klog .V (3 ).Infof ("Delete BucketClaim" ,
99103 "name" , bucketClaim .ObjectMeta .Name ,
100104 "ns" , bucketClaim .ObjectMeta .Namespace )
@@ -103,12 +107,19 @@ func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1.
103107}
104108
105109// provisionBucketClaimOperation attempts to provision a bucket for a given bucketClaim.
110+ //
111+ // Recorded events
112+ //
113+ // InvalidBucket - Bucket provided in the BucketClaim does not exist
114+ // InvalidBucketClass - BucketClass provided in the BucketClaim does not exist
115+ //
106116// Return values
107- // nil - BucketClaim successfully processed
108- // ErrInvalidBucketClass - BucketClass does not exist [requeue'd with exponential backoff]
109- // ErrBucketAlreadyExists - BucketClaim already processed
110- // non-nil err - Internal error [requeue'd with exponential backoff]
111- func (b * bucketClaimListener ) provisionBucketClaimOperation (ctx context.Context , inputBucketClaim * v1alpha1.BucketClaim ) error {
117+ //
118+ // nil - BucketClaim successfully processed
119+ // ErrInvalidBucketClass - BucketClass does not exist [requeue'd with exponential backoff]
120+ // ErrBucketAlreadyExists - BucketClaim already processed
121+ // non-nil err - Internal error [requeue'd with exponential backoff]
122+ func (b * BucketClaimListener ) provisionBucketClaimOperation (ctx context.Context , inputBucketClaim * v1alpha1.BucketClaim ) error {
112123 bucketClaim := inputBucketClaim .DeepCopy ()
113124 if bucketClaim .Status .BucketReady {
114125 return util .ErrBucketAlreadyExists
@@ -120,7 +131,10 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context,
120131 if bucketClaim .Spec .ExistingBucketName != "" {
121132 bucketName = bucketClaim .Spec .ExistingBucketName
122133 bucket , err := b .buckets ().Get (ctx , bucketName , metav1.GetOptions {})
123- if err != nil {
134+ if kubeerrors .IsNotFound (err ) {
135+ b .recordEvent (inputBucketClaim , v1 .EventTypeWarning , "InvalidBucket" , "Bucket provided in the BucketClaim does not exist" )
136+ return err
137+ } else if err != nil {
124138 klog .V (3 ).ErrorS (err , "Get Bucket with ExistingBucketName error" , "name" , bucketClaim .Spec .ExistingBucketName )
125139 return err
126140 }
@@ -152,7 +166,10 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context,
152166 }
153167
154168 bucketClass , err := b .bucketClasses ().Get (ctx , bucketClassName , metav1.GetOptions {})
155- if err != nil {
169+ if kubeerrors .IsNotFound (err ) {
170+ b .recordEvent (inputBucketClaim , v1 .EventTypeWarning , "InvalidBucketClass" , "BucketClass provided in the BucketClaim does not exist" )
171+ return util .ErrInvalidBucketClass
172+ } else if err != nil {
156173 klog .V (3 ).ErrorS (err , "Get Bucketclass Error" , "name" , bucketClassName )
157174 return util .ErrInvalidBucketClass
158175 }
@@ -179,7 +196,7 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context,
179196
180197 bucket .Spec .Protocols = protocolCopy
181198 bucket , err = b .buckets ().Create (ctx , bucket , metav1.CreateOptions {})
182- if err != nil && ! errors .IsAlreadyExists (err ) {
199+ if err != nil && ! kubeerrors .IsAlreadyExists (err ) {
183200 klog .V (3 ).ErrorS (err , "Error creationg bucket" ,
184201 "bucket" , bucketName ,
185202 "bucketClaim" , bucketClaim .ObjectMeta .Name )
@@ -211,31 +228,46 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context,
211228 return nil
212229}
213230
214- func (b * bucketClaimListener ) InitializeKubeClient (k kubeclientset.Interface ) {
231+ // InitializeKubeClient initializes the kubernetes client
232+ func (b * BucketClaimListener ) InitializeKubeClient (k kubeclientset.Interface ) {
215233 b .kubeClient = k
216234}
217235
218- func (b * bucketClaimListener ) InitializeBucketClient (bc bucketclientset.Interface ) {
236+ // InitializeBucketClient initializes the object storage bucket client
237+ func (b * BucketClaimListener ) InitializeBucketClient (bc bucketclientset.Interface ) {
219238 b .bucketClient = bc
220239}
221240
222- func (b * bucketClaimListener ) buckets () objectstoragev1alpha1.BucketInterface {
241+ // InitializeEventRecorder initializes the event recorder
242+ func (b * BucketClaimListener ) InitializeEventRecorder (er record.EventRecorder ) {
243+ b .eventRecorder = er
244+ }
245+
246+ func (b * BucketClaimListener ) buckets () objectstoragev1alpha1.BucketInterface {
223247 if b .bucketClient != nil {
224248 return b .bucketClient .ObjectstorageV1alpha1 ().Buckets ()
225249 }
226250 panic ("uninitialized listener" )
227251}
228252
229- func (b * bucketClaimListener ) bucketClasses () objectstoragev1alpha1.BucketClassInterface {
253+ func (b * BucketClaimListener ) bucketClasses () objectstoragev1alpha1.BucketClassInterface {
230254 if b .bucketClient != nil {
231255 return b .bucketClient .ObjectstorageV1alpha1 ().BucketClasses ()
232256 }
233257 panic ("uninitialized listener" )
234258}
235259
236- func (b * bucketClaimListener ) bucketClaims (namespace string ) objectstoragev1alpha1.BucketClaimInterface {
260+ func (b * BucketClaimListener ) bucketClaims (namespace string ) objectstoragev1alpha1.BucketClaimInterface {
237261 if b .bucketClient != nil {
238262 return b .bucketClient .ObjectstorageV1alpha1 ().BucketClaims (namespace )
239263 }
240264 panic ("uninitialized listener" )
241265}
266+
267+ // recordEvent during the processing of the objects
268+ func (b * BucketClaimListener ) recordEvent (subject runtime.Object , eventtype , reason , message string ) {
269+ if b .eventRecorder == nil {
270+ return
271+ }
272+ b .eventRecorder .Event (subject , eventtype , reason , message )
273+ }
0 commit comments