func()

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
}