package garage import ( "crypto/rand" "encoding/hex" "errors" "fmt" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" ) func randStr(l int) string { b := make([]byte, l) if _, err := rand.Read(b); err != nil { panic(err) } return hex.EncodeToString(b) } // IsKeyNotFound returns true if the given error is the result of a key not // being found in a bucket. func IsKeyNotFound(err error) bool { var mErr minio.ErrorResponse return errors.As(err, &mErr) && mErr.Code == "NoSuchKey" } // S3APIClient is a client used to interact with garage's S3 API. type S3APIClient = *minio.Client // S3APICredentials describe data fields necessary for authenticating with a // garage S3 API endpoint. type S3APICredentials struct { ID string `yaml:"id"` Secret string `yaml:"secret"` } // NewS3APICredentials returns a new usable instance of S3APICredentials. func NewS3APICredentials() S3APICredentials { return S3APICredentials{ ID: randStr(8), Secret: randStr(32), } } // NewS3APIClient returns a minio client configured to use the given garage S3 API // endpoint. func NewS3APIClient(addr string, creds S3APICredentials) S3APIClient { client, err := minio.New(addr, &minio.Options{ Creds: credentials.NewStaticV4(creds.ID, creds.Secret, ""), Region: Region, }) if err != nil { panic(fmt.Sprintf("initializing minio client at addr %q and with creds %+v", addr, creds)) } return client }