mirror of
https://github.com/podman-container-tools/podman.git
synced 2026-10-20 04:47:34 +00:00
Implement a new network interface to abstract CNI from libpod. The interface is implemented for the CNI backend but in the future we can add more backends. The code is structured in three new packages: - `libpod/network/types`: contains the interface definition and the necessary types for it. - `libpod/network/cni` contains the interface implementation for the CNI backend. - `libpod/network/util` a set of utility functions related to networking. The CNI package uses ginkgo style unit tests. To test Setup/Teardown the test must be run as root. Each test will run in their own namespace to make the test independent from the host environment. New features with the CNI backend: - The default network will be created in memory if it does not exists on disk. - It can set more than one static IP per container network. - Networks are loaded once from disk and only if this interface is used, e.g. for commands such as `podman info` networks are not loaded. This reduces unnecessary disk IO. This commit only adds the interface it is not wired into libpod. This requires a lot of breaking changes which will be done in a followup commit. Once this is integrated into libpod the current network code under `libpod/network` should be removed. Also the dependency on OCICNI should be dropped. Signed-off-by: Paul Holzinger <pholzing@redhat.com> |
||
|---|---|---|
| .. | ||
| common | ||
| completion | ||
| containers | ||
| diff | ||
| generate | ||
| healthcheck | ||
| images | ||
| inspect | ||
| machine | ||
| manifest | ||
| networks | ||
| parse | ||
| play | ||
| pods | ||
| registry | ||
| secrets | ||
| system | ||
| utils | ||
| validate | ||
| volumes | ||
| auto-update.go | ||
| diff.go | ||
| early_init_linux.go | ||
| early_init_unsupported.go | ||
| inspect.go | ||
| login.go | ||
| logout.go | ||
| main.go | ||
| README.md | ||
| root.go | ||
| root_test.go | ||
| shell_completion_test.go | ||
| syslog_linux.go | ||
| syslog_unsupported.go | ||
Podman CLI
The following is an example of how to add a new primary command (manifest) and a sub-command (inspect) to the Podman CLI.
This is example code, the production code has additional error checking and the business logic provided.
See items below for details on building, installing, contributing to Podman:
Adding a new command podman manifest
$ mkdir -p $GOPATH/src/github.com/containers/podman/cmd/podmanV2/manifests
Create the file $GOPATH/src/github.com/containers/podman/cmd/podmanV2/manifests/manifest.go
package manifests
import (
"github.com/containers/podman/cmd/podman/registry"
"github.com/containers/podman/cmd/podman/validate"
"github.com/containers/podman/pkg/domain/entities"
"github.com/spf13/cobra"
)
var (
// podman _manifests_
manifestCmd = &cobra.Command{
Use: "manifest",
Short: "Manage manifests",
Args: cobra.ExactArgs(1),
Long: "Manage manifests",
Example: "podman manifest IMAGE",
TraverseChildren: true,
RunE: validate.SubCommandExists, // Report error if there is no sub command given
}
)
func init() {
// Subscribe command to podman
registry.Commands = append(registry.Commands, registry.CliCommand{
Command: manifestCmd,
})
}
To "wire" in the manifest command, edit the file $GOPATH/src/github.com/containers/podman/cmd/podmanV2/main.go to add:
package main
import _ "github.com/containers/podman/cmd/podman/manifests"
Adding a new sub command podman manifests list
Create the file $GOPATH/src/github.com/containers/podman/cmd/podmanV2/manifests/inspect.go
package manifests
import (
"github.com/containers/podman/cmd/podman/registry"
"github.com/containers/podman/pkg/domain/entities"
"github.com/spf13/cobra"
)
var (
// podman manifests _inspect_
inspectCmd = &cobra.Command{
Use: "inspect IMAGE",
Short: "Display manifest from image",
Long: "Displays the low-level information on a manifest identified by image name or ID",
RunE: inspect,
Annotations: map[string]string{
// Add this annotation if this command cannot be run rootless
// registry.ParentNSRequired: "",
},
Example: "podman manifest inspect DEADBEEF",
}
)
func init() {
// Subscribe inspect sub command to manifest command
registry.Commands = append(registry.Commands, registry.CliCommand{
Command: inspectCmd,
// The parent command to proceed this command on the CLI
Parent: manifestCmd,
})
// This is where you would configure the cobra flags using inspectCmd.Flags()
}
// Business logic: cmd is inspectCmd, args is the positional arguments from os.Args
func inspect(cmd *cobra.Command, args []string) error {
// Business logic using registry.ImageEngine()
// Do not pull from libpod directly use the domain objects and types
return nil
}
Helper functions
The complete set can be found in the validate package, here are some examples:
cobra.Command{ Args: validate.NoArgs }used when the command does not accept errorscobra.Command{ Args: validate.IdOrLatestArgs }used to ensure either a list of ids given or the --latest flagcobra.Command{ RunE: validate.SubCommandExists }used to validate a subcommand given to a commandvalidate.ChoiceValueused to create apflag.Valuethat validate user input against a provided slice of values. For example:flags := cobraCommand.Flags() created := validate.ChoiceValue(&opts.Sort, "command", "created", "id", "image", "names", "runningfor", "size", "status") flags.Var(created, "sort", "Sort output by: "+created.Choices())