Skip to content

Commit

Permalink
fix: issue #322
Browse files Browse the repository at this point in the history
wrap errors for fuctions and use slog to print the wrapped errors
  • Loading branch information
christiangda committed Feb 8, 2025
1 parent 924d033 commit fbbda22
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 30 deletions.
5 changes: 5 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"amzn",
"awsconf",
"AWSS",
"AWSSCIM",
"Babs",
"bjensen",
"christiangda",
Expand Down Expand Up @@ -30,6 +31,7 @@
"GOMODCACHE",
"googleapi",
"GOPATH",
"gopkg",
"goroot",
"GOROOT",
"gosec",
Expand All @@ -38,6 +40,7 @@
"hashcode",
"hashicorp",
"idpid",
"idpscim",
"idpscimcli",
"ietf",
"Infof",
Expand All @@ -56,10 +59,12 @@
"repositoryname",
"Retryable",
"retryablehttp",
"SCIM",
"scimid",
"secretmanager",
"securego",
"sirupsen",
"slashdevops",
"softprops",
"stackset",
"stretchr",
Expand Down
61 changes: 31 additions & 30 deletions cmd/idpscim/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ import (
)

var (
cfg config.Config
cfg config.Config

logHandler slog.Handler
logHandlerOptions *slog.HandlerOptions
logger *slog.Logger
Expand Down Expand Up @@ -111,10 +112,6 @@ func init() {

// initConfig reads in config file and ENV variables if set.
func initConfig() {
// Set the default logger
logger = slog.New(logHandler)
slog.SetDefault(logger)

viper.SetEnvPrefix("idpscim") // allow to read in from environment

envVars := []string{
Expand Down Expand Up @@ -175,6 +172,10 @@ func initConfig() {
slog.Error("cannot unmarshal config", "error", err)
}

if cfg.Debug {
cfg.LogLevel = "debug"
}

switch strings.ToLower(cfg.LogFormat) {
case "json":
logHandler = slog.NewJSONHandler(os.Stdout, logHandlerOptions)
Expand All @@ -198,12 +199,15 @@ func initConfig() {
slog.Warn("unknown log level, setting it to info", "level", cfg.LogLevel)
}

if cfg.Debug {
cfg.LogLevel = "debug"
}
// Set the default logger
logger = slog.New(logHandler)
slog.SetDefault(logger)

if cfg.IsLambda || cfg.UseSecretsManager {
getSecrets()
if err := getSecrets(); err != nil {
slog.Error("cannot get secrets", "error", err)
os.Exit(1)
}
}

// not implemented yet block
Expand All @@ -213,65 +217,64 @@ func initConfig() {
}
}

func getSecrets() {
func getSecrets() error {
slog.Info("reading secrets from AWS Secrets Manager")

awsConf, err := aws.NewDefaultConf(context.Background())
if err != nil {
slog.Error("cannot load aws config", "error", err)
os.Exit(1)
return errors.Wrap(err, "cannot load aws config")
}

svc := secretsmanager.NewFromConfig(awsConf)

secrets, err := aws.NewSecretsManagerService(svc)
if err != nil {
slog.Error("cannot create aws secrets manager service", "error", err)
os.Exit(1)
return errors.Wrap(err, "cannot create aws secrets manager service")
}

slog.Debug("reading secret", "name", cfg.GWSUserEmailSecretName)
unwrap, err := secrets.GetSecretValue(context.Background(), cfg.GWSUserEmailSecretName)
if err != nil {
slog.Error("cannot get secretmanager value", "error", err)
os.Exit(1)
return errors.Wrap(err, "cannot get secretmanager value")
}
cfg.GWSUserEmail = unwrap

slog.Debug("reading secret", "name", cfg.GWSServiceAccountFileSecretName)
unwrap, err = secrets.GetSecretValue(context.Background(), cfg.GWSServiceAccountFileSecretName)
if err != nil {
slog.Error("cannot get secretmanager value", "error", err)
os.Exit(1)
return errors.Wrap(err, "cannot get secretmanager value")
}
cfg.GWSServiceAccountFile = unwrap

slog.Debug("reading secret", "name", cfg.AWSSCIMAccessTokenSecretName)
unwrap, err = secrets.GetSecretValue(context.Background(), cfg.AWSSCIMAccessTokenSecretName)
if err != nil {
slog.Error("cannot get secretmanager value", "error", err)
os.Exit(1)
return errors.Wrap(err, "cannot get secretmanager value")
}
cfg.AWSSCIMAccessToken = unwrap

slog.Debug("reading secret", "name", cfg.AWSSCIMEndpointSecretName)
unwrap, err = secrets.GetSecretValue(context.Background(), cfg.AWSSCIMEndpointSecretName)
if err != nil {
slog.Error("cannot get secretmanager value", "error", err)
os.Exit(1)
return errors.Wrap(err, "cannot get secretmanager value")
}
cfg.AWSSCIMEndpoint = unwrap

return nil
}

func sync() error {
slog.Debug("viper config", "config", viper.AllSettings())

if cfg.SyncMethod != "groups" {
slog.Error("only 'sync-method=groups' are implemented")
return fmt.Errorf("unknown sync method: %s", cfg.SyncMethod)
return fmt.Errorf("unknown sync method: %s, only 'groups' are implemented", cfg.SyncMethod)
}

if err := syncGroups(); err != nil {
return errors.Wrap(err, "cannot sync groups")
}

return syncGroups()
return nil
}

func syncGroups() error {
Expand All @@ -284,7 +287,7 @@ func syncGroups() error {
if !cfg.IsLambda {
gwsServiceAccount, err := os.ReadFile(cfg.GWSServiceAccountFile)
if err != nil {
slog.Error("cannot read service account file", "error", err)
return errors.Wrap(err, "cannot read google workspace service account file")
}
gwsServiceAccountContent = gwsServiceAccount
}
Expand Down Expand Up @@ -343,15 +346,13 @@ func syncGroups() error {

awsConf, err := aws.NewDefaultConf(context.Background())
if err != nil {
slog.Error("cannot load aws config", "error", err)
os.Exit(1)
return errors.Wrap(err, "cannot load aws config")
}

s3Client := s3.NewFromConfig(awsConf)
repo, err := repository.NewS3Repository(s3Client, repository.WithBucket(cfg.AWSS3BucketName), repository.WithKey(cfg.AWSS3BucketKey))
if err != nil {
slog.Error("cannot create s3 repository", "error", err)
os.Exit(1)
return errors.Wrap(err, "cannot create s3 repository")
}

ss, err := core.NewSyncService(idpService, scimService, repo, core.WithIdentityProviderGroupsFilter(cfg.GWSGroupsFilter))
Expand Down

0 comments on commit fbbda22

Please sign in to comment.