84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"git.badhouseplants.net/allanger/shoebill/internal/controller"
|
|
"git.badhouseplants.net/allanger/shoebill/internal/utils/workdir"
|
|
"github.com/alecthomas/kong"
|
|
"github.com/go-logr/logr"
|
|
"github.com/go-logr/zapr"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type Sync struct {
|
|
Config string `short:"c" default:"config.yaml" help:"A path to the configuration file"`
|
|
Workdir string `short:"w" default:"" help:"A path to a workdir"`
|
|
SshKey string `help:"A path to the ssh key that should be used for git operations"`
|
|
DryRun bool `help:"Run the generation without pushing to repos"`
|
|
SopsBin string `default:"/usr/bin/sops" help:"A path to the sops binary"`
|
|
}
|
|
|
|
var CLI struct {
|
|
Sync Sync `cmd:"" help:"Sync gitops configs"`
|
|
}
|
|
|
|
func main() {
|
|
var log logr.Logger
|
|
zapLog, err := zap.NewDevelopment()
|
|
if err != nil {
|
|
panic(fmt.Sprintf("who watches the watchmen (%v)?", err))
|
|
}
|
|
log = zapr.NewLogger(zapLog)
|
|
|
|
ctx := logr.NewContext(context.Background(), log)
|
|
cmd := kong.Parse(&CLI)
|
|
switch cmd.Command() {
|
|
case "sync":
|
|
if err := syncCmd(ctx, CLI.Sync); err != nil {
|
|
log.Error(err, "Error occured during the execution")
|
|
}
|
|
default:
|
|
panic(cmd.Command())
|
|
}
|
|
|
|
}
|
|
|
|
func syncCmd(ctx context.Context, args Sync) error {
|
|
log, err := logr.FromContext(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
log.Info("Setting up the sync command")
|
|
|
|
log.Info("Trying to read the config file", "path", args.Config)
|
|
configObj, err := controller.ReadTheConfig(args.Config)
|
|
if err != nil {
|
|
log.Error(err, "Couldn't read the config file")
|
|
return err
|
|
}
|
|
|
|
log.Info("Preparing the workdir")
|
|
workdirPath, err := workdir.CreateWorkdir(ctx, args.Workdir)
|
|
if err != nil {
|
|
log.Error(err, "Couldn't prepare a working directory")
|
|
return err
|
|
}
|
|
|
|
syncOptions := &controller.SyncOptions{
|
|
SSHKey: args.SshKey,
|
|
Dry: args.DryRun,
|
|
Config: configObj,
|
|
Workdir: workdirPath,
|
|
SopsBin: args.SopsBin,
|
|
}
|
|
|
|
if err := controller.Sync(ctx, syncOptions); err != nil {
|
|
log.Error(err, "Couldn't sync the config")
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|