From 162d325b1eaa7d21742c146a069507045940e311 Mon Sep 17 00:00:00 2001 From: Jamison Tsai Date: Mon, 28 Oct 2024 12:39:02 +1100 Subject: [PATCH 1/7] move interfaces.go from interfaces to authtoken/providers directory and add commenting --- cmd/authtoken/main.go | 5 ++--- pkg/{interfaces => authtoken}/interfaces.go | 5 ++++- pkg/authtoken/providers/azure/azure_msi.go | 9 ++++----- pkg/authtoken/providers/secret/k8s_secret.go | 9 ++++----- pkg/authtoken/token_refresher.go | 16 +++++++--------- pkg/authtoken/token_refresher_test.go | 12 +++++------- pkg/authtoken/token_writer.go | 6 ++---- pkg/authtoken/token_writer_test.go | 4 +--- 8 files changed, 29 insertions(+), 37 deletions(-) rename pkg/{interfaces => authtoken}/interfaces.go (53%) diff --git a/cmd/authtoken/main.go b/cmd/authtoken/main.go index c3f94162c..4018d1f04 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.AuthTokenProvider, error) { + var tokenProvider authtoken.AuthTokenProvider rootCmd := &cobra.Command{Use: "refreshtoken", Args: cobra.NoArgs} rootCmd.PersistentFlags().StringVar(&configPath, "file-path", "/config/token", "token file path") diff --git a/pkg/interfaces/interfaces.go b/pkg/authtoken/interfaces.go similarity index 53% rename from pkg/interfaces/interfaces.go rename to pkg/authtoken/interfaces.go index 5ce4ecb30..c35b5d302 100644 --- a/pkg/interfaces/interfaces.go +++ b/pkg/authtoken/interfaces.go @@ -2,22 +2,25 @@ Copyright (c) Microsoft Corporation. Licensed under the MIT license. */ -package interfaces +package authtoken import ( "context" "time" ) +// AuthToken: Authorization Token containing token name as a string and its expiration time type AuthToken struct { Token string ExpiresOn time.Time } +// AuthTokenProvider: Interface with a function that takes in a context input in order to fetch an AuthToken type AuthTokenProvider interface { FetchToken(ctx context.Context) (AuthToken, error) } +// AuthTokenWriter: Interface with a function to write an AuthToken type AuthTokenWriter interface { WriteToken(token AuthToken) error } diff --git a/pkg/authtoken/providers/azure/azure_msi.go b/pkg/authtoken/providers/azure/azure_msi.go index 3f6c7d183..a94189f90 100644 --- a/pkg/authtoken/providers/azure/azure_msi.go +++ b/pkg/authtoken/providers/azure/azure_msi.go @@ -7,14 +7,13 @@ package azure import ( "context" "fmt" + "go.goms.io/fleet/pkg/authtoken" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "k8s.io/client-go/util/retry" "k8s.io/klog/v2" - - "go.goms.io/fleet/pkg/interfaces" ) const ( @@ -26,7 +25,7 @@ type AuthTokenProvider struct { Scope string } -func New(clientID, scope string) interfaces.AuthTokenProvider { +func New(clientID, scope string) authtoken.AuthTokenProvider { if scope == "" { scope = aksScope } @@ -37,8 +36,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..aae1b25af 100644 --- a/pkg/authtoken/providers/secret/k8s_secret.go +++ b/pkg/authtoken/providers/secret/k8s_secret.go @@ -7,6 +7,7 @@ package secret import ( "context" "fmt" + "go.goms.io/fleet/pkg/authtoken" "time" corev1 "k8s.io/api/core/v1" @@ -15,8 +16,6 @@ import ( "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" - - "go.goms.io/fleet/pkg/interfaces" ) var ( @@ -29,7 +28,7 @@ type secretAuthTokenProvider struct { secretNamespace string } -func New(secretName, namespace string) (interfaces.AuthTokenProvider, error) { +func New(secretName, namespace string) (authtoken.AuthTokenProvider, error) { client, err := getClient() if err != nil { return nil, fmt.Errorf("an error occurred will creating client: %w", err) @@ -41,9 +40,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..3b374980c 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 AuthTokenProvider + writer AuthTokenWriter refreshCalculate RefreshDurationFuncType createTicker CreateTickerFuncType } -func NewAuthTokenRefresher(tokenProvider interfaces.AuthTokenProvider, - writer interfaces.AuthTokenWriter, +func NewAuthTokenRefresher(tokenProvider AuthTokenProvider, + writer AuthTokenWriter, 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..a25721ed4 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 { @@ -34,13 +32,13 @@ type Writer struct { writerFactory func() (io.WriteCloser, error) } -func NewWriter(factory func() (io.WriteCloser, error)) interfaces.AuthTokenWriter { +func NewWriter(factory func() (io.WriteCloser, error)) AuthTokenWriter { return &Writer{ writerFactory: factory, } } -func (w *Writer) WriteToken(token interfaces.AuthToken) error { +func (w *Writer) 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(), } From 19ad9c2c443ad6f381040da37a7cc130839ebb61 Mon Sep 17 00:00:00 2001 From: Jamison Tsai Date: Mon, 28 Oct 2024 16:31:04 +1100 Subject: [PATCH 2/7] Edit comments --- pkg/authtoken/interfaces.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pkg/authtoken/interfaces.go b/pkg/authtoken/interfaces.go index c35b5d302..1e9af0a2d 100644 --- a/pkg/authtoken/interfaces.go +++ b/pkg/authtoken/interfaces.go @@ -9,18 +9,22 @@ import ( "time" ) -// AuthToken: Authorization Token containing token name as a string and its expiration time +// An AuthToken is an authorization token for the fleet type AuthToken struct { - Token string - ExpiresOn time.Time + Token string // name of token + ExpiresOn time.Time // expiration time of token } -// AuthTokenProvider: Interface with a function that takes in a context input in order to fetch an AuthToken +// AuthTokenProvider defines a method for fetching an AuthToken type AuthTokenProvider interface { + // FetchToken fetches an AuthToken + // It returns an error if it is unable to fetch an AuthToken for the given input context FetchToken(ctx context.Context) (AuthToken, error) } -// AuthTokenWriter: Interface with a function to write an AuthToken +// AuthTokenWriter defines a method for writing an AuthToken type AuthTokenWriter interface { + // WriteToken writes an AuthToken + // It returns an error if it is unable to write the AuthToken WriteToken(token AuthToken) error } From 78d079791b852471a1b33e3beba072b81c7edf5b Mon Sep 17 00:00:00 2001 From: Jamison Tsai Date: Mon, 28 Oct 2024 18:38:50 +1100 Subject: [PATCH 3/7] Rename structs, add periods to comments and update AuthToken comment --- cmd/authtoken/main.go | 4 ++-- pkg/authtoken/interfaces.go | 18 +++++++++--------- pkg/authtoken/providers/azure/azure_msi.go | 2 +- pkg/authtoken/providers/secret/k8s_secret.go | 2 +- pkg/authtoken/token_refresher.go | 8 ++++---- pkg/authtoken/token_writer.go | 8 ++++---- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/cmd/authtoken/main.go b/cmd/authtoken/main.go index 4018d1f04..04cb53dd5 100644 --- a/cmd/authtoken/main.go +++ b/cmd/authtoken/main.go @@ -22,8 +22,8 @@ var ( configPath string ) -func parseArgs() (authtoken.AuthTokenProvider, error) { - var tokenProvider authtoken.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/pkg/authtoken/interfaces.go b/pkg/authtoken/interfaces.go index 1e9af0a2d..56f577ac6 100644 --- a/pkg/authtoken/interfaces.go +++ b/pkg/authtoken/interfaces.go @@ -9,22 +9,22 @@ import ( "time" ) -// An AuthToken is an authorization token for the fleet +// An AuthToken is an authentication token used to communicate with the hub API server. type AuthToken struct { Token string // name of token ExpiresOn time.Time // expiration time of token } -// AuthTokenProvider defines a method for fetching an AuthToken -type AuthTokenProvider interface { - // FetchToken fetches an AuthToken - // It returns an error if it is unable to fetch an AuthToken for the given input context +// Provider defines a method for fetching an AuthToken. +type Provider interface { + // FetchToken fetches an AuthToken. + // It returns an error if it is unable to fetch an AuthToken for the given input context. FetchToken(ctx context.Context) (AuthToken, error) } -// AuthTokenWriter defines a method for writing an AuthToken -type AuthTokenWriter interface { - // WriteToken writes an AuthToken - // It returns an error if it is unable to write the AuthToken +// Writer defines a method for writing an AuthToken. +type Writer interface { + // WriteToken writes an AuthToken. + // It returns an error if it is unable to write the AuthToken. WriteToken(token AuthToken) error } diff --git a/pkg/authtoken/providers/azure/azure_msi.go b/pkg/authtoken/providers/azure/azure_msi.go index a94189f90..1c7e651b9 100644 --- a/pkg/authtoken/providers/azure/azure_msi.go +++ b/pkg/authtoken/providers/azure/azure_msi.go @@ -25,7 +25,7 @@ type AuthTokenProvider struct { Scope string } -func New(clientID, scope string) authtoken.AuthTokenProvider { +func New(clientID, scope string) authtoken.Provider { if scope == "" { scope = aksScope } diff --git a/pkg/authtoken/providers/secret/k8s_secret.go b/pkg/authtoken/providers/secret/k8s_secret.go index aae1b25af..6fbdfe11a 100644 --- a/pkg/authtoken/providers/secret/k8s_secret.go +++ b/pkg/authtoken/providers/secret/k8s_secret.go @@ -28,7 +28,7 @@ type secretAuthTokenProvider struct { secretNamespace string } -func New(secretName, namespace string) (authtoken.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) diff --git a/pkg/authtoken/token_refresher.go b/pkg/authtoken/token_refresher.go index 3b374980c..0ea4f4fd3 100644 --- a/pkg/authtoken/token_refresher.go +++ b/pkg/authtoken/token_refresher.go @@ -16,14 +16,14 @@ type RefreshDurationFuncType func(token AuthToken) time.Duration type CreateTickerFuncType func(time.Duration) <-chan time.Time type Refresher struct { - provider AuthTokenProvider - writer AuthTokenWriter + provider Provider + writer Writer refreshCalculate RefreshDurationFuncType createTicker CreateTickerFuncType } -func NewAuthTokenRefresher(tokenProvider AuthTokenProvider, - writer AuthTokenWriter, +func NewAuthTokenRefresher(tokenProvider Provider, + writer Writer, refreshCalculate RefreshDurationFuncType, createTicker CreateTickerFuncType) *Refresher { return &Refresher{ diff --git a/pkg/authtoken/token_writer.go b/pkg/authtoken/token_writer.go index a25721ed4..1b0095004 100644 --- a/pkg/authtoken/token_writer.go +++ b/pkg/authtoken/token_writer.go @@ -28,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)) AuthTokenWriter { - return &Writer{ +func NewWriter(factory func() (io.WriteCloser, error)) Writer { + return &TokenWriter{ writerFactory: factory, } } -func (w *Writer) WriteToken(token AuthToken) error { +func (w *TokenWriter) WriteToken(token AuthToken) error { writer, err := w.writerFactory() if err != nil { return err From d989f31adb9a30abb93adfbb829b20ef0a516fba Mon Sep 17 00:00:00 2001 From: Jamison Tsai Date: Mon, 28 Oct 2024 18:55:51 +1100 Subject: [PATCH 4/7] remove pkg/interfaces to be copied from go source --- docker/refresh-token.Dockerfile | 1 - 1 file changed, 1 deletion(-) 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 From f88c62efbf498613408d6e55b49d41d8e824d551 Mon Sep 17 00:00:00 2001 From: Jamison Tsai Date: Mon, 28 Oct 2024 19:07:30 +1100 Subject: [PATCH 5/7] Ran goimports -w on files in pkg/authtoken/providers/ directory --- pkg/authtoken/providers/azure/azure_msi.go | 1 + pkg/authtoken/providers/secret/k8s_secret.go | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/authtoken/providers/azure/azure_msi.go b/pkg/authtoken/providers/azure/azure_msi.go index 1c7e651b9..e4b69d618 100644 --- a/pkg/authtoken/providers/azure/azure_msi.go +++ b/pkg/authtoken/providers/azure/azure_msi.go @@ -7,6 +7,7 @@ package azure import ( "context" "fmt" + "go.goms.io/fleet/pkg/authtoken" "github.com/Azure/azure-sdk-for-go/sdk/azcore" diff --git a/pkg/authtoken/providers/secret/k8s_secret.go b/pkg/authtoken/providers/secret/k8s_secret.go index 6fbdfe11a..5f3ad8352 100644 --- a/pkg/authtoken/providers/secret/k8s_secret.go +++ b/pkg/authtoken/providers/secret/k8s_secret.go @@ -7,9 +7,10 @@ package secret import ( "context" "fmt" - "go.goms.io/fleet/pkg/authtoken" "time" + "go.goms.io/fleet/pkg/authtoken" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/util/retry" From dee5042d203dad0f718952d69a5375f248e6bb1a Mon Sep 17 00:00:00 2001 From: Jamison Tsai Date: Mon, 28 Oct 2024 21:22:09 +1100 Subject: [PATCH 6/7] Elaborate commenting for documentation --- pkg/authtoken/interfaces.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/authtoken/interfaces.go b/pkg/authtoken/interfaces.go index 56f577ac6..75549a1e6 100644 --- a/pkg/authtoken/interfaces.go +++ b/pkg/authtoken/interfaces.go @@ -11,20 +11,20 @@ import ( // An AuthToken is an authentication token used to communicate with the hub API server. type AuthToken struct { - Token string // name of token - ExpiresOn time.Time // expiration time of token + Token string // The authentication token string. + ExpiresOn time.Time // The expiration time of the token. } -// Provider defines a method for fetching an AuthToken. +// Provider defines a method for fetching an authentication token. type Provider interface { - // FetchToken fetches an AuthToken. - // It returns an error if it is unable to fetch an AuthToken for the given input context. + // 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 AuthToken. +// Writer defines a method for writing an authentication token to a specified location. type Writer interface { - // WriteToken writes an AuthToken. - // It returns an error if it is unable to write the AuthToken. + // 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 } From b7bfee77e4051577865d664e54eec45a259c0fa0 Mon Sep 17 00:00:00 2001 From: Jamison Tsai Date: Tue, 29 Oct 2024 08:41:30 +1100 Subject: [PATCH 7/7] Reorder imports by moving fleet pkgs to the bottom --- pkg/authtoken/providers/azure/azure_msi.go | 4 ++-- pkg/authtoken/providers/secret/k8s_secret.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/authtoken/providers/azure/azure_msi.go b/pkg/authtoken/providers/azure/azure_msi.go index e4b69d618..062c2e180 100644 --- a/pkg/authtoken/providers/azure/azure_msi.go +++ b/pkg/authtoken/providers/azure/azure_msi.go @@ -8,13 +8,13 @@ import ( "context" "fmt" - "go.goms.io/fleet/pkg/authtoken" - "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "k8s.io/client-go/util/retry" "k8s.io/klog/v2" + + "go.goms.io/fleet/pkg/authtoken" ) const ( diff --git a/pkg/authtoken/providers/secret/k8s_secret.go b/pkg/authtoken/providers/secret/k8s_secret.go index 5f3ad8352..b169240c1 100644 --- a/pkg/authtoken/providers/secret/k8s_secret.go +++ b/pkg/authtoken/providers/secret/k8s_secret.go @@ -9,14 +9,14 @@ import ( "fmt" "time" - "go.goms.io/fleet/pkg/authtoken" - corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/util/retry" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + + "go.goms.io/fleet/pkg/authtoken" ) var (