mirror of
https://github.com/containers/podman.git
synced 2025-06-28 14:29:04 +08:00
Merge pull request #2422 from baude/remotepodcreate
podman-remote create|ps
This commit is contained in:
@ -92,9 +92,7 @@ func getContainerSubCommands() []*cobra.Command {
|
|||||||
// Commands that the local client implements
|
// Commands that the local client implements
|
||||||
func getPodSubCommands() []*cobra.Command {
|
func getPodSubCommands() []*cobra.Command {
|
||||||
return []*cobra.Command{
|
return []*cobra.Command{
|
||||||
_podCreateCommand,
|
|
||||||
_podPauseCommand,
|
_podPauseCommand,
|
||||||
_podPsCommand,
|
|
||||||
_podRestartCommand,
|
_podRestartCommand,
|
||||||
_podStatsCommand,
|
_podStatsCommand,
|
||||||
_podTopCommand,
|
_podTopCommand,
|
||||||
|
@ -20,9 +20,11 @@ var podCommand = cliconfig.PodmanCommand{
|
|||||||
|
|
||||||
//podSubCommands are implemented both in local and remote clients
|
//podSubCommands are implemented both in local and remote clients
|
||||||
var podSubCommands = []*cobra.Command{
|
var podSubCommands = []*cobra.Command{
|
||||||
|
_podCreateCommand,
|
||||||
_podExistsCommand,
|
_podExistsCommand,
|
||||||
_podInspectCommand,
|
_podInspectCommand,
|
||||||
_podKillCommand,
|
_podKillCommand,
|
||||||
|
_podPsCommand,
|
||||||
_podRmCommand,
|
_podRmCommand,
|
||||||
_podStartCommand,
|
_podStartCommand,
|
||||||
_podStopCommand,
|
_podStopCommand,
|
||||||
|
@ -3,12 +3,10 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/containers/libpod/cmd/podman/cliconfig"
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
||||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
|
||||||
"github.com/containers/libpod/cmd/podman/shared"
|
|
||||||
"github.com/containers/libpod/libpod"
|
"github.com/containers/libpod/libpod"
|
||||||
|
"github.com/containers/libpod/pkg/adapter"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -56,20 +54,29 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func podCreateCmd(c *cliconfig.PodCreateValues) error {
|
func podCreateCmd(c *cliconfig.PodCreateValues) error {
|
||||||
var options []libpod.PodCreateOption
|
var (
|
||||||
var err error
|
err error
|
||||||
|
podIdFile *os.File
|
||||||
|
)
|
||||||
|
|
||||||
if len(c.InputArgs) > 0 {
|
if len(c.InputArgs) > 0 {
|
||||||
return errors.New("podman pod create does not accept any arguments")
|
return errors.New("podman pod create does not accept any arguments")
|
||||||
}
|
}
|
||||||
|
runtime, err := adapter.GetRuntime(&c.PodmanCommand)
|
||||||
runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "error creating libpod runtime")
|
return errors.Wrapf(err, "error creating libpod runtime")
|
||||||
}
|
}
|
||||||
defer runtime.Shutdown(false)
|
defer runtime.Shutdown(false)
|
||||||
|
|
||||||
var podIdFile *os.File
|
if len(c.Publish) > 0 {
|
||||||
|
if !c.Infra {
|
||||||
|
return errors.Errorf("you must have an infra container to publish port bindings to the host")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !c.Infra && c.Flag("share").Changed && c.Share != "none" && c.Share != "" {
|
||||||
|
return errors.Errorf("You cannot share kernel namespaces on the pod level without an infra container")
|
||||||
|
}
|
||||||
if c.Flag("pod-id-file").Changed && os.Geteuid() == 0 {
|
if c.Flag("pod-id-file").Changed && os.Geteuid() == 0 {
|
||||||
podIdFile, err = libpod.OpenExclusiveFile(c.PodIDFile)
|
podIdFile, err = libpod.OpenExclusiveFile(c.PodIDFile)
|
||||||
if err != nil && os.IsExist(err) {
|
if err != nil && os.IsExist(err) {
|
||||||
@ -82,67 +89,21 @@ func podCreateCmd(c *cliconfig.PodCreateValues) error {
|
|||||||
defer podIdFile.Sync()
|
defer podIdFile.Sync()
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(c.Publish) > 0 {
|
|
||||||
if !c.Infra {
|
|
||||||
return errors.Errorf("you must have an infra container to publish port bindings to the host")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !c.Infra && c.Flag("share").Changed && c.Share != "none" && c.Share != "" {
|
|
||||||
return errors.Errorf("You cannot share kernel namespaces on the pod level without an infra container")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.Flag("cgroup-parent").Changed {
|
|
||||||
options = append(options, libpod.WithPodCgroupParent(c.CgroupParent))
|
|
||||||
}
|
|
||||||
|
|
||||||
labels, err := getAllLabels(c.LabelFile, c.Labels)
|
labels, err := getAllLabels(c.LabelFile, c.Labels)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "unable to process labels")
|
return errors.Wrapf(err, "unable to process labels")
|
||||||
}
|
}
|
||||||
if len(labels) != 0 {
|
|
||||||
options = append(options, libpod.WithPodLabels(labels))
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.Flag("name").Changed {
|
podID, err := runtime.CreatePod(getContext(), c, labels)
|
||||||
options = append(options, libpod.WithPodName(c.Name))
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.Infra {
|
|
||||||
options = append(options, libpod.WithInfraContainer())
|
|
||||||
nsOptions, err := shared.GetNamespaceOptions(strings.Split(c.Share, ","))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return errors.Wrapf(err, "unable to create pod")
|
||||||
}
|
}
|
||||||
options = append(options, nsOptions...)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(c.Publish) > 0 {
|
|
||||||
portBindings, err := shared.CreatePortBindings(c.Publish)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
options = append(options, libpod.WithInfraContainerPorts(portBindings))
|
|
||||||
|
|
||||||
}
|
|
||||||
// always have containers use pod cgroups
|
|
||||||
// User Opt out is not yet supported
|
|
||||||
options = append(options, libpod.WithPodCgroups())
|
|
||||||
|
|
||||||
ctx := getContext()
|
|
||||||
pod, err := runtime.NewPod(ctx, options...)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if podIdFile != nil {
|
if podIdFile != nil {
|
||||||
_, err = podIdFile.WriteString(pod.ID())
|
_, err = podIdFile.WriteString(podID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Error(err)
|
logrus.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fmt.Printf("%s\n", podID)
|
||||||
fmt.Printf("%s\n", pod.ID())
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -10,9 +10,9 @@ import (
|
|||||||
|
|
||||||
"github.com/containers/libpod/cmd/podman/cliconfig"
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
||||||
"github.com/containers/libpod/cmd/podman/formats"
|
"github.com/containers/libpod/cmd/podman/formats"
|
||||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
|
||||||
"github.com/containers/libpod/cmd/podman/shared"
|
"github.com/containers/libpod/cmd/podman/shared"
|
||||||
"github.com/containers/libpod/libpod"
|
"github.com/containers/libpod/libpod"
|
||||||
|
"github.com/containers/libpod/pkg/adapter"
|
||||||
"github.com/containers/libpod/pkg/util"
|
"github.com/containers/libpod/pkg/util"
|
||||||
"github.com/docker/go-units"
|
"github.com/docker/go-units"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@ -29,6 +29,8 @@ const (
|
|||||||
NUM_CTR_INFO = 10
|
NUM_CTR_INFO = 10
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type PodFilter func(*adapter.Pod) bool
|
||||||
|
|
||||||
var (
|
var (
|
||||||
bc_opts shared.PsOptions
|
bc_opts shared.PsOptions
|
||||||
)
|
)
|
||||||
@ -152,7 +154,7 @@ func podPsCmd(c *cliconfig.PodPsValues) error {
|
|||||||
return errors.Wrapf(err, "error with flags passed")
|
return errors.Wrapf(err, "error with flags passed")
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
|
runtime, err := adapter.GetRuntime(&c.PodmanCommand)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "error creating libpod runtime")
|
return errors.Wrapf(err, "error creating libpod runtime")
|
||||||
}
|
}
|
||||||
@ -173,7 +175,7 @@ func podPsCmd(c *cliconfig.PodPsValues) error {
|
|||||||
|
|
||||||
opts.Format = genPodPsFormat(c)
|
opts.Format = genPodPsFormat(c)
|
||||||
|
|
||||||
var filterFuncs []libpod.PodFilter
|
var filterFuncs []PodFilter
|
||||||
if c.Filter != "" {
|
if c.Filter != "" {
|
||||||
filters := strings.Split(c.Filter, ",")
|
filters := strings.Split(c.Filter, ",")
|
||||||
for _, f := range filters {
|
for _, f := range filters {
|
||||||
@ -181,7 +183,7 @@ func podPsCmd(c *cliconfig.PodPsValues) error {
|
|||||||
if len(filterSplit) < 2 {
|
if len(filterSplit) < 2 {
|
||||||
return errors.Errorf("filter input must be in the form of filter=value: %s is invalid", f)
|
return errors.Errorf("filter input must be in the form of filter=value: %s is invalid", f)
|
||||||
}
|
}
|
||||||
generatedFunc, err := generatePodFilterFuncs(filterSplit[0], filterSplit[1], runtime)
|
generatedFunc, err := generatePodFilterFuncs(filterSplit[0], filterSplit[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "invalid filter")
|
return errors.Wrapf(err, "invalid filter")
|
||||||
}
|
}
|
||||||
@ -189,7 +191,7 @@ func podPsCmd(c *cliconfig.PodPsValues) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var pods []*libpod.Pod
|
var pods []*adapter.Pod
|
||||||
if c.Latest {
|
if c.Latest {
|
||||||
pod, err := runtime.GetLatestPod()
|
pod, err := runtime.GetLatestPod()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -203,7 +205,7 @@ func podPsCmd(c *cliconfig.PodPsValues) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
podsFiltered := make([]*libpod.Pod, 0, len(pods))
|
podsFiltered := make([]*adapter.Pod, 0, len(pods))
|
||||||
for _, pod := range pods {
|
for _, pod := range pods {
|
||||||
include := true
|
include := true
|
||||||
for _, filter := range filterFuncs {
|
for _, filter := range filterFuncs {
|
||||||
@ -215,7 +217,7 @@ func podPsCmd(c *cliconfig.PodPsValues) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return generatePodPsOutput(podsFiltered, opts, runtime)
|
return generatePodPsOutput(podsFiltered, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
// podPsCheckFlagsPassed checks if mutually exclusive flags are passed together
|
// podPsCheckFlagsPassed checks if mutually exclusive flags are passed together
|
||||||
@ -234,10 +236,10 @@ func podPsCheckFlagsPassed(c *cliconfig.PodPsValues) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func generatePodFilterFuncs(filter, filterValue string, runtime *libpod.Runtime) (func(pod *libpod.Pod) bool, error) {
|
func generatePodFilterFuncs(filter, filterValue string) (func(pod *adapter.Pod) bool, error) {
|
||||||
switch filter {
|
switch filter {
|
||||||
case "ctr-ids":
|
case "ctr-ids":
|
||||||
return func(p *libpod.Pod) bool {
|
return func(p *adapter.Pod) bool {
|
||||||
ctrIds, err := p.AllContainersByID()
|
ctrIds, err := p.AllContainersByID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
@ -245,7 +247,7 @@ func generatePodFilterFuncs(filter, filterValue string, runtime *libpod.Runtime)
|
|||||||
return util.StringInSlice(filterValue, ctrIds)
|
return util.StringInSlice(filterValue, ctrIds)
|
||||||
}, nil
|
}, nil
|
||||||
case "ctr-names":
|
case "ctr-names":
|
||||||
return func(p *libpod.Pod) bool {
|
return func(p *adapter.Pod) bool {
|
||||||
ctrs, err := p.AllContainers()
|
ctrs, err := p.AllContainers()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
@ -258,7 +260,7 @@ func generatePodFilterFuncs(filter, filterValue string, runtime *libpod.Runtime)
|
|||||||
return false
|
return false
|
||||||
}, nil
|
}, nil
|
||||||
case "ctr-number":
|
case "ctr-number":
|
||||||
return func(p *libpod.Pod) bool {
|
return func(p *adapter.Pod) bool {
|
||||||
ctrIds, err := p.AllContainersByID()
|
ctrIds, err := p.AllContainersByID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
@ -274,7 +276,7 @@ func generatePodFilterFuncs(filter, filterValue string, runtime *libpod.Runtime)
|
|||||||
if !util.StringInSlice(filterValue, []string{"created", "restarting", "running", "paused", "exited", "unknown"}) {
|
if !util.StringInSlice(filterValue, []string{"created", "restarting", "running", "paused", "exited", "unknown"}) {
|
||||||
return nil, errors.Errorf("%s is not a valid status", filterValue)
|
return nil, errors.Errorf("%s is not a valid status", filterValue)
|
||||||
}
|
}
|
||||||
return func(p *libpod.Pod) bool {
|
return func(p *adapter.Pod) bool {
|
||||||
ctr_statuses, err := p.Status()
|
ctr_statuses, err := p.Status()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
@ -291,19 +293,19 @@ func generatePodFilterFuncs(filter, filterValue string, runtime *libpod.Runtime)
|
|||||||
return false
|
return false
|
||||||
}, nil
|
}, nil
|
||||||
case "id":
|
case "id":
|
||||||
return func(p *libpod.Pod) bool {
|
return func(p *adapter.Pod) bool {
|
||||||
return strings.Contains(p.ID(), filterValue)
|
return strings.Contains(p.ID(), filterValue)
|
||||||
}, nil
|
}, nil
|
||||||
case "name":
|
case "name":
|
||||||
return func(p *libpod.Pod) bool {
|
return func(p *adapter.Pod) bool {
|
||||||
return strings.Contains(p.Name(), filterValue)
|
return strings.Contains(p.Name(), filterValue)
|
||||||
}, nil
|
}, nil
|
||||||
case "status":
|
case "status":
|
||||||
if !util.StringInSlice(filterValue, []string{"stopped", "running", "paused", "exited", "dead", "created"}) {
|
if !util.StringInSlice(filterValue, []string{"stopped", "running", "paused", "exited", "dead", "created"}) {
|
||||||
return nil, errors.Errorf("%s is not a valid pod status", filterValue)
|
return nil, errors.Errorf("%s is not a valid pod status", filterValue)
|
||||||
}
|
}
|
||||||
return func(p *libpod.Pod) bool {
|
return func(p *adapter.Pod) bool {
|
||||||
status, err := shared.GetPodStatus(p)
|
status, err := p.GetPodStatus()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -448,7 +450,7 @@ func getPodTemplateOutput(psParams []podPsJSONParams, opts podPsOptions) ([]podP
|
|||||||
return psOutput, nil
|
return psOutput, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getNamespaces(pod *libpod.Pod) []string {
|
func getNamespaces(pod *adapter.Pod) []string {
|
||||||
var shared []string
|
var shared []string
|
||||||
if pod.SharesPID() {
|
if pod.SharesPID() {
|
||||||
shared = append(shared, "pid")
|
shared = append(shared, "pid")
|
||||||
@ -475,7 +477,7 @@ func getNamespaces(pod *libpod.Pod) []string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// getAndSortPodJSONOutput returns the container info in its raw, sorted form
|
// getAndSortPodJSONOutput returns the container info in its raw, sorted form
|
||||||
func getAndSortPodJSONParams(pods []*libpod.Pod, opts podPsOptions, runtime *libpod.Runtime) ([]podPsJSONParams, error) {
|
func getAndSortPodJSONParams(pods []*adapter.Pod, opts podPsOptions) ([]podPsJSONParams, error) {
|
||||||
var (
|
var (
|
||||||
psOutput []podPsJSONParams
|
psOutput []podPsJSONParams
|
||||||
)
|
)
|
||||||
@ -487,7 +489,7 @@ func getAndSortPodJSONParams(pods []*libpod.Pod, opts podPsOptions, runtime *lib
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
ctrNum := len(ctrs)
|
ctrNum := len(ctrs)
|
||||||
status, err := shared.GetPodStatus(pod)
|
status, err := pod.GetPodStatus()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -497,7 +499,7 @@ func getAndSortPodJSONParams(pods []*libpod.Pod, opts podPsOptions, runtime *lib
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
for _, ctr := range ctrs {
|
for _, ctr := range ctrs {
|
||||||
batchInfo, err := shared.BatchContainerOp(ctr, bc_opts)
|
batchInfo, err := adapter.BatchContainerOp(ctr, bc_opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -539,11 +541,11 @@ func getAndSortPodJSONParams(pods []*libpod.Pod, opts podPsOptions, runtime *lib
|
|||||||
return sortPodPsOutput(opts.Sort, psOutput)
|
return sortPodPsOutput(opts.Sort, psOutput)
|
||||||
}
|
}
|
||||||
|
|
||||||
func generatePodPsOutput(pods []*libpod.Pod, opts podPsOptions, runtime *libpod.Runtime) error {
|
func generatePodPsOutput(pods []*adapter.Pod, opts podPsOptions) error {
|
||||||
if len(pods) == 0 && opts.Format != formats.JSONString {
|
if len(pods) == 0 && opts.Format != formats.JSONString {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
psOutput, err := getAndSortPodJSONParams(pods, opts, runtime)
|
psOutput, err := getAndSortPodJSONParams(pods, opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,10 @@ func GetPodStatus(pod *libpod.Pod) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return errored, err
|
return errored, err
|
||||||
}
|
}
|
||||||
|
return CreatePodStatusResults(ctrStatuses)
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreatePodStatusResults(ctrStatuses map[string]libpod.ContainerStatus) (string, error) {
|
||||||
ctrNum := len(ctrStatuses)
|
ctrNum := len(ctrStatuses)
|
||||||
if ctrNum == 0 {
|
if ctrNum == 0 {
|
||||||
return created, nil
|
return created, nil
|
||||||
|
@ -172,7 +172,7 @@ func getPodsFromContext(c *cliconfig.PodmanCommand, r *libpod.Runtime) ([]*libpo
|
|||||||
var err error
|
var err error
|
||||||
|
|
||||||
if c.Bool("all") {
|
if c.Bool("all") {
|
||||||
pods, err = r.Pods()
|
pods, err = r.GetAllPods()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "unable to get running pods")
|
return nil, errors.Wrapf(err, "unable to get running pods")
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ package adapter
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"github.com/containers/libpod/cmd/podman/shared"
|
||||||
|
|
||||||
iopodman "github.com/containers/libpod/cmd/podman/varlink"
|
iopodman "github.com/containers/libpod/cmd/podman/varlink"
|
||||||
"github.com/containers/libpod/libpod"
|
"github.com/containers/libpod/libpod"
|
||||||
@ -48,3 +49,33 @@ func (c *Container) Config() *libpod.ContainerConfig {
|
|||||||
}
|
}
|
||||||
return c.Runtime.Config(c.ID())
|
return c.Runtime.Config(c.ID())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Name returns the name of the container
|
||||||
|
func (c *Container) Name() string {
|
||||||
|
return c.config.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
// BatchContainerOp is wrapper func to mimic shared's function with a similar name meant for libpod
|
||||||
|
func BatchContainerOp(ctr *Container, opts shared.PsOptions) (shared.BatchContainerStruct, error) {
|
||||||
|
// TODO If pod ps ever shows container's sizes, re-enable this code; otherwise it isn't needed
|
||||||
|
// and would be a perf hit
|
||||||
|
//data, err := ctr.Inspect(true)
|
||||||
|
//if err != nil {
|
||||||
|
// return shared.BatchContainerStruct{}, err
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//size := new(shared.ContainerSize)
|
||||||
|
//size.RootFsSize = data.SizeRootFs
|
||||||
|
//size.RwSize = data.SizeRw
|
||||||
|
|
||||||
|
bcs := shared.BatchContainerStruct{
|
||||||
|
ConConfig: ctr.config,
|
||||||
|
ConState: ctr.state.State,
|
||||||
|
ExitCode: ctr.state.ExitCode,
|
||||||
|
Pid: ctr.state.PID,
|
||||||
|
StartedTime: ctr.state.StartedTime,
|
||||||
|
ExitedTime: ctr.state.FinishedTime,
|
||||||
|
//Size: size,
|
||||||
|
}
|
||||||
|
return bcs, nil
|
||||||
|
}
|
||||||
|
@ -4,10 +4,12 @@ package adapter
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/containers/libpod/pkg/adapter/shortcuts"
|
"strings"
|
||||||
|
|
||||||
"github.com/containers/libpod/cmd/podman/cliconfig"
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
||||||
|
"github.com/containers/libpod/cmd/podman/shared"
|
||||||
"github.com/containers/libpod/libpod"
|
"github.com/containers/libpod/libpod"
|
||||||
|
"github.com/containers/libpod/pkg/adapter/shortcuts"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Pod ...
|
// Pod ...
|
||||||
@ -45,6 +47,21 @@ func (r *LocalRuntime) GetLatestPod() (*Pod, error) {
|
|||||||
return &pod, err
|
return &pod, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetAllPods gets all pods and wraps it in an adapter pod
|
||||||
|
func (r *LocalRuntime) GetAllPods() ([]*Pod, error) {
|
||||||
|
var pods []*Pod
|
||||||
|
allPods, err := r.Runtime.GetAllPods()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, p := range allPods {
|
||||||
|
pod := Pod{}
|
||||||
|
pod.Pod = p
|
||||||
|
pods = append(pods, &pod)
|
||||||
|
}
|
||||||
|
return pods, nil
|
||||||
|
}
|
||||||
|
|
||||||
// LookupPod gets a pod by name or id and wraps it in an adapter pod
|
// LookupPod gets a pod by name or id and wraps it in an adapter pod
|
||||||
func (r *LocalRuntime) LookupPod(nameOrID string) (*Pod, error) {
|
func (r *LocalRuntime) LookupPod(nameOrID string) (*Pod, error) {
|
||||||
pod := Pod{}
|
pod := Pod{}
|
||||||
@ -150,3 +167,60 @@ func (r *LocalRuntime) StartPods(ctx context.Context, cli *cliconfig.PodStartVal
|
|||||||
}
|
}
|
||||||
return podids, errs
|
return podids, errs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreatePod is a wrapper for libpod and creating a new pod from the cli context
|
||||||
|
func (r *LocalRuntime) CreatePod(ctx context.Context, cli *cliconfig.PodCreateValues, labels map[string]string) (string, error) {
|
||||||
|
var (
|
||||||
|
options []libpod.PodCreateOption
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
if cli.Flag("cgroup-parent").Changed {
|
||||||
|
options = append(options, libpod.WithPodCgroupParent(cli.CgroupParent))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(labels) != 0 {
|
||||||
|
options = append(options, libpod.WithPodLabels(labels))
|
||||||
|
}
|
||||||
|
|
||||||
|
if cli.Flag("name").Changed {
|
||||||
|
options = append(options, libpod.WithPodName(cli.Name))
|
||||||
|
}
|
||||||
|
|
||||||
|
if cli.Infra {
|
||||||
|
options = append(options, libpod.WithInfraContainer())
|
||||||
|
nsOptions, err := shared.GetNamespaceOptions(strings.Split(cli.Share, ","))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
options = append(options, nsOptions...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(cli.Publish) > 0 {
|
||||||
|
portBindings, err := shared.CreatePortBindings(cli.Publish)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
options = append(options, libpod.WithInfraContainerPorts(portBindings))
|
||||||
|
|
||||||
|
}
|
||||||
|
// always have containers use pod cgroups
|
||||||
|
// User Opt out is not yet supported
|
||||||
|
options = append(options, libpod.WithPodCgroups())
|
||||||
|
|
||||||
|
pod, err := r.NewPod(ctx, options...)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return pod.ID(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPodStatus is a wrapper to get the status of a local libpod pod
|
||||||
|
func (p *Pod) GetPodStatus() (string, error) {
|
||||||
|
return shared.GetPodStatus(p.Pod)
|
||||||
|
}
|
||||||
|
|
||||||
|
// BatchContainerOp is a wrapper for the shared function of the same name
|
||||||
|
func BatchContainerOp(ctr *libpod.Container, opts shared.PsOptions) (shared.BatchContainerStruct, error) {
|
||||||
|
return shared.BatchContainerOp(ctr, opts)
|
||||||
|
}
|
||||||
|
@ -5,8 +5,11 @@ package adapter
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/containers/libpod/cmd/podman/cliconfig"
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
||||||
|
"github.com/containers/libpod/cmd/podman/shared"
|
||||||
"github.com/containers/libpod/cmd/podman/varlink"
|
"github.com/containers/libpod/cmd/podman/varlink"
|
||||||
"github.com/containers/libpod/libpod"
|
"github.com/containers/libpod/libpod"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@ -168,3 +171,159 @@ func (r *LocalRuntime) StartPods(ctx context.Context, cli *cliconfig.PodStartVal
|
|||||||
}
|
}
|
||||||
return startPods, startErrs
|
return startPods, startErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreatePod creates a pod for the remote client over a varlink connection
|
||||||
|
func (r *LocalRuntime) CreatePod(ctx context.Context, cli *cliconfig.PodCreateValues, labels map[string]string) (string, error) {
|
||||||
|
pc := iopodman.PodCreate{
|
||||||
|
Name: cli.Name,
|
||||||
|
CgroupParent: cli.CgroupParent,
|
||||||
|
Labels: labels,
|
||||||
|
Share: strings.Split(cli.Share, ","),
|
||||||
|
Infra: cli.Infra,
|
||||||
|
InfraCommand: cli.InfraCommand,
|
||||||
|
InfraImage: cli.InfraCommand,
|
||||||
|
Publish: cli.Publish,
|
||||||
|
}
|
||||||
|
|
||||||
|
return iopodman.CreatePod().Call(r.Conn, pc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllPods is a helper function that gets all pods for the remote client
|
||||||
|
func (r *LocalRuntime) GetAllPods() ([]*Pod, error) {
|
||||||
|
var pods []*Pod
|
||||||
|
podIDs, err := iopodman.GetPodsByContext().Call(r.Conn, true, false, []string{})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, p := range podIDs {
|
||||||
|
pod, err := r.LookupPod(p)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pods = append(pods, pod)
|
||||||
|
}
|
||||||
|
return pods, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ID returns the id of a remote pod
|
||||||
|
func (p *Pod) ID() string {
|
||||||
|
return p.config.ID
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name returns the name of the remote pod
|
||||||
|
func (p *Pod) Name() string {
|
||||||
|
return p.config.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllContainersByID returns a slice of a pod's container IDs
|
||||||
|
func (p *Pod) AllContainersByID() ([]string, error) {
|
||||||
|
var containerIDs []string
|
||||||
|
for _, ctr := range p.containers {
|
||||||
|
containerIDs = append(containerIDs, ctr.ID)
|
||||||
|
}
|
||||||
|
return containerIDs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllContainers returns a pods containers
|
||||||
|
func (p *Pod) AllContainers() ([]*Container, error) {
|
||||||
|
var containers []*Container
|
||||||
|
for _, ctr := range p.containers {
|
||||||
|
container, err := p.Runtime.LookupContainer(ctr.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
containers = append(containers, container)
|
||||||
|
}
|
||||||
|
return containers, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status ...
|
||||||
|
func (p *Pod) Status() (map[string]libpod.ContainerStatus, error) {
|
||||||
|
ctrs := make(map[string]libpod.ContainerStatus)
|
||||||
|
for _, i := range p.containers {
|
||||||
|
var status libpod.ContainerStatus
|
||||||
|
switch i.State {
|
||||||
|
case "exited":
|
||||||
|
status = libpod.ContainerStateExited
|
||||||
|
case "stopped":
|
||||||
|
status = libpod.ContainerStateStopped
|
||||||
|
case "running":
|
||||||
|
status = libpod.ContainerStateRunning
|
||||||
|
case "paused":
|
||||||
|
status = libpod.ContainerStatePaused
|
||||||
|
case "created":
|
||||||
|
status = libpod.ContainerStateCreated
|
||||||
|
case "configured":
|
||||||
|
status = libpod.ContainerStateConfigured
|
||||||
|
default:
|
||||||
|
status = libpod.ContainerStateUnknown
|
||||||
|
}
|
||||||
|
ctrs[i.ID] = status
|
||||||
|
}
|
||||||
|
return ctrs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPodStatus is a wrapper to get the string version of the status
|
||||||
|
func (p *Pod) GetPodStatus() (string, error) {
|
||||||
|
ctrStatuses, err := p.Status()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return shared.CreatePodStatusResults(ctrStatuses)
|
||||||
|
}
|
||||||
|
|
||||||
|
// InfraContainerID returns the ID of the infra container in a pod
|
||||||
|
func (p *Pod) InfraContainerID() (string, error) {
|
||||||
|
return p.state.InfraContainerID, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreatedTime returns the time the container was created as a time.Time
|
||||||
|
func (p *Pod) CreatedTime() time.Time {
|
||||||
|
return p.config.CreatedTime
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharesPID ....
|
||||||
|
func (p *Pod) SharesPID() bool {
|
||||||
|
return p.config.UsePodPID
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharesIPC returns whether containers in pod
|
||||||
|
// default to use IPC namespace of first container in pod
|
||||||
|
func (p *Pod) SharesIPC() bool {
|
||||||
|
return p.config.UsePodIPC
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharesNet returns whether containers in pod
|
||||||
|
// default to use network namespace of first container in pod
|
||||||
|
func (p *Pod) SharesNet() bool {
|
||||||
|
return p.config.UsePodNet
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharesMount returns whether containers in pod
|
||||||
|
// default to use PID namespace of first container in pod
|
||||||
|
func (p *Pod) SharesMount() bool {
|
||||||
|
return p.config.UsePodMount
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharesUser returns whether containers in pod
|
||||||
|
// default to use user namespace of first container in pod
|
||||||
|
func (p *Pod) SharesUser() bool {
|
||||||
|
return p.config.UsePodUser
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharesUTS returns whether containers in pod
|
||||||
|
// default to use UTS namespace of first container in pod
|
||||||
|
func (p *Pod) SharesUTS() bool {
|
||||||
|
return p.config.UsePodUTS
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharesCgroup returns whether containers in the pod will default to this pod's
|
||||||
|
// cgroup instead of the default libpod parent
|
||||||
|
func (p *Pod) SharesCgroup() bool {
|
||||||
|
return p.config.UsePodCgroup
|
||||||
|
}
|
||||||
|
|
||||||
|
// CgroupParent returns the pod's CGroup parent
|
||||||
|
func (p *Pod) CgroupParent() string {
|
||||||
|
return p.config.CgroupParent
|
||||||
|
}
|
||||||
|
@ -14,10 +14,6 @@ import (
|
|||||||
// CreatePod ...
|
// CreatePod ...
|
||||||
func (i *LibpodAPI) CreatePod(call iopodman.VarlinkCall, create iopodman.PodCreate) error {
|
func (i *LibpodAPI) CreatePod(call iopodman.VarlinkCall, create iopodman.PodCreate) error {
|
||||||
var options []libpod.PodCreateOption
|
var options []libpod.PodCreateOption
|
||||||
|
|
||||||
if create.InfraCommand != "" || create.InfraImage != "" {
|
|
||||||
return call.ReplyErrorOccurred("the infra-command and infra-image options are not supported yet")
|
|
||||||
}
|
|
||||||
if create.CgroupParent != "" {
|
if create.CgroupParent != "" {
|
||||||
options = append(options, libpod.WithPodCgroupParent(create.CgroupParent))
|
options = append(options, libpod.WithPodCgroupParent(create.CgroupParent))
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user