80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
package farm
|
|
|
|
import (
|
|
"fmt"
|
|
"slices"
|
|
|
|
"github.com/containers/common/pkg/completion"
|
|
"github.com/containers/common/pkg/config"
|
|
"github.com/containers/podman/v5/cmd/podman/registry"
|
|
"github.com/containers/podman/v5/cmd/podman/validate"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
farmCreateDescription = `Create a new farm with connections added via podman system connection add.
|
|
|
|
The "podman system connection add --farm" command can be used to add a new connection to a new or existing farm.`
|
|
|
|
createCommand = &cobra.Command{
|
|
Use: "create NAME [CONNECTIONS...]",
|
|
Args: cobra.MinimumNArgs(1),
|
|
Short: "Create a new farm",
|
|
Long: farmCreateDescription,
|
|
PersistentPreRunE: validate.NoOp,
|
|
RunE: create,
|
|
PersistentPostRunE: validate.NoOp,
|
|
ValidArgsFunction: completion.AutocompleteNone,
|
|
Example: `podman farm create myfarm connection1
|
|
podman farm create myfarm`,
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
|
Command: createCommand,
|
|
Parent: farmCmd,
|
|
})
|
|
}
|
|
|
|
func create(cmd *cobra.Command, args []string) error {
|
|
farmName := args[0]
|
|
connections := args[1:]
|
|
|
|
err := config.EditConnectionConfig(func(cfg *config.ConnectionsFile) error {
|
|
if _, ok := cfg.Farm.List[farmName]; ok {
|
|
// if farm exists return an error
|
|
return fmt.Errorf("farm with name %q already exists", farmName)
|
|
}
|
|
|
|
// Can create an empty farm without any connections
|
|
if len(connections) == 0 {
|
|
cfg.Farm.List[farmName] = []string{}
|
|
}
|
|
|
|
for _, c := range connections {
|
|
if _, ok := cfg.Connection.Connections[c]; ok {
|
|
if slices.Contains(cfg.Farm.List[farmName], c) {
|
|
// Don't add duplicate connections to a farm
|
|
continue
|
|
}
|
|
cfg.Farm.List[farmName] = append(cfg.Farm.List[farmName], c)
|
|
} else {
|
|
return fmt.Errorf("cannot create farm, %q is not a system connection", c)
|
|
}
|
|
}
|
|
|
|
// If this is the first farm being created, set it as the default farm
|
|
if len(cfg.Farm.List) == 1 {
|
|
cfg.Farm.Default = farmName
|
|
}
|
|
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Printf("Farm %q created\n", farmName)
|
|
return nil
|
|
}
|