creds/google: replace NewComputeEngineCredsWithOptions with NewDefaultCredentialsWithOptions (#4830)

This commit is contained in:
Menghan Li 2021-10-05 14:49:15 -07:00 committed by GitHub
parent 02da625150
commit ee479e630f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 54 deletions

View File

@ -35,27 +35,40 @@ const tokenRequestTimeout = 30 * time.Second
var logger = grpclog.Component("credentials") var logger = grpclog.Component("credentials")
// DefaultCredentialsOptions constructs options to build DefaultCredentials.
type DefaultCredentialsOptions struct {
// PerRPCCreds is a per RPC credentials that is passed to a bundle.
PerRPCCreds credentials.PerRPCCredentials
}
// NewDefaultCredentialsWithOptions returns a credentials bundle that is
// configured to work with google services.
//
// This API is experimental.
func NewDefaultCredentialsWithOptions(opts DefaultCredentialsOptions) credentials.Bundle {
if opts.PerRPCCreds == nil {
ctx, cancel := context.WithTimeout(context.Background(), tokenRequestTimeout)
defer cancel()
var err error
opts.PerRPCCreds, err = oauth.NewApplicationDefault(ctx)
if err != nil {
logger.Warningf("NewDefaultCredentialsWithOptions: failed to create application oauth: %v", err)
}
}
c := &creds{opts: opts}
bundle, err := c.NewWithMode(internal.CredsBundleModeFallback)
if err != nil {
logger.Warningf("NewDefaultCredentialsWithOptions: failed to create new creds: %v", err)
}
return bundle
}
// NewDefaultCredentials returns a credentials bundle that is configured to work // NewDefaultCredentials returns a credentials bundle that is configured to work
// with google services. // with google services.
// //
// This API is experimental. // This API is experimental.
func NewDefaultCredentials() credentials.Bundle { func NewDefaultCredentials() credentials.Bundle {
c := &creds{ return NewDefaultCredentialsWithOptions(DefaultCredentialsOptions{})
newPerRPCCreds: func() credentials.PerRPCCredentials {
ctx, cancel := context.WithTimeout(context.Background(), tokenRequestTimeout)
defer cancel()
perRPCCreds, err := oauth.NewApplicationDefault(ctx)
if err != nil {
logger.Warningf("google default creds: failed to create application oauth: %v", err)
}
return perRPCCreds
},
}
bundle, err := c.NewWithMode(internal.CredsBundleModeFallback)
if err != nil {
logger.Warningf("google default creds: failed to create new creds: %v", err)
}
return bundle
} }
// NewComputeEngineCredentials returns a credentials bundle that is configured to work // NewComputeEngineCredentials returns a credentials bundle that is configured to work
@ -64,46 +77,21 @@ func NewDefaultCredentials() credentials.Bundle {
// //
// This API is experimental. // This API is experimental.
func NewComputeEngineCredentials() credentials.Bundle { func NewComputeEngineCredentials() credentials.Bundle {
return NewComputeEngineCredsWithOptions(ComputeEngineCredsOptions{}) return NewDefaultCredentialsWithOptions(DefaultCredentialsOptions{
} PerRPCCreds: oauth.NewComputeEngine(),
})
// ComputeEngineCredsOptions constructs compite engine credentials with options.
type ComputeEngineCredsOptions struct {
// PerRPCCreds is a per RPC credentials that is passed to a bundle.
PerRPCCreds credentials.PerRPCCredentials
}
// NewComputeEngineCredsWithOptions returns a credentials bundle that is configured to work
// with google services. This API must only be used when running on GCE.
//
// This API is experimental.
func NewComputeEngineCredsWithOptions(perRPCOpts ComputeEngineCredsOptions) credentials.Bundle {
perRPC := oauth.NewComputeEngine()
if perRPCOpts.PerRPCCreds != nil {
perRPC = perRPCOpts.PerRPCCreds
}
c := &creds{
newPerRPCCreds: func() credentials.PerRPCCredentials {
return perRPC
},
}
bundle, err := c.NewWithMode(internal.CredsBundleModeFallback)
if err != nil {
logger.Warningf("compute engine creds with per rpc: failed to create new creds: %v", err)
}
return bundle
} }
// creds implements credentials.Bundle. // creds implements credentials.Bundle.
type creds struct { type creds struct {
opts DefaultCredentialsOptions
// Supported modes are defined in internal/internal.go. // Supported modes are defined in internal/internal.go.
mode string mode string
// The transport credentials associated with this bundle. // The active transport credentials associated with this bundle.
transportCreds credentials.TransportCredentials transportCreds credentials.TransportCredentials
// The per RPC credentials associated with this bundle. // The active per RPC credentials associated with this bundle.
perRPCCreds credentials.PerRPCCredentials perRPCCreds credentials.PerRPCCredentials
// Creates new per RPC credentials
newPerRPCCreds func() credentials.PerRPCCredentials
} }
func (c *creds) TransportCredentials() credentials.TransportCredentials { func (c *creds) TransportCredentials() credentials.TransportCredentials {
@ -130,8 +118,8 @@ var (
// existing Bundle may cause races. // existing Bundle may cause races.
func (c *creds) NewWithMode(mode string) (credentials.Bundle, error) { func (c *creds) NewWithMode(mode string) (credentials.Bundle, error) {
newCreds := &creds{ newCreds := &creds{
mode: mode, opts: c.opts,
newPerRPCCreds: c.newPerRPCCreds, mode: mode,
} }
// Create transport credentials. // Create transport credentials.
@ -147,7 +135,7 @@ func (c *creds) NewWithMode(mode string) (credentials.Bundle, error) {
} }
if mode == internal.CredsBundleModeFallback || mode == internal.CredsBundleModeBackendFromBalancer { if mode == internal.CredsBundleModeFallback || mode == internal.CredsBundleModeBackendFromBalancer {
newCreds.perRPCCreds = newCreds.newPerRPCCreds() newCreds.perRPCCreds = newCreds.opts.PerRPCCreds
} }
return newCreds, nil return newCreds, nil

View File

@ -76,9 +76,9 @@ func overrideNewCredsFuncs() func() {
func TestClientHandshakeBasedOnClusterName(t *testing.T) { func TestClientHandshakeBasedOnClusterName(t *testing.T) {
defer overrideNewCredsFuncs()() defer overrideNewCredsFuncs()()
for bundleTyp, tc := range map[string]credentials.Bundle{ for bundleTyp, tc := range map[string]credentials.Bundle{
"defaultCreds": NewDefaultCredentials(), "defaultCredsWithOptions": NewDefaultCredentialsWithOptions(DefaultCredentialsOptions{}),
"computeCreds": NewComputeEngineCredentials(), "defaultCreds": NewDefaultCredentials(),
"computeCredsPerRPC": NewComputeEngineCredsWithOptions(ComputeEngineCredsOptions{}), "computeCreds": NewComputeEngineCredentials(),
} { } {
tests := []struct { tests := []struct {
name string name string