@@ -17,10 +17,6 @@ import (
1717 "sigs.k8s.io/container-object-storage-interface-controller/pkg/util"
1818)
1919
20- const (
21- finalizer = "cosi.objectstorage.k8s.io/bucketclaim-protection"
22- )
23-
2420// bucketClaimListener is a resource handler for bucket requests objects
2521type bucketClaimListener struct {
2622 kubeClient kubeclientset.Interface
@@ -34,8 +30,8 @@ func NewBucketClaimListener() *bucketClaimListener {
3430// Add creates a bucket in response to a bucketClaim
3531func (b * bucketClaimListener ) Add (ctx context.Context , bucketClaim * v1alpha1.BucketClaim ) error {
3632 klog .V (3 ).InfoS ("Add BucketClaim" ,
37- "name" , bucketClaim .Name ,
38- "ns" , bucketClaim .Namespace ,
33+ "name" , bucketClaim .ObjectMeta . Name ,
34+ "ns" , bucketClaim .ObjectMeta . Namespace ,
3935 "bucketClass" , bucketClaim .Spec .BucketClassName ,
4036 "bucketPrefix" , bucketClaim .Spec .BucketPrefix ,
4137 )
@@ -45,27 +41,27 @@ func (b *bucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.Buc
4541 switch err {
4642 case util .ErrInvalidBucketClass :
4743 klog .ErrorS (util .ErrInvalidBucketClass ,
48- "bucketClaim" , bucketClaim .Name ,
49- "ns" , bucketClaim .Namespace ,
44+ "bucketClaim" , bucketClaim .ObjectMeta . Name ,
45+ "ns" , bucketClaim .ObjectMeta . Namespace ,
5046 "bucketClassName" , bucketClaim .Spec .BucketClassName )
5147 case util .ErrBucketAlreadyExists :
5248 klog .V (3 ).InfoS ("Bucket already exists" ,
53- "bucketClaim" , bucketClaim .Name ,
54- "ns" , bucketClaim .Namespace ,
49+ "bucketClaim" , bucketClaim .ObjectMeta . Name ,
50+ "ns" , bucketClaim .ObjectMeta . Namespace ,
5551 )
5652 return nil
5753 default :
5854 klog .ErrorS (err ,
59- "name" , bucketClaim .Name ,
60- "ns" , bucketClaim .Namespace ,
55+ "name" , bucketClaim .ObjectMeta . Name ,
56+ "ns" , bucketClaim .ObjectMeta . Namespace ,
6157 "err" , err )
6258 }
6359 return err
6460 }
6561
6662 klog .V (3 ).InfoS ("Add BucketClaim success" ,
67- "name" , bucketClaim .Name ,
68- "ns" , bucketClaim .Namespace )
63+ "name" , bucketClaim .ObjectMeta . Name ,
64+ "ns" , bucketClaim .ObjectMeta . Namespace )
6965 return nil
7066}
7167
@@ -74,14 +70,24 @@ func (b *bucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.Buc
7470 klog .V (3 ).InfoS ("Update BucketClaim" ,
7571 "name" , old .Name ,
7672 "ns" , old .Namespace )
73+
74+ if ! new .GetDeletionTimestamp ().IsZero () {
75+ if controllerutil .ContainsFinalizer (bucketClaim , util .BucketClaimFinalizer ) {
76+ bucketName := bucketClaim .Status .BucketName
77+ err := b .Buckets ().Delete (ctx , bucketName , metav1.DeleteOptions {})
78+ if err != nil {
79+ return err
80+ }
81+ }
82+ }
7783 return nil
7884}
7985
8086// Delete processes a bucket for which bucket request is deleted
8187func (b * bucketClaimListener ) Delete (ctx context.Context , bucketClaim * v1alpha1.BucketClaim ) error {
8288 klog .V (3 ).Infof ("Delete BucketClaim %v" ,
83- "name" , bucketClaim .Name ,
84- "ns" , bucketClaim .Namespace )
89+ "name" , bucketClaim .ObjectMeta . Name ,
90+ "ns" , bucketClaim .ObjectMeta . Namespace )
8591
8692 return nil
8793}
@@ -93,50 +99,82 @@ func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1.
9399// ErrBucketAlreadyExists - BucketClaim already processed
94100// non-nil err - Internal error [requeue'd with exponential backoff]
95101func (b * bucketClaimListener ) provisionBucketClaimOperation (ctx context.Context , bucketClaim * v1alpha1.BucketClaim ) error {
96- bucketClassName := b .getBucketClass (bucketClaim )
97- bucketClass , err := b .BucketClasses ().Get (ctx , bucketClassName , metav1.GetOptions {})
98- if err != nil {
99- klog .ErrorS (err , "Get Bucketclass Error" , "name" , bucketClassName )
100- return util .ErrInvalidBucketClass
101- }
102-
103102 if bucketClaim .Status .BucketReady {
104103 return util .ErrBucketAlreadyExists
105104 }
106105
107- name = bucketClassName + string (bucketClaim .GetUID ())
108-
109- // create bucket
110- bucket := & v1alpha1.Bucket {}
111- bucket .Name = name
112- bucket .Status .BucketReady = false
113- bucket .Spec .DriverName = bucketClass .DriverName
114- bucket .Spec .BucketClassName = bucketClassName
115- bucket .Spec .DeletionPolicy = bucketClass .DeletionPolicy
116- bucket .Spec .BucketClaim = & v1.ObjectReference {
117- Name : bucketClaim .Name ,
118- Namespace : bucketClaim .Namespace ,
119- UID : bucketClaim .ObjectMeta .UID ,
106+ var bucketName string
107+
108+ if bucketClaim .Spec .ExistingBucketName != "" {
109+ bucketName = bucketClaim .Spec .ExistingBucketName
110+ bucket , err = b .Buckets ().Get (ctx , bucketName , metav1.GetOptions {})
111+ if err != nil {
112+ klog .ErrorS (err , "Get Bucket with ExistingBucketName error" , "name" , existingBucketName )
113+ return err
114+ }
115+
116+ bucket .Spec .BucketClaim = & v1.ObjectReference {
117+ Name : bucketClaim .ObjectMeta .Name ,
118+ Namespace : bucketClaim .ObjectMeta .Namespace ,
119+ UID : bucketClaim .ObjectMeta .UID ,
120+ }
121+
122+ _ , err = b .Buckets ().Update (ctx , bucket , metav1.UpdateOptions {})
123+ if err != nil {
124+ return err
125+ }
126+
127+ bucketClaim .Status .BucketName = bucketName
128+ bucketClaim .Status .BucketAvailable = true
129+ } else {
130+ bucketClassName := b .getBucketClass (bucketClaim )
131+ bucketClass , err := b .BucketClasses ().Get (ctx , bucketClassName , metav1.GetOptions {})
132+ if err != nil {
133+ klog .ErrorS (err , "Get Bucketclass Error" , "name" , bucketClassName )
134+ return util .ErrInvalidBucketClass
135+ }
136+
137+ bucketName = bucketClassName + string (bucketClaim .ObjectMeta .UID )
138+
139+ // create bucket
140+ bucket := & v1alpha1.Bucket {}
141+ bucket .Name = bucketName
142+ bucket .Spec .DriverName = bucketClass .DriverName
143+ bucket .Status .BucketReady = false
144+ bucket .Spec .BucketClassName = bucketClassName
145+ bucket .Spec .DeletionPolicy = bucketClass .DeletionPolicy
146+ bucket .Spec .Parameters = util .CopySS (bucketClass .Parameters )
147+
148+ bucket .Spec .BucketClaim = & v1.ObjectReference {
149+ Name : bucketClaim .ObjectMeta .Name ,
150+ Namespace : bucketClaim .ObjectMeta .Namespace ,
151+ UID : bucketClaim .ObjectMeta .UID ,
152+ }
153+
154+ bucket .Spec .Protocols = * bucketClaim .Spec .Protocol .DeepCopy ()
155+ bucket , err = b .Buckets ().Create (ctx , bucket , metav1.CreateOptions {})
156+ if err != nil && ! errors .IsAlreadyExists (err ) {
157+ klog .ErrorS (err , "name" , bucketName )
158+ return err
159+ }
160+
161+ bucketClaim .Status .BucketName = bucketName
162+ bucketClaim .Status .BucketAvailable = false
120163 }
121- bucket .Spec .Protocols = * bucketClass .Protocol .DeepCopy ()
122- bucket .Spec .Parameters = util .CopySS (bucketClass .Parameters )
123164
124- bucket , err = b .Buckets ().Create (ctx , bucket , metav1.CreateOptions {})
125- if err != nil && ! errors .IsAlreadyExists (err ) {
126- klog .ErrorS (err , "name" , bucket .Name )
165+ _ , err = b .BucketClaims (bucketClaim .ObjectMeta .Namespace ).UpdateStatus (ctx , bucketClaim , metav1.UpdateOptions {})
166+ if err != nil {
127167 return err
128168 }
129169
130- // controllerutil.AddFinalizer(bucketClaim, finalizer)
131-
132- bucketClaim .Status .BucketName = bucket .Name
133- bucketClaim .Status .BucketAvailable = false
134- _ , err = b .BucketClaims (bucketClaim .Namespace ).UpdateStatus (ctx , bucketClaim , metav1.UpdateOptions {})
170+ // Add the finalizers so that bucketClaim is deleted
171+ // only after the associated bucket is deleted.
172+ controllerutil .AddFinalizer (bucketClaim , util .BucketClaimFinalizer )
173+ _ , err = b .BucketClaims (bucketClaim .ObjectMeta .Namespace ).Update (ctx , bucketClaim , metav1.UpdateOptions {})
135174 if err != nil {
136175 return err
137176 }
138-
139- klog .Infof ("Finished creating Bucket %v" , bucket .Name )
177+ klog .Infof ("Finished creating Bucket %v" , bucketName )
140178 return nil
141179}
142180
0 commit comments