mirror of
https://github.com/grafana/grafana.git
synced 2025-01-26 00:06:58 -06:00
59ce564d49
* add grabpl build-docker
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package gcloud
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
func GetDecodedKey() ([]byte, error) {
|
|
gcpKey := strings.TrimSpace(os.Getenv("GCP_KEY"))
|
|
if gcpKey == "" {
|
|
return nil, fmt.Errorf("the environment variable GCP_KEY must be set")
|
|
}
|
|
|
|
gcpKeyB, err := base64.StdEncoding.DecodeString(gcpKey)
|
|
if err != nil {
|
|
// key is not always base64 encoded
|
|
validKey := []byte(gcpKey)
|
|
if json.Valid(validKey) {
|
|
return validKey, nil
|
|
}
|
|
return nil, fmt.Errorf("error decoding the gcp_key, err: %q", err)
|
|
}
|
|
|
|
return gcpKeyB, nil
|
|
}
|
|
|
|
func ActivateServiceAccount() error {
|
|
byteKey, err := GetDecodedKey()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
f, err := os.CreateTemp("", "*.json")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer func() {
|
|
if err := os.Remove(f.Name()); err != nil {
|
|
log.Printf("error removing %s: %s", f.Name(), err)
|
|
}
|
|
}()
|
|
|
|
defer func() {
|
|
if err := f.Close(); err != nil {
|
|
log.Println("error closing file:", err)
|
|
}
|
|
}()
|
|
|
|
if _, err := f.Write(byteKey); err != nil {
|
|
return fmt.Errorf("failed to write GCP key file: %w", err)
|
|
}
|
|
keyArg := fmt.Sprintf("--key-file=%s", f.Name())
|
|
//nolint:gosec
|
|
cmd := exec.Command("gcloud", "auth", "activate-service-account", keyArg)
|
|
|
|
if output, err := cmd.CombinedOutput(); err != nil {
|
|
return fmt.Errorf("failed to sign into GCP: %w\n%s", err, output)
|
|
}
|
|
return nil
|
|
}
|