blob: c8ee3255ae8e84ad19b9b931ab3e42565b4bd2f3 [file] [log] [blame]
package client
import (
"context"
"crypto/tls"
"go.skia.org/infra/go/auth"
"go.skia.org/infra/go/skerr"
"go.skia.org/infra/go/sklog"
anomalygroup "go.skia.org/infra/perf/go/anomalygroup/proto/v1"
"go.skia.org/infra/perf/go/config"
culprit "go.skia.org/infra/perf/go/culprit/proto/v1"
pinpoint "go.skia.org/infra/pinpoint/proto/v1"
"golang.org/x/oauth2/google"
grpc "google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/credentials/oauth"
)
// getBackendHostUrl returns the host url for the backend service.
func getBackendHostUrl() string {
return config.Config.BackendServiceHostUrl
}
// isBackendEnabled returns true if a backend service is enabled for the current instance.
func isBackendEnabled(urlOverride string) bool {
return urlOverride != "" || config.Config.BackendServiceHostUrl != ""
}
// getGrpcConnection returns a ClientConn object that can be used to create individual
// service clients for the BE service.
func getGrpcConnection(backendServiceUrlOverride string, insecure_conn bool) (*grpc.ClientConn, error) {
var backendServiceUrl string
if backendServiceUrlOverride != "" {
backendServiceUrl = backendServiceUrlOverride
} else {
backendServiceUrl = getBackendHostUrl()
}
// TODO(ashwinpv): Explore the use of opentracing with something
// like https://github.com/grpc-ecosystem/grpc-opentracing/tree/master/go/otgrpc
opts := []grpc.DialOption{}
if insecure_conn {
opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials()))
} else {
tlsCreds := credentials.NewTLS(&tls.Config{
// Since the communication is internal within the same GKE cluster,
// we do not need to verify the server certificate.
InsecureSkipVerify: true,
})
tokenSource, err := getOauthCredentials(context.Background())
if err != nil {
return nil, skerr.Wrapf(err, "Error getting token source")
}
opts = append(opts, grpc.WithTransportCredentials(tlsCreds), grpc.WithPerRPCCredentials(tokenSource))
}
conn, err := grpc.Dial(backendServiceUrl, opts...)
if err != nil {
sklog.Errorf("Error connecting to Backend service at %s: %s", backendServiceUrl, err)
return nil, err
}
return conn, nil
}
// getOauthCredentials returns a token source that will provide oauth tokens
// for the service account running the client process.
func getOauthCredentials(ctx context.Context) (oauth.TokenSource, error) {
tokenSource, err := google.DefaultTokenSource(ctx, auth.ScopeUserinfoEmail)
if err != nil {
return oauth.TokenSource{}, skerr.Wrapf(err, "Failed to create oauth token source.")
}
return oauth.TokenSource{TokenSource: tokenSource}, nil
}
// NewPinpointClient returns a new instance of a client for the pinpoint service.
func NewPinpointClient(backendServiceUrlOverride string) (pinpoint.PinpointClient, error) {
if !isBackendEnabled(backendServiceUrlOverride) {
return nil, skerr.Fmt("Backend service is not enabled for this instance.")
}
conn, err := getGrpcConnection(backendServiceUrlOverride, false)
if err != nil {
return nil, err
}
return pinpoint.NewPinpointClient(conn), nil
}
// NewAnomalyGroupServiceClient returns a new instance of a client for the anomalygroup service.
func NewAnomalyGroupServiceClient(backendServiceUrlOverride string, insecure_conn bool) (anomalygroup.AnomalyGroupServiceClient, error) {
if !isBackendEnabled(backendServiceUrlOverride) {
return nil, skerr.Fmt("Backend service is not enabled for this instance.")
}
conn, err := getGrpcConnection(backendServiceUrlOverride, insecure_conn)
if err != nil {
return nil, err
}
return anomalygroup.NewAnomalyGroupServiceClient(conn), nil
}
// NewCulpritServiceClient returns a new instance of a client for the culprit service.
func NewCulpritServiceClient(backendServiceUrlOverride string, insecure_conn bool) (culprit.CulpritServiceClient, error) {
if !isBackendEnabled(backendServiceUrlOverride) {
return nil, skerr.Fmt("Backend service is not enabled for this instance.")
}
conn, err := getGrpcConnection(backendServiceUrlOverride, insecure_conn)
if err != nil {
return nil, err
}
return culprit.NewCulpritServiceClient(conn), nil
}