diff options
-rw-r--r-- | cmd/podman/machine/config.go | 38 | ||||
-rw-r--r-- | cmd/podman/machine/create.go | 132 | ||||
-rw-r--r-- | cmd/podman/machine/machine.go | 30 | ||||
-rw-r--r-- | cmd/podman/machine/start.go | 34 | ||||
-rw-r--r-- | cmd/podman/machine/stop.go | 34 | ||||
-rw-r--r-- | cmd/podman/main.go | 1 | ||||
-rw-r--r-- | docs/source/Commands.rst | 2 | ||||
-rw-r--r-- | docs/source/machine.rst | 7 | ||||
-rw-r--r-- | docs/source/markdown/podman-machine-create.1.md | 56 | ||||
-rw-r--r-- | docs/source/markdown/podman-machine-start.1.md | 35 | ||||
-rw-r--r-- | docs/source/markdown/podman-machine-stop.1.md | 35 | ||||
-rw-r--r-- | docs/source/markdown/podman-machine.1.md | 24 | ||||
-rw-r--r-- | docs/source/markdown/podman.1.md | 1 |
13 files changed, 429 insertions, 0 deletions
diff --git a/cmd/podman/machine/config.go b/cmd/podman/machine/config.go new file mode 100644 index 000000000..5fa6aa50d --- /dev/null +++ b/cmd/podman/machine/config.go @@ -0,0 +1,38 @@ +package machine + +import "fmt" + +type CreateOptions struct { + CPUS uint64 + Memory uint64 + KernelPath string + Devices []VMDevices +} + +type VMDevices struct { + Path string + ReadOnly bool +} + +type VM interface { + Create(name string, opts CreateOptions) error + Start(name string) error + Stop(name string) error +} + +type TestVM struct { +} + +func (vm *TestVM) Create(name string, opts CreateOptions) error { + fmt.Printf("Created: %s\n", name) + return nil +} + +func (vm *TestVM) Start(name string) error { + fmt.Printf("Started: %s\n", name) + return nil +} +func (vm *TestVM) Stop(name string) error { + fmt.Printf("Stopped: %s\n", name) + return nil +} diff --git a/cmd/podman/machine/create.go b/cmd/podman/machine/create.go new file mode 100644 index 000000000..35f0677ad --- /dev/null +++ b/cmd/podman/machine/create.go @@ -0,0 +1,132 @@ +package machine + +import ( + "fmt" + "strings" + + "github.com/containers/common/pkg/completion" + "github.com/containers/podman/v3/cmd/podman/registry" + "github.com/containers/podman/v3/pkg/domain/entities" + "github.com/pkg/errors" + "github.com/spf13/cobra" +) + +var ( + createCmd = &cobra.Command{ + Use: "create [options] NAME", + Short: "Create a vm", + Long: "Create a virtual machine for Podman to run on. Virtual machines are used to run Podman on Macs. ", + RunE: create, + Args: cobra.ExactArgs(1), + Example: `podman machine create myvm`, + ValidArgsFunction: completion.AutocompleteNone, + } +) + +type CreateCLIOptions struct { + CPUS uint64 + Memory uint64 + KernelPath string + Devices []string +} + +var ( + createOpts = CreateCLIOptions{} +) + +func init() { + registry.Commands = append(registry.Commands, registry.CliCommand{ + Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, + Command: createCmd, + Parent: machineCmd, + }) + flags := createCmd.Flags() + + cpusFlagName := "cpus" + flags.Uint64Var( + &createOpts.CPUS, + cpusFlagName, 0, + "Number of CPUs. The default is 0.000 which means no limit", + ) + _ = createCmd.RegisterFlagCompletionFunc(cpusFlagName, completion.AutocompleteNone) + + memoryFlagName := "memory" + flags.Uint64VarP( + &createOpts.Memory, + memoryFlagName, "m", 0, + "Memory (in MB)", + ) + _ = createCmd.RegisterFlagCompletionFunc(memoryFlagName, completion.AutocompleteNone) + + kernelPathFlagName := "kernel-path" + flags.StringVar( + &createOpts.KernelPath, + kernelPathFlagName, "", + "Kernel path", + ) + _ = createCmd.RegisterFlagCompletionFunc(kernelPathFlagName, completion.AutocompleteNone) + + deviceFlagName := "device" + flags.StringSliceVar( + &createOpts.Devices, + deviceFlagName, []string{}, + "Add a device", + ) + _ = createCmd.RegisterFlagCompletionFunc(deviceFlagName, completion.AutocompleteDefault) +} + +func create(cmd *cobra.Command, args []string) error { + vmOpts := CreateOptions{ + CPUS: createOpts.CPUS, + Memory: createOpts.Memory, + KernelPath: createOpts.KernelPath, + } + + if cmd.Flags().Changed("device") { + devices, err := cmd.Flags().GetStringSlice("device") + if err != nil { + return err + } + vmOpts.Devices, err = parseDevices(devices) + if err != nil { + return err + } + } + + test := new(TestVM) + test.Create(args[0], vmOpts) + + return nil +} + +func parseDevices(devices []string) ([]VMDevices, error) { + vmDevices := make([]VMDevices, 0, len(devices)) + + for _, dev := range devices { + split := strings.Split(dev, ":") + + if len(split) == 1 { + vmDevices = append(vmDevices, VMDevices{ + Path: split[0], + ReadOnly: false, + }) + } else if len(split) == 2 { + var readonly bool + + switch split[1] { + case "ro", "readonly": + readonly = true + default: + return nil, errors.New(fmt.Sprintf("Invalid readonly value: %s", dev)) + } + + vmDevices = append(vmDevices, VMDevices{ + Path: split[0], + ReadOnly: readonly, + }) + } else { + return nil, errors.New(fmt.Sprintf("Invalid device format: %s", dev)) + } + } + return vmDevices, nil +} diff --git a/cmd/podman/machine/machine.go b/cmd/podman/machine/machine.go new file mode 100644 index 000000000..ce5a3b889 --- /dev/null +++ b/cmd/podman/machine/machine.go @@ -0,0 +1,30 @@ +package machine + +import ( + "github.com/containers/podman/v3/cmd/podman/registry" + "github.com/containers/podman/v3/cmd/podman/validate" + "github.com/containers/podman/v3/pkg/domain/entities" + "github.com/spf13/cobra" +) + +var ( + noOp = func(cmd *cobra.Command, args []string) error { + return nil + } + // Command: podman _machine_ + machineCmd = &cobra.Command{ + Use: "machine", + Short: "Manage a virtual machine", + Long: "Manage a virtual machine. Virtual machines are used to run Podman on Macs.", + PersistentPreRunE: noOp, + PersistentPostRunE: noOp, + RunE: validate.SubCommandExists, + } +) + +func init() { + registry.Commands = append(registry.Commands, registry.CliCommand{ + Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, + Command: machineCmd, + }) +} diff --git a/cmd/podman/machine/start.go b/cmd/podman/machine/start.go new file mode 100644 index 000000000..118ce74c0 --- /dev/null +++ b/cmd/podman/machine/start.go @@ -0,0 +1,34 @@ +package machine + +import ( + "github.com/containers/common/pkg/completion" + "github.com/containers/podman/v3/cmd/podman/registry" + "github.com/containers/podman/v3/pkg/domain/entities" + "github.com/spf13/cobra" +) + +var ( + startCmd = &cobra.Command{ + Use: "start NAME", + Short: "Start an existing machine", + Long: "Start an existing machine ", + RunE: start, + Args: cobra.ExactArgs(1), + Example: `podman machine start myvm`, + ValidArgsFunction: completion.AutocompleteNone, + } +) + +func init() { + registry.Commands = append(registry.Commands, registry.CliCommand{ + Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, + Command: startCmd, + Parent: machineCmd, + }) +} + +func start(cmd *cobra.Command, args []string) error { + test := new(TestVM) + test.Start(args[0]) + return nil +} diff --git a/cmd/podman/machine/stop.go b/cmd/podman/machine/stop.go new file mode 100644 index 000000000..d04b3a447 --- /dev/null +++ b/cmd/podman/machine/stop.go @@ -0,0 +1,34 @@ +package machine + +import ( + "github.com/containers/common/pkg/completion" + "github.com/containers/podman/v3/cmd/podman/registry" + "github.com/containers/podman/v3/pkg/domain/entities" + "github.com/spf13/cobra" +) + +var ( + stopCmd = &cobra.Command{ + Use: "stop NAME", + Short: "Stop an existing machine", + Long: "Stop an existing machine ", + RunE: stop, + Args: cobra.ExactArgs(1), + Example: `podman machine stop myvm`, + ValidArgsFunction: completion.AutocompleteNone, + } +) + +func init() { + registry.Commands = append(registry.Commands, registry.CliCommand{ + Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, + Command: stopCmd, + Parent: machineCmd, + }) +} + +func stop(cmd *cobra.Command, args []string) error { + test := new(TestVM) + test.Stop(args[0]) + return nil +} diff --git a/cmd/podman/main.go b/cmd/podman/main.go index 561459c31..5219da26d 100644 --- a/cmd/podman/main.go +++ b/cmd/podman/main.go @@ -9,6 +9,7 @@ import ( _ "github.com/containers/podman/v3/cmd/podman/generate" _ "github.com/containers/podman/v3/cmd/podman/healthcheck" _ "github.com/containers/podman/v3/cmd/podman/images" + _ "github.com/containers/podman/v3/cmd/podman/machine" _ "github.com/containers/podman/v3/cmd/podman/manifest" _ "github.com/containers/podman/v3/cmd/podman/networks" _ "github.com/containers/podman/v3/cmd/podman/play" diff --git a/docs/source/Commands.rst b/docs/source/Commands.rst index 0bb23f71b..766b6a02e 100644 --- a/docs/source/Commands.rst +++ b/docs/source/Commands.rst @@ -55,6 +55,8 @@ Commands :doc:`logs <markdown/podman-logs.1>` Fetch the logs of a container +:doc:`machine <markdown/podman-machine.1>` Manage podman's virtual machine + :doc:`manifest <manifest>` Create and manipulate manifest lists and image indexes :doc:`mount <markdown/podman-mount.1>` Mount a working container's root filesystem diff --git a/docs/source/machine.rst b/docs/source/machine.rst new file mode 100644 index 000000000..5fdfef6b4 --- /dev/null +++ b/docs/source/machine.rst @@ -0,0 +1,7 @@ +Machine +====== +:doc:`create <markdown/podman-machine-create.1>` Create a new virtual machine + +:doc:`start <markdown/podman-machine-start.1>` Start a virtual machine + +:doc:`stop <markdown/podman-machine-stop.1>` Stop a virtual machine diff --git a/docs/source/markdown/podman-machine-create.1.md b/docs/source/markdown/podman-machine-create.1.md new file mode 100644 index 000000000..8282e3d56 --- /dev/null +++ b/docs/source/markdown/podman-machine-create.1.md @@ -0,0 +1,56 @@ +% podman-machine-create(1) + +## NAME +podman\-machine\-create - Create a new virtual machine + +## SYNOPSIS +**podman machine create** [*options*] *name* + +## DESCRIPTION + +Creates a new virtual machine for Podman. + +Podman on MacOS requires a virtual machine. This is because containers are Linux - +containers do not run on any other OS because containers' core functionality are +tied to the Linux kernel. + +**podman machine create** creates a new Linux virtual machine where containers are run. + +## OPTIONS + +#### **--cpus**=*number* + +Number of CPUs. + +#### **--memory**, **-m**=*number* + +Memory (in MB). + +#### **--kernel-path**=*path* + +Print usage statement. + +#### **--device**=_device_[**:**_permissions_] + +Add a device to the virtual machine. Optional *permissions* parameter +can be used to specify device permissions. **ro** means the device is read-only. + +Example: **--device=/dev/xvdc:ro**. + +#### **--help** + +Print usage statement. + +## EXAMPLES + +``` +$ podman machine create myvm +$ podman machine create --device=/dev/xvdc:rw myvm +$ podman machine create --memory=1024 myvm +``` + +## SEE ALSO +podman-machine (1) + +## HISTORY +March 2021, Originally compiled by Ashley Cui <acui@redhat.com> diff --git a/docs/source/markdown/podman-machine-start.1.md b/docs/source/markdown/podman-machine-start.1.md new file mode 100644 index 000000000..511296b11 --- /dev/null +++ b/docs/source/markdown/podman-machine-start.1.md @@ -0,0 +1,35 @@ +% podman-machine-start(1) + +## NAME +podman\-machine\-start - Start a virtual machine + +## SYNOPSIS +**podman machine start** *name* + +## DESCRIPTION + +Starts a virtual machine for Podman. + +Podman on MacOS requires a virtual machine. This is because containers are Linux - +containers do not run on any other OS because containers' core functionality are +tied to the Linux kernel. + +**podman machine start** starts a Linux virtual machine where containers are run. + +## OPTIONS + +#### **--help** + +Print usage statement. + +## EXAMPLES + +``` +$ podman machine start myvm +``` + +## SEE ALSO +podman-machine (1) + +## HISTORY +March 2021, Originally compiled by Ashley Cui <acui@redhat.com> diff --git a/docs/source/markdown/podman-machine-stop.1.md b/docs/source/markdown/podman-machine-stop.1.md new file mode 100644 index 000000000..62439cbb1 --- /dev/null +++ b/docs/source/markdown/podman-machine-stop.1.md @@ -0,0 +1,35 @@ +% podman-machine-stop(1) + +## NAME +podman\-machine\-stop - Stop a virtual machine + +## SYNOPSIS +**podman machine stop** *name* + +## DESCRIPTION + +Stops a virtual machine. + +Podman on MacOS requires a virtual machine. This is because containers are Linux - +containers do not run on any other OS because containers' core functionality are +tied to the Linux kernel. + +**podman machine stop** stops a Linux virtual machine where containers are run. + +## OPTIONS + +#### **--help** + +Print usage statement. + +## EXAMPLES + +``` +$ podman machine stop myvm +``` + +## SEE ALSO +podman-machine (1) + +## HISTORY +March 2021, Originally compiled by Ashley Cui <acui@redhat.com> diff --git a/docs/source/markdown/podman-machine.1.md b/docs/source/markdown/podman-machine.1.md new file mode 100644 index 000000000..167a6a9e9 --- /dev/null +++ b/docs/source/markdown/podman-machine.1.md @@ -0,0 +1,24 @@ +% podman-machine(1) + +## NAME +podman\-machine - Manage Podman's virtual machine + +## SYNOPSIS +**podman machine** *subcommand* + +## DESCRIPTION +`podman machine` is a set of subcommands that manage Podman's virtual machine on MacOS. + +## SUBCOMMANDS + +| Command | Man Page | Description | +| ------- | ------------------------------------------------------- | ----------------------------- | +| create | [podman-machine-create(1)](podman-machine-create.1.md) | Create a new virtual machine | +| start | [podman-machine-start(1)](podman-machine-start.1.md) | Start a virtual machine | +| stop | [podman-machine-stop(1)](podman-machine-stop.1.md) | Stop a virtual machine | + +## SEE ALSO +podman(1) + +## HISTORY +March 2021, Originally compiled by Ashley Cui <acui@redhat.com> diff --git a/docs/source/markdown/podman.1.md b/docs/source/markdown/podman.1.md index 141d231f3..7bf7aa210 100644 --- a/docs/source/markdown/podman.1.md +++ b/docs/source/markdown/podman.1.md @@ -237,6 +237,7 @@ the exit codes follow the `chroot` standard, see below: | [podman-login(1)](podman-login.1.md) | Login to a container registry. | | [podman-logout(1)](podman-logout.1.md) | Logout of a container registry. | | [podman-logs(1)](podman-logs.1.md) | Display the logs of one or more containers. | +| [podman-machine(1)](podman-machine.1.md) | Manage Podman's virtual machine | | [podman-manifest(1)](podman-manifest.1.md) | Create and manipulate manifest lists and image indexes. | | [podman-mount(1)](podman-mount.1.md) | Mount a working container's root filesystem. | | [podman-network(1)](podman-network.1.md) | Manage Podman CNI networks. | |