spiegel_podman/cmd/podman/pods/start.go
cdoern d28e85741f InfraContainer Rework
InfraContainer should go through the same creation process as regular containers. This change was from the cmd level
down, involving new container CLI opts and specgen creating functions. What now happens is that both container and pod
cli options are populated in cmd and used to create a podSpecgen and a containerSpecgen. The process then goes as follows

FillOutSpecGen (infra) -> MapSpec (podOpts -> infraOpts) -> PodCreate -> MakePod -> createPodOptions -> NewPod -> CompleteSpec (infra) -> MakeContainer -> NewContainer -> newContainer -> AddInfra (to pod state)

Signed-off-by: cdoern <cdoern@redhat.com>
2021-08-26 16:05:16 -04:00

87 lines
2.3 KiB
Go

package pods
import (
"context"
"fmt"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v3/cmd/podman/common"
"github.com/containers/podman/v3/cmd/podman/registry"
"github.com/containers/podman/v3/cmd/podman/utils"
"github.com/containers/podman/v3/cmd/podman/validate"
"github.com/containers/podman/v3/pkg/domain/entities"
"github.com/containers/podman/v3/pkg/specgenutil"
"github.com/spf13/cobra"
)
// allows for splitting API and CLI-only options
type podStartOptionsWrapper struct {
entities.PodStartOptions
PodIDFiles []string
}
var (
podStartDescription = `The pod name or ID can be used.
All containers defined in the pod will be started.`
startCommand = &cobra.Command{
Use: "start [options] POD [POD...]",
Short: "Start one or more pods",
Long: podStartDescription,
RunE: start,
Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndPodIDFile(cmd, args, false, true)
},
ValidArgsFunction: common.AutocompletePods,
Example: `podman pod start podID
podman pod start --latest
podman pod start --all`,
}
)
var (
startOptions = podStartOptionsWrapper{}
)
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Command: startCommand,
Parent: podCmd,
})
flags := startCommand.Flags()
flags.BoolVarP(&startOptions.All, "all", "a", false, "Restart all running pods")
podIDFileFlagName := "pod-id-file"
flags.StringArrayVarP(&startOptions.PodIDFiles, podIDFileFlagName, "", nil, "Read the pod ID from the file")
_ = startCommand.RegisterFlagCompletionFunc(podIDFileFlagName, completion.AutocompleteDefault)
validate.AddLatestFlag(startCommand, &startOptions.Latest)
}
func start(cmd *cobra.Command, args []string) error {
var (
errs utils.OutputErrors
)
ids, err := specgenutil.ReadPodIDFiles(startOptions.PodIDFiles)
if err != nil {
return err
}
args = append(args, ids...)
responses, err := registry.ContainerEngine().PodStart(context.Background(), args, startOptions.PodStartOptions)
if err != nil {
return err
}
// in the cli, first we print out all the successful attempts
for _, r := range responses {
if len(r.Errs) == 0 {
fmt.Println(r.Id)
} else {
errs = append(errs, r.Errs...)
}
}
return errs.PrintErrors()
}