@@ -47,26 +47,23 @@ const (
4747// BucketAccessListener manages Bucket objects
4848type BucketAccessListener struct {
4949 provisionerClient cosi.ProvisionerClient
50- provisionerName string
50+ driverName string
5151
5252 kubeClient kube.Interface
5353 bucketClient buckets.Interface
5454 kubeVersion * utilversion.Version
55-
56- namespace string
5755}
5856
5957// NewBucketAccessListener returns a resource handler for BucketAccess objects
60- func NewBucketAccessListener (provisionerName string , client cosi.ProvisionerClient ) (* BucketAccessListener , error ) {
58+ func NewBucketAccessListener (driverName string , client cosi.ProvisionerClient ) (* BucketAccessListener , error ) {
6159 ns := os .Getenv ("POD_NAMESPACE" )
6260 if ns == "" {
6361 return nil , errors .New ("POD_NAMESPACE env var cannot be empty" )
6462 }
6563
6664 return & BucketAccessListener {
67- provisionerName : provisionerName ,
65+ driverName : driverName ,
6866 provisionerClient : client ,
69- namespace : ns ,
7067 }, nil
7168}
7269
@@ -77,60 +74,96 @@ func NewBucketAccessListener(provisionerName string, client cosi.ProvisionerClie
7774func (bal * BucketAccessListener ) Add (ctx context.Context , inputBucketAccess * v1alpha1.BucketAccess ) error {
7875 bucketAccess := inputBucketAccess .DeepCopy ()
7976
80- bucketName := bucketAccess .Spec .BucketName
77+ bucketClaimName := bucketAccess .Spec .BucketClaimName
8178 klog .V (3 ).InfoS ("Add BucketAccess" ,
8279 "name" , bucketAccess .Name ,
83- "bucket " , bucketName ,
80+ "bucketClaim " , bucketClaimName ,
8481 )
8582
86- if bucketAccess .Status .MintedSecret != nil {
87- klog .V (5 ).InfoS ("AccessAlreadyGranted" ,
83+ bucketAccessClassName := bucketAccess .Spec .BucketAccessClassName
84+ klog .V (3 ).InfoS ("Add BucketAccess" ,
85+ "name" , bucketAccess .Name ,
86+ "BucketAccessClassName" , bucketAccessClassName ,
87+ )
88+
89+ secretCredName := bucketAccess .Spec .CredentialsSecretName
90+ if secretCredName == nil {
91+ return errors .New ("CredentialsSecretName not defined in the BucketAccess" )
92+ }
93+
94+ authType := cosi .AuthenticationType_UnknownAuthenticationType
95+ if bucketAccess .Spec .AuthenticationType == v1alpha1 .AuthenticationTypeKey {
96+ authType = cosi .AuthenticationType_Key
97+ } else if bucketAccess .Spec .AuthenticationType == v1alpha1 .AuthenticationTypeIAM {
98+ authType = cosi .AuthenticationType_IAM
99+ }
100+
101+ if authType == cosi .AuthenticationType_IAM && bucketAccess .Spec .ServiceAccountName == "" {
102+ return errors .New ("Must define ServiceAccountName when AuthenticationType is IAM" )
103+ }
104+
105+ namespace := bucketAccess .Namespace
106+ bucketClaim , err := bal .BucketClaims (namespace ).Get (ctx , bucketClaimName , metav1.GetOptions {})
107+ if err != nil {
108+ klog .ErrorS (err , "Failed to fetch bucketClaim" , "bucketClaim" , bucketClaimName )
109+ return errors .Wrap (err , "Failed to fetch bucketClaim" )
110+ }
111+
112+
113+ if bucketClaim .Status .BucketName == "" || bucketClaim .Status .BucketReady != true {
114+ err := errors .New ("BucketName cannot be empty or BucketNotReady" )
115+ klog .ErrorS (err ,
116+ "Invalid arguments" ,
117+ "bucketClaim" , bucketClaim .Name ,
88118 "bucketAccess" , bucketAccess .Name ,
89- "bucket" , bucketName ,
90119 )
91- return nil
120+ return errors . Wrap ( err , "Invalid arguments" )
92121 }
93122
94- bucket , err := bal .Buckets ().Get (ctx , bucketName , metav1.GetOptions {})
123+ bucketAccessClass , err := bal .BucketAccessClasses ().Get (ctx , bucketAccessClassName , metav1.GetOptions {})
95124 if err != nil {
96- klog .ErrorS (err , "Failed to fetch bucket " , "bucket " , bucketName )
97- return errors .Wrap (err , "Failed to fetch bucket " )
125+ klog .ErrorS (err , "Failed to fetch bucketAccessClass " , "bucketAccessClass " , bucketAccessClassName )
126+ return errors .Wrap (err , "Failed to fetch BucketAccessClass " )
98127 }
99128
100- if ! strings .EqualFold (bucket . Spec . Provisioner , bal .provisionerName ) {
129+ if ! strings .EqualFold (bucketAccessClass . DriverName , bal .driverName ) {
101130 klog .V (5 ).InfoS ("Skipping bucketaccess for provisiner" ,
102131 "bucketAccess" , bucketAccess .Name ,
103- "provisioner " , bucket . Spec . Provisioner ,
132+ "driver " , bucketAccessClass . DriverName ,
104133 )
105134 return nil
106135 }
107136
108- if bucketAccess .Status .AccessGranted {
137+
138+ if bucketAccess .Status .AccessGranted == true {
109139 klog .V (5 ).InfoS ("AccessAlreadyGranted" ,
110- "bucketaccess " , bucketAccess .Name ,
111- "bucket " , bucket . Name ,
140+ "bucketAccess " , bucketAccess .Name ,
141+ "bucketClaim " , bucketClaimName ,
112142 )
113143 return nil
114144 }
115145
116- if bucket .Status .BucketID == "" {
117- err := errors .New ("BucketID cannot be empty" )
118- klog .ErrorS (err ,
119- "Invalid arguments" ,
120- "bucket" , bucket .Name ,
121- "bucketAccess" , bucketAccess .Name ,
122- )
123- return errors .Wrap (err , "Invalid arguments" )
146+ bucket , err := bal .Buckets ().Get (ctx , bucketClaim .Status .BucketName , metav1.GetOptions {})
147+ if err != nil {
148+ klog .ErrorS (err , "Failed to fetch bucket" , "bucket" , bucketClaim .Status .BucketName )
149+ return errors .Wrap (err , "Failed to fetch bucket" )
124150 }
125151
126- req := & cosi.ProvisionerGrantBucketAccessRequest {
152+ if bucket .Status .BucketStatus != true || bucket .Status .BucketID == "" {
153+ return errors .New ("BucketAccess can't be granted to bucket not in Ready state and without a bucketID" )
154+ }
155+
156+ accountName := "ba-" + bucketAccess .UID
157+
158+ req := & cosi.DriverGrantBucketAccessRequest {
127159 BucketId : bucket .Status .BucketID ,
128- AccountName : bucketAccess .Name ,
129- AccessPolicy : bucketAccess .Spec .PolicyActionsConfigMapData ,
160+ AccountName : accountName ,
161+ AuthenticationType : authType ,
162+ Parameters : bucketAccessClass .Parameters ,
130163 }
131164
132165 // This needs to be idempotent
133- rsp , err := bal .provisionerClient .ProvisionerGrantBucketAccess (ctx , req )
166+ rsp , err := bal .provisionerClient .DriverGrantBucketAccess (ctx , req )
134167 if err != nil {
135168 if status .Code (err ) != codes .AlreadyExists {
136169 klog .ErrorS (err ,
@@ -142,9 +175,8 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
142175 }
143176
144177 }
145- ns := bal .namespace
146- mintedSecretName := "ba-" + string (bucketAccess .UID )
147- if _ , err := bal .Secrets (ns ).Get (ctx , mintedSecretName , metav1.GetOptions {}); err != nil {
178+
179+ if _ , err := bal .Secrets (namespace ).Get (ctx , secretCredName , metav1.GetOptions {}); err != nil {
148180 if ! kubeerrors .IsNotFound (err ) {
149181 klog .ErrorS (err ,
150182 "Failed to create secrets" ,
@@ -156,10 +188,10 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
156188 // if secret doesn't exist, create it
157189 credentials := rsp .Credentials
158190
159- if _ , err := bal .Secrets (ns ).Create (ctx , & corev1.Secret {
191+ if _ , err := bal .Secrets (namespace ).Create (ctx , & corev1.Secret {
160192 ObjectMeta : metav1.ObjectMeta {
161- Name : mintedSecretName ,
162- Namespace : ns ,
193+ Name : secretCredName ,
194+ Namespace : namespace ,
163195 },
164196 StringData : map [string ]string {
165197 Credentials : credentials ,
@@ -179,7 +211,7 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
179211 bucketAccess .Status .AccountID = rsp .AccountId
180212 bucketAccess .Status .MintedSecret = & corev1.SecretReference {
181213 Namespace : bal .namespace ,
182- Name : mintedSecretName ,
214+ Name : secretCredName ,
183215 }
184216 bucketAccess .Status .AccessGranted = true
185217
@@ -263,6 +295,20 @@ func (b *BucketAccessListener) Buckets() bucketapi.BucketInterface {
263295 panic ("uninitialized listener" )
264296}
265297
298+ func (b * BucketAccessListener ) BucketClaims (namespace string ) bucketapi.BucketClaimInterface {
299+ if b .bucketClient != nil {
300+ return b .bucketClient .ObjectstorageV1alpha1 ().BucketClaims (namespace )
301+ }
302+ panic ("uninitialized listener" )
303+ }
304+
305+ func (b * BucketAccessListener ) BucketAccessClasses () bucketapi.BucketClaimInterface {
306+ if b .bucketClient != nil {
307+ return b .bucketClient .ObjectstorageV1alpha1 ().BucketAccessClasses ()
308+ }
309+ panic ("uninitialized listener" )
310+ }
311+
266312// InitializeKubeClient initializes the kubernetes client
267313func (b * BucketAccessListener ) InitializeKubeClient (k kube.Interface ) {
268314 b .kubeClient = k
0 commit comments