@@ -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.
7573func (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 }
0 commit comments