@@ -17,6 +17,7 @@ package biz
1717
1818import (
1919 "context"
20+ "errors"
2021 "fmt"
2122 "io"
2223
@@ -29,9 +30,13 @@ import (
2930)
3031
3132type CASClientUseCase struct {
33+ // to generate temporary credentials
3234 credsProvider * CASCredentialsUseCase
35+ // configuration to generate the client
3336 casServerConf * conf.Bootstrap_CASServer
34- logger * log.Helper
37+ // factory to generate the client
38+ casClientFactory CASClientFactory
39+ logger * log.Helper
3540}
3641
3742type CASUploader interface {
@@ -45,11 +50,40 @@ type CASDownloader interface {
4550type CASClient interface {
4651 CASUploader
4752 CASDownloader
48- Configured () bool
4953}
5054
51- func NewCASClientUseCase (credsProvider * CASCredentialsUseCase , config * conf.Bootstrap_CASServer , l log.Logger ) * CASClientUseCase {
52- return & CASClientUseCase {credsProvider , config , servicelogger .ScopedHelper (l , "biz/cas-client" )}
55+ type CASClientFactory func (conf * conf.Bootstrap_CASServer , token string ) (casclient.DownloaderUploader , error )
56+ type CASClientOpts func (u * CASClientUseCase )
57+
58+ func WithClientFactory (f CASClientFactory ) CASClientOpts {
59+ return func (c * CASClientUseCase ) {
60+ c .casClientFactory = f
61+ }
62+ }
63+
64+ func NewCASClientUseCase (credsProvider * CASCredentialsUseCase , config * conf.Bootstrap_CASServer , l log.Logger , opts ... CASClientOpts ) * CASClientUseCase {
65+ // generate a client from the given configuration
66+ defaultCasClientFactory := func (conf * conf.Bootstrap_CASServer , token string ) (casclient.DownloaderUploader , error ) {
67+ conn , err := grpcconn .New (conf .GetGrpc ().GetAddr (), token , conf .GetInsecure ())
68+ if err != nil {
69+ return nil , fmt .Errorf ("failed to create grpc connection: %w" , err )
70+ }
71+
72+ return casclient .New (conn ), nil
73+ }
74+
75+ uc := & CASClientUseCase {
76+ credsProvider : credsProvider ,
77+ casServerConf : config ,
78+ logger : servicelogger .ScopedHelper (l , "biz/cas-client" ),
79+ casClientFactory : defaultCasClientFactory ,
80+ }
81+
82+ for _ , opt := range opts {
83+ opt (uc )
84+ }
85+
86+ return uc
5387}
5488
5589// The secretID is embedded in the JWT token and is used to identify the secret by the CAS server
@@ -90,35 +124,31 @@ func (uc *CASClientUseCase) Download(ctx context.Context, secretID string, w io.
90124}
91125
92126// create a client with a temporary set of credentials for a specific operation
93- func (uc * CASClientUseCase ) casAPIClient (secretID string , role casJWT.Role ) (* casclient.Client , error ) {
127+ func (uc * CASClientUseCase ) casAPIClient (secretID string , role casJWT.Role ) (casclient.DownloaderUploader , error ) {
94128 token , err := uc .credsProvider .GenerateTemporaryCredentials (secretID , role )
95129 if err != nil {
96130 return nil , fmt .Errorf ("failed to generate temporary credentials: %w" , err )
97131 }
98132
99133 // Initialize connection to CAS server
100- return casClient (uc .casServerConf , token )
134+ return uc . casClientFactory (uc .casServerConf , token )
101135}
102136
103- func casClient (conf * conf.Bootstrap_CASServer , token string ) (* casclient.Client , error ) {
104- conn , err := grpcconn .New (conf .GetGrpc ().GetAddr (), token , conf .GetInsecure ())
105- if err != nil {
106- return nil , fmt .Errorf ("failed to create grpc connection: %w" , err )
107- }
108-
109- return casclient .New (conn ), nil
110- }
111-
112- // If the CAS client configuration is present and valid
113- func (uc * CASClientUseCase ) Configured () bool {
137+ // If the CAS server can be reached and reports readiness
138+ func (uc * CASClientUseCase ) IsReady (ctx context.Context ) (bool , error ) {
114139 if uc .casServerConf == nil {
115- return false
140+ return false , errors . New ( "missing CAS server configuration" )
116141 }
117142
118143 err := uc .casServerConf .ValidateAll ()
119144 if err != nil {
120- uc .logger .Infow ("msg" , "Invalid CAS client configuration" , "err" , err .Error ())
145+ return false , fmt .Errorf ("invalid CAS client configuration: %w" , err )
146+ }
147+
148+ c , err := uc .casClientFactory (uc .casServerConf , "" )
149+ if err != nil {
150+ return false , fmt .Errorf ("failed to create CAS client: %w" , err )
121151 }
122152
123- return err == nil
153+ return c . IsReady ( ctx )
124154}
0 commit comments