automation-tests/cmd/podman/farm/create.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
}