@@ -17,10 +17,6 @@ import (
17
17
"sigs.k8s.io/container-object-storage-interface-controller/pkg/util"
18
18
)
19
19
20
- const (
21
- finalizer = "cosi.objectstorage.k8s.io/bucketclaim-protection"
22
- )
23
-
24
20
// bucketClaimListener is a resource handler for bucket requests objects
25
21
type bucketClaimListener struct {
26
22
kubeClient kubeclientset.Interface
@@ -34,8 +30,8 @@ func NewBucketClaimListener() *bucketClaimListener {
34
30
// Add creates a bucket in response to a bucketClaim
35
31
func (b * bucketClaimListener ) Add (ctx context.Context , bucketClaim * v1alpha1.BucketClaim ) error {
36
32
klog .V (3 ).InfoS ("Add BucketClaim" ,
37
- "name" , bucketClaim .Name ,
38
- "ns" , bucketClaim .Namespace ,
33
+ "name" , bucketClaim .ObjectMeta . Name ,
34
+ "ns" , bucketClaim .ObjectMeta . Namespace ,
39
35
"bucketClass" , bucketClaim .Spec .BucketClassName ,
40
36
"bucketPrefix" , bucketClaim .Spec .BucketPrefix ,
41
37
)
@@ -45,27 +41,27 @@ func (b *bucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.Buc
45
41
switch err {
46
42
case util .ErrInvalidBucketClass :
47
43
klog .ErrorS (util .ErrInvalidBucketClass ,
48
- "bucketClaim" , bucketClaim .Name ,
49
- "ns" , bucketClaim .Namespace ,
44
+ "bucketClaim" , bucketClaim .ObjectMeta . Name ,
45
+ "ns" , bucketClaim .ObjectMeta . Namespace ,
50
46
"bucketClassName" , bucketClaim .Spec .BucketClassName )
51
47
case util .ErrBucketAlreadyExists :
52
48
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 ,
55
51
)
56
52
return nil
57
53
default :
58
54
klog .ErrorS (err ,
59
- "name" , bucketClaim .Name ,
60
- "ns" , bucketClaim .Namespace ,
55
+ "name" , bucketClaim .ObjectMeta . Name ,
56
+ "ns" , bucketClaim .ObjectMeta . Namespace ,
61
57
"err" , err )
62
58
}
63
59
return err
64
60
}
65
61
66
62
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 )
69
65
return nil
70
66
}
71
67
@@ -74,14 +70,24 @@ func (b *bucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.Buc
74
70
klog .V (3 ).InfoS ("Update BucketClaim" ,
75
71
"name" , old .Name ,
76
72
"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
+ }
77
83
return nil
78
84
}
79
85
80
86
// Delete processes a bucket for which bucket request is deleted
81
87
func (b * bucketClaimListener ) Delete (ctx context.Context , bucketClaim * v1alpha1.BucketClaim ) error {
82
88
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 )
85
91
86
92
return nil
87
93
}
@@ -93,50 +99,82 @@ func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1.
93
99
// ErrBucketAlreadyExists - BucketClaim already processed
94
100
// non-nil err - Internal error [requeue'd with exponential backoff]
95
101
func (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
-
103
102
if bucketClaim .Status .BucketReady {
104
103
return util .ErrBucketAlreadyExists
105
104
}
106
105
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
120
163
}
121
- bucket .Spec .Protocols = * bucketClass .Protocol .DeepCopy ()
122
- bucket .Spec .Parameters = util .CopySS (bucketClass .Parameters )
123
164
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 {
127
167
return err
128
168
}
129
169
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 {})
135
174
if err != nil {
136
175
return err
137
176
}
138
-
139
- klog .Infof ("Finished creating Bucket %v" , bucket .Name )
177
+ klog .Infof ("Finished creating Bucket %v" , bucketName )
140
178
return nil
141
179
}
142
180
0 commit comments