@@ -4,14 +4,15 @@ import (
4
4
"context"
5
5
6
6
v1 "k8s.io/api/core/v1"
7
+ "k8s.io/apimachinery/pkg/api/errors"
7
8
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9
+ kubeclientset "k8s.io/client-go/kubernetes"
10
+ "k8s.io/client-go/util/retry"
8
11
9
12
"github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1"
10
13
bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset"
11
14
bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller"
12
15
"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"
15
16
16
17
"github.com/golang/glog"
17
18
)
@@ -41,9 +42,6 @@ func (b *bucketAccessRequestListener) Add(ctx context.Context, obj *v1alpha1.Buc
41
42
if err != nil {
42
43
// Provisioning is 100% finished / not in progress.
43
44
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
47
45
case util .ErrBucketAccessAlreadyExists :
48
46
glog .V (1 ).Infof ("BucketAccess already exist for this BucketAccessRequest %v." , bucketAccessRequest .Name )
49
47
err = nil
@@ -73,50 +71,70 @@ func (b *bucketAccessRequestListener) Delete(ctx context.Context, obj *v1alpha1.
73
71
// or a special error errBucketAccessAlreadyExists, errInvalidBucketAccessClass is returned when provisioning was impossible and
74
72
// no further attempts to provision should be tried.
75
73
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
82
90
}
83
91
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 {
86
95
// bucket access class is invalid or not specified, cannot continue with provisioning.
96
+ glog .Errorf ("error fetching bucketaccessclass [%v]: %v" , bucketAccessClassName , err )
87
97
return util .ErrInvalidBucketAccessClass
88
98
}
89
99
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
94
104
}
105
+ bucketRequest , err := brClient (bucketAccessRequest .Namespace ).Get (ctx , brName , metav1.GetOptions {})
95
106
if err != nil {
107
+ glog .Errorf ("error fetching bucket request [%v]: %v" , brName , err )
96
108
return err
97
109
}
98
110
99
111
if bucketRequest .Spec .BucketInstanceName == "" {
100
112
return util .ErrWaitForBucketProvisioning
101
113
}
102
114
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
+ }
106
122
}
107
123
108
- bucketaccess = & v1alpha1.BucketAccess {}
109
- bucketaccess .Name = util . GetUUID ()
124
+ bucketaccess : = & v1alpha1.BucketAccess {}
125
+ bucketaccess .Name = name
110
126
111
127
bucketaccess .Spec .BucketInstanceName = bucketRequest .Spec .BucketInstanceName
112
128
bucketaccess .Spec .BucketAccessRequest = & v1.ObjectReference {
113
129
Name : bucketAccessRequest .Name ,
114
130
Namespace : bucketAccessRequest .Namespace ,
115
- UID : bucketAccessRequest .ObjectMeta .UID }
131
+ UID : bucketAccessRequest .ObjectMeta .UID ,
132
+ }
116
133
bucketaccess .Spec .ServiceAccount = & v1.ObjectReference {
117
134
Name : sa .Name ,
118
135
Namespace : sa .Namespace ,
119
- UID : sa .ObjectMeta .UID }
136
+ UID : sa .ObjectMeta .UID ,
137
+ }
120
138
// bucketaccess.Spec.MintedSecretName - set by the driver
121
139
bucketaccess .Spec .PolicyActionsConfigMapData , err = util .ReadConfigData (b .kubeClient , bucketAccessClass .PolicyActionsConfigMap )
122
140
if err != nil {
@@ -126,14 +144,17 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context,
126
144
bucketaccess .Spec .Provisioner = bucketAccessClass .Provisioner
127
145
bucketaccess .Spec .Parameters = util .CopySS (bucketAccessClass .Parameters )
128
146
129
- bucketaccess , err = b . bucketClient . ObjectstorageV1alpha1 (). BucketAccesses () .Create (context .Background (), bucketaccess , metav1.CreateOptions {})
147
+ bucketaccess , err = baClient .Create (context .Background (), bucketaccess , metav1.CreateOptions {})
130
148
if err != nil {
149
+ if errors .IsAlreadyExists (err ) {
150
+ return nil
151
+ }
131
152
return err
132
153
}
133
154
134
155
err = retry .RetryOnConflict (retry .DefaultRetry , func () error {
135
156
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 {})
137
158
if err != nil {
138
159
return err
139
160
}
0 commit comments