in internal/alloydb/refresh.go [262:335]
func (c adminAPIClient) connectionInfo(
ctx context.Context, i InstanceURI,
) (res ConnectionInfo, err error) {
var refreshEnd tel.EndSpanFunc
ctx, refreshEnd = tel.StartSpan(ctx, "cloud.google.com/go/alloydbconn/internal.RefreshConnection",
tel.AddInstanceName(i.String()),
)
defer func() {
go tel.RecordRefreshResult(
context.Background(), i.String(), c.dialerID, err,
)
refreshEnd(err)
}()
type mdRes struct {
info instanceInfo
err error
}
mdCh := make(chan mdRes, 1)
go func() {
defer close(mdCh)
c, err := fetchInstanceInfo(ctx, c.client, i)
mdCh <- mdRes{info: c, err: err}
}()
type certRes struct {
cc *clientCertificate
err error
}
certCh := make(chan certRes, 1)
go func() {
defer close(certCh)
cc, err := fetchClientCertificate(ctx, c.client, i, c.key, c.disableMetadataExchange)
certCh <- certRes{cc: cc, err: err}
}()
var info instanceInfo
select {
case r := <-mdCh:
if r.err != nil {
return ConnectionInfo{}, fmt.Errorf(
"failed to get instance IP address: %w", r.err,
)
}
info = r.info
case <-ctx.Done():
return ConnectionInfo{}, fmt.Errorf("refresh failed: %w", ctx.Err())
}
var cc *clientCertificate
select {
case r := <-certCh:
if r.err != nil {
return ConnectionInfo{}, fmt.Errorf(
"fetch ephemeral cert failed: %w", r.err,
)
}
cc = r.cc
case <-ctx.Done():
return ConnectionInfo{}, fmt.Errorf("refresh failed: %w", ctx.Err())
}
caCerts := x509.NewCertPool()
caCerts.AddCert(cc.caCert)
ci := ConnectionInfo{
Instance: i,
IPAddrs: info.ipAddrs,
ClientCert: cc.certChain,
RootCAs: caCerts,
Expiration: cc.expiry,
}
return ci, nil
}