blob: 9ec0561b34e38cdb476190ecf09b306370def2a5 [file] [log] [blame]
package main
import (
"context"
"crypto/tls"
"encoding/json"
"flag"
"io"
"os"
"path/filepath"
"strings"
"go.skia.org/infra/go/auth"
pb "go.skia.org/infra/go/coverage/proto/v1"
"go.skia.org/infra/go/skerr"
"go.skia.org/infra/go/sklog"
"golang.org/x/oauth2/google"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/credentials/oauth"
)
// 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
}
// getGrpcConnection returns a ClientConn object that can be used to create individual
// service clients for the coverage service.
func getGrpcConnection(host string, insecure_conn bool) *grpc.ClientConn {
opts := []grpc.DialOption{}
sklog.Debugf("Connecting to Host: %s", host)
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 {
sklog.Errorf("Error Getting Token.")
return nil
}
opts = append(opts, grpc.WithTransportCredentials(tlsCreds), grpc.WithPerRPCCredentials(tokenSource))
}
conn, err := grpc.Dial(host, opts...)
if err != nil {
sklog.Errorf("Error connecting to Coverage service at %s: %s", host, err)
return nil
}
return conn
}
func getJson(filename string) []byte {
sklog.Debugf("Loading File: %s", filename)
cwd, err := os.Getwd()
file := filepath.Join(cwd, "coverageclient", filename)
jsonFile, err := os.Open(file)
if err != nil {
sklog.Errorf("Error loading Json %s:", err)
}
defer jsonFile.Close()
byteValue, _ := io.ReadAll(jsonFile)
return byteValue
}
func main() {
ctx := context.Background()
addBuilder := flag.Bool("addBuilder", false, "Add Builder to Database")
addFile := flag.Bool("addFile", false, "Add File to Database")
addTest := flag.Bool("addTest", false, "Add TestSuite to Database")
deleteFile := flag.Bool("delete", false, "Remove File from Database")
getAll := flag.Bool("getAll", false, "Get Full Database")
host := flag.String("host", "localhost", "Hostname/IP of gRPC Service")
port := flag.String("port", "8006", "Hostname/IP of gRPC Service")
insecure := flag.Bool("insecure", true, "Use TLS secure connection")
flag.Parse()
sampleFile := "getTestSuite.json"
if *addFile {
sampleFile = "addFile.json"
}
if *addBuilder {
sampleFile = "addBuilder.json"
}
if *addTest {
sampleFile = "addTestSuite.json"
}
if *deleteFile {
sampleFile = "deleteFile.json"
}
if *getAll {
sampleFile = "getAll.json"
}
rpcHost := *host + ":" + *port
conn := getGrpcConnection(rpcHost, *insecure)
client := pb.NewCoverageServiceClient(conn)
if strings.HasPrefix(sampleFile, "get") {
if strings.HasPrefix(sampleFile, "getAll") {
var request pb.CoverageRequest
var response *pb.CoverageAllResponses
err := json.Unmarshal(getJson(sampleFile), &request)
if err != nil {
sklog.Errorf("Unmarshal Error: %s", err)
return
}
response, err = client.GetAllFiles(ctx, &request)
sklog.Debugf(" Response: %v Length: %d", response.Responses, len(response.Responses))
} else {
var listRequest pb.CoverageListRequest
var listResponse *pb.CoverageListResponse
err := json.Unmarshal(getJson(sampleFile), &listRequest)
if err != nil {
sklog.Errorf("Unmarshal Error: %s", err)
return
}
listResponse, err = client.GetTestSuite(ctx, &listRequest)
sklog.Debugf(" Response: %s", listResponse)
}
} else {
var changeRequest pb.CoverageChangeRequest
var changeResponse *pb.CoverageChangeResponse
err := json.Unmarshal(getJson(sampleFile), &changeRequest)
if err != nil {
sklog.Errorf("Unmarshal Error: %s", err)
return
}
if strings.HasPrefix(sampleFile, "add") {
changeResponse, err = client.InsertFile(ctx, &changeRequest)
} else {
changeResponse, err = client.DeleteFile(ctx, &changeRequest)
}
if err != nil {
sklog.Errorf("Error: %s", err.Error())
} else {
sklog.Debugf("Change Response: %s", changeResponse)
}
}
conn.Close()
}