diff --git a/cmd/authtoken/main.go b/cmd/authtoken/main.go index c3f94162c..04cb53dd5 100644 --- a/cmd/authtoken/main.go +++ b/cmd/authtoken/main.go @@ -16,15 +16,14 @@ import ( "go.goms.io/fleet/pkg/authtoken" "go.goms.io/fleet/pkg/authtoken/providers/azure" "go.goms.io/fleet/pkg/authtoken/providers/secret" - "go.goms.io/fleet/pkg/interfaces" ) var ( configPath string ) -func parseArgs() (interfaces.AuthTokenProvider, error) { - var tokenProvider interfaces.AuthTokenProvider +func parseArgs() (authtoken.Provider, error) { + var tokenProvider authtoken.Provider rootCmd := &cobra.Command{Use: "refreshtoken", Args: cobra.NoArgs} rootCmd.PersistentFlags().StringVar(&configPath, "file-path", "/config/token", "token file path") diff --git a/docker/refresh-token.Dockerfile b/docker/refresh-token.Dockerfile index 9e5c4fb62..d47cab4b7 100644 --- a/docker/refresh-token.Dockerfile +++ b/docker/refresh-token.Dockerfile @@ -12,7 +12,6 @@ RUN go mod download # Copy the go source COPY cmd/authtoken/main.go main.go COPY pkg/authtoken pkg/authtoken -COPY pkg/interfaces pkg/interfaces ARG TARGETARCH diff --git a/pkg/authtoken/interfaces.go b/pkg/authtoken/interfaces.go new file mode 100644 index 000000000..75549a1e6 --- /dev/null +++ b/pkg/authtoken/interfaces.go @@ -0,0 +1,30 @@ +/* +Copyright (c) Microsoft Corporation. +Licensed under the MIT license. +*/ +package authtoken + +import ( + "context" + "time" +) + +// An AuthToken is an authentication token used to communicate with the hub API server. +type AuthToken struct { + Token string // The authentication token string. + ExpiresOn time.Time // The expiration time of the token. +} + +// Provider defines a method for fetching an authentication token. +type Provider interface { + // FetchToken fetches an authentication token to make requests to its associated fleet's hub cluster. + // It returns the token for a given input context, or an error if the retrieval fails. + FetchToken(ctx context.Context) (AuthToken, error) +} + +// Writer defines a method for writing an authentication token to a specified location. +type Writer interface { + // WriteToken writes the provided authentication token to a filepath location specified in a TokenWriter. + // It returns an error if the writing process fails. + WriteToken(token AuthToken) error +} diff --git a/pkg/authtoken/providers/azure/azure_msi.go b/pkg/authtoken/providers/azure/azure_msi.go index 3f6c7d183..062c2e180 100644 --- a/pkg/authtoken/providers/azure/azure_msi.go +++ b/pkg/authtoken/providers/azure/azure_msi.go @@ -14,7 +14,7 @@ import ( "k8s.io/client-go/util/retry" "k8s.io/klog/v2" - "go.goms.io/fleet/pkg/interfaces" + "go.goms.io/fleet/pkg/authtoken" ) const ( @@ -26,7 +26,7 @@ type AuthTokenProvider struct { Scope string } -func New(clientID, scope string) interfaces.AuthTokenProvider { +func New(clientID, scope string) authtoken.Provider { if scope == "" { scope = aksScope } @@ -37,8 +37,8 @@ func New(clientID, scope string) interfaces.AuthTokenProvider { } // FetchToken gets a new token to make request to the associated fleet' hub cluster. -func (a *AuthTokenProvider) FetchToken(ctx context.Context) (interfaces.AuthToken, error) { - token := interfaces.AuthToken{} +func (a *AuthTokenProvider) FetchToken(ctx context.Context) (authtoken.AuthToken, error) { + token := authtoken.AuthToken{} opts := &azidentity.ManagedIdentityCredentialOptions{ID: azidentity.ClientID(a.ClientID)} klog.V(2).InfoS("FetchToken", "client ID", a.ClientID) diff --git a/pkg/authtoken/providers/secret/k8s_secret.go b/pkg/authtoken/providers/secret/k8s_secret.go index 5444adaf7..b169240c1 100644 --- a/pkg/authtoken/providers/secret/k8s_secret.go +++ b/pkg/authtoken/providers/secret/k8s_secret.go @@ -16,7 +16,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" - "go.goms.io/fleet/pkg/interfaces" + "go.goms.io/fleet/pkg/authtoken" ) var ( @@ -29,7 +29,7 @@ type secretAuthTokenProvider struct { secretNamespace string } -func New(secretName, namespace string) (interfaces.AuthTokenProvider, error) { +func New(secretName, namespace string) (authtoken.Provider, error) { client, err := getClient() if err != nil { return nil, fmt.Errorf("an error occurred will creating client: %w", err) @@ -41,9 +41,9 @@ func New(secretName, namespace string) (interfaces.AuthTokenProvider, error) { }, nil } -func (s *secretAuthTokenProvider) FetchToken(ctx context.Context) (interfaces.AuthToken, error) { +func (s *secretAuthTokenProvider) FetchToken(ctx context.Context) (authtoken.AuthToken, error) { klog.V(2).InfoS("fetching token from secret", "secret", klog.KRef(s.secretName, s.secretNamespace)) - token := interfaces.AuthToken{} + token := authtoken.AuthToken{} secret, err := s.fetchSecret(ctx) if err != nil { return token, fmt.Errorf("cannot get the secret: %w", err) diff --git a/pkg/authtoken/token_refresher.go b/pkg/authtoken/token_refresher.go index 7f4f71a4a..0ea4f4fd3 100644 --- a/pkg/authtoken/token_refresher.go +++ b/pkg/authtoken/token_refresher.go @@ -10,22 +10,20 @@ import ( "time" "k8s.io/klog/v2" - - "go.goms.io/fleet/pkg/interfaces" ) -type RefreshDurationFuncType func(token interfaces.AuthToken) time.Duration +type RefreshDurationFuncType func(token AuthToken) time.Duration type CreateTickerFuncType func(time.Duration) <-chan time.Time type Refresher struct { - provider interfaces.AuthTokenProvider - writer interfaces.AuthTokenWriter + provider Provider + writer Writer refreshCalculate RefreshDurationFuncType createTicker CreateTickerFuncType } -func NewAuthTokenRefresher(tokenProvider interfaces.AuthTokenProvider, - writer interfaces.AuthTokenWriter, +func NewAuthTokenRefresher(tokenProvider Provider, + writer Writer, refreshCalculate RefreshDurationFuncType, createTicker CreateTickerFuncType) *Refresher { return &Refresher{ @@ -37,14 +35,14 @@ func NewAuthTokenRefresher(tokenProvider interfaces.AuthTokenProvider, } var ( - DefaultRefreshDurationFunc = func(token interfaces.AuthToken) time.Duration { + DefaultRefreshDurationFunc = func(token AuthToken) time.Duration { return time.Until(token.ExpiresOn) / 2 } DefaultCreateTicker = time.Tick DefaultRefreshDuration = time.Second * 30 ) -func (at *Refresher) callFetchToken(ctx context.Context) (interfaces.AuthToken, error) { +func (at *Refresher) callFetchToken(ctx context.Context) (AuthToken, error) { klog.V(2).InfoS("FetchToken start") deadline := time.Now().Add(DefaultRefreshDuration) fetchTokenContext, cancel := context.WithDeadline(ctx, deadline) diff --git a/pkg/authtoken/token_refresher_test.go b/pkg/authtoken/token_refresher_test.go index 5cc403af6..eda7e97e3 100644 --- a/pkg/authtoken/token_refresher_test.go +++ b/pkg/authtoken/token_refresher_test.go @@ -12,22 +12,20 @@ import ( "time" "github.com/stretchr/testify/assert" - - "go.goms.io/fleet/pkg/interfaces" ) type MockAuthTokenProvider struct { - Token interfaces.AuthToken + Token AuthToken } -func (m MockAuthTokenProvider) FetchToken(_ context.Context) (interfaces.AuthToken, error) { +func (m MockAuthTokenProvider) FetchToken(_ context.Context) (AuthToken, error) { return m.Token, nil } // TestRefreshTokenOnce test to refresh/rewrite token for one time func TestRefreshTokenOnce(t *testing.T) { provider := MockAuthTokenProvider{ - Token: interfaces.AuthToken{ + Token: AuthToken{ Token: "test token", ExpiresOn: time.Now(), }, @@ -60,7 +58,7 @@ func TestRefreshTokenOnce(t *testing.T) { // TestRefreshToken test to refresh/rewrite token multiple times func TestRefreshToken(t *testing.T) { provider := MockAuthTokenProvider{ - Token: interfaces.AuthToken{ + Token: AuthToken{ Token: "test token", ExpiresOn: time.Now(), }, @@ -99,7 +97,7 @@ func TestRefreshToken(t *testing.T) { // TestRefresherCancelContext test if the func will be canceled/returned once the ctx is canceled func TestRefresherCancelContext(t *testing.T) { provider := MockAuthTokenProvider{ - Token: interfaces.AuthToken{ + Token: AuthToken{ Token: "test token", ExpiresOn: time.Now().Add(100 * time.Millisecond), }, diff --git a/pkg/authtoken/token_writer.go b/pkg/authtoken/token_writer.go index c3abbf9eb..1b0095004 100644 --- a/pkg/authtoken/token_writer.go +++ b/pkg/authtoken/token_writer.go @@ -10,8 +10,6 @@ import ( "os" "k8s.io/klog/v2" - - "go.goms.io/fleet/pkg/interfaces" ) type Factory struct { @@ -30,17 +28,17 @@ func (w Factory) Create() (io.WriteCloser, error) { return wc, nil } -type Writer struct { +type TokenWriter struct { writerFactory func() (io.WriteCloser, error) } -func NewWriter(factory func() (io.WriteCloser, error)) interfaces.AuthTokenWriter { - return &Writer{ +func NewWriter(factory func() (io.WriteCloser, error)) Writer { + return &TokenWriter{ writerFactory: factory, } } -func (w *Writer) WriteToken(token interfaces.AuthToken) error { +func (w *TokenWriter) WriteToken(token AuthToken) error { writer, err := w.writerFactory() if err != nil { return err diff --git a/pkg/authtoken/token_writer_test.go b/pkg/authtoken/token_writer_test.go index 332474183..344dea77e 100644 --- a/pkg/authtoken/token_writer_test.go +++ b/pkg/authtoken/token_writer_test.go @@ -11,8 +11,6 @@ import ( "time" "github.com/stretchr/testify/assert" - - "go.goms.io/fleet/pkg/interfaces" ) type BufferWriterFactory struct { @@ -43,7 +41,7 @@ func (c BufferWriter) Close() error { } func TestWriteToken(t *testing.T) { - token := interfaces.AuthToken{ + token := AuthToken{ Token: "test token", ExpiresOn: time.Now(), } diff --git a/pkg/interfaces/interfaces.go b/pkg/interfaces/interfaces.go deleted file mode 100644 index 5ce4ecb30..000000000 --- a/pkg/interfaces/interfaces.go +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright (c) Microsoft Corporation. -Licensed under the MIT license. -*/ -package interfaces - -import ( - "context" - "time" -) - -type AuthToken struct { - Token string - ExpiresOn time.Time -} - -type AuthTokenProvider interface { - FetchToken(ctx context.Context) (AuthToken, error) -} - -type AuthTokenWriter interface { - WriteToken(token AuthToken) error -}