@@ -52,7 +52,8 @@ type CASClient interface {
52
52
CASDownloader
53
53
}
54
54
55
- type CASClientFactory func (conf * conf.Bootstrap_CASServer , token string ) (casclient.DownloaderUploader , error )
55
+ // Function that returns a CAS client including a connection closer method
56
+ type CASClientFactory func (conf * conf.Bootstrap_CASServer , token string ) (casclient.DownloaderUploader , func (), error )
56
57
type CASClientOpts func (u * CASClientUseCase )
57
58
58
59
func WithClientFactory (f CASClientFactory ) CASClientOpts {
@@ -62,20 +63,29 @@ func WithClientFactory(f CASClientFactory) CASClientOpts {
62
63
}
63
64
64
65
func NewCASClientUseCase (credsProvider * CASCredentialsUseCase , config * conf.Bootstrap_CASServer , l log.Logger , opts ... CASClientOpts ) * CASClientUseCase {
66
+ helper := servicelogger .ScopedHelper (l , "biz/cas-client" )
67
+
65
68
// generate a client from the given configuration
66
- defaultCasClientFactory := func (conf * conf.Bootstrap_CASServer , token string ) (casclient.DownloaderUploader , error ) {
69
+ defaultCasClientFactory := func (conf * conf.Bootstrap_CASServer , token string ) (casclient.DownloaderUploader , func (), error ) {
67
70
conn , err := grpcconn .New (conf .GetGrpc ().GetAddr (), token , conf .GetInsecure ())
68
71
if err != nil {
69
- return nil , fmt .Errorf ("failed to create grpc connection: %w" , err )
72
+ return nil , nil , fmt .Errorf ("failed to create grpc connection: %w" , err )
73
+ }
74
+
75
+ closerFn := func () {
76
+ err := conn .Close ()
77
+ if err != nil {
78
+ helper .Error (err )
79
+ }
70
80
}
71
81
72
- return casclient .New (conn ), nil
82
+ return casclient .New (conn ), closerFn , err
73
83
}
74
84
75
85
uc := & CASClientUseCase {
76
86
credsProvider : credsProvider ,
77
87
casServerConf : config ,
78
- logger : servicelogger . ScopedHelper ( l , "biz/cas-client" ) ,
88
+ logger : helper ,
79
89
casClientFactory : defaultCasClientFactory ,
80
90
}
81
91
@@ -91,10 +101,11 @@ func (uc *CASClientUseCase) Upload(ctx context.Context, secretID string, content
91
101
uc .logger .Infow ("msg" , "upload initialized" , "filename" , filename , "digest" , digest )
92
102
93
103
// client with temporary set of credentials
94
- client , err := uc .casAPIClient (secretID , casJWT .Uploader )
104
+ client , closeFn , err := uc .casAPIClient (secretID , casJWT .Uploader )
95
105
if err != nil {
96
106
return fmt .Errorf ("failed to create cas client: %w" , err )
97
107
}
108
+ defer closeFn ()
98
109
99
110
status , err := client .Upload (ctx , content , filename , digest )
100
111
if err != nil {
@@ -109,10 +120,11 @@ func (uc *CASClientUseCase) Upload(ctx context.Context, secretID string, content
109
120
func (uc * CASClientUseCase ) Download (ctx context.Context , secretID string , w io.Writer , digest string ) error {
110
121
uc .logger .Infow ("msg" , "download initialized" , "digest" , digest )
111
122
112
- client , err := uc .casAPIClient (secretID , casJWT .Downloader )
123
+ client , closeFn , err := uc .casAPIClient (secretID , casJWT .Downloader )
113
124
if err != nil {
114
125
return fmt .Errorf ("failed to create cas client: %w" , err )
115
126
}
127
+ defer closeFn ()
116
128
117
129
if err := client .Download (ctx , w , digest ); err != nil {
118
130
return fmt .Errorf ("failed to download content: %w" , err )
@@ -124,10 +136,10 @@ func (uc *CASClientUseCase) Download(ctx context.Context, secretID string, w io.
124
136
}
125
137
126
138
// create a client with a temporary set of credentials for a specific operation
127
- func (uc * CASClientUseCase ) casAPIClient (secretID string , role casJWT.Role ) (casclient.DownloaderUploader , error ) {
139
+ func (uc * CASClientUseCase ) casAPIClient (secretID string , role casJWT.Role ) (casclient.DownloaderUploader , func (), error ) {
128
140
token , err := uc .credsProvider .GenerateTemporaryCredentials (secretID , role )
129
141
if err != nil {
130
- return nil , fmt .Errorf ("failed to generate temporary credentials: %w" , err )
142
+ return nil , nil , fmt .Errorf ("failed to generate temporary credentials: %w" , err )
131
143
}
132
144
133
145
// Initialize connection to CAS server
@@ -145,10 +157,11 @@ func (uc *CASClientUseCase) IsReady(ctx context.Context) (bool, error) {
145
157
return false , fmt .Errorf ("invalid CAS client configuration: %w" , err )
146
158
}
147
159
148
- c , err := uc .casClientFactory (uc .casServerConf , "" )
160
+ c , closeFn , err := uc .casClientFactory (uc .casServerConf , "" )
149
161
if err != nil {
150
162
return false , fmt .Errorf ("failed to create CAS client: %w" , err )
151
163
}
164
+ defer closeFn ()
152
165
153
166
return c .IsReady (ctx )
154
167
}
0 commit comments