Skip to content

Commit 1a8cb15

Browse files
Merge pull request #21384 from Luap99/connections
rework system connection and farm storage
2 parents 4370932 + 74454bf commit 1a8cb15

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1082
-1080
lines changed

cmd/podman/common/completion.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -837,15 +837,15 @@ func AutoCompleteFarms(cmd *cobra.Command, args []string, toComplete string) ([]
837837
if !validCurrentCmdLine(cmd, args, toComplete) {
838838
return nil, cobra.ShellCompDirectiveNoFileComp
839839
}
840-
suggestions := []string{}
841-
cfg, err := config.ReadCustomConfig()
840+
farms, err := podmanConfig.ContainersConfDefaultsRO.GetAllFarms()
842841
if err != nil {
843842
cobra.CompErrorln(err.Error())
844843
return nil, cobra.ShellCompDirectiveNoFileComp
845844
}
846845

847-
for k := range cfg.Farms.List {
848-
suggestions = append(suggestions, k)
846+
suggestions := make([]string, 0, len(farms))
847+
for _, farm := range farms {
848+
suggestions = append(suggestions, farm.Name)
849849
}
850850

851851
return suggestions, cobra.ShellCompDirectiveNoFileComp
@@ -856,16 +856,17 @@ func AutocompleteSystemConnections(cmd *cobra.Command, args []string, toComplete
856856
if !validCurrentCmdLine(cmd, args, toComplete) {
857857
return nil, cobra.ShellCompDirectiveNoFileComp
858858
}
859-
suggestions := []string{}
860-
cfg, err := config.ReadCustomConfig()
859+
860+
cons, err := podmanConfig.ContainersConfDefaultsRO.GetAllConnections()
861861
if err != nil {
862862
cobra.CompErrorln(err.Error())
863863
return nil, cobra.ShellCompDirectiveNoFileComp
864864
}
865865

866-
for k, v := range cfg.Engine.ServiceDestinations {
866+
suggestions := make([]string, 0, len(cons))
867+
for _, con := range cons {
867868
// the URI will be show as description in shells like zsh
868-
suggestions = append(suggestions, k+"\t"+v.URI)
869+
suggestions = append(suggestions, con.Name+"\t"+con.URI)
869870
}
870871

871872
return suggestions, cobra.ShellCompDirectiveNoFileComp

cmd/podman/compose.go

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414
"strings"
1515
"text/template"
1616

17-
"github.com/containers/common/pkg/config"
1817
"github.com/containers/podman/v4/cmd/podman/registry"
1918
"github.com/containers/podman/v4/pkg/errorhandling"
2019
"github.com/containers/podman/v4/pkg/machine"
@@ -114,15 +113,10 @@ func composeDockerHost() (string, error) {
114113
return registry.DefaultAPIAddress(), nil
115114
}
116115

117-
cfg, err := config.ReadCustomConfig()
116+
// TODO need to add support for --connection and --url
117+
connection, err := registry.PodmanConfig().ContainersConfDefaultsRO.GetConnection("", true)
118118
if err != nil {
119-
return "", err
120-
}
121-
122-
// NOTE: podman --connection=foo and --url=... are injected
123-
// into the default connection below in `root.go`.
124-
defaultConnection := cfg.Engine.ActiveService
125-
if defaultConnection == "" {
119+
logrus.Info(err)
126120
switch runtime.GOOS {
127121
// If no default connection is set on Linux or FreeBSD,
128122
// we just use the local socket by default - just as
@@ -137,10 +131,6 @@ func composeDockerHost() (string, error) {
137131
}
138132
}
139133

140-
connection, ok := cfg.Engine.ServiceDestinations[defaultConnection]
141-
if !ok {
142-
return "", fmt.Errorf("internal error: default connection %q not found in database", defaultConnection)
143-
}
144134
parsedConnection, err := url.Parse(connection.URI)
145135
if err != nil {
146136
return "", fmt.Errorf("preparing connection to remote machine: %w", err)

cmd/podman/farm/build.go

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"strings"
88

99
"github.com/containers/common/pkg/completion"
10-
"github.com/containers/common/pkg/config"
1110
"github.com/containers/podman/v4/cmd/podman/common"
1211
"github.com/containers/podman/v4/cmd/podman/registry"
1312
"github.com/containers/podman/v4/cmd/podman/utils"
@@ -50,14 +49,8 @@ func init() {
5049
cleanupFlag := "cleanup"
5150
flags.BoolVar(&buildOpts.buildOptions.Cleanup, cleanupFlag, false, "Remove built images from farm nodes on success")
5251

53-
podmanConfig := registry.PodmanConfig()
5452
farmFlagName := "farm"
55-
// If remote, don't read the client's containers.conf file
56-
defaultFarm := ""
57-
if !registry.IsRemote() {
58-
defaultFarm = podmanConfig.ContainersConfDefaultsRO.Farms.Default
59-
}
60-
flags.StringVar(&buildOpts.farm, farmFlagName, defaultFarm, "Farm to use for builds")
53+
flags.StringVar(&buildOpts.farm, farmFlagName, "", "Farm to use for builds")
6154
_ = buildCommand.RegisterFlagCompletionFunc(farmFlagName, common.AutoCompleteFarms)
6255

6356
localFlagName := "local"
@@ -122,23 +115,9 @@ func build(cmd *cobra.Command, args []string) error {
122115
}
123116
opts.SkipTLSVerify = !tlsVerify
124117

125-
cfg, err := config.ReadCustomConfig()
126-
if err != nil {
127-
return err
128-
}
129-
130-
defaultFarm := cfg.Farms.Default
131-
if cmd.Flags().Changed("farm") {
132-
f, err := cmd.Flags().GetString("farm")
133-
if err != nil {
134-
return err
135-
}
136-
defaultFarm = f
137-
}
138-
139118
localEngine := registry.ImageEngine()
140119
ctx := registry.Context()
141-
farm, err := farm.NewFarm(ctx, defaultFarm, localEngine, buildOpts.local)
120+
farm, err := farm.NewFarm(ctx, buildOpts.farm, localEngine, buildOpts.local)
142121
if err != nil {
143122
return fmt.Errorf("initializing: %w", err)
144123
}

cmd/podman/farm/create.go

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -41,43 +41,39 @@ func create(cmd *cobra.Command, args []string) error {
4141
farmName := args[0]
4242
connections := args[1:]
4343

44-
cfg, err := config.ReadCustomConfig()
45-
if err != nil {
46-
return err
47-
}
48-
49-
if _, ok := cfg.Farms.List[farmName]; ok {
50-
// if farm exists return an error
51-
return fmt.Errorf("farm with name %q already exists", farmName)
52-
}
44+
err := config.EditConnectionConfig(func(cfg *config.ConnectionsFile) error {
45+
if _, ok := cfg.Farm.List[farmName]; ok {
46+
// if farm exists return an error
47+
return fmt.Errorf("farm with name %q already exists", farmName)
48+
}
5349

54-
// Can create an empty farm without any connections
55-
if len(connections) == 0 {
56-
cfg.Farms.List[farmName] = []string{}
57-
}
50+
// Can create an empty farm without any connections
51+
if len(connections) == 0 {
52+
cfg.Farm.List[farmName] = []string{}
53+
}
5854

59-
for _, c := range connections {
60-
if _, ok := cfg.Engine.ServiceDestinations[c]; ok {
61-
if slices.Contains(cfg.Farms.List[farmName], c) {
62-
// Don't add duplicate connections to a farm
63-
continue
55+
for _, c := range connections {
56+
if _, ok := cfg.Connection.Connections[c]; ok {
57+
if slices.Contains(cfg.Farm.List[farmName], c) {
58+
// Don't add duplicate connections to a farm
59+
continue
60+
}
61+
cfg.Farm.List[farmName] = append(cfg.Farm.List[farmName], c)
62+
} else {
63+
return fmt.Errorf("cannot create farm, %q is not a system connection", c)
6464
}
65-
cfg.Farms.List[farmName] = append(cfg.Farms.List[farmName], c)
66-
} else {
67-
return fmt.Errorf("cannot create farm, %q is not a system connection", c)
6865
}
69-
}
7066

71-
// If this is the first farm being created, set it as the default farm
72-
if len(cfg.Farms.List) == 1 {
73-
cfg.Farms.Default = farmName
74-
}
67+
// If this is the first farm being created, set it as the default farm
68+
if len(cfg.Farm.List) == 1 {
69+
cfg.Farm.Default = farmName
70+
}
7571

76-
err = cfg.Write()
72+
return nil
73+
})
7774
if err != nil {
7875
return err
7976
}
80-
8177
fmt.Printf("Farm %q created\n", farmName)
8278
return nil
8379
}

cmd/podman/farm/list.go

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -46,50 +46,29 @@ func init() {
4646

4747
formatFlagName := "format"
4848
flags.StringVar(&lsOpts.Format, formatFlagName, "", "Format farm output using Go template")
49-
_ = lsCommand.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteFormat(&farmOut{}))
50-
}
51-
52-
type farmOut struct {
53-
Name string
54-
Connections []string
55-
Default bool
49+
_ = lsCommand.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteFormat(&config.Farm{}))
5650
}
5751

5852
func list(cmd *cobra.Command, args []string) error {
59-
cfg, err := config.ReadCustomConfig()
60-
if err != nil {
61-
return err
62-
}
63-
6453
format := lsOpts.Format
6554
if format == "" && len(args) > 0 {
6655
format = "json"
6756
}
6857

69-
rows := make([]farmOut, 0)
70-
for k, v := range cfg.Farms.List {
71-
defaultFarm := false
72-
if k == cfg.Farms.Default {
73-
defaultFarm = true
74-
}
75-
76-
r := farmOut{
77-
Name: k,
78-
Connections: v,
79-
Default: defaultFarm,
80-
}
81-
rows = append(rows, r)
58+
farms, err := registry.PodmanConfig().ContainersConfDefaultsRO.GetAllFarms()
59+
if err != nil {
60+
return err
8261
}
8362

84-
sort.Slice(rows, func(i, j int) bool {
85-
return rows[i].Name < rows[j].Name
63+
sort.Slice(farms, func(i, j int) bool {
64+
return farms[i].Name < farms[j].Name
8665
})
8766

8867
rpt := report.New(os.Stdout, cmd.Name())
8968
defer rpt.Flush()
9069

9170
if report.IsJSON(format) {
92-
buf, err := registry.JSONLibrary().MarshalIndent(rows, "", " ")
71+
buf, err := registry.JSONLibrary().MarshalIndent(farms, "", " ")
9372
if err == nil {
9473
fmt.Println(string(buf))
9574
}
@@ -100,7 +79,7 @@ func list(cmd *cobra.Command, args []string) error {
10079
rpt, err = rpt.Parse(report.OriginUser, format)
10180
} else {
10281
rpt, err = rpt.Parse(report.OriginPodman,
103-
"{{range .}}{{.Name}}\t{{.Connections}}\t{{.Default}}\n{{end -}}")
82+
"{{range .}}{{.Name}}\t{{.Connections}}\t{{.Default}}\t{{.ReadWrite}}\n{{end -}}")
10483
}
10584
if err != nil {
10685
return err
@@ -111,11 +90,12 @@ func list(cmd *cobra.Command, args []string) error {
11190
"Default": "Default",
11291
"Connections": "Connections",
11392
"Name": "Name",
93+
"ReadWrite": "ReadWrite",
11494
}})
11595
if err != nil {
11696
return err
11797
}
11898
}
11999

120-
return rpt.Execute(rows)
100+
return rpt.Execute(farms)
121101
}

cmd/podman/farm/remove.go

Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -43,57 +43,55 @@ func init() {
4343
}
4444

4545
func rm(cmd *cobra.Command, args []string) error {
46-
cfg, err := config.ReadCustomConfig()
47-
if err != nil {
48-
return err
49-
}
50-
51-
if rmOpts.All {
52-
cfg.Farms.List = make(map[string][]string)
53-
cfg.Farms.Default = ""
54-
if err := cfg.Write(); err != nil {
55-
return err
46+
deletedFarms := []string{}
47+
err := config.EditConnectionConfig(func(cfg *config.ConnectionsFile) error {
48+
if rmOpts.All {
49+
cfg.Farm.List = make(map[string][]string)
50+
cfg.Farm.Default = ""
51+
return nil
5652
}
57-
fmt.Println("All farms have been deleted")
58-
return nil
59-
}
6053

61-
// If the --all is not set, we require at least one arg
62-
if len(args) == 0 {
63-
return errors.New("requires at lease 1 arg(s), received 0")
64-
}
54+
// If the --all is not set, we require at least one arg
55+
if len(args) == 0 {
56+
return errors.New("requires at lease 1 arg(s), received 0")
57+
}
6558

66-
if len(cfg.Farms.List) == 0 {
67-
return errors.New("no existing farms; nothing to remove")
68-
}
59+
if len(cfg.Farm.List) == 0 {
60+
return errors.New("no existing farms; nothing to remove")
61+
}
6962

70-
deletedFarms := []string{}
71-
for _, k := range args {
72-
if _, ok := cfg.Farms.List[k]; !ok {
73-
logrus.Warnf("farm %q doesn't exist; nothing to remove", k)
74-
continue
63+
for _, k := range args {
64+
if _, ok := cfg.Farm.List[k]; !ok {
65+
logrus.Warnf("farm %q doesn't exist; nothing to remove", k)
66+
continue
67+
}
68+
delete(cfg.Farm.List, k)
69+
deletedFarms = append(deletedFarms, k)
70+
if k == cfg.Farm.Default {
71+
cfg.Farm.Default = ""
72+
}
7573
}
76-
delete(cfg.Farms.List, k)
77-
deletedFarms = append(deletedFarms, k)
78-
if k == cfg.Farms.Default {
79-
cfg.Farms.Default = ""
74+
// Return error if none of the given farms were deleted
75+
if len(deletedFarms) == 0 {
76+
return fmt.Errorf("failed to delete farms %q", args)
8077
}
81-
}
82-
// Return error if none of the given farms were deleted
83-
if len(deletedFarms) == 0 {
84-
return fmt.Errorf("failed to delete farms %q", args)
85-
}
8678

87-
// Set a new default farm if the current default farm has been removed
88-
if cfg.Farms.Default == "" && cfg.Farms.List != nil {
89-
for k := range cfg.Farms.List {
90-
cfg.Farms.Default = k
91-
break
79+
// Set a new default farm if the current default farm has been removed
80+
if cfg.Farm.Default == "" && cfg.Farm.List != nil {
81+
for k := range cfg.Farm.List {
82+
cfg.Farm.Default = k
83+
break
84+
}
9285
}
93-
}
94-
if err := cfg.Write(); err != nil {
86+
return nil
87+
})
88+
if err != nil {
9589
return err
9690
}
91+
if rmOpts.All {
92+
fmt.Println("All farms have been deleted")
93+
return nil
94+
}
9795

9896
for _, k := range deletedFarms {
9997
fmt.Printf("Farm %q deleted\n", k)

0 commit comments

Comments
 (0)