blob: 11e8fc0f1c3fe86e30894b02acc0376cbb031c44 [file] [log] [blame]
package main
import (
"fmt"
"path/filepath"
"github.com/spf13/cobra"
"go.skia.org/infra/go/fileutil"
"go.skia.org/infra/gold-client/go/goldclient"
)
const (
// Define the flag names to be consistent.
fstrServiceAccount = "service-account"
fstrLUCI = "luci"
)
// authEnv provides the environment for the auth command.
type authEnv struct {
flagServiceAccount string
flagUseLUCIContext bool
flagWorkDir string
}
// getAuthCmd returns the definition of the auth command.
func getAuthCmd() *cobra.Command {
env := &authEnv{}
cmd := &cobra.Command{
Use: "auth",
Short: "Authenticate against GCP and Gold instances",
Long: `
Authenticate against GCP and the Gold instance.
`,
Run: env.runAuthCmd,
}
// add the service-account flag.
cmd.Flags().StringVar(&env.flagServiceAccount, fstrServiceAccount, "", "Service account file to be used to authenticate against GCP and Gold")
// add the luci flag to use the LUCI_CONTEXT for authentication.
cmd.Flags().BoolVar(&env.flagUseLUCIContext, fstrLUCI, false, "Use the LUCI context to retrieve an oauth token.")
// add the workdir flag and make it required
cmd.Flags().StringVar(&env.flagWorkDir, fstrWorkDir, "", "Work directory for intermediate results")
Must(cmd.MarkFlagRequired(fstrWorkDir))
return cmd
}
// runAuthCommand executes the logic for the auth command. It
// sets up the work directory to support future calls (e.g. imgtest)
func (a *authEnv) runAuthCmd(cmd *cobra.Command, args []string) {
_, err := fileutil.EnsureDirExists(a.flagWorkDir)
if err != nil {
logErrfAndExit(cmd, "Could not make work dir: %s", err)
}
if a.flagUseLUCIContext {
err = goldclient.InitLUCIAuth(a.flagWorkDir)
} else if a.flagServiceAccount != "" {
err = goldclient.InitServiceAccountAuth(a.flagServiceAccount, a.flagWorkDir)
} else {
fmt.Println("Falling back to gsutil implementation")
fmt.Println("This should not be used in production.")
err = goldclient.InitGSUtil(a.flagWorkDir)
}
ifErrLogExit(cmd, err)
abs, err := filepath.Abs(a.flagWorkDir)
if err == nil {
fmt.Printf("Authentication set up in directory %s\n", abs)
} else {
fmt.Printf("Authentication set up in directory %s\n", filepath.Clean(a.flagWorkDir))
}
// Open up the auth we configured and see if we can get an authenticated HTTPClient.
// This helps catch auth errors early.
authDir, err := goldclient.LoadAuthOpt(a.flagWorkDir)
ifErrLogExit(cmd, err)
err = authDir.Validate()
ifErrLogExit(cmd, err)
_, err = authDir.GetHTTPClient()
ifErrLogExit(cmd, err)
fmt.Println("self test passed")
}