Skip to content

Commit 4b90bfb

Browse files
Merge pull request #21536 from containers/machine-dev-5
Podman Machine 5 Refactor
2 parents caee76e + 90c9387 commit 4b90bfb

File tree

104 files changed

+4354
-5090
lines changed

Some content is hidden

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

104 files changed

+4354
-5090
lines changed

.cirrus.yml

Lines changed: 273 additions & 274 deletions
Large diffs are not rendered by default.

cmd/podman/compose.go

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/containers/podman/v4/pkg/machine"
2020
"github.com/containers/podman/v4/pkg/machine/define"
2121
"github.com/containers/podman/v4/pkg/machine/provider"
22+
"github.com/containers/podman/v4/pkg/machine/vmconfigs"
2223
"github.com/sirupsen/logrus"
2324
"github.com/spf13/cobra"
2425
"github.com/spf13/pflag"
@@ -149,7 +150,12 @@ func composeDockerHost() (string, error) {
149150
if err != nil {
150151
return "", fmt.Errorf("getting machine provider: %w", err)
151152
}
152-
machineList, err := machineProvider.List(machine.ListOptions{})
153+
dirs, err := machine.GetMachineDirs(machineProvider.VMType())
154+
if err != nil {
155+
return "", err
156+
}
157+
158+
machineList, err := vmconfigs.LoadMachinesInDir(dirs)
153159
if err != nil {
154160
return "", fmt.Errorf("listing machines: %w", err)
155161
}
@@ -162,31 +168,32 @@ func composeDockerHost() (string, error) {
162168
return "", fmt.Errorf("parsing connection port: %w", err)
163169
}
164170
for _, item := range machineList {
165-
if connectionPort != item.Port {
171+
if connectionPort != item.SSH.Port {
166172
continue
167173
}
168174

169-
vm, err := machineProvider.LoadVMByName(item.Name)
170-
if err != nil {
171-
return "", fmt.Errorf("loading machine: %w", err)
172-
}
173-
info, err := vm.Inspect()
175+
state, err := machineProvider.State(item, false)
174176
if err != nil {
175-
return "", fmt.Errorf("inspecting machine: %w", err)
177+
return "", err
176178
}
177-
if info.State != define.Running {
178-
return "", fmt.Errorf("machine %s is not running but in state %s", item.Name, info.State)
179-
}
180-
if machineProvider.VMType() == define.WSLVirt || machineProvider.VMType() == define.HyperVVirt {
181-
if info.ConnectionInfo.PodmanPipe == nil {
182-
return "", errors.New("pipe of machine is not set")
183-
}
184-
return strings.Replace(info.ConnectionInfo.PodmanPipe.Path, `\\.\pipe\`, "npipe:////./pipe/", 1), nil
185-
}
186-
if info.ConnectionInfo.PodmanSocket == nil {
187-
return "", errors.New("socket of machine is not set")
179+
180+
if state != define.Running {
181+
return "", fmt.Errorf("machine %s is not running but in state %s", item.Name, state)
188182
}
189-
return "unix://" + info.ConnectionInfo.PodmanSocket.Path, nil
183+
184+
// TODO This needs to be wired back in when all providers are complete
185+
// TODO Need someoone to plumb in the connection information below
186+
// if machineProvider.VMType() == define.WSLVirt || machineProvider.VMType() == define.HyperVVirt {
187+
// if info.ConnectionInfo.PodmanPipe == nil {
188+
// return "", errors.New("pipe of machine is not set")
189+
// }
190+
// return strings.Replace(info.ConnectionInfo.PodmanPipe.Path, `\\.\pipe\`, "npipe:////./pipe/", 1), nil
191+
// }
192+
// if info.ConnectionInfo.PodmanSocket == nil {
193+
// return "", errors.New("socket of machine is not set")
194+
// }
195+
// return "unix://" + info.ConnectionInfo.PodmanSocket.Path, nil
196+
return "", nil
190197
}
191198

192199
return "", fmt.Errorf("could not find a matching machine for connection %q", connection.URI)

cmd/podman/machine/info.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ import (
1515
"github.com/containers/podman/v4/libpod/define"
1616
"github.com/containers/podman/v4/pkg/domain/entities"
1717
"github.com/containers/podman/v4/pkg/machine"
18+
machineDefine "github.com/containers/podman/v4/pkg/machine/define"
19+
"github.com/containers/podman/v4/pkg/machine/vmconfigs"
1820
"github.com/spf13/cobra"
19-
"sigs.k8s.io/yaml"
21+
"gopkg.in/yaml.v2"
2022
)
2123

2224
var infoDescription = `Display information pertaining to the machine host.`
@@ -89,7 +91,6 @@ func info(cmd *cobra.Command, args []string) error {
8991
}
9092
fmt.Println(string(b))
9193
}
92-
9394
return nil
9495
}
9596

@@ -99,13 +100,16 @@ func hostInfo() (*entities.MachineHostInfo, error) {
99100
host.Arch = runtime.GOARCH
100101
host.OS = runtime.GOOS
101102

102-
var listOpts machine.ListOptions
103-
listResponse, err := provider.List(listOpts)
103+
dirs, err := machine.GetMachineDirs(provider.VMType())
104+
if err != nil {
105+
return nil, err
106+
}
107+
mcs, err := vmconfigs.LoadMachinesInDir(dirs)
104108
if err != nil {
105109
return nil, fmt.Errorf("failed to get machines %w", err)
106110
}
107111

108-
host.NumberOfMachines = len(listResponse)
112+
host.NumberOfMachines = len(mcs)
109113

110114
defaultCon := ""
111115
con, err := registry.PodmanConfig().ContainersConfDefaultsRO.GetConnection("", true)
@@ -116,13 +120,18 @@ func hostInfo() (*entities.MachineHostInfo, error) {
116120

117121
// Default state of machine is stopped
118122
host.MachineState = "Stopped"
119-
for _, vm := range listResponse {
123+
for _, vm := range mcs {
120124
// Set default machine if found
121125
if vm.Name == defaultCon {
122126
host.DefaultMachine = vm.Name
123127
}
124128
// If machine is running or starting, it is automatically the current machine
125-
if vm.Running {
129+
state, err := provider.State(vm, false)
130+
if err != nil {
131+
return nil, err
132+
}
133+
134+
if state == machineDefine.Running {
126135
host.CurrentMachine = vm.Name
127136
host.MachineState = "Running"
128137
} else if vm.Starting {
@@ -142,17 +151,8 @@ func hostInfo() (*entities.MachineHostInfo, error) {
142151

143152
host.VMType = provider.VMType().String()
144153

145-
dataDir, err := machine.GetDataDir(provider.VMType())
146-
if err != nil {
147-
return nil, fmt.Errorf("failed to get machine image dir")
148-
}
149-
host.MachineImageDir = dataDir
150-
151-
confDir, err := machine.GetConfDir(provider.VMType())
152-
if err != nil {
153-
return nil, fmt.Errorf("failed to get machine config dir %w", err)
154-
}
155-
host.MachineConfigDir = confDir
154+
host.MachineImageDir = dirs.DataDir.GetPath()
155+
host.MachineConfigDir = dirs.ConfigDir.GetPath()
156156

157157
eventsDir, err := eventSockDir()
158158
if err != nil {

cmd/podman/machine/init.go

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"github.com/containers/podman/v4/libpod/events"
1212
"github.com/containers/podman/v4/pkg/machine"
1313
"github.com/containers/podman/v4/pkg/machine/define"
14+
"github.com/containers/podman/v4/pkg/machine/shim"
15+
"github.com/containers/podman/v4/pkg/machine/vmconfigs"
1416
"github.com/spf13/cobra"
1517
)
1618

@@ -26,7 +28,7 @@ var (
2628
ValidArgsFunction: completion.AutocompleteNone,
2729
}
2830

29-
initOpts = machine.InitOptions{}
31+
initOpts = define.InitOptions{}
3032
initOptionalFlags = InitOptionalFlags{}
3133
defaultMachineName = machine.DefaultMachineName
3234
now bool
@@ -99,7 +101,7 @@ func init() {
99101
_ = initCmd.RegisterFlagCompletionFunc(UsernameFlagName, completion.AutocompleteDefault)
100102

101103
ImagePathFlagName := "image-path"
102-
flags.StringVar(&initOpts.ImagePath, ImagePathFlagName, cfg.ContainersConfDefaultsRO.Machine.Image, "Path to bootable image")
104+
flags.StringVar(&initOpts.ImagePath, ImagePathFlagName, "", "Path to bootable image")
103105
_ = initCmd.RegisterFlagCompletionFunc(ImagePathFlagName, completion.AutocompleteDefault)
104106

105107
VolumeFlagName := "volume"
@@ -128,10 +130,6 @@ func init() {
128130
}
129131

130132
func initMachine(cmd *cobra.Command, args []string) error {
131-
var (
132-
err error
133-
vm machine.VM
134-
)
135133
initOpts.Name = defaultMachineName
136134
if len(args) > 0 {
137135
if len(args[0]) > maxMachineNameSize {
@@ -145,8 +143,15 @@ func initMachine(cmd *cobra.Command, args []string) error {
145143
return fmt.Errorf("cannot use %q for a machine name", initOpts.Name)
146144
}
147145

148-
if _, err := provider.LoadVMByName(initOpts.Name); err == nil {
149-
return fmt.Errorf("%s: %w", initOpts.Name, machine.ErrVMAlreadyExists)
146+
// Check if machine already exists
147+
_, exists, err := shim.VMExists(initOpts.Name, []vmconfigs.VMProvider{provider})
148+
if err != nil {
149+
return err
150+
}
151+
152+
// machine exists, return error
153+
if exists {
154+
return fmt.Errorf("%s: %w", initOpts.Name, define.ErrVMAlreadyExists)
150155
}
151156

152157
// check if a system connection already exists
@@ -173,20 +178,28 @@ func initMachine(cmd *cobra.Command, args []string) error {
173178
initOpts.UserModeNetworking = &initOptionalFlags.UserModeNetworking
174179
}
175180

176-
vm, err = provider.NewMachine(initOpts)
181+
// TODO need to work this back in
182+
// if finished, err := vm.Init(initOpts); err != nil || !finished {
183+
// // Finished = true, err = nil - Success! Log a message with further instructions
184+
// // Finished = false, err = nil - The installation is partially complete and podman should
185+
// // exit gracefully with no error and no success message.
186+
// // Examples:
187+
// // - a user has chosen to perform their own reboot
188+
// // - reexec for limited admin operations, returning to parent
189+
// // Finished = *, err != nil - Exit with an error message
190+
// return err
191+
// }
192+
193+
mc, err := shim.Init(initOpts, provider)
177194
if err != nil {
178195
return err
179196
}
180-
if finished, err := vm.Init(initOpts); err != nil || !finished {
181-
// Finished = true, err = nil - Success! Log a message with further instructions
182-
// Finished = false, err = nil - The installation is partially complete and podman should
183-
// exit gracefully with no error and no success message.
184-
// Examples:
185-
// - a user has chosen to perform their own reboot
186-
// - reexec for limited admin operations, returning to parent
187-
// Finished = *, err != nil - Exit with an error message
197+
198+
// TODO callback needed for the configuration file
199+
if err := mc.Write(); err != nil {
188200
return err
189201
}
202+
190203
newMachineEvent(events.Init, events.Event{Name: initOpts.Name})
191204
fmt.Println("Machine init complete")
192205

cmd/podman/machine/inspect.go

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/containers/podman/v4/cmd/podman/registry"
1111
"github.com/containers/podman/v4/cmd/podman/utils"
1212
"github.com/containers/podman/v4/pkg/machine"
13+
"github.com/containers/podman/v4/pkg/machine/vmconfigs"
1314
"github.com/spf13/cobra"
1415
)
1516

@@ -46,23 +47,54 @@ func inspect(cmd *cobra.Command, args []string) error {
4647
var (
4748
errs utils.OutputErrors
4849
)
50+
dirs, err := machine.GetMachineDirs(provider.VMType())
51+
if err != nil {
52+
return err
53+
}
4954
if len(args) < 1 {
5055
args = append(args, defaultMachineName)
5156
}
52-
vms := make([]machine.InspectInfo, 0, len(args))
5357

54-
for _, vmName := range args {
55-
vm, err := provider.LoadVMByName(vmName)
58+
vms := make([]machine.InspectInfo, 0, len(args))
59+
for _, name := range args {
60+
mc, err := vmconfigs.LoadMachineByName(name, dirs)
5661
if err != nil {
5762
errs = append(errs, err)
5863
continue
5964
}
60-
ii, err := vm.Inspect()
65+
66+
state, err := provider.State(mc, false)
6167
if err != nil {
62-
errs = append(errs, err)
63-
continue
68+
return err
6469
}
65-
vms = append(vms, *ii)
70+
ignFile, err := mc.IgnitionFile()
71+
if err != nil {
72+
return err
73+
}
74+
75+
ii := machine.InspectInfo{
76+
// TODO I dont think this is useful
77+
ConfigPath: *dirs.ConfigDir,
78+
// TODO Fill this out
79+
ConnectionInfo: machine.ConnectionConfig{},
80+
Created: mc.Created,
81+
// TODO This is no longer applicable; we dont care about the provenance
82+
// of the image
83+
Image: machine.ImageConfig{
84+
IgnitionFile: *ignFile,
85+
ImagePath: *mc.ImagePath,
86+
},
87+
LastUp: mc.LastUp,
88+
Name: mc.Name,
89+
Resources: mc.Resources,
90+
SSHConfig: mc.SSH,
91+
State: state,
92+
UserModeNetworking: false,
93+
// TODO I think this should be the HostUser
94+
Rootful: mc.HostUser.Rootful,
95+
}
96+
97+
vms = append(vms, ii)
6698
}
6799

68100
switch {

cmd/podman/machine/list.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import (
1616
"github.com/containers/podman/v4/cmd/podman/validate"
1717
"github.com/containers/podman/v4/pkg/domain/entities"
1818
"github.com/containers/podman/v4/pkg/machine"
19+
"github.com/containers/podman/v4/pkg/machine/shim"
20+
"github.com/containers/podman/v4/pkg/machine/vmconfigs"
1921
"github.com/docker/go-units"
2022
"github.com/spf13/cobra"
2123
)
@@ -59,14 +61,13 @@ func init() {
5961

6062
func list(cmd *cobra.Command, args []string) error {
6163
var (
62-
opts machine.ListOptions
63-
listResponse []*machine.ListResponse
64-
err error
64+
opts machine.ListOptions
65+
err error
6566
)
6667

67-
listResponse, err = provider.List(opts)
68+
listResponse, err := shim.List([]vmconfigs.VMProvider{provider}, opts)
6869
if err != nil {
69-
return fmt.Errorf("listing vms: %w", err)
70+
return err
7071
}
7172

7273
// Sort by last run

cmd/podman/machine/machine.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/containers/podman/v4/libpod/events"
1818
"github.com/containers/podman/v4/pkg/machine"
1919
provider2 "github.com/containers/podman/v4/pkg/machine/provider"
20+
"github.com/containers/podman/v4/pkg/machine/vmconfigs"
2021
"github.com/containers/podman/v4/pkg/util"
2122
"github.com/sirupsen/logrus"
2223
"github.com/spf13/cobra"
@@ -39,8 +40,9 @@ var (
3940
RunE: validate.SubCommandExists,
4041
}
4142
)
43+
4244
var (
43-
provider machine.VirtProvider
45+
provider vmconfigs.VMProvider
4446
)
4547

4648
func init() {
@@ -80,7 +82,11 @@ func getMachines(toComplete string) ([]string, cobra.ShellCompDirective) {
8082
if err != nil {
8183
return nil, cobra.ShellCompDirectiveNoFileComp
8284
}
83-
machines, err := provider.List(machine.ListOptions{})
85+
dirs, err := machine.GetMachineDirs(provider.VMType())
86+
if err != nil {
87+
return nil, cobra.ShellCompDirectiveNoFileComp
88+
}
89+
machines, err := vmconfigs.LoadMachinesInDir(dirs)
8490
if err != nil {
8591
cobra.CompErrorln(err.Error())
8692
return nil, cobra.ShellCompDirectiveNoFileComp

0 commit comments

Comments
 (0)