Skip to content

Commit 74454bf

Browse files
committed
rework system connection and farm storage
We now no longer write containers.conf, instead system connections and farms are written to a new file called podman-connections.conf. This is a major rework and I had to change a lot of things to get this to compile again with my c/common changes. It is a breaking change for users as connections/farms added before this commit can now no longer be removed or modified directly. However because the logic keeps reading from containers.conf the old connections can still be used to connect to a remote host. Signed-off-by: Paul Holzinger <[email protected]>
1 parent 1698fa0 commit 74454bf

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)