Skip to content
This repository was archived by the owner on Dec 6, 2024. It is now read-only.

Commit ebfe483

Browse files
committed
More updates to the bucket claim controller
1 parent a052b99 commit ebfe483

File tree

4 files changed

+90
-110
lines changed

4 files changed

+90
-110
lines changed

Diff for: container-object-storage-interface-controller/cmd/controller-manager/controller-manager.go

-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"github.com/spf13/viper"
1212

1313
bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller"
14-
"sigs.k8s.io/container-object-storage-interface-controller/pkg/bucketaccessrequest"
1514
"sigs.k8s.io/container-object-storage-interface-controller/pkg/bucketclaim"
1615

1716
"k8s.io/klog/v2"
@@ -68,6 +67,5 @@ func run(ctx context.Context, args []string) error {
6867
return err
6968
}
7069
ctrl.AddBucketClaimListener(bucketclaim.NewBucketClaimListener())
71-
ctrl.AddBucketAccessRequestListener(bucketaccessrequest.NewListener())
7270
return ctrl.Run(ctx)
7371
}

Diff for: container-object-storage-interface-controller/pkg/bucketclaim/bucketclaim.go

+86-48
Original file line numberDiff line numberDiff line change
@@ -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
2521
type bucketClaimListener struct {
2622
kubeClient kubeclientset.Interface
@@ -34,8 +30,8 @@ func NewBucketClaimListener() *bucketClaimListener {
3430
// Add creates a bucket in response to a bucketClaim
3531
func (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
8187
func (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]
95101
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-
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

Diff for: container-object-storage-interface-controller/pkg/util/const.go

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import (
44
"errors"
55
)
66

7+
const (
8+
BucketClaimFinalizer = "cosi.objectstorage.k8s.io/bucketclaim-protection"
9+
)
10+
711
var (
812
// Error codes that the central controller will return
913
ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request")

Diff for: container-object-storage-interface-controller/pkg/util/util.go

-60
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package util
33
import (
44
"context"
55
"encoding/json"
6-
"errors"
76
"fmt"
87
"golang.org/x/time/rate"
98
"os"
@@ -228,65 +227,6 @@ func DeleteObjects(ctx context.Context, client bucketclientset.Interface, objs .
228227
}
229228
}
230229

231-
// CreateBucketRequest creates a bucket request object or return an existing bucket request object
232-
// This is used by bucket request unit tests
233-
func CreateBucketRequest(ctx context.Context, client bucketclientset.Interface, br *types.BucketRequest) (*types.BucketRequest, error) {
234-
br, err := client.ObjectstorageV1alpha1().BucketRequests(br.Namespace).Create(ctx, br, metav1.CreateOptions{})
235-
if (err != nil) && apierrors.IsAlreadyExists(err) {
236-
br, err = client.ObjectstorageV1alpha1().BucketRequests(br.Namespace).Get(ctx, br.Name, metav1.GetOptions{})
237-
}
238-
return br, err
239-
}
240-
241-
// CreateBucketAccessRequest creates a bucket access request object or return an existing bucket access request object
242-
// This is used by bucket access request unit tests
243-
func CreateBucketAccessRequest(ctx context.Context, client bucketclientset.Interface, bar *types.BucketAccessRequest) (*types.BucketAccessRequest, error) {
244-
bar, err := client.ObjectstorageV1alpha1().BucketAccessRequests(bar.Namespace).Create(ctx, bar, metav1.CreateOptions{})
245-
if (err != nil) && apierrors.IsAlreadyExists(err) {
246-
bar, err = client.ObjectstorageV1alpha1().BucketAccessRequests(bar.Namespace).Get(ctx, bar.Name, metav1.GetOptions{})
247-
}
248-
return bar, err
249-
}
250-
251-
// CreateBucketClass creates a bucket class object or return an existing bucket class object
252-
// This is used by bucket request unit tests
253-
func CreateBucketClass(ctx context.Context, client bucketclientset.Interface, bc *types.BucketClass) (*types.BucketClass, error) {
254-
bc, err := client.ObjectstorageV1alpha1().BucketClasses().Create(ctx, bc, metav1.CreateOptions{})
255-
if (err != nil) && apierrors.IsAlreadyExists(err) {
256-
bc, err = client.ObjectstorageV1alpha1().BucketClasses().Get(ctx, bc.Name, metav1.GetOptions{})
257-
}
258-
return bc, err
259-
}
260-
261-
// CreateBucketAccessClass creates a bucket access class object or return an existing bucket access class object
262-
// This is used by bucket request unit tests
263-
func CreateBucketAccessClass(ctx context.Context, client bucketclientset.Interface, bac *types.BucketAccessClass) (*types.BucketAccessClass, error) {
264-
bac, err := client.ObjectstorageV1alpha1().BucketAccessClasses().Create(ctx, bac, metav1.CreateOptions{})
265-
if (err != nil) && apierrors.IsAlreadyExists(err) {
266-
bac, err = client.ObjectstorageV1alpha1().BucketAccessClasses().Get(ctx, bac.Name, metav1.GetOptions{})
267-
}
268-
return bac, err
269-
}
270-
271-
// CreateBucket creates a bucket object or return an existing bucket object
272-
// This is used by bucket request unit tests
273-
func CreateBucket(ctx context.Context, client bucketclientset.Interface, b *types.Bucket) (*types.Bucket, error) {
274-
b, err := client.ObjectstorageV1alpha1().Buckets().Create(ctx, b, metav1.CreateOptions{})
275-
if (err != nil) && apierrors.IsAlreadyExists(err) {
276-
b, err = client.ObjectstorageV1alpha1().Buckets().Get(ctx, b.Name, metav1.GetOptions{})
277-
}
278-
return b, err
279-
}
280-
281-
// CreateBucketAccess creates a bucket access object or return an existing bucket access object
282-
// This is used by bucket access request unit tests
283-
func CreateBucketAccess(ctx context.Context, client bucketclientset.Interface, ba *types.BucketAccess) (*types.BucketAccess, error) {
284-
ba, err := client.ObjectstorageV1alpha1().BucketAccesses().Create(ctx, ba, metav1.CreateOptions{})
285-
if (err != nil) && apierrors.IsAlreadyExists(err) {
286-
ba, err = client.ObjectstorageV1alpha1().BucketAccesses().Get(ctx, ba.Name, metav1.GetOptions{})
287-
}
288-
return ba, err
289-
}
290230

291231
// getCRDClient returns CRD interface for managing CRD objects programmatically
292232
// Used by unit tests and functional tests

0 commit comments

Comments
 (0)