in internal/cloudsql/refresh.go [283:355]
func (c adminAPIClient) ConnectionInfo(
ctx context.Context, cn instance.ConnName, iamAuthNDial bool,
) (ci ConnectionInfo, err error) {
var refreshEnd trace.EndSpanFunc
ctx, refreshEnd = trace.StartSpan(ctx, "cloud.google.com/go/cloudsqlconn/internal.RefreshConnection",
trace.AddInstanceName(cn.String()),
)
defer func() {
go trace.RecordRefreshResult(context.Background(), cn.String(), c.dialerID, err)
refreshEnd(err)
}()
// start async fetching the instance's metadata
type mdRes struct {
md metadata
err error
}
mdC := make(chan mdRes, 1)
go func() {
defer close(mdC)
md, err := fetchMetadata(ctx, c.client, cn)
mdC <- mdRes{md, err}
}()
// start async fetching the certs
type ecRes struct {
ec tls.Certificate
err error
}
ecC := make(chan ecRes, 1)
go func() {
defer close(ecC)
var iamTP auth.TokenProvider
if iamAuthNDial {
iamTP = c.tp
}
ec, err := fetchEphemeralCert(ctx, c.client, cn, c.key, iamTP)
ecC <- ecRes{ec, err}
}()
// wait for the results of each operation
var md metadata
select {
case r := <-mdC:
if r.err != nil {
return ConnectionInfo{}, fmt.Errorf("failed to get instance: %w", r.err)
}
md = r.md
case <-ctx.Done():
return ci, fmt.Errorf("refresh failed: %w", ctx.Err())
}
if iamAuthNDial {
if vErr := supportsAutoIAMAuthN(md.version); vErr != nil {
return ConnectionInfo{}, vErr
}
}
var ec tls.Certificate
select {
case r := <-ecC:
if r.err != nil {
return ConnectionInfo{}, fmt.Errorf("fetch ephemeral cert failed: %w", r.err)
}
ec = r.ec
case <-ctx.Done():
return ConnectionInfo{}, fmt.Errorf("refresh failed: %w", ctx.Err())
}
return NewConnectionInfo(
cn, md.dnsName, md.serverCAMode, md.version, md.ipAddrs, md.serverCACert, ec,
), nil
}