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

Commit 072911c

Browse files
committed
fix rbac rules and check for errors getting bucketclass
1 parent cb08138 commit 072911c

File tree

6 files changed

+77
-43
lines changed

6 files changed

+77
-43
lines changed

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

+47-26
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ import (
44
"context"
55

66
v1 "k8s.io/api/core/v1"
7+
"k8s.io/apimachinery/pkg/api/errors"
78
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
kubeclientset "k8s.io/client-go/kubernetes"
10+
"k8s.io/client-go/util/retry"
811

912
"github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1"
1013
bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset"
1114
bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller"
1215
"github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util"
13-
kubeclientset "k8s.io/client-go/kubernetes"
14-
"k8s.io/client-go/util/retry"
1516

1617
"github.com/golang/glog"
1718
)
@@ -41,9 +42,6 @@ func (b *bucketAccessRequestListener) Add(ctx context.Context, obj *v1alpha1.Buc
4142
if err != nil {
4243
// Provisioning is 100% finished / not in progress.
4344
switch err {
44-
case util.ErrInvalidBucketAccessClass:
45-
glog.V(1).Infof("BucketAccessClass specified does not exist while processing BucketAccessRequest %v.", bucketAccessRequest.Name)
46-
err = nil
4745
case util.ErrBucketAccessAlreadyExists:
4846
glog.V(1).Infof("BucketAccess already exist for this BucketAccessRequest %v.", bucketAccessRequest.Name)
4947
err = nil
@@ -73,50 +71,70 @@ func (b *bucketAccessRequestListener) Delete(ctx context.Context, obj *v1alpha1.
7371
// or a special error errBucketAccessAlreadyExists, errInvalidBucketAccessClass is returned when provisioning was impossible and
7472
// no further attempts to provision should be tried.
7573
func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, bucketAccessRequest *v1alpha1.BucketAccessRequest) error {
76-
bucketAccessClassName := bucketAccessRequest.Spec.BucketAccessClassName
77-
78-
bucketaccess := b.FindBucketAccess(ctx, bucketAccessRequest)
79-
if bucketaccess != nil {
80-
// bucketaccess has provisioned, nothing to do.
81-
return util.ErrBucketAccessAlreadyExists
74+
baClient := b.bucketClient.ObjectstorageV1alpha1().BucketAccesses()
75+
bacClient := b.bucketClient.ObjectstorageV1alpha1().BucketAccessClasses()
76+
brClient := b.bucketClient.ObjectstorageV1alpha1().BucketRequests
77+
barClient := b.bucketClient.ObjectstorageV1alpha1().BucketAccessRequests
78+
coreClient := b.kubeClient.CoreV1()
79+
80+
name := string(bucketAccessRequest.GetUID())
81+
_, err := baClient.Get(ctx, name, metav1.GetOptions{})
82+
if err != nil {
83+
// anything other than 404
84+
if !errors.IsNotFound(err) {
85+
glog.Errorf("error fetching bucketaccess: %v", err)
86+
return err
87+
}
88+
} else { // if bucket found
89+
return nil
8290
}
8391

84-
bucketAccessClass, err := b.bucketClient.ObjectstorageV1alpha1().BucketAccessClasses().Get(ctx, bucketAccessClassName, metav1.GetOptions{})
85-
if bucketAccessClass == nil {
92+
bucketAccessClassName := bucketAccessRequest.Spec.BucketAccessClassName
93+
bucketAccessClass, err := bacClient.Get(ctx, bucketAccessClassName, metav1.GetOptions{})
94+
if err != nil {
8695
// bucket access class is invalid or not specified, cannot continue with provisioning.
96+
glog.Errorf("error fetching bucketaccessclass [%v]: %v", bucketAccessClassName, err)
8797
return util.ErrInvalidBucketAccessClass
8898
}
8999

90-
bucketRequest, err := b.bucketClient.ObjectstorageV1alpha1().BucketRequests(bucketAccessRequest.Namespace).Get(ctx, bucketAccessRequest.Spec.BucketRequestName, metav1.GetOptions{})
91-
if bucketRequest == nil {
92-
// bucket request does not exist, we have to reject this provision.
93-
return util.ErrInvalidBucketRequest
100+
brName := bucketAccessRequest.Spec.BucketRequestName
101+
// TODO: catch this in a admission controller
102+
if brName == "" {
103+
return util.ErrInvalidBucketAccessRequest
94104
}
105+
bucketRequest, err := brClient(bucketAccessRequest.Namespace).Get(ctx, brName, metav1.GetOptions{})
95106
if err != nil {
107+
glog.Errorf("error fetching bucket request [%v]: %v", brName, err)
96108
return err
97109
}
98110

99111
if bucketRequest.Spec.BucketInstanceName == "" {
100112
return util.ErrWaitForBucketProvisioning
101113
}
102114

103-
sa, err := b.kubeClient.CoreV1().ServiceAccounts(bucketAccessRequest.Namespace).Get(ctx, bucketAccessRequest.Spec.ServiceAccountName, metav1.GetOptions{})
104-
if err != nil {
105-
return err
115+
saName := bucketAccessRequest.Spec.ServiceAccountName
116+
sa := &v1.ServiceAccount{}
117+
if saName != "" {
118+
sa, err = coreClient.ServiceAccounts(bucketAccessRequest.Namespace).Get(ctx, saName, metav1.GetOptions{})
119+
if err != nil {
120+
return err
121+
}
106122
}
107123

108-
bucketaccess = &v1alpha1.BucketAccess{}
109-
bucketaccess.Name = util.GetUUID()
124+
bucketaccess := &v1alpha1.BucketAccess{}
125+
bucketaccess.Name = name
110126

111127
bucketaccess.Spec.BucketInstanceName = bucketRequest.Spec.BucketInstanceName
112128
bucketaccess.Spec.BucketAccessRequest = &v1.ObjectReference{
113129
Name: bucketAccessRequest.Name,
114130
Namespace: bucketAccessRequest.Namespace,
115-
UID: bucketAccessRequest.ObjectMeta.UID}
131+
UID: bucketAccessRequest.ObjectMeta.UID,
132+
}
116133
bucketaccess.Spec.ServiceAccount = &v1.ObjectReference{
117134
Name: sa.Name,
118135
Namespace: sa.Namespace,
119-
UID: sa.ObjectMeta.UID}
136+
UID: sa.ObjectMeta.UID,
137+
}
120138
// bucketaccess.Spec.MintedSecretName - set by the driver
121139
bucketaccess.Spec.PolicyActionsConfigMapData, err = util.ReadConfigData(b.kubeClient, bucketAccessClass.PolicyActionsConfigMap)
122140
if err != nil {
@@ -126,14 +144,17 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context,
126144
bucketaccess.Spec.Provisioner = bucketAccessClass.Provisioner
127145
bucketaccess.Spec.Parameters = util.CopySS(bucketAccessClass.Parameters)
128146

129-
bucketaccess, err = b.bucketClient.ObjectstorageV1alpha1().BucketAccesses().Create(context.Background(), bucketaccess, metav1.CreateOptions{})
147+
bucketaccess, err = baClient.Create(context.Background(), bucketaccess, metav1.CreateOptions{})
130148
if err != nil {
149+
if errors.IsAlreadyExists(err) {
150+
return nil
151+
}
131152
return err
132153
}
133154

134155
err = retry.RetryOnConflict(retry.DefaultRetry, func() error {
135156
bucketAccessRequest.Spec.BucketAccessName = bucketaccess.Name
136-
_, err := b.bucketClient.ObjectstorageV1alpha1().BucketAccessRequests(bucketAccessRequest.Namespace).Update(ctx, bucketAccessRequest, metav1.UpdateOptions{})
157+
_, err := barClient(bucketAccessRequest.Namespace).Update(ctx, bucketAccessRequest, metav1.UpdateOptions{})
137158
if err != nil {
138159
return err
139160
}

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

+3
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ var bucketRequest1 = types.BucketRequest{
6868
ObjectMeta: metav1.ObjectMeta{
6969
Name: "bucketrequest1",
7070
Namespace: "default",
71+
UID: "br-12345",
7172
},
7273
Spec: types.BucketRequestSpec{
7374
BucketPrefix: "cosi",
@@ -88,6 +89,7 @@ var bucketAccessRequest1 = types.BucketAccessRequest{
8889
ObjectMeta: metav1.ObjectMeta{
8990
Name: "bucketaccessrequest1",
9091
Namespace: "default",
92+
UID: "bar-12345",
9193
},
9294
Spec: types.BucketAccessRequestSpec{
9395
ServiceAccountName: "sa1",
@@ -104,6 +106,7 @@ var bucketAccessRequest2 = types.BucketAccessRequest{
104106
ObjectMeta: metav1.ObjectMeta{
105107
Name: "bucketaccessrequest2",
106108
Namespace: "default",
109+
UID: "bar-67890",
107110
},
108111
Spec: types.BucketAccessRequestSpec{
109112
ServiceAccountName: "sa2",

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

+8-5
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func (b *bucketRequestListener) InitializeBucketClient(bc bucketclientset.Interf
3737

3838
// Add creates a bucket in response to a bucketrequest
3939
func (b *bucketRequestListener) Add(ctx context.Context, obj *v1alpha1.BucketRequest) error {
40-
glog.V(1).Infof("Add called for BucketRequest %s", obj.Name)
40+
glog.V(3).Infof("Add called for BucketRequest %s", obj.Name)
4141
bucketRequest := obj
4242
err := b.provisionBucketRequestOperation(ctx, bucketRequest)
4343
if err != nil {
@@ -61,13 +61,13 @@ func (b *bucketRequestListener) Add(ctx context.Context, obj *v1alpha1.BucketReq
6161

6262
// update processes any updates made to the bucket request
6363
func (b *bucketRequestListener) Update(ctx context.Context, old, new *v1alpha1.BucketRequest) error {
64-
glog.V(1).Infof("Update called for BucketRequest %v", old.Name)
64+
glog.V(3).Infof("Update called for BucketRequest %v", old.Name)
6565
return nil
6666
}
6767

6868
// Delete processes a bucket for which bucket request is deleted
6969
func (b *bucketRequestListener) Delete(ctx context.Context, obj *v1alpha1.BucketRequest) error {
70-
glog.V(1).Infof("Delete called for BucketRequest %v", obj.Name)
70+
glog.V(3).Infof("Delete called for BucketRequest %v", obj.Name)
7171
return nil
7272
}
7373

@@ -81,8 +81,8 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont
8181
bucketClassName := b.GetBucketClass(bucketRequest)
8282

8383
bucketClass, err := b.bucketClient.ObjectstorageV1alpha1().BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{})
84-
if bucketClass == nil {
85-
// bucketclass does not exist in order to create a bucket
84+
if err != nil {
85+
glog.Errorf("error getting bucketclass: [%v] %v", bucketClassName, err)
8686
return util.ErrInvalidBucketClass
8787
}
8888

@@ -123,6 +123,9 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont
123123

124124
bucket, err = b.bucketClient.ObjectstorageV1alpha1().Buckets().Create(context.Background(), bucket, metav1.CreateOptions{})
125125
if err != nil {
126+
if errors.IsAlreadyExists(err) {
127+
return nil
128+
}
126129
glog.V(5).Infof("Error occurred when creating Bucket %v", err)
127130
return err
128131
}

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

+10-9
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,16 @@ import (
3737

3838
var (
3939
// Error codes that the central controller will return
40-
ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request")
41-
ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket request")
42-
ErrBucketAccessAlreadyExists = errors.New("A bucket access already existing that matches the bucket access request")
43-
ErrInvalidBucketAccessClass = errors.New("Cannot find bucket access class with the name specified in the bucket access request")
44-
ErrInvalidBucketRequest = errors.New("Invalid bucket request specified in the bucket access request")
45-
ErrWaitForBucketProvisioning = errors.New("Bucket instance specified in the bucket request is not available to provision bucket access")
46-
ErrBCUnavailable = errors.New("BucketClass is not available")
47-
ErrNotImplemented = errors.New("Operation Not Implemented")
48-
ErrNilConfigMap = errors.New("ConfigMap cannot be nil")
40+
ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request")
41+
ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket request")
42+
ErrBucketAccessAlreadyExists = errors.New("A bucket access already existing that matches the bucket access request")
43+
ErrInvalidBucketAccessClass = errors.New("Cannot find bucket access class with the name specified in the bucket access request")
44+
ErrInvalidBucketRequest = errors.New("Invalid bucket request specified in the bucket access request")
45+
ErrInvalidBucketAccessRequest = errors.New("Invalid bucket access request specified")
46+
ErrWaitForBucketProvisioning = errors.New("Bucket instance specified in the bucket request is not available to provision bucket access")
47+
ErrBCUnavailable = errors.New("BucketClass is not available")
48+
ErrNotImplemented = errors.New("Operation Not Implemented")
49+
ErrNilConfigMap = errors.New("ConfigMap cannot be nil")
4950
)
5051

5152
func CopySS(m map[string]string) map[string]string {

Diff for: container-object-storage-interface-controller/resources/deployment.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,5 @@ spec:
3232
containers:
3333
- name: objectstorage-controller
3434
image: quay.io/containerobjectstorage/objectstorage-controller:latest
35+
args:
36+
- "--v=5"

Diff for: container-object-storage-interface-controller/resources/rbac.yaml

+7-3
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,20 @@ metadata:
1212
rules:
1313
- apiGroups: ["objectstorage.k8s.io"]
1414
resources: ["bucketrequests", "bucketaccessrequests"]
15-
verbs: ["get", "list", "watch"]
15+
verbs: ["get", "list", "watch", "update"]
1616
- apiGroups: ["objectstorage.k8s.io"]
17-
resources: ["buckets", "bucketaccess"]
17+
resources: ["buckets", "bucketaccesses"]
1818
verbs: ["get", "list", "watch", "update", "create", "delete"]
1919
- apiGroups: ["objectstorage.k8s.io"]
20-
resources: ["bucketclass","bucketaccessclass"]
20+
resources: ["bucketclasses","bucketaccessclasses"]
2121
verbs: ["get", "list"]
2222
- apiGroups: [""]
2323
resources: ["events"]
2424
verbs: ["list", "watch", "create", "update", "patch"]
25+
- apiGroups: [""]
26+
resources: ["configmaps", "serviceaccounts"]
27+
verbs: ["list", "get"]
28+
2529
---
2630
kind: ClusterRoleBinding
2731
apiVersion: rbac.authorization.k8s.io/v1

0 commit comments

Comments
 (0)