90 lines
2.1 KiB
Go
90 lines
2.1 KiB
Go
package appconfig
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"strconv"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
)
|
|
|
|
type AppConfig struct {
|
|
AppID string `json:"github_app_id"`
|
|
AppInstallationID int64 `json:"github_app_installation_id"`
|
|
AppPrivateKey string `json:"github_app_private_key"`
|
|
|
|
Token string `json:"github_token"`
|
|
}
|
|
|
|
func (c *AppConfig) tidy() *AppConfig {
|
|
if len(c.Token) > 0 {
|
|
return &AppConfig{
|
|
Token: c.Token,
|
|
}
|
|
}
|
|
|
|
return &AppConfig{
|
|
AppID: c.AppID,
|
|
AppInstallationID: c.AppInstallationID,
|
|
AppPrivateKey: c.AppPrivateKey,
|
|
}
|
|
}
|
|
|
|
func (c *AppConfig) Validate() error {
|
|
if c == nil {
|
|
return fmt.Errorf("missing app config")
|
|
}
|
|
hasToken := len(c.Token) > 0
|
|
hasGitHubAppAuth := c.hasGitHubAppAuth()
|
|
if hasToken && hasGitHubAppAuth {
|
|
return fmt.Errorf("both PAT and GitHub App credentials provided. should only provide one")
|
|
}
|
|
if !hasToken && !hasGitHubAppAuth {
|
|
return fmt.Errorf("no credentials provided: either a PAT or GitHub App credentials should be provided")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c *AppConfig) hasGitHubAppAuth() bool {
|
|
return len(c.AppID) > 0 && c.AppInstallationID > 0 && len(c.AppPrivateKey) > 0
|
|
}
|
|
|
|
func FromSecret(secret *corev1.Secret) (*AppConfig, error) {
|
|
var appInstallationID int64
|
|
if v := string(secret.Data["github_app_installation_id"]); v != "" {
|
|
val, err := strconv.ParseInt(v, 10, 64)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
appInstallationID = val
|
|
}
|
|
|
|
cfg := &AppConfig{
|
|
Token: string(secret.Data["github_token"]),
|
|
AppID: string(secret.Data["github_app_id"]),
|
|
AppInstallationID: appInstallationID,
|
|
AppPrivateKey: string(secret.Data["github_app_private_key"]),
|
|
}
|
|
|
|
if err := cfg.Validate(); err != nil {
|
|
return nil, fmt.Errorf("failed to validate config: %v", err)
|
|
}
|
|
|
|
return cfg.tidy(), nil
|
|
}
|
|
|
|
func FromJSONString(v string) (*AppConfig, error) {
|
|
var appConfig AppConfig
|
|
if err := json.NewDecoder(bytes.NewBufferString(v)).Decode(&appConfig); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := appConfig.Validate(); err != nil {
|
|
return nil, fmt.Errorf("failed to validate app config decoded from string: %w", err)
|
|
}
|
|
|
|
return appConfig.tidy(), nil
|
|
}
|