package cmd import ( "fmt" "github.com/jensbecker/homelab/knecht/drift" "github.com/jensbecker/homelab/knecht/stack" "github.com/spf13/cobra" ) var diffCmd = &cobra.Command{ Use: "diff ", Short: "Show drift between local and deployed compose + env keys", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { _, client, svcPath, err := setup() if err != nil { return err } name := args[0] local, err := stack.Get(svcPath, name) if err != nil { return err } remote, err := client.GetStackByName(name) if err != nil { return err } if remote == nil { fmt.Printf("Stack %q is not deployed yet.\n", name) return nil } remoteCompose, err := client.GetStackFile(remote.ID) if err != nil { return err } localCompose, err := local.ReadCompose() if err != nil { return err } exampleKeys, err := local.EnvExampleKeys() if err != nil { return err } portainerKeys := make([]string, len(remote.Env)) for i, e := range remote.Env { portainerKeys[i] = e.Name } // Compose diff composeDiff := drift.Compose(localCompose, remoteCompose) fmt.Println("=== compose diff ===") if len(composeDiff) == 0 { fmt.Println(" in sync") } else { for _, line := range composeDiff { fmt.Println(" " + line) } } // Env key diff missingKeys, unknownKeys := drift.EnvKeys(exampleKeys, portainerKeys) fmt.Println("\n=== env keys ===") if len(missingKeys) == 0 && len(unknownKeys) == 0 { fmt.Println(" in sync") } for _, k := range missingKeys { fmt.Printf(" ! missing in Portainer: %s\n", k) } for _, k := range unknownKeys { fmt.Printf(" ? unknown (not in .env.example): %s\n", k) } return nil }, } func init() { rootCmd.AddCommand(diffCmd) }