Skip to content

Commit 4494323

Browse files
authored
Merge pull request #188 from scality/bugfix/COSI-86-resolve-infonite-retry-loops
COSI-86: resolve infinite retry loops
2 parents 9a49a25 + cfdb7ba commit 4494323

File tree

12 files changed

+1095
-51
lines changed

12 files changed

+1095
-51
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ bin
88
.idea
99
vendor
1010
coverage.txt
11+
coverage.out

codecov.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ component_management:
5252
name: 🔖 Constants Package
5353
paths:
5454
- pkg/constants/**
55+
- component_id: osperrors-package
56+
name: 🚨 Object Storage Provider Errors Package
57+
paths:
58+
- pkg/osperrors/**
5559

5660
flag_management:
5761
default_rules: # the rules that will be followed for any flag added, generally

pkg/constants/constants.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,12 @@ const (
1010
LvlDebug // 4 - Debug-level logs, tricky logic areas
1111
LvlTrace // 5 - Trace-level logs, detailed troubleshooting context
1212
)
13+
14+
// Action constants for error translation context
15+
// These align with the driver operations and underlying API calls
16+
const (
17+
ActionCreateBucket = "CreateBucket"
18+
ActionDeleteBucket = "DeleteBucket"
19+
ActionGrantBucketAccess = "GrantBucketAccess"
20+
ActionRevokeBucketAccess = "RevokeBucketAccess"
21+
)

pkg/driver/provisioner_server_impl.go

Lines changed: 43 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ import (
2020
"errors"
2121
"os"
2222

23-
s3types "github.com/aws/aws-sdk-go-v2/service/s3/types"
2423
iamclient "github.com/scality/cosi-driver/pkg/clients/iam"
2524
s3client "github.com/scality/cosi-driver/pkg/clients/s3"
26-
c "github.com/scality/cosi-driver/pkg/constants"
25+
constants "github.com/scality/cosi-driver/pkg/constants"
26+
"github.com/scality/cosi-driver/pkg/osperrors"
2727
"github.com/scality/cosi-driver/pkg/util"
2828
"google.golang.org/grpc/codes"
2929
"google.golang.org/grpc/status"
@@ -64,7 +64,7 @@ func InitProvisionerServer(provisioner string) (cosiapi.ProvisionerServer, error
6464
klog.ErrorS(err, "Failed to initialize ProvisionerServer: empty provisioner name")
6565
return nil, err
6666
}
67-
klog.V(c.LvlEvent).InfoS("Initializing ProvisionerServer", "provisioner", provisioner)
67+
klog.V(constants.LvlEvent).InfoS("Initializing ProvisionerServer", "provisioner", provisioner)
6868

6969
kubeConfig, err := InClusterConfig()
7070
if err != nil {
@@ -84,7 +84,7 @@ func InitProvisionerServer(provisioner string) (cosiapi.ProvisionerServer, error
8484
return nil, err
8585
}
8686

87-
klog.V(c.LvlEvent).InfoS("Successfully initialized ProvisionerServer", "provisioner", provisioner)
87+
klog.V(constants.LvlEvent).InfoS("Successfully initialized ProvisionerServer", "provisioner", provisioner)
8888
return &ProvisionerServer{
8989
Provisioner: provisioner,
9090
Clientset: clientset,
@@ -106,12 +106,12 @@ func InitProvisionerServer(provisioner string) (cosiapi.ProvisionerServer, error
106106
// non-nil err - Internal error [requeue'd with exponential backoff]
107107
func (s *ProvisionerServer) DriverCreateBucket(ctx context.Context,
108108
req *cosiapi.DriverCreateBucketRequest) (*cosiapi.DriverCreateBucketResponse, error) {
109-
klog.V(c.LvlTrace).InfoS("DriverCreateBucket request received", "request", req)
109+
klog.V(constants.LvlTrace).InfoS("DriverCreateBucket request received", "request", req)
110110
bucketName := req.GetName()
111111
parameters := req.GetParameters()
112112
service := "S3"
113113

114-
klog.V(c.LvlInfo).InfoS("Processing DriverCreateBucket request", "bucketName", bucketName)
114+
klog.V(constants.LvlInfo).InfoS("Processing DriverCreateBucket request", "bucketName", bucketName)
115115

116116
client, s3Params, err := InitializeClient(ctx, s.Clientset, parameters, service)
117117
if err != nil {
@@ -125,20 +125,14 @@ func (s *ProvisionerServer) DriverCreateBucket(ctx context.Context,
125125
return nil, status.Error(codes.InvalidArgument, "unsupported client type for bucket creation")
126126
}
127127

128-
klog.V(c.LvlDebug).InfoS("Creating bucket", "bucketName", bucketName)
128+
klog.V(constants.LvlDebug).InfoS("Creating bucket", "bucketName", bucketName)
129129
err = s3Client.CreateBucket(ctx, bucketName, *s3Params)
130130
if err != nil {
131-
var bucketAlreadyExists *s3types.BucketAlreadyExists
132-
133-
if errors.As(err, &bucketAlreadyExists) {
134-
klog.V(c.LvlInfo).InfoS("Bucket already exists", "bucketName", bucketName)
135-
return nil, status.Errorf(codes.AlreadyExists, "Bucket already exists: %s", bucketName)
136-
} else {
137-
klog.ErrorS(err, "Failed to create bucket", "bucketName", bucketName)
138-
return nil, status.Error(codes.Internal, "Failed to create bucket")
131+
if translatedErr := osperrors.TranslateS3Error(constants.ActionCreateBucket, bucketName, err); translatedErr != nil {
132+
return nil, translatedErr
139133
}
140134
}
141-
klog.V(c.LvlInfo).InfoS("Successfully created bucket", "bucketName", bucketName)
135+
klog.V(constants.LvlInfo).InfoS("Successfully created bucket", "bucketName", bucketName)
142136
return &cosiapi.DriverCreateBucketResponse{
143137
BucketId: bucketName,
144138
}, nil
@@ -154,17 +148,17 @@ func (s *ProvisionerServer) DriverCreateBucket(ctx context.Context,
154148
// non-nil err - Internal error [requeue'd with exponential backoff]
155149
func (s *ProvisionerServer) DriverDeleteBucket(ctx context.Context,
156150
req *cosiapi.DriverDeleteBucketRequest) (*cosiapi.DriverDeleteBucketResponse, error) {
157-
klog.V(c.LvlTrace).InfoS("DriverDeleteBucket request received", "request", req)
151+
klog.V(constants.LvlTrace).InfoS("DriverDeleteBucket request received", "request", req)
158152

159153
bucketName := req.GetBucketId()
160154

161-
klog.V(c.LvlInfo).InfoS("Processing DriverDeleteBucket request", "bucketName", bucketName)
155+
klog.V(constants.LvlInfo).InfoS("Processing DriverDeleteBucket request", "bucketName", bucketName)
162156
bucket, err := s.BucketClientset.ObjectstorageV1alpha1().Buckets().Get(ctx, bucketName, metav1.GetOptions{})
163157
if err != nil {
164158
klog.ErrorS(err, "Failed to fetch bucket object", "bucketName", bucketName)
165159
return nil, status.Error(codes.Internal, "failed to get bucket object from kubernetes")
166160
}
167-
klog.V(c.LvlTrace).InfoS("Successfully fetched Bucket object", "bucketName", bucket.Name, "parameters", bucket.Spec.Parameters)
161+
klog.V(constants.LvlTrace).InfoS("Successfully fetched Bucket object", "bucketName", bucket.Name, "parameters", bucket.Spec.Parameters)
168162

169163
client, _, err := InitializeClient(ctx, s.Clientset, bucket.Spec.Parameters, "S3")
170164
if err != nil {
@@ -180,11 +174,12 @@ func (s *ProvisionerServer) DriverDeleteBucket(ctx context.Context,
180174

181175
err = s3Client.DeleteBucket(ctx, bucketName)
182176
if err != nil {
183-
klog.ErrorS(err, "Failed to delete bucket", "bucketName", bucketName)
184-
return nil, status.Error(codes.Internal, "failed to delete bucket")
177+
if translatedErr := osperrors.TranslateS3Error(constants.ActionDeleteBucket, bucketName, err); translatedErr != nil {
178+
return nil, translatedErr
179+
}
185180
}
186181

187-
klog.V(c.LvlInfo).InfoS("Successfully deleted bucket", "bucketName", bucketName)
182+
klog.V(constants.LvlInfo).InfoS("Successfully deleted bucket", "bucketName", bucketName)
188183
return &cosiapi.DriverDeleteBucketResponse{}, nil
189184
}
190185

@@ -197,13 +192,13 @@ func (s *ProvisionerServer) DriverDeleteBucket(ctx context.Context,
197192
// non-nil err - Internal error [requeue'd with exponential backoff]
198193
func (s *ProvisionerServer) DriverGrantBucketAccess(ctx context.Context,
199194
req *cosiapi.DriverGrantBucketAccessRequest) (*cosiapi.DriverGrantBucketAccessResponse, error) {
200-
klog.V(c.LvlTrace).InfoS("DriverGrantBucketAccess request received", "request", req)
195+
klog.V(constants.LvlTrace).InfoS("DriverGrantBucketAccess request received", "request", req)
201196

202197
bucketName := req.GetBucketId()
203198
userName := req.GetName()
204199
parameters := req.GetParameters()
205200

206-
klog.V(c.LvlInfo).InfoS("Processing DriverGrantBucketAccess request", "bucketName", bucketName, "userName", userName)
201+
klog.V(constants.LvlInfo).InfoS("Processing DriverGrantBucketAccess request", "bucketName", bucketName, "userName", userName)
207202

208203
client, iamParams, err := InitializeClient(ctx, s.Clientset, parameters, "IAM")
209204

@@ -218,14 +213,15 @@ func (s *ProvisionerServer) DriverGrantBucketAccess(ctx context.Context,
218213
return nil, status.Error(codes.Internal, "failed to initialize object storage provider IAM client")
219214
}
220215

221-
klog.V(c.LvlInfo).InfoS("Granting bucket access", "bucketName", bucketName, "userName", userName)
216+
klog.V(constants.LvlInfo).InfoS("Granting bucket access", "bucketName", bucketName, "userName", userName)
222217
userInfo, err := iamClient.CreateBucketAccess(ctx, userName, bucketName)
223218
if err != nil {
224-
klog.ErrorS(err, "Failed to create bucket access", "bucketName", bucketName, "userName", userName)
225-
return nil, status.Error(codes.Internal, "failed to create bucket access")
219+
if translatedErr := osperrors.TranslateIAMError(constants.ActionGrantBucketAccess, userName, err); translatedErr != nil {
220+
return nil, translatedErr
221+
}
226222
}
227223

228-
klog.V(c.LvlInfo).InfoS("Successfully granted bucket access", "bucketName", bucketName, "userName", userName)
224+
klog.V(constants.LvlInfo).InfoS("Successfully granted bucket access", "bucketName", bucketName, "userName", userName)
229225
return &cosiapi.DriverGrantBucketAccessResponse{
230226
AccountId: userName,
231227
Credentials: map[string]*cosiapi.CredentialDetails{
@@ -251,20 +247,20 @@ func (s *ProvisionerServer) DriverGrantBucketAccess(ctx context.Context,
251247
// non-nil err - Internal error [requeue'd with exponential backoff]
252248
func (s *ProvisionerServer) DriverRevokeBucketAccess(ctx context.Context,
253249
req *cosiapi.DriverRevokeBucketAccessRequest) (*cosiapi.DriverRevokeBucketAccessResponse, error) {
254-
klog.V(c.LvlTrace).InfoS("DriverRevokeBucketAccess request received", "request", req)
250+
klog.V(constants.LvlTrace).InfoS("DriverRevokeBucketAccess request received", "request", req)
255251

256252
bucketName := req.GetBucketId()
257253
userName := req.GetAccountId()
258254

259-
klog.V(c.LvlInfo).InfoS("Processing DriverRevokeBucketAccess request", "bucketName", bucketName, "userName", userName)
255+
klog.V(constants.LvlInfo).InfoS("Processing DriverRevokeBucketAccess request", "bucketName", bucketName, "userName", userName)
260256

261257
// Fetch the bucket to retrieve parameters
262258
bucket, err := s.BucketClientset.ObjectstorageV1alpha1().Buckets().Get(ctx, bucketName, metav1.GetOptions{})
263259
if err != nil {
264260
klog.ErrorS(err, "Failed to fetch bucket object", "bucketName", bucketName)
265261
return nil, status.Error(codes.Internal, "failed to get bucket object from kubernetes")
266262
}
267-
klog.V(c.LvlTrace).InfoS("Successfully fetched Bucket object", "bucketName", bucket.Name, "parameters", bucket.Spec.Parameters)
263+
klog.V(constants.LvlTrace).InfoS("Successfully fetched Bucket object", "bucketName", bucket.Name, "parameters", bucket.Spec.Parameters)
268264

269265
client, _, err := InitializeClient(ctx, s.Clientset, bucket.Spec.Parameters, "IAM")
270266
if err != nil {
@@ -278,33 +274,34 @@ func (s *ProvisionerServer) DriverRevokeBucketAccess(ctx context.Context,
278274
return nil, status.Error(codes.Internal, "unsupported client type for IAM operations")
279275
}
280276

281-
klog.V(c.LvlInfo).InfoS("Revoking bucket access", "bucketName", bucketName, "userName", userName)
277+
klog.V(constants.LvlInfo).InfoS("Revoking bucket access", "bucketName", bucketName, "userName", userName)
282278
err = iamClient.RevokeBucketAccess(ctx, userName, bucketName)
283279
if err != nil {
284-
klog.ErrorS(err, "Failed to revoke bucket access", "bucketName", bucketName, "userName", userName)
285-
return nil, status.Error(codes.Internal, "failed to revoke bucket access")
280+
if translatedErr := osperrors.TranslateIAMError(constants.ActionRevokeBucketAccess, userName, err); translatedErr != nil {
281+
return nil, translatedErr
282+
}
286283
}
287284

288-
klog.V(c.LvlInfo).InfoS("Successfully revoked bucket access", "bucketName", bucketName, "userName", userName)
285+
klog.V(constants.LvlInfo).InfoS("Successfully revoked bucket access", "bucketName", bucketName, "userName", userName)
289286
return &cosiapi.DriverRevokeBucketAccessResponse{}, nil
290287
}
291288

292289
func initializeObjectStorageClient(ctx context.Context, clientset kubernetes.Interface, parameters map[string]string, service string) (interface{}, *util.StorageClientParameters, error) {
293-
klog.V(c.LvlDebug).InfoS("Initializing object storage provider client", "service", service)
290+
klog.V(constants.LvlDebug).InfoS("Initializing object storage provider client", "service", service)
294291

295292
ospSecretName, namespace, err := FetchSecretInformation(parameters)
296293
if err != nil {
297294
klog.ErrorS(err, "Failed to fetch object storage provider secret info")
298295
return nil, nil, err
299296
}
300297

301-
klog.V(c.LvlDebug).InfoS("Fetching secret data", "secretName", ospSecretName, "namespace", namespace)
298+
klog.V(constants.LvlDebug).InfoS("Fetching secret data", "secretName", ospSecretName, "namespace", namespace)
302299
ospSecret, err := clientset.CoreV1().Secrets(namespace).Get(ctx, ospSecretName, metav1.GetOptions{})
303300
if err != nil {
304301
klog.ErrorS(err, "Failed to get object store user secret", "secretName", ospSecretName, "namespace", namespace)
305302
return nil, nil, status.Error(codes.Internal, "failed to get object store user secret")
306303
}
307-
klog.V(c.LvlDebug).InfoS("Successfully fetched object storage provider secret", "secretName", ospSecretName, "namespace", namespace)
304+
klog.V(constants.LvlDebug).InfoS("Successfully fetched object storage provider secret", "secretName", ospSecretName, "namespace", namespace)
308305

309306
storageClientParameters, err := FetchParameters(ospSecret.Data)
310307
if err != nil {
@@ -320,14 +317,14 @@ func initializeObjectStorageClient(ctx context.Context, clientset kubernetes.Int
320317
klog.ErrorS(err, "Failed to initialize S3 client", "endpoint", storageClientParameters.Endpoint)
321318
return nil, nil, status.Error(codes.Internal, "failed to initialize S3 client")
322319
}
323-
klog.V(c.LvlDebug).InfoS("Successfully initialized S3 client", "endpoint", storageClientParameters.Endpoint)
320+
klog.V(constants.LvlDebug).InfoS("Successfully initialized S3 client", "endpoint", storageClientParameters.Endpoint)
324321
case "IAM":
325322
client, err = iamclient.InitIAMClient(ctx, *storageClientParameters)
326323
if err != nil {
327324
klog.ErrorS(err, "Failed to initialize IAM client", "endpoint", storageClientParameters.IAMEndpoint)
328325
return nil, nil, status.Error(codes.Internal, "failed to initialize IAM client")
329326
}
330-
klog.V(c.LvlDebug).InfoS("Successfully initialized IAM client", "endpoint", storageClientParameters.IAMEndpoint)
327+
klog.V(constants.LvlDebug).InfoS("Successfully initialized IAM client", "endpoint", storageClientParameters.IAMEndpoint)
331328
default:
332329
klog.ErrorS(nil, "Unsupported object storage provider service", "service", service)
333330
return nil, nil, status.Error(codes.Internal, "unsupported object storage provider service")
@@ -336,7 +333,7 @@ func initializeObjectStorageClient(ctx context.Context, clientset kubernetes.Int
336333
}
337334

338335
func fetchObjectStorageProviderSecretInfo(parameters map[string]string) (string, string, error) {
339-
klog.V(c.LvlDebug).InfoS("Validating object storage provider secret parameters", "parameters", parameters)
336+
klog.V(constants.LvlDebug).InfoS("Validating object storage provider secret parameters", "parameters", parameters)
340337

341338
secretName := parameters["objectStorageSecretName"]
342339
namespace := os.Getenv("POD_NAMESPACE")
@@ -348,12 +345,12 @@ func fetchObjectStorageProviderSecretInfo(parameters map[string]string) (string,
348345
return "", "", status.Error(codes.InvalidArgument, "Object storage provider secret name and namespace are required")
349346
}
350347

351-
klog.V(c.LvlDebug).InfoS("Successfully validated object storage provider secret parameters", "secretName", secretName, "namespace", namespace)
348+
klog.V(constants.LvlDebug).InfoS("Successfully validated object storage provider secret parameters", "secretName", secretName, "namespace", namespace)
352349
return secretName, namespace, nil
353350
}
354351

355352
func fetchS3Parameters(secretData map[string][]byte) (*util.StorageClientParameters, error) {
356-
klog.V(c.LvlTrace).InfoS("Extracting object storage parameters from secret")
353+
klog.V(constants.LvlTrace).InfoS("Extracting object storage parameters from secret")
357354

358355
params := util.NewStorageClientParameters()
359356

@@ -365,7 +362,7 @@ func fetchS3Parameters(secretData map[string][]byte) (*util.StorageClientParamet
365362
if cert, exists := secretData["tlsCert"]; exists {
366363
params.TLSCert = cert
367364
} else {
368-
klog.V(c.LvlTrace).InfoS("TLS certificate not provided, proceeding without it")
365+
klog.V(constants.LvlTrace).InfoS("TLS certificate not provided, proceeding without it")
369366
}
370367

371368
if err := params.Validate(); err != nil {
@@ -376,8 +373,8 @@ func fetchS3Parameters(secretData map[string][]byte) (*util.StorageClientParamet
376373
params.IAMEndpoint = params.Endpoint
377374
if value, exists := secretData["iamEndpoint"]; exists && len(value) > 0 {
378375
params.IAMEndpoint = string(value)
379-
klog.V(c.LvlTrace).InfoS("IAM endpoint specified", "iamEndpoint", params.IAMEndpoint)
376+
klog.V(constants.LvlTrace).InfoS("IAM endpoint specified", "iamEndpoint", params.IAMEndpoint)
380377
}
381-
klog.V(c.LvlTrace).InfoS("Successfully validated object storage parameters", "endpoint", params.Endpoint, "region", params.Region)
378+
klog.V(constants.LvlTrace).InfoS("Successfully validated object storage parameters", "endpoint", params.Endpoint, "region", params.Region)
382379
return params, nil
383380
}

0 commit comments

Comments
 (0)