Merge pull request #5634 from jwhonce/wip/service

V2 podman system service
This commit is contained in:
OpenShift Merge Robot
2020-04-09 14:55:45 +02:00
committed by GitHub
37 changed files with 498 additions and 180 deletions

View File

@ -1,10 +1,5 @@
--- ---
run: run:
build-tags:
- apparmor
- seccomp
- selinux
- ABISupport
concurrency: 6 concurrency: 6
deadline: 5m deadline: 5m
skip-dirs-use-default: true skip-dirs-use-default: true
@ -12,6 +7,8 @@ run:
- contrib - contrib
- dependencies - dependencies
- test - test
- pkg/varlink
- pkg/varlinkapi
skip-files: skip-files:
- iopodman.go - iopodman.go
- swagger.go - swagger.go
@ -31,3 +28,7 @@ linters:
- misspell - misspell
- prealloc - prealloc
- unparam - unparam
linters-settings:
errcheck:
check-blank: false
ignore: encoding/json:^Unmarshal,fmt:.*

View File

@ -159,7 +159,7 @@ endif
.PHONY: golangci-lint .PHONY: golangci-lint
golangci-lint: .gopathok varlink_generate .install.golangci-lint golangci-lint: .gopathok varlink_generate .install.golangci-lint
$(GOBIN)/golangci-lint run hack/golangci-lint.sh run
.PHONY: gofmt .PHONY: gofmt
gofmt: ## Verify the source code gofmt gofmt: ## Verify the source code gofmt

View File

@ -14,7 +14,7 @@ func getMainCommands() []*cobra.Command {
} }
// commands that only the remoteclient implements // commands that only the remoteclient implements
func getAppCommands() []*cobra.Command { func getAppCommands() []*cobra.Command { // nolint:varcheck,deadcode,unused
return []*cobra.Command{} return []*cobra.Command{}
} }
@ -29,7 +29,7 @@ func getContainerSubCommands() []*cobra.Command {
} }
// commands that only the remoteclient implements // commands that only the remoteclient implements
func getGenerateSubCommands() []*cobra.Command { func getGenerateSubCommands() []*cobra.Command { // nolint:varcheck,deadcode,unused
return []*cobra.Command{} return []*cobra.Command{}
} }
@ -126,7 +126,7 @@ func getDefaultPidsDescription() string {
return "Tune container pids limit (set 0 for unlimited, -1 for server defaults)" return "Tune container pids limit (set 0 for unlimited, -1 for server defaults)"
} }
func getDefaultShareNetwork() string { func getDefaultShareNetwork() string { // nolint:varcheck,deadcode,unused
return "" return ""
} }

View File

@ -24,8 +24,8 @@ import (
var ( var (
exitCode = define.ExecErrorCodeGeneric exitCode = define.ExecErrorCodeGeneric
Ctx context.Context Ctx context.Context
span opentracing.Span span opentracing.Span // nolint:varcheck,deadcode,unused
closer io.Closer closer io.Closer // nolint:varcheck,deadcode,unused
) )
// Commands that the remote and local client have // Commands that the remote and local client have

View File

@ -91,7 +91,7 @@ func resolveApiURI(c *cliconfig.ServiceValues) (string, error) {
if len(c.InputArgs) > 0 { if len(c.InputArgs) > 0 {
apiURI = c.InputArgs[0] apiURI = c.InputArgs[0]
} else if ok := systemd.SocketActivated(); ok { } else if ok := systemd.SocketActivated(); ok { // nolint: gocritic
apiURI = "" apiURI = ""
} else if rootless.IsRootless() { } else if rootless.IsRootless() {
xdg, err := util.GetRuntimeDir() xdg, err := util.GetRuntimeDir()
@ -161,7 +161,7 @@ func runREST(r *libpod.Runtime, uri string, timeout time.Duration) error {
} }
func runVarlink(r *libpod.Runtime, uri string, timeout time.Duration, c *cliconfig.ServiceValues) error { func runVarlink(r *libpod.Runtime, uri string, timeout time.Duration, c *cliconfig.ServiceValues) error {
var varlinkInterfaces = []*iopodman.VarlinkInterface{varlinkapi.New(&c.PodmanCommand, r)} var varlinkInterfaces = []*iopodman.VarlinkInterface{varlinkapi.New(c.PodmanCommand.Command, r)}
service, err := varlink.NewService( service, err := varlink.NewService(
"Atomic", "Atomic",
"podman", "podman",
@ -182,7 +182,7 @@ func runVarlink(r *libpod.Runtime, uri string, timeout time.Duration, c *cliconf
if err = service.Listen(uri, timeout); err != nil { if err = service.Listen(uri, timeout); err != nil {
switch err.(type) { switch err.(type) {
case varlink.ServiceTimeoutError: case varlink.ServiceTimeoutError:
logrus.Infof("varlink service expired (use --timeout to increase session time beyond %d ms, 0 means never timeout)", timeout.String()) logrus.Infof("varlink service expired (use --timeout to increase session time beyond %s ms, 0 means never timeout)", timeout.String())
return nil return nil
default: default:
return errors.Wrapf(err, "unable to start varlink service") return errors.Wrapf(err, "unable to start varlink service")

View File

@ -5,6 +5,7 @@ package main
import "github.com/spf13/cobra" import "github.com/spf13/cobra"
var ( var (
// nolint:varcheck,deadcode,unused
_serviceCommand = &cobra.Command{ _serviceCommand = &cobra.Command{
Use: "", Use: "",
} }

View File

@ -85,7 +85,7 @@ func varlinkCmd(c *cliconfig.VarlinkValues) error {
} }
defer runtime.DeferredShutdown(false) defer runtime.DeferredShutdown(false)
var varlinkInterfaces = []*iopodman.VarlinkInterface{varlinkapi.New(&c.PodmanCommand, runtime)} var varlinkInterfaces = []*iopodman.VarlinkInterface{varlinkapi.New(c.PodmanCommand.Command, runtime)}
// Register varlink service. The metadata can be retrieved with: // Register varlink service. The metadata can be retrieved with:
// $ varlink info [varlink address URI] // $ varlink info [varlink address URI]
service, err := varlink.NewService( service, err := varlink.NewService(

View File

@ -5,6 +5,7 @@ package main
import "github.com/spf13/cobra" import "github.com/spf13/cobra"
var ( var (
// nolint:varcheck,deadcode,unused
_varlinkCommand = &cobra.Command{ _varlinkCommand = &cobra.Command{
Use: "", Use: "",
} }

View File

@ -1,2 +1,10 @@
all: all: podman podman-remote
CGO_ENABLED=1 GO111MODULE=off go build -tags 'ABISupport systemd seccomp'
podman:
CGO_ENABLED=1 GO111MODULE=off go build -tags 'ABISupport systemd varlink seccomp'
podman-remote:
CGO_ENABLED=1 GO111MODULE=off go build -tags '!ABISupport systemd seccomp' -o podmanV2-remote
clean:
rm podmanV2 podmanV2-remote

View File

@ -9,7 +9,11 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
type CobraFuncs func(cmd *cobra.Command, args []string) error // DefaultAPIAddress is the default address of the REST socket
const DefaultAPIAddress = "unix:/run/podman/podman.sock"
// DefaultVarlinkAddress is the default address of the varlink socket
const DefaultVarlinkAddress = "unix:/run/podman/io.podman"
type CliCommand struct { type CliCommand struct {
Mode []entities.EngineMode Mode []entities.EngineMode

View File

@ -0,0 +1,124 @@
package system
import (
"fmt"
"os"
"path/filepath"
"time"
"github.com/containers/libpod/cmd/podmanV2/registry"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/pkg/rootless"
"github.com/containers/libpod/pkg/systemd"
"github.com/containers/libpod/pkg/util"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
var (
srvDescription = `Run an API service
Enable a listening service for API access to Podman commands.
`
srvCmd = &cobra.Command{
Use: "service [flags] [URI]",
Args: cobra.MaximumNArgs(1),
Short: "Run API service",
Long: srvDescription,
RunE: service,
Example: `podman system service --time=0 unix:///tmp/podman.sock
podman system service --varlink --time=0 unix:///tmp/podman.sock`,
}
srvArgs = struct {
Timeout int64
Varlink bool
}{}
)
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode},
Command: srvCmd,
Parent: systemCmd,
})
flags := srvCmd.Flags()
flags.Int64VarP(&srvArgs.Timeout, "time", "t", 5, "Time until the service session expires in seconds. Use 0 to disable the timeout")
flags.Int64Var(&srvArgs.Timeout, "timeout", 5, "Time until the service session expires in seconds. Use 0 to disable the timeout")
flags.BoolVar(&srvArgs.Varlink, "varlink", false, "Use legacy varlink service instead of REST")
_ = flags.MarkDeprecated("varlink", "valink API is deprecated.")
}
func service(cmd *cobra.Command, args []string) error {
apiURI, err := resolveApiURI(args)
if err != nil {
return err
}
logrus.Infof("using API endpoint: \"%s\"", apiURI)
opts := entities.ServiceOptions{
URI: apiURI,
Timeout: time.Duration(srvArgs.Timeout) * time.Second,
Command: cmd,
}
if srvArgs.Varlink {
return registry.ContainerEngine().VarlinkService(registry.GetContext(), opts)
}
logrus.Warn("This function is EXPERIMENTAL")
fmt.Fprintf(os.Stderr, "This function is EXPERIMENTAL.\n")
return registry.ContainerEngine().RestService(registry.GetContext(), opts)
}
func resolveApiURI(_url []string) (string, error) {
// When determining _*THE*_ listening endpoint --
// 1) User input wins always
// 2) systemd socket activation
// 3) rootless honors XDG_RUNTIME_DIR
// 4) if varlink -- adapter.DefaultVarlinkAddress
// 5) lastly adapter.DefaultAPIAddress
if _url == nil {
if v, found := os.LookupEnv("PODMAN_SOCKET"); found {
_url = []string{v}
}
}
switch {
case len(_url) > 0:
return _url[0], nil
case systemd.SocketActivated():
logrus.Info("using systemd socket activation to determine API endpoint")
return "", nil
case rootless.IsRootless():
xdg, err := util.GetRuntimeDir()
if err != nil {
return "", err
}
socketName := "podman.sock"
if srvArgs.Varlink {
socketName = "io.podman"
}
socketDir := filepath.Join(xdg, "podman", socketName)
if _, err := os.Stat(filepath.Dir(socketDir)); err != nil {
if os.IsNotExist(err) {
if err := os.Mkdir(filepath.Dir(socketDir), 0755); err != nil {
return "", err
}
} else {
return "", err
}
}
return "unix:" + socketDir, nil
case srvArgs.Varlink:
return registry.DefaultVarlinkAddress, nil
default:
return registry.DefaultAPIAddress, nil
}
}

View File

@ -8,7 +8,7 @@ import (
var ( var (
// Command: podman _system_ // Command: podman _system_
cmd = &cobra.Command{ systemCmd = &cobra.Command{
Use: "system", Use: "system",
Short: "Manage podman", Short: "Manage podman",
Long: "Manage podman", Long: "Manage podman",
@ -21,10 +21,10 @@ var (
func init() { func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: cmd, Command: systemCmd,
}) })
cmd.SetHelpTemplate(registry.HelpTemplate()) systemCmd.SetHelpTemplate(registry.HelpTemplate())
cmd.SetUsageTemplate(registry.UsageTemplate()) systemCmd.SetUsageTemplate(registry.UsageTemplate())
} }
func preRunE(cmd *cobra.Command, args []string) error { func preRunE(cmd *cobra.Command, args []string) error {

View File

@ -0,0 +1,56 @@
package system
import (
"time"
"github.com/containers/libpod/cmd/podmanV2/registry"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
)
var (
varlinkDescription = `Run varlink interface. Podman varlink listens on the specified unix domain socket for incoming connects.
Tools speaking varlink protocol can remotely manage pods, containers and images.
`
varlinkCmd = &cobra.Command{
Use: "varlink [flags] [URI]",
Args: cobra.MinimumNArgs(1),
Short: "Run varlink interface",
Long: varlinkDescription,
PreRunE: preRunE,
RunE: varlinkE,
Example: `podman varlink unix:/run/podman/io.podman
podman varlink --timeout 5000 unix:/run/podman/io.podman`,
}
varlinkArgs = struct {
Timeout int64
}{}
)
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: varlinkCmd,
})
varlinkCmd.SetHelpTemplate(registry.HelpTemplate())
varlinkCmd.SetUsageTemplate(registry.UsageTemplate())
flags := varlinkCmd.Flags()
flags.Int64VarP(&varlinkArgs.Timeout, "time", "t", 1000, "Time until the varlink session expires in milliseconds. Use 0 to disable the timeout")
flags.Int64Var(&varlinkArgs.Timeout, "timeout", 1000, "Time until the varlink session expires in milliseconds. Use 0 to disable the timeout")
}
func varlinkE(cmd *cobra.Command, args []string) error {
uri := registry.DefaultVarlinkAddress
if len(args) > 0 {
uri = args[0]
}
opts := entities.ServiceOptions{
URI: uri,
Timeout: time.Duration(varlinkArgs.Timeout) * time.Second,
Command: cmd,
}
return registry.ContainerEngine().VarlinkService(registry.GetContext(), opts)
}

9
go.sum
View File

@ -217,6 +217,7 @@ github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHh
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
@ -258,6 +259,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
@ -270,7 +272,9 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0j
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mistifyio/go-zfs v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJdNZo6oqSENd4eW8= github.com/mistifyio/go-zfs v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJdNZo6oqSENd4eW8=
github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o=
github.com/moby/vpnkit v0.3.1-0.20200304131818-6bc1679a048d/go.mod h1:KyjUrL9cb6ZSNNAUwZfqRjhwwgJ3BJN+kXh0t43WTUQ= github.com/moby/vpnkit v0.3.1-0.20200304131818-6bc1679a048d/go.mod h1:KyjUrL9cb6ZSNNAUwZfqRjhwwgJ3BJN+kXh0t43WTUQ=
@ -339,6 +343,7 @@ github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsq
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw= github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw=
github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc=
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/pkg/errors v0.0.0-20190227000051-27936f6d90f9/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.0.0-20190227000051-27936f6d90f9/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@ -393,16 +398,20 @@ github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q
github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.7 h1:FfTH+vuMXOas8jmfb5/M7dzEYx7LpcLb7a0LPe34uOU= github.com/spf13/cobra v0.0.7 h1:FfTH+vuMXOas8jmfb5/M7dzEYx7LpcLb7a0LPe34uOU=
github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=

15
hack/golangci-lint.sh Executable file
View File

@ -0,0 +1,15 @@
#!/bin/bash -e
# Need to run linter twice to cover all the build tags code paths
declare -A BUILD_TAGS
BUILD_TAGS[default]="apparmor,seccomp,selinux"
BUILD_TAGS[abi]="${BUILD_TAGS[default]},ABISupport,varlink,!remoteclient"
BUILD_TAGS[tunnel]="${BUILD_TAGS[default]},!ABISupport,!varlink,remoteclient"
[[ $1 == run ]] && shift
for i in tunnel abi; do
echo Build Tags: ${BUILD_TAGS[$i]}
golangci-lint run --build-tags=${BUILD_TAGS[$i]} "$@"
done

View File

@ -12,7 +12,7 @@ import (
"github.com/varlink/go/varlink" "github.com/varlink/go/varlink"
) )
var remoteEndpoint *Endpoint var remoteEndpoint *Endpoint // nolint: deadcode,unused
func (r RemoteRuntime) RemoteEndpoint() (remoteEndpoint *Endpoint, err error) { func (r RemoteRuntime) RemoteEndpoint() (remoteEndpoint *Endpoint, err error) {
remoteConfigConnections, err := remoteclientconfig.ReadRemoteConfig(r.config) remoteConfigConnections, err := remoteclientconfig.ReadRemoteConfig(r.config)
@ -26,8 +26,8 @@ func (r RemoteRuntime) RemoteEndpoint() (remoteEndpoint *Endpoint, err error) {
remoteEndpoint, err = newBridgeConnection(bridge, nil, r.cmd.LogLevel) remoteEndpoint, err = newBridgeConnection(bridge, nil, r.cmd.LogLevel)
// if an environment variable for podman_varlink_address is defined, // if an environment variable for podman_varlink_address is defined,
// we used that as passed // we used that as passed
} else if address := os.Getenv("PODMAN_VARLINK_ADDRESS"); address != "" { } else if address := os.Getenv("PODMAN_VARLINK_ADDRESS"); address != "" { // nolint:gocritic
logrus.Debug("creating a varlink address based on env variable: %s", address) logrus.Debugf("creating a varlink address based on env variable: %s", address)
remoteEndpoint, err = newSocketConnection(address) remoteEndpoint, err = newSocketConnection(address)
// if the user provides a remote host, we use it to configure a bridge connection // if the user provides a remote host, we use it to configure a bridge connection
} else if len(r.cmd.RemoteHost) > 0 { } else if len(r.cmd.RemoteHost) > 0 {
@ -35,7 +35,7 @@ func (r RemoteRuntime) RemoteEndpoint() (remoteEndpoint *Endpoint, err error) {
if len(r.cmd.RemoteUserName) < 1 { if len(r.cmd.RemoteUserName) < 1 {
return nil, errors.New("you must provide a username when providing a remote host name") return nil, errors.New("you must provide a username when providing a remote host name")
} }
rc := remoteclientconfig.RemoteConnection{r.cmd.RemoteHost, r.cmd.RemoteUserName, false, r.cmd.Port, r.cmd.IdentityFile, r.cmd.IgnoreHosts} rc := remoteclientconfig.RemoteConnection{r.cmd.RemoteHost, r.cmd.RemoteUserName, false, r.cmd.Port, r.cmd.IdentityFile, r.cmd.IgnoreHosts} // nolint: govet
remoteEndpoint, err = newBridgeConnection("", &rc, r.cmd.LogLevel) remoteEndpoint, err = newBridgeConnection("", &rc, r.cmd.LogLevel)
// if the user has a config file with connections in it // if the user has a config file with connections in it
} else if len(remoteConfigConnections.Connections) > 0 { } else if len(remoteConfigConnections.Connections) > 0 {
@ -59,7 +59,7 @@ func (r RemoteRuntime) RemoteEndpoint() (remoteEndpoint *Endpoint, err error) {
logrus.Debug("creating a varlink address based default root address") logrus.Debug("creating a varlink address based default root address")
remoteEndpoint, err = newSocketConnection(DefaultVarlinkAddress) remoteEndpoint, err = newSocketConnection(DefaultVarlinkAddress)
} }
return return // nolint: nakedret
} }
// Connect provides a varlink connection // Connect provides a varlink connection

View File

@ -341,7 +341,7 @@ func (r *LocalRuntime) RemoveContainers(ctx context.Context, cli *cliconfig.RmVa
failures[ctr] = errors.Wrapf(err, "Failed to evict container: %q", id) failures[ctr] = errors.Wrapf(err, "Failed to evict container: %q", id)
continue continue
} }
ok = append(ok, string(id)) ok = append(ok, id)
} }
return ok, failures, nil return ok, failures, nil
} }
@ -432,7 +432,7 @@ func BatchContainerOp(ctr *Container, opts shared.PsOptions) (shared.BatchContai
// Log one or more containers over a varlink connection // Log one or more containers over a varlink connection
func (r *LocalRuntime) Log(c *cliconfig.LogsValues, options *logs.LogOptions) error { func (r *LocalRuntime) Log(c *cliconfig.LogsValues, options *logs.LogOptions) error {
// GetContainersLogs // GetContainersLogs
reply, err := iopodman.GetContainersLogs().Send(r.Conn, uint64(varlink.More), c.InputArgs, c.Follow, c.Latest, options.Since.Format(time.RFC3339Nano), int64(c.Tail), c.Timestamps) reply, err := iopodman.GetContainersLogs().Send(r.Conn, uint64(varlink.More), c.InputArgs, c.Follow, c.Latest, options.Since.Format(time.RFC3339Nano), c.Tail, c.Timestamps)
if err != nil { if err != nil {
return errors.Wrapf(err, "failed to get container logs") return errors.Wrapf(err, "failed to get container logs")
} }
@ -753,15 +753,15 @@ func (r *LocalRuntime) attach(ctx context.Context, stdin, stdout *os.File, cid s
return nil, nil, err return nil, nil, err
} }
defer cancel() defer cancel()
defer restoreTerminal(oldTermState) defer restoreTerminal(oldTermState) // nolint: errcheck
logrus.SetFormatter(&RawTtyFormatter{}) logrus.SetFormatter(&RawTtyFormatter{})
term.SetRawTerminal(os.Stdin.Fd()) term.SetRawTerminal(os.Stdin.Fd()) // nolint: errcheck
} }
reply, err := iopodman.Attach().Send(r.Conn, varlink.Upgrade, cid, detachKeys, start) reply, err := iopodman.Attach().Send(r.Conn, varlink.Upgrade, cid, detachKeys, start)
if err != nil { if err != nil {
restoreTerminal(oldTermState) restoreTerminal(oldTermState) // nolint: errcheck
return nil, nil, err return nil, nil, err
} }
@ -769,7 +769,7 @@ func (r *LocalRuntime) attach(ctx context.Context, stdin, stdout *os.File, cid s
_, err = reply() _, err = reply()
if err != nil { if err != nil {
restoreTerminal(oldTermState) restoreTerminal(oldTermState) // nolint: errcheck
return nil, nil, err return nil, nil, err
} }
@ -857,7 +857,7 @@ func (r *LocalRuntime) Restart(ctx context.Context, c *cliconfig.RestartValues)
useTimeout := c.Flag("timeout").Changed || c.Flag("time").Changed useTimeout := c.Flag("timeout").Changed || c.Flag("time").Changed
inputTimeout := c.Timeout inputTimeout := c.Timeout
if c.Latest { if c.Latest { // nolint: gocritic
lastCtr, err := r.GetLatestContainer() lastCtr, err := r.GetLatestContainer()
if err != nil { if err != nil {
return nil, nil, errors.Wrapf(err, "unable to get latest container") return nil, nil, errors.Wrapf(err, "unable to get latest container")
@ -1042,10 +1042,10 @@ func (r *LocalRuntime) ExecContainer(ctx context.Context, cli *cliconfig.ExecVal
return ec, err return ec, err
} }
defer cancel() defer cancel()
defer restoreTerminal(oldTermState) defer restoreTerminal(oldTermState) // nolint: errcheck
logrus.SetFormatter(&RawTtyFormatter{}) logrus.SetFormatter(&RawTtyFormatter{})
term.SetRawTerminal(os.Stdin.Fd()) term.SetRawTerminal(os.Stdin.Fd()) // nolint: errcheck
} }
opts := iopodman.ExecOpts{ opts := iopodman.ExecOpts{
@ -1082,7 +1082,7 @@ func (r *LocalRuntime) ExecContainer(ctx context.Context, cli *cliconfig.ExecVal
return ec, err return ec, err
} }
func configureVarlinkAttachStdio(reader *bufio.Reader, writer *bufio.Writer, stdin *os.File, stdout *os.File, oldTermState *term.State, resize chan remotecommand.TerminalSize, ecChan chan int) chan error { func configureVarlinkAttachStdio(reader *bufio.Reader, writer *bufio.Writer, stdin *os.File, stdout *os.File, oldTermState *term.State, resize chan remotecommand.TerminalSize, ecChan chan int) chan error { // nolint: interfacer
errChan := make(chan error, 1) errChan := make(chan error, 1)
// These are the special writers that encode input from the client. // These are the special writers that encode input from the client.
varlinkStdinWriter := virtwriter.NewVirtWriteCloser(writer, virtwriter.ToStdin) varlinkStdinWriter := virtwriter.NewVirtWriteCloser(writer, virtwriter.ToStdin)
@ -1092,7 +1092,7 @@ func configureVarlinkAttachStdio(reader *bufio.Reader, writer *bufio.Writer, std
go func() { go func() {
// Read from the wire and direct to stdout or stderr // Read from the wire and direct to stdout or stderr
err := virtwriter.Reader(reader, stdout, os.Stderr, nil, nil, ecChan) err := virtwriter.Reader(reader, stdout, os.Stderr, nil, nil, ecChan)
defer restoreTerminal(oldTermState) defer restoreTerminal(oldTermState) // nolint: errcheck
sendGenericError(ecChan) sendGenericError(ecChan)
errChan <- err errChan <- err
}() }()
@ -1101,13 +1101,13 @@ func configureVarlinkAttachStdio(reader *bufio.Reader, writer *bufio.Writer, std
for termResize := range resize { for termResize := range resize {
b, err := json.Marshal(termResize) b, err := json.Marshal(termResize)
if err != nil { if err != nil {
defer restoreTerminal(oldTermState) defer restoreTerminal(oldTermState) // nolint: errcheck,staticcheck
sendGenericError(ecChan) sendGenericError(ecChan)
errChan <- err errChan <- err
} }
_, err = varlinkResizeWriter.Write(b) _, err = varlinkResizeWriter.Write(b)
if err != nil { if err != nil {
defer restoreTerminal(oldTermState) defer restoreTerminal(oldTermState) // nolint: errcheck,staticcheck
sendGenericError(ecChan) sendGenericError(ecChan)
errChan <- err errChan <- err
} }
@ -1117,7 +1117,7 @@ func configureVarlinkAttachStdio(reader *bufio.Reader, writer *bufio.Writer, std
// Takes stdinput and sends it over the wire after being encoded // Takes stdinput and sends it over the wire after being encoded
go func() { go func() {
if _, err := io.Copy(varlinkStdinWriter, stdin); err != nil { if _, err := io.Copy(varlinkStdinWriter, stdin); err != nil {
defer restoreTerminal(oldTermState) defer restoreTerminal(oldTermState) // nolint: errcheck
sendGenericError(ecChan) sendGenericError(ecChan)
errChan <- err errChan <- err
} }

View File

@ -515,10 +515,10 @@ func (p *Pod) GetPodStats(previousContainerStats map[string]*libpod.ContainerSta
newStats := varlinkapi.ContainerStatsToLibpodContainerStats(stats) newStats := varlinkapi.ContainerStatsToLibpodContainerStats(stats)
// If the container wasn't running, don't include it // If the container wasn't running, don't include it
// but also suppress the error // but also suppress the error
if err != nil && errors.Cause(err) != define.ErrCtrStateInvalid { if err != nil && errors.Cause(err) != define.ErrCtrStateInvalid { // nolint: govet
return nil, err return nil, err
} }
if err == nil { if err == nil { // nolint: govet
newContainerStats[c.ID()] = &newStats newContainerStats[c.ID()] = &newStats
} }
} }

View File

@ -180,7 +180,7 @@ type Pod struct {
type remotepod struct { type remotepod struct {
config *libpod.PodConfig config *libpod.PodConfig
state *libpod.PodInspectState state *libpod.PodInspectState
containers []libpod.PodContainerInfo containers []libpod.PodContainerInfo // nolint: structcheck
Runtime *LocalRuntime Runtime *LocalRuntime
} }
@ -627,7 +627,7 @@ func (r *LocalRuntime) SendFileOverVarlink(source string) (string, error) {
return "", err return "", err
} }
logrus.Debugf("sending %s over varlink connection", source) logrus.Debugf("sending %s over varlink connection", source)
reply, err := iopodman.SendFile().Send(r.Conn, varlink.Upgrade, "", int64(fileInfo.Size())) reply, err := iopodman.SendFile().Send(r.Conn, varlink.Upgrade, "", fileInfo.Size())
if err != nil { if err != nil {
return "", err return "", err
} }
@ -754,9 +754,7 @@ func (r *LocalRuntime) InspectVolumes(ctx context.Context, c *cliconfig.VolumeIn
volumes = append(volumes, vol.Name()) volumes = append(volumes, vol.Name())
} }
} else { } else {
for _, arg := range c.InputArgs { volumes = append(volumes, c.InputArgs...)
volumes = append(volumes, arg)
}
} }
for _, vol := range volumes { for _, vol := range volumes {
@ -855,7 +853,7 @@ func (r *LocalRuntime) SaveImage(ctx context.Context, c *cliconfig.SaveValues) e
} }
} }
if err != nil { if err != nil { // nolint: govet
return err return err
} }
@ -927,7 +925,7 @@ func IsImageNotFound(err error) bool {
if errors.Cause(err) == image.ErrNoSuchImage { if errors.Cause(err) == image.ErrNoSuchImage {
return true return true
} }
switch err.(type) { switch err.(type) { // nolint: gocritic
case *iopodman.ImageNotFound: case *iopodman.ImageNotFound:
return true return true
} }
@ -991,7 +989,7 @@ func (r *LocalRuntime) Events(c *cliconfig.EventValues) error {
Time: eTime, Time: eTime,
Type: eType, Type: eType,
} }
if c.Format == formats.JSONString { if c.Format == formats.JSONString { // nolint: gocritic
jsonStr, err := event.ToJSONString() jsonStr, err := event.ToJSONString()
if err != nil { if err != nil {
return errors.Wrapf(err, "unable to format json") return errors.Wrapf(err, "unable to format json")
@ -1008,6 +1006,7 @@ func (r *LocalRuntime) Events(c *cliconfig.EventValues) error {
return err return err
} }
} }
if _, err := w.Write([]byte("\n")); err != nil { if _, err := w.Write([]byte("\n")); err != nil {
return err return err
} }
@ -1040,7 +1039,7 @@ func stringToChangeType(change string) archive.ChangeType {
return archive.ChangeAdd return archive.ChangeAdd
case "D": case "D":
return archive.ChangeDelete return archive.ChangeDelete
default: default: // nolint: gocritic,stylecheck
logrus.Errorf("'%s' is unknown archive type", change) logrus.Errorf("'%s' is unknown archive type", change)
fallthrough fallthrough
case "C": case "C":

View File

@ -56,7 +56,7 @@ func newServer(runtime *libpod.Runtime, duration time.Duration, listener *net.Li
// If listener not provided try socket activation protocol // If listener not provided try socket activation protocol
if listener == nil { if listener == nil {
if _, found := os.LookupEnv("LISTEN_FDS"); !found { if _, found := os.LookupEnv("LISTEN_FDS"); !found {
return nil, errors.Errorf("Cannot create Server, no listener provided and socket activation protocol is not active.") return nil, errors.Errorf("Cannot create API Server, no listener provided and socket activation protocol is not active.")
} }
listeners, err := activation.Listeners() listeners, err := activation.Listeners()

View File

@ -24,13 +24,14 @@ type ContainerEngine interface {
ContainerRestart(ctx context.Context, namesOrIds []string, options RestartOptions) ([]*RestartReport, error) ContainerRestart(ctx context.Context, namesOrIds []string, options RestartOptions) ([]*RestartReport, error)
ContainerRestore(ctx context.Context, namesOrIds []string, options RestoreOptions) ([]*RestoreReport, error) ContainerRestore(ctx context.Context, namesOrIds []string, options RestoreOptions) ([]*RestoreReport, error)
ContainerRm(ctx context.Context, namesOrIds []string, options RmOptions) ([]*RmReport, error) ContainerRm(ctx context.Context, namesOrIds []string, options RmOptions) ([]*RmReport, error)
ContainerStart(ctx context.Context, namesOrIds []string, options ContainerStartOptions) ([]*ContainerStartReport, error)
ContainerRun(ctx context.Context, opts ContainerRunOptions) (*ContainerRunReport, error) ContainerRun(ctx context.Context, opts ContainerRunOptions) (*ContainerRunReport, error)
ContainerStart(ctx context.Context, namesOrIds []string, options ContainerStartOptions) ([]*ContainerStartReport, error)
ContainerStop(ctx context.Context, namesOrIds []string, options StopOptions) ([]*StopReport, error) ContainerStop(ctx context.Context, namesOrIds []string, options StopOptions) ([]*StopReport, error)
ContainerTop(ctx context.Context, options TopOptions) (*StringSliceReport, error) ContainerTop(ctx context.Context, options TopOptions) (*StringSliceReport, error)
ContainerUnpause(ctx context.Context, namesOrIds []string, options PauseUnPauseOptions) ([]*PauseUnpauseReport, error) ContainerUnpause(ctx context.Context, namesOrIds []string, options PauseUnPauseOptions) ([]*PauseUnpauseReport, error)
ContainerWait(ctx context.Context, namesOrIds []string, options WaitOptions) ([]WaitReport, error) ContainerWait(ctx context.Context, namesOrIds []string, options WaitOptions) ([]WaitReport, error)
HealthCheckRun(ctx context.Context, nameOrId string, options HealthCheckOptions) (*define.HealthCheckResults, error) HealthCheckRun(ctx context.Context, nameOrId string, options HealthCheckOptions) (*define.HealthCheckResults, error)
Info(ctx context.Context) (*define.Info, error)
PodCreate(ctx context.Context, opts PodCreateOptions) (*PodCreateReport, error) PodCreate(ctx context.Context, opts PodCreateOptions) (*PodCreateReport, error)
PodExists(ctx context.Context, nameOrId string) (*BoolReport, error) PodExists(ctx context.Context, nameOrId string) (*BoolReport, error)
PodInspect(ctx context.Context, options PodInspectOptions) (*PodInspectReport, error) PodInspect(ctx context.Context, options PodInspectOptions) (*PodInspectReport, error)
@ -43,11 +44,11 @@ type ContainerEngine interface {
PodStop(ctx context.Context, namesOrIds []string, options PodStopOptions) ([]*PodStopReport, error) PodStop(ctx context.Context, namesOrIds []string, options PodStopOptions) ([]*PodStopReport, error)
PodTop(ctx context.Context, options PodTopOptions) (*StringSliceReport, error) PodTop(ctx context.Context, options PodTopOptions) (*StringSliceReport, error)
PodUnpause(ctx context.Context, namesOrIds []string, options PodunpauseOptions) ([]*PodUnpauseReport, error) PodUnpause(ctx context.Context, namesOrIds []string, options PodunpauseOptions) ([]*PodUnpauseReport, error)
RestService(ctx context.Context, opts ServiceOptions) error
VarlinkService(ctx context.Context, opts ServiceOptions) error
VolumeCreate(ctx context.Context, opts VolumeCreateOptions) (*IdOrNameResponse, error) VolumeCreate(ctx context.Context, opts VolumeCreateOptions) (*IdOrNameResponse, error)
VolumeInspect(ctx context.Context, namesOrIds []string, opts VolumeInspectOptions) ([]*VolumeInspectReport, error) VolumeInspect(ctx context.Context, namesOrIds []string, opts VolumeInspectOptions) ([]*VolumeInspectReport, error)
VolumeList(ctx context.Context, opts VolumeListOptions) ([]*VolumeListReport, error) VolumeList(ctx context.Context, opts VolumeListOptions) ([]*VolumeListReport, error)
VolumePrune(ctx context.Context, opts VolumePruneOptions) ([]*VolumePruneReport, error) VolumePrune(ctx context.Context, opts VolumePruneOptions) ([]*VolumePruneReport, error)
VolumeRm(ctx context.Context, namesOrIds []string, opts VolumeRmOptions) ([]*VolumeRmReport, error) VolumeRm(ctx context.Context, namesOrIds []string, opts VolumeRmOptions) ([]*VolumeRmReport, error)
Info(ctx context.Context) (*define.Info, error)
} }

View File

@ -0,0 +1,14 @@
package entities
import (
"time"
"github.com/spf13/cobra"
)
// ServiceOptions provides the input for starting an API Service
type ServiceOptions struct {
URI string // Path to unix domain socket service should listen on
Timeout time.Duration // duration of inactivity the service should wait before shutting down
Command *cobra.Command // CLI command provided. Used in V1 code
}

View File

@ -4,10 +4,88 @@ package abi
import ( import (
"context" "context"
"net"
"strings"
"github.com/containers/libpod/libpod/define" "github.com/containers/libpod/libpod/define"
api "github.com/containers/libpod/pkg/api/server"
"github.com/containers/libpod/pkg/domain/entities"
iopodman "github.com/containers/libpod/pkg/varlink"
iopodmanAPI "github.com/containers/libpod/pkg/varlinkapi"
"github.com/containers/libpod/version"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/varlink/go/varlink"
) )
func (ic *ContainerEngine) Info(ctx context.Context) (*define.Info, error) { func (ic *ContainerEngine) Info(ctx context.Context) (*define.Info, error) {
return ic.Libpod.Info() return ic.Libpod.Info()
} }
func (ic *ContainerEngine) RestService(_ context.Context, opts entities.ServiceOptions) error {
var (
listener net.Listener
err error
)
if opts.URI != "" {
fields := strings.Split(opts.URI, ":")
if len(fields) == 1 {
return errors.Errorf("%s is an invalid socket destination", opts.URI)
}
address := strings.Join(fields[1:], ":")
listener, err = net.Listen(fields[0], address)
if err != nil {
return errors.Wrapf(err, "unable to create socket %s", opts.URI)
}
}
server, err := api.NewServerWithSettings(ic.Libpod, opts.Timeout, &listener)
if err != nil {
return err
}
defer func() {
if err := server.Shutdown(); err != nil {
logrus.Warnf("Error when stopping API service: %s", err)
}
}()
err = server.Serve()
logrus.Debugf("%d/%d Active connections/Total connections\n", server.ActiveConnections, server.TotalConnections)
_ = listener.Close()
return err
}
func (ic *ContainerEngine) VarlinkService(_ context.Context, opts entities.ServiceOptions) error {
var varlinkInterfaces = []*iopodman.VarlinkInterface{
iopodmanAPI.New(opts.Command, ic.Libpod),
}
service, err := varlink.NewService(
"Atomic",
"podman",
version.Version,
"https://github.com/containers/libpod",
)
if err != nil {
return errors.Wrapf(err, "unable to create new varlink service")
}
for _, i := range varlinkInterfaces {
if err := service.RegisterInterface(i); err != nil {
return errors.Errorf("unable to register varlink interface %v", i)
}
}
// Run the varlink server at the given address
if err = service.Listen(opts.URI, opts.Timeout); err != nil {
switch err.(type) {
case varlink.ServiceTimeoutError:
logrus.Infof("varlink service expired (use --timeout to increase session time beyond %s ms, 0 means never timeout)", opts.Timeout.String())
return nil
default:
return errors.Wrapf(err, "unable to start varlink service")
}
}
return nil
}

View File

@ -2,11 +2,21 @@ package tunnel
import ( import (
"context" "context"
"errors"
"github.com/containers/libpod/libpod/define" "github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/bindings/system" "github.com/containers/libpod/pkg/bindings/system"
"github.com/containers/libpod/pkg/domain/entities"
) )
func (ic *ContainerEngine) Info(ctx context.Context) (*define.Info, error) { func (ic *ContainerEngine) Info(ctx context.Context) (*define.Info, error) {
return system.Info(ic.ClientCxt) return system.Info(ic.ClientCxt)
} }
func (ic *ContainerEngine) RestService(_ context.Context, _ entities.ServiceOptions) error {
panic(errors.New("rest service is not supported when tunneling"))
}
func (ic *ContainerEngine) VarlinkService(_ context.Context, _ entities.ServiceOptions) error {
panic(errors.New("varlink service is not supported when tunneling"))
}

View File

@ -44,7 +44,7 @@ func setupStreams(call iopodman.VarlinkCall) (*bufio.Reader, *bufio.Writer, *io.
} }
// Attach connects to a containers console // Attach connects to a containers console
func (i *LibpodAPI) Attach(call iopodman.VarlinkCall, name string, detachKeys string, start bool) error { func (i *VarlinkAPI) Attach(call iopodman.VarlinkCall, name string, detachKeys string, start bool) error {
var finalErr error var finalErr error
resize := make(chan remotecommand.TerminalSize) resize := make(chan remotecommand.TerminalSize)
errChan := make(chan error) errChan := make(chan error)

View File

@ -3,21 +3,20 @@
package varlinkapi package varlinkapi
import ( import (
"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/libpod" "github.com/containers/libpod/libpod"
iopodman "github.com/containers/libpod/pkg/varlink" iopodman "github.com/containers/libpod/pkg/varlink"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
// LibpodAPI is the basic varlink struct for libpod // VarlinkAPI is the basic varlink struct for libpod
type LibpodAPI struct { type VarlinkAPI struct {
Cli *cobra.Command Cli *cobra.Command
iopodman.VarlinkInterface iopodman.VarlinkInterface
Runtime *libpod.Runtime Runtime *libpod.Runtime
} }
// New creates a new varlink client // New creates a new varlink client
func New(cli *cliconfig.PodmanCommand, runtime *libpod.Runtime) *iopodman.VarlinkInterface { func New(cli *cobra.Command, runtime *libpod.Runtime) *iopodman.VarlinkInterface {
lp := LibpodAPI{Cli: cli.Command, Runtime: runtime} lp := VarlinkAPI{Cli: cli, Runtime: runtime}
return iopodman.VarlinkNew(&lp) return iopodman.VarlinkNew(&lp)
} }

View File

@ -30,7 +30,7 @@ import (
) )
// ListContainers ... // ListContainers ...
func (i *LibpodAPI) ListContainers(call iopodman.VarlinkCall) error { func (i *VarlinkAPI) ListContainers(call iopodman.VarlinkCall) error {
var ( var (
listContainers []iopodman.Container listContainers []iopodman.Container
) )
@ -54,7 +54,7 @@ func (i *LibpodAPI) ListContainers(call iopodman.VarlinkCall) error {
return call.ReplyListContainers(listContainers) return call.ReplyListContainers(listContainers)
} }
func (i *LibpodAPI) Ps(call iopodman.VarlinkCall, opts iopodman.PsOpts) error { func (i *VarlinkAPI) Ps(call iopodman.VarlinkCall, opts iopodman.PsOpts) error {
var ( var (
containers []iopodman.PsContainer containers []iopodman.PsContainer
) )
@ -106,7 +106,7 @@ func (i *LibpodAPI) Ps(call iopodman.VarlinkCall, opts iopodman.PsOpts) error {
} }
// GetContainer ... // GetContainer ...
func (i *LibpodAPI) GetContainer(call iopodman.VarlinkCall, id string) error { func (i *VarlinkAPI) GetContainer(call iopodman.VarlinkCall, id string) error {
ctr, err := i.Runtime.LookupContainer(id) ctr, err := i.Runtime.LookupContainer(id)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(id, err.Error()) return call.ReplyContainerNotFound(id, err.Error())
@ -123,7 +123,7 @@ func (i *LibpodAPI) GetContainer(call iopodman.VarlinkCall, id string) error {
} }
// GetContainersByContext returns a slice of container ids based on all, latest, or a list // GetContainersByContext returns a slice of container ids based on all, latest, or a list
func (i *LibpodAPI) GetContainersByContext(call iopodman.VarlinkCall, all, latest bool, input []string) error { func (i *VarlinkAPI) GetContainersByContext(call iopodman.VarlinkCall, all, latest bool, input []string) error {
var ids []string var ids []string
ctrs, err := shortcuts.GetContainersByContext(all, latest, input, i.Runtime) ctrs, err := shortcuts.GetContainersByContext(all, latest, input, i.Runtime)
@ -141,7 +141,7 @@ func (i *LibpodAPI) GetContainersByContext(call iopodman.VarlinkCall, all, lates
} }
// GetContainersByStatus returns a slice of containers filtered by a libpod status // GetContainersByStatus returns a slice of containers filtered by a libpod status
func (i *LibpodAPI) GetContainersByStatus(call iopodman.VarlinkCall, statuses []string) error { func (i *VarlinkAPI) GetContainersByStatus(call iopodman.VarlinkCall, statuses []string) error {
var ( var (
filterFuncs []libpod.ContainerFilter filterFuncs []libpod.ContainerFilter
containers []iopodman.Container containers []iopodman.Container
@ -172,7 +172,7 @@ func (i *LibpodAPI) GetContainersByStatus(call iopodman.VarlinkCall, statuses []
} }
// InspectContainer ... // InspectContainer ...
func (i *LibpodAPI) InspectContainer(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) InspectContainer(call iopodman.VarlinkCall, name string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -189,7 +189,7 @@ func (i *LibpodAPI) InspectContainer(call iopodman.VarlinkCall, name string) err
} }
// ListContainerProcesses ... // ListContainerProcesses ...
func (i *LibpodAPI) ListContainerProcesses(call iopodman.VarlinkCall, name string, opts []string) error { func (i *VarlinkAPI) ListContainerProcesses(call iopodman.VarlinkCall, name string, opts []string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -216,7 +216,7 @@ func (i *LibpodAPI) ListContainerProcesses(call iopodman.VarlinkCall, name strin
} }
// GetContainerLogs ... // GetContainerLogs ...
func (i *LibpodAPI) GetContainerLogs(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) GetContainerLogs(call iopodman.VarlinkCall, name string) error {
var logs []string var logs []string
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
@ -277,7 +277,7 @@ func (i *LibpodAPI) GetContainerLogs(call iopodman.VarlinkCall, name string) err
} }
// ListContainerChanges ... // ListContainerChanges ...
func (i *LibpodAPI) ListContainerChanges(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) ListContainerChanges(call iopodman.VarlinkCall, name string) error {
changes, err := i.Runtime.GetDiff("", name) changes, err := i.Runtime.GetDiff("", name)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())
@ -297,7 +297,7 @@ func (i *LibpodAPI) ListContainerChanges(call iopodman.VarlinkCall, name string)
} }
// ExportContainer ... // ExportContainer ...
func (i *LibpodAPI) ExportContainer(call iopodman.VarlinkCall, name, outPath string) error { func (i *VarlinkAPI) ExportContainer(call iopodman.VarlinkCall, name, outPath string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -319,7 +319,7 @@ func (i *LibpodAPI) ExportContainer(call iopodman.VarlinkCall, name, outPath str
} }
// GetContainerStats ... // GetContainerStats ...
func (i *LibpodAPI) GetContainerStats(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) GetContainerStats(call iopodman.VarlinkCall, name string) error {
if rootless.IsRootless() { if rootless.IsRootless() {
cgroupv2, err := cgroups.IsCgroup2UnifiedMode() cgroupv2, err := cgroups.IsCgroup2UnifiedMode()
if err != nil { if err != nil {
@ -359,7 +359,7 @@ func (i *LibpodAPI) GetContainerStats(call iopodman.VarlinkCall, name string) er
} }
// StartContainer ... // StartContainer ...
func (i *LibpodAPI) StartContainer(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) StartContainer(call iopodman.VarlinkCall, name string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -382,7 +382,7 @@ func (i *LibpodAPI) StartContainer(call iopodman.VarlinkCall, name string) error
} }
// InitContainer initializes the container given by Varlink. // InitContainer initializes the container given by Varlink.
func (i *LibpodAPI) InitContainer(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) InitContainer(call iopodman.VarlinkCall, name string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -397,7 +397,7 @@ func (i *LibpodAPI) InitContainer(call iopodman.VarlinkCall, name string) error
} }
// StopContainer ... // StopContainer ...
func (i *LibpodAPI) StopContainer(call iopodman.VarlinkCall, name string, timeout int64) error { func (i *VarlinkAPI) StopContainer(call iopodman.VarlinkCall, name string, timeout int64) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -415,7 +415,7 @@ func (i *LibpodAPI) StopContainer(call iopodman.VarlinkCall, name string, timeou
} }
// RestartContainer ... // RestartContainer ...
func (i *LibpodAPI) RestartContainer(call iopodman.VarlinkCall, name string, timeout int64) error { func (i *VarlinkAPI) RestartContainer(call iopodman.VarlinkCall, name string, timeout int64) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -427,7 +427,7 @@ func (i *LibpodAPI) RestartContainer(call iopodman.VarlinkCall, name string, tim
} }
// ContainerExists looks in local storage for the existence of a container // ContainerExists looks in local storage for the existence of a container
func (i *LibpodAPI) ContainerExists(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) ContainerExists(call iopodman.VarlinkCall, name string) error {
_, err := i.Runtime.LookupContainer(name) _, err := i.Runtime.LookupContainer(name)
if errors.Cause(err) == define.ErrNoSuchCtr { if errors.Cause(err) == define.ErrNoSuchCtr {
return call.ReplyContainerExists(1) return call.ReplyContainerExists(1)
@ -440,7 +440,7 @@ func (i *LibpodAPI) ContainerExists(call iopodman.VarlinkCall, name string) erro
// KillContainer kills a running container. If you want to use the default SIGTERM signal, just send a -1 // KillContainer kills a running container. If you want to use the default SIGTERM signal, just send a -1
// for the signal arg. // for the signal arg.
func (i *LibpodAPI) KillContainer(call iopodman.VarlinkCall, name string, signal int64) error { func (i *VarlinkAPI) KillContainer(call iopodman.VarlinkCall, name string, signal int64) error {
killSignal := uint(syscall.SIGTERM) killSignal := uint(syscall.SIGTERM)
if signal != -1 { if signal != -1 {
killSignal = uint(signal) killSignal = uint(signal)
@ -456,7 +456,7 @@ func (i *LibpodAPI) KillContainer(call iopodman.VarlinkCall, name string, signal
} }
// PauseContainer ... // PauseContainer ...
func (i *LibpodAPI) PauseContainer(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) PauseContainer(call iopodman.VarlinkCall, name string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -468,7 +468,7 @@ func (i *LibpodAPI) PauseContainer(call iopodman.VarlinkCall, name string) error
} }
// UnpauseContainer ... // UnpauseContainer ...
func (i *LibpodAPI) UnpauseContainer(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) UnpauseContainer(call iopodman.VarlinkCall, name string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -480,7 +480,7 @@ func (i *LibpodAPI) UnpauseContainer(call iopodman.VarlinkCall, name string) err
} }
// WaitContainer ... // WaitContainer ...
func (i *LibpodAPI) WaitContainer(call iopodman.VarlinkCall, name string, interval int64) error { func (i *VarlinkAPI) WaitContainer(call iopodman.VarlinkCall, name string, interval int64) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -493,7 +493,7 @@ func (i *LibpodAPI) WaitContainer(call iopodman.VarlinkCall, name string, interv
} }
// RemoveContainer ... // RemoveContainer ...
func (i *LibpodAPI) RemoveContainer(call iopodman.VarlinkCall, name string, force bool, removeVolumes bool) error { func (i *VarlinkAPI) RemoveContainer(call iopodman.VarlinkCall, name string, force bool, removeVolumes bool) error {
ctx := getContext() ctx := getContext()
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
@ -512,7 +512,7 @@ func (i *LibpodAPI) RemoveContainer(call iopodman.VarlinkCall, name string, forc
} }
// EvictContainer ... // EvictContainer ...
func (i *LibpodAPI) EvictContainer(call iopodman.VarlinkCall, name string, removeVolumes bool) error { func (i *VarlinkAPI) EvictContainer(call iopodman.VarlinkCall, name string, removeVolumes bool) error {
ctx := getContext() ctx := getContext()
id, err := i.Runtime.EvictContainer(ctx, name, removeVolumes) id, err := i.Runtime.EvictContainer(ctx, name, removeVolumes)
if err != nil { if err != nil {
@ -522,7 +522,7 @@ func (i *LibpodAPI) EvictContainer(call iopodman.VarlinkCall, name string, remov
} }
// DeleteStoppedContainers ... // DeleteStoppedContainers ...
func (i *LibpodAPI) DeleteStoppedContainers(call iopodman.VarlinkCall) error { func (i *VarlinkAPI) DeleteStoppedContainers(call iopodman.VarlinkCall) error {
ctx := getContext() ctx := getContext()
var deletedContainers []string var deletedContainers []string
containers, err := i.Runtime.GetAllContainers() containers, err := i.Runtime.GetAllContainers()
@ -545,7 +545,7 @@ func (i *LibpodAPI) DeleteStoppedContainers(call iopodman.VarlinkCall) error {
} }
// GetAttachSockets ... // GetAttachSockets ...
func (i *LibpodAPI) GetAttachSockets(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) GetAttachSockets(call iopodman.VarlinkCall, name string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -578,7 +578,7 @@ func (i *LibpodAPI) GetAttachSockets(call iopodman.VarlinkCall, name string) err
} }
// ContainerCheckpoint ... // ContainerCheckpoint ...
func (i *LibpodAPI) ContainerCheckpoint(call iopodman.VarlinkCall, name string, keep, leaveRunning, tcpEstablished bool) error { func (i *VarlinkAPI) ContainerCheckpoint(call iopodman.VarlinkCall, name string, keep, leaveRunning, tcpEstablished bool) error {
ctx := getContext() ctx := getContext()
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
@ -597,7 +597,7 @@ func (i *LibpodAPI) ContainerCheckpoint(call iopodman.VarlinkCall, name string,
} }
// ContainerRestore ... // ContainerRestore ...
func (i *LibpodAPI) ContainerRestore(call iopodman.VarlinkCall, name string, keep, tcpEstablished bool) error { func (i *VarlinkAPI) ContainerRestore(call iopodman.VarlinkCall, name string, keep, tcpEstablished bool) error {
ctx := getContext() ctx := getContext()
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
@ -615,7 +615,7 @@ func (i *LibpodAPI) ContainerRestore(call iopodman.VarlinkCall, name string, kee
} }
// ContainerConfig returns just the container.config struct // ContainerConfig returns just the container.config struct
func (i *LibpodAPI) ContainerConfig(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) ContainerConfig(call iopodman.VarlinkCall, name string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -629,7 +629,7 @@ func (i *LibpodAPI) ContainerConfig(call iopodman.VarlinkCall, name string) erro
} }
// ContainerArtifacts returns an untouched container's artifact in string format // ContainerArtifacts returns an untouched container's artifact in string format
func (i *LibpodAPI) ContainerArtifacts(call iopodman.VarlinkCall, name, artifactName string) error { func (i *VarlinkAPI) ContainerArtifacts(call iopodman.VarlinkCall, name, artifactName string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -646,7 +646,7 @@ func (i *LibpodAPI) ContainerArtifacts(call iopodman.VarlinkCall, name, artifact
} }
// ContainerInspectData returns the inspect data of a container in string format // ContainerInspectData returns the inspect data of a container in string format
func (i *LibpodAPI) ContainerInspectData(call iopodman.VarlinkCall, name string, size bool) error { func (i *VarlinkAPI) ContainerInspectData(call iopodman.VarlinkCall, name string, size bool) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -664,7 +664,7 @@ func (i *LibpodAPI) ContainerInspectData(call iopodman.VarlinkCall, name string,
} }
// ContainerStateData returns a container's state data in string format // ContainerStateData returns a container's state data in string format
func (i *LibpodAPI) ContainerStateData(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) ContainerStateData(call iopodman.VarlinkCall, name string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(name, err.Error()) return call.ReplyContainerNotFound(name, err.Error())
@ -682,7 +682,7 @@ func (i *LibpodAPI) ContainerStateData(call iopodman.VarlinkCall, name string) e
// GetContainerStatsWithHistory is a varlink endpoint that returns container stats based on current and // GetContainerStatsWithHistory is a varlink endpoint that returns container stats based on current and
// previous statistics // previous statistics
func (i *LibpodAPI) GetContainerStatsWithHistory(call iopodman.VarlinkCall, prevStats iopodman.ContainerStats) error { func (i *VarlinkAPI) GetContainerStatsWithHistory(call iopodman.VarlinkCall, prevStats iopodman.ContainerStats) error {
con, err := i.Runtime.LookupContainer(prevStats.Id) con, err := i.Runtime.LookupContainer(prevStats.Id)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(prevStats.Id, err.Error()) return call.ReplyContainerNotFound(prevStats.Id, err.Error())
@ -711,7 +711,7 @@ func (i *LibpodAPI) GetContainerStatsWithHistory(call iopodman.VarlinkCall, prev
} }
// Spec ... // Spec ...
func (i *LibpodAPI) Spec(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) Spec(call iopodman.VarlinkCall, name string) error {
ctr, err := i.Runtime.LookupContainer(name) ctr, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())
@ -727,7 +727,7 @@ func (i *LibpodAPI) Spec(call iopodman.VarlinkCall, name string) error {
} }
// GetContainersLogs is the varlink endpoint to obtain one or more container logs // GetContainersLogs is the varlink endpoint to obtain one or more container logs
func (i *LibpodAPI) GetContainersLogs(call iopodman.VarlinkCall, names []string, follow, latest bool, since string, tail int64, timestamps bool) error { func (i *VarlinkAPI) GetContainersLogs(call iopodman.VarlinkCall, names []string, follow, latest bool, since string, tail int64, timestamps bool) error {
var wg sync.WaitGroup var wg sync.WaitGroup
if call.WantsMore() { if call.WantsMore() {
call.Continues = true call.Continues = true
@ -784,7 +784,7 @@ func newPodmanLogLine(line *logs.LogLine) iopodman.LogLine {
} }
// Top displays information about a container's running processes // Top displays information about a container's running processes
func (i *LibpodAPI) Top(call iopodman.VarlinkCall, nameOrID string, descriptors []string) error { func (i *VarlinkAPI) Top(call iopodman.VarlinkCall, nameOrID string, descriptors []string) error {
ctr, err := i.Runtime.LookupContainer(nameOrID) ctr, err := i.Runtime.LookupContainer(nameOrID)
if err != nil { if err != nil {
return call.ReplyContainerNotFound(ctr.ID(), err.Error()) return call.ReplyContainerNotFound(ctr.ID(), err.Error())
@ -797,7 +797,7 @@ func (i *LibpodAPI) Top(call iopodman.VarlinkCall, nameOrID string, descriptors
} }
// ExecContainer is the varlink endpoint to execute a command in a container // ExecContainer is the varlink endpoint to execute a command in a container
func (i *LibpodAPI) ExecContainer(call iopodman.VarlinkCall, opts iopodman.ExecOpts) error { func (i *VarlinkAPI) ExecContainer(call iopodman.VarlinkCall, opts iopodman.ExecOpts) error {
if !call.WantsUpgrade() { if !call.WantsUpgrade() {
return call.ReplyErrorOccurred("client must use upgraded connection to exec") return call.ReplyErrorOccurred("client must use upgraded connection to exec")
} }
@ -901,7 +901,7 @@ func (i *LibpodAPI) ExecContainer(call iopodman.VarlinkCall, opts iopodman.ExecO
} }
// HealthCheckRun executes defined container's healthcheck command and returns the container's health status. // HealthCheckRun executes defined container's healthcheck command and returns the container's health status.
func (i *LibpodAPI) HealthCheckRun(call iopodman.VarlinkCall, nameOrID string) error { func (i *VarlinkAPI) HealthCheckRun(call iopodman.VarlinkCall, nameOrID string) error {
hcStatus, err := i.Runtime.HealthCheck(nameOrID) hcStatus, err := i.Runtime.HealthCheck(nameOrID)
if err != nil && hcStatus != libpod.HealthCheckFailure { if err != nil && hcStatus != libpod.HealthCheckFailure {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())

View File

@ -8,7 +8,7 @@ import (
) )
// CreateContainer ... // CreateContainer ...
func (i *LibpodAPI) CreateContainer(call iopodman.VarlinkCall, config iopodman.Create) error { func (i *VarlinkAPI) CreateContainer(call iopodman.VarlinkCall, config iopodman.Create) error {
generic := shared.VarlinkCreateToGeneric(config) generic := shared.VarlinkCreateToGeneric(config)
ctr, _, err := shared.CreateContainer(getContext(), &generic, i.Runtime) ctr, _, err := shared.CreateContainer(getContext(), &generic, i.Runtime)
if err != nil { if err != nil {

View File

@ -3,7 +3,6 @@
package varlinkapi package varlinkapi
import ( import (
"fmt"
"time" "time"
"github.com/containers/libpod/libpod/events" "github.com/containers/libpod/libpod/events"
@ -11,7 +10,7 @@ import (
) )
// GetEvents is a remote endpoint to get events from the event log // GetEvents is a remote endpoint to get events from the event log
func (i *LibpodAPI) GetEvents(call iopodman.VarlinkCall, filter []string, since string, until string) error { func (i *VarlinkAPI) GetEvents(call iopodman.VarlinkCall, filter []string, since string, until string) error {
var ( var (
fromStart bool fromStart bool
eventsError error eventsError error
@ -43,9 +42,9 @@ func (i *LibpodAPI) GetEvents(call iopodman.VarlinkCall, filter []string, since
Id: event.ID, Id: event.ID,
Image: event.Image, Image: event.Image,
Name: event.Name, Name: event.Name,
Status: fmt.Sprintf("%s", event.Status), Status: string(event.Status),
Time: event.Time.Format(time.RFC3339Nano), Time: event.Time.Format(time.RFC3339Nano),
Type: fmt.Sprintf("%s", event.Type), Type: string(event.Type),
}) })
if !call.Continues { if !call.Continues {
// For a one-shot on events, we break out here // For a one-shot on events, we break out here

View File

@ -10,7 +10,7 @@ import (
) )
// GenerateKube ... // GenerateKube ...
func (i *LibpodAPI) GenerateKube(call iopodman.VarlinkCall, name string, service bool) error { func (i *VarlinkAPI) GenerateKube(call iopodman.VarlinkCall, name string, service bool) error {
pod, serv, err := shared.GenerateKube(name, service, i.Runtime) pod, serv, err := shared.GenerateKube(name, service, i.Runtime)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())

View File

@ -35,14 +35,14 @@ import (
) )
// ListImagesWithFilters returns a list of images that have been filtered // ListImagesWithFilters returns a list of images that have been filtered
func (i *LibpodAPI) ListImagesWithFilters(call iopodman.VarlinkCall, filters []string) error { func (i *VarlinkAPI) ListImagesWithFilters(call iopodman.VarlinkCall, filters []string) error {
images, err := i.Runtime.ImageRuntime().GetImagesWithFilters(filters) images, err := i.Runtime.ImageRuntime().GetImagesWithFilters(filters)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(fmt.Sprintf("unable to get list of images %q", err)) return call.ReplyErrorOccurred(fmt.Sprintf("unable to get list of images %q", err))
} }
imageList, err := imagesToImageList(images) imageList, err := imagesToImageList(images)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(fmt.Sprintf("unable to parse response", err)) return call.ReplyErrorOccurred("unable to parse response " + err.Error())
} }
return call.ReplyListImagesWithFilters(imageList) return call.ReplyListImagesWithFilters(imageList)
} }
@ -50,34 +50,34 @@ func (i *LibpodAPI) ListImagesWithFilters(call iopodman.VarlinkCall, filters []s
// imagesToImageList converts a slice of Images to an imagelist for varlink responses // imagesToImageList converts a slice of Images to an imagelist for varlink responses
func imagesToImageList(images []*image.Image) ([]iopodman.Image, error) { func imagesToImageList(images []*image.Image) ([]iopodman.Image, error) {
var imageList []iopodman.Image var imageList []iopodman.Image
for _, image := range images { for _, img := range images {
labels, _ := image.Labels(getContext()) labels, _ := img.Labels(getContext())
containers, _ := image.Containers() containers, _ := img.Containers()
repoDigests, err := image.RepoDigests() repoDigests, err := img.RepoDigests()
if err != nil { if err != nil {
return nil, err return nil, err
} }
size, _ := image.Size(getContext()) size, _ := img.Size(getContext())
isParent, err := image.IsParent(context.TODO()) isParent, err := img.IsParent(context.TODO())
if err != nil { if err != nil {
return nil, err return nil, err
} }
i := iopodman.Image{ i := iopodman.Image{
Id: image.ID(), Id: img.ID(),
Digest: string(image.Digest()), Digest: string(img.Digest()),
ParentId: image.Parent, ParentId: img.Parent,
RepoTags: image.Names(), RepoTags: img.Names(),
RepoDigests: repoDigests, RepoDigests: repoDigests,
Created: image.Created().Format(time.RFC3339), Created: img.Created().Format(time.RFC3339),
Size: int64(*size), Size: int64(*size),
VirtualSize: image.VirtualSize, VirtualSize: img.VirtualSize,
Containers: int64(len(containers)), Containers: int64(len(containers)),
Labels: labels, Labels: labels,
IsParent: isParent, IsParent: isParent,
ReadOnly: image.IsReadOnly(), ReadOnly: img.IsReadOnly(),
History: image.NamesHistory(), History: img.NamesHistory(),
} }
imageList = append(imageList, i) imageList = append(imageList, i)
} }
@ -86,20 +86,20 @@ func imagesToImageList(images []*image.Image) ([]iopodman.Image, error) {
// ListImages lists all the images in the store // ListImages lists all the images in the store
// It requires no inputs. // It requires no inputs.
func (i *LibpodAPI) ListImages(call iopodman.VarlinkCall) error { func (i *VarlinkAPI) ListImages(call iopodman.VarlinkCall) error {
images, err := i.Runtime.ImageRuntime().GetImages() images, err := i.Runtime.ImageRuntime().GetImages()
if err != nil { if err != nil {
return call.ReplyErrorOccurred(fmt.Sprintf("unable to get list of images %q", err)) return call.ReplyErrorOccurred("unable to get list of images " + err.Error())
} }
imageList, err := imagesToImageList(images) imageList, err := imagesToImageList(images)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(fmt.Sprintf("unable to parse response", err)) return call.ReplyErrorOccurred("unable to parse response " + err.Error())
} }
return call.ReplyListImages(imageList) return call.ReplyListImages(imageList)
} }
// GetImage returns a single image in the form of a Image // GetImage returns a single image in the form of a Image
func (i *LibpodAPI) GetImage(call iopodman.VarlinkCall, id string) error { func (i *VarlinkAPI) GetImage(call iopodman.VarlinkCall, id string) error {
newImage, err := i.Runtime.ImageRuntime().NewFromLocal(id) newImage, err := i.Runtime.ImageRuntime().NewFromLocal(id)
if err != nil { if err != nil {
return call.ReplyImageNotFound(id, err.Error()) return call.ReplyImageNotFound(id, err.Error())
@ -139,7 +139,7 @@ func (i *LibpodAPI) GetImage(call iopodman.VarlinkCall, id string) error {
} }
// BuildImage ... // BuildImage ...
func (i *LibpodAPI) BuildImage(call iopodman.VarlinkCall, config iopodman.BuildInfo) error { func (i *VarlinkAPI) BuildImage(call iopodman.VarlinkCall, config iopodman.BuildInfo) error {
var ( var (
namespace []buildah.NamespaceOption namespace []buildah.NamespaceOption
imageID string imageID string
@ -302,7 +302,7 @@ func (i *LibpodAPI) BuildImage(call iopodman.VarlinkCall, config iopodman.BuildI
// InspectImage returns an image's inspect information as a string that can be serialized. // InspectImage returns an image's inspect information as a string that can be serialized.
// Requires an image ID or name // Requires an image ID or name
func (i *LibpodAPI) InspectImage(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) InspectImage(call iopodman.VarlinkCall, name string) error {
newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name) newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name)
if err != nil { if err != nil {
return call.ReplyImageNotFound(name, err.Error()) return call.ReplyImageNotFound(name, err.Error())
@ -320,7 +320,7 @@ func (i *LibpodAPI) InspectImage(call iopodman.VarlinkCall, name string) error {
// HistoryImage returns the history of the image's layers // HistoryImage returns the history of the image's layers
// Requires an image or name // Requires an image or name
func (i *LibpodAPI) HistoryImage(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) HistoryImage(call iopodman.VarlinkCall, name string) error {
newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name) newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name)
if err != nil { if err != nil {
return call.ReplyImageNotFound(name, err.Error()) return call.ReplyImageNotFound(name, err.Error())
@ -345,7 +345,7 @@ func (i *LibpodAPI) HistoryImage(call iopodman.VarlinkCall, name string) error {
} }
// PushImage pushes an local image to registry // PushImage pushes an local image to registry
func (i *LibpodAPI) PushImage(call iopodman.VarlinkCall, name, tag string, compress bool, format string, removeSignatures bool, signBy string) error { func (i *VarlinkAPI) PushImage(call iopodman.VarlinkCall, name, tag string, compress bool, format string, removeSignatures bool, signBy string) error {
var ( var (
manifestType string manifestType string
) )
@ -437,7 +437,7 @@ func (i *LibpodAPI) PushImage(call iopodman.VarlinkCall, name, tag string, compr
} }
// TagImage accepts an image name and tag as strings and tags an image in the local store. // TagImage accepts an image name and tag as strings and tags an image in the local store.
func (i *LibpodAPI) TagImage(call iopodman.VarlinkCall, name, tag string) error { func (i *VarlinkAPI) TagImage(call iopodman.VarlinkCall, name, tag string) error {
newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name) newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name)
if err != nil { if err != nil {
return call.ReplyImageNotFound(name, err.Error()) return call.ReplyImageNotFound(name, err.Error())
@ -449,7 +449,7 @@ func (i *LibpodAPI) TagImage(call iopodman.VarlinkCall, name, tag string) error
} }
// UntagImage accepts an image name and tag as strings and removes the tag from the local store. // UntagImage accepts an image name and tag as strings and removes the tag from the local store.
func (i *LibpodAPI) UntagImage(call iopodman.VarlinkCall, name, tag string) error { func (i *VarlinkAPI) UntagImage(call iopodman.VarlinkCall, name, tag string) error {
newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name) newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name)
if err != nil { if err != nil {
return call.ReplyImageNotFound(name, err.Error()) return call.ReplyImageNotFound(name, err.Error())
@ -462,7 +462,7 @@ func (i *LibpodAPI) UntagImage(call iopodman.VarlinkCall, name, tag string) erro
// RemoveImage accepts a image name or ID as a string and force bool to determine if it should // RemoveImage accepts a image name or ID as a string and force bool to determine if it should
// remove the image even if being used by stopped containers // remove the image even if being used by stopped containers
func (i *LibpodAPI) RemoveImage(call iopodman.VarlinkCall, name string, force bool) error { func (i *VarlinkAPI) RemoveImage(call iopodman.VarlinkCall, name string, force bool) error {
ctx := getContext() ctx := getContext()
newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name) newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name)
if err != nil { if err != nil {
@ -477,7 +477,7 @@ func (i *LibpodAPI) RemoveImage(call iopodman.VarlinkCall, name string, force bo
// RemoveImageWithResponse accepts an image name and force bool. It returns details about what // RemoveImageWithResponse accepts an image name and force bool. It returns details about what
// was done in removeimageresponse struct. // was done in removeimageresponse struct.
func (i *LibpodAPI) RemoveImageWithResponse(call iopodman.VarlinkCall, name string, force bool) error { func (i *VarlinkAPI) RemoveImageWithResponse(call iopodman.VarlinkCall, name string, force bool) error {
ir := iopodman.RemoveImageResponse{} ir := iopodman.RemoveImageResponse{}
ctx := getContext() ctx := getContext()
newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name) newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name)
@ -495,7 +495,7 @@ func (i *LibpodAPI) RemoveImageWithResponse(call iopodman.VarlinkCall, name stri
// SearchImages searches all registries configured in /etc/containers/registries.conf for an image // SearchImages searches all registries configured in /etc/containers/registries.conf for an image
// Requires an image name and a search limit as int // Requires an image name and a search limit as int
func (i *LibpodAPI) SearchImages(call iopodman.VarlinkCall, query string, limit *int64, filter iopodman.ImageSearchFilter) error { func (i *VarlinkAPI) SearchImages(call iopodman.VarlinkCall, query string, limit *int64, filter iopodman.ImageSearchFilter) error {
// Transform all arguments to proper types first // Transform all arguments to proper types first
argLimit := 0 argLimit := 0
argIsOfficial := types.OptionalBoolUndefined argIsOfficial := types.OptionalBoolUndefined
@ -543,7 +543,7 @@ func (i *LibpodAPI) SearchImages(call iopodman.VarlinkCall, query string, limit
// DeleteUnusedImages deletes any images that do not have containers associated with it. // DeleteUnusedImages deletes any images that do not have containers associated with it.
// TODO Filters are not implemented // TODO Filters are not implemented
func (i *LibpodAPI) DeleteUnusedImages(call iopodman.VarlinkCall) error { func (i *VarlinkAPI) DeleteUnusedImages(call iopodman.VarlinkCall) error {
images, err := i.Runtime.ImageRuntime().GetImages() images, err := i.Runtime.ImageRuntime().GetImages()
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())
@ -565,7 +565,7 @@ func (i *LibpodAPI) DeleteUnusedImages(call iopodman.VarlinkCall) error {
} }
// Commit ... // Commit ...
func (i *LibpodAPI) Commit(call iopodman.VarlinkCall, name, imageName string, changes []string, author, message string, pause bool, manifestType string) error { func (i *VarlinkAPI) Commit(call iopodman.VarlinkCall, name, imageName string, changes []string, author, message string, pause bool, manifestType string) error {
var ( var (
newImage *image.Image newImage *image.Image
log []string log []string
@ -643,7 +643,7 @@ func (i *LibpodAPI) Commit(call iopodman.VarlinkCall, name, imageName string, ch
} }
// ImportImage imports an image from a tarball to the image store // ImportImage imports an image from a tarball to the image store
func (i *LibpodAPI) ImportImage(call iopodman.VarlinkCall, source, reference, message string, changes []string, delete bool) error { func (i *VarlinkAPI) ImportImage(call iopodman.VarlinkCall, source, reference, message string, changes []string, delete bool) error {
configChanges, err := util.GetImageConfig(changes) configChanges, err := util.GetImageConfig(changes)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())
@ -670,7 +670,7 @@ func (i *LibpodAPI) ImportImage(call iopodman.VarlinkCall, source, reference, me
// ExportImage exports an image to the provided destination // ExportImage exports an image to the provided destination
// destination must have the transport type!! // destination must have the transport type!!
func (i *LibpodAPI) ExportImage(call iopodman.VarlinkCall, name, destination string, compress bool, tags []string) error { func (i *VarlinkAPI) ExportImage(call iopodman.VarlinkCall, name, destination string, compress bool, tags []string) error {
newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name) newImage, err := i.Runtime.ImageRuntime().NewFromLocal(name)
if err != nil { if err != nil {
return call.ReplyImageNotFound(name, err.Error()) return call.ReplyImageNotFound(name, err.Error())
@ -688,7 +688,7 @@ func (i *LibpodAPI) ExportImage(call iopodman.VarlinkCall, name, destination str
} }
// PullImage pulls an image from a registry to the image store. // PullImage pulls an image from a registry to the image store.
func (i *LibpodAPI) PullImage(call iopodman.VarlinkCall, name string, creds iopodman.AuthConfig) error { func (i *VarlinkAPI) PullImage(call iopodman.VarlinkCall, name string, creds iopodman.AuthConfig) error {
var ( var (
imageID string imageID string
err error err error
@ -760,7 +760,7 @@ func (i *LibpodAPI) PullImage(call iopodman.VarlinkCall, name string, creds iopo
} }
// ImageExists returns bool as to whether the input image exists in local storage // ImageExists returns bool as to whether the input image exists in local storage
func (i *LibpodAPI) ImageExists(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) ImageExists(call iopodman.VarlinkCall, name string) error {
_, err := i.Runtime.ImageRuntime().NewFromLocal(name) _, err := i.Runtime.ImageRuntime().NewFromLocal(name)
if errors.Cause(err) == image.ErrNoSuchImage { if errors.Cause(err) == image.ErrNoSuchImage {
return call.ReplyImageExists(1) return call.ReplyImageExists(1)
@ -772,7 +772,7 @@ func (i *LibpodAPI) ImageExists(call iopodman.VarlinkCall, name string) error {
} }
// ContainerRunlabel ... // ContainerRunlabel ...
func (i *LibpodAPI) ContainerRunlabel(call iopodman.VarlinkCall, input iopodman.Runlabel) error { func (i *VarlinkAPI) ContainerRunlabel(call iopodman.VarlinkCall, input iopodman.Runlabel) error {
ctx := getContext() ctx := getContext()
dockerRegistryOptions := image.DockerRegistryOptions{} dockerRegistryOptions := image.DockerRegistryOptions{}
stdErr := os.Stderr stdErr := os.Stderr
@ -798,7 +798,7 @@ func (i *LibpodAPI) ContainerRunlabel(call iopodman.VarlinkCall, input iopodman.
} }
// ImagesPrune .... // ImagesPrune ....
func (i *LibpodAPI) ImagesPrune(call iopodman.VarlinkCall, all bool, filter []string) error { func (i *VarlinkAPI) ImagesPrune(call iopodman.VarlinkCall, all bool, filter []string) error {
prunedImages, err := i.Runtime.ImageRuntime().PruneImages(context.TODO(), all, []string{}) prunedImages, err := i.Runtime.ImageRuntime().PruneImages(context.TODO(), all, []string{})
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())
@ -807,7 +807,7 @@ func (i *LibpodAPI) ImagesPrune(call iopodman.VarlinkCall, all bool, filter []st
} }
// ImageSave .... // ImageSave ....
func (i *LibpodAPI) ImageSave(call iopodman.VarlinkCall, options iopodman.ImageSaveOptions) error { func (i *VarlinkAPI) ImageSave(call iopodman.VarlinkCall, options iopodman.ImageSaveOptions) error {
newImage, err := i.Runtime.ImageRuntime().NewFromLocal(options.Name) newImage, err := i.Runtime.ImageRuntime().NewFromLocal(options.Name)
if err != nil { if err != nil {
if errors.Cause(err) == define.ErrNoSuchImage { if errors.Cause(err) == define.ErrNoSuchImage {
@ -905,7 +905,7 @@ func (i *LibpodAPI) ImageSave(call iopodman.VarlinkCall, options iopodman.ImageS
} }
// LoadImage ... // LoadImage ...
func (i *LibpodAPI) LoadImage(call iopodman.VarlinkCall, name, inputFile string, deleteInputFile, quiet bool) error { func (i *VarlinkAPI) LoadImage(call iopodman.VarlinkCall, name, inputFile string, deleteInputFile, quiet bool) error {
var ( var (
names string names string
writer io.Writer writer io.Writer
@ -974,7 +974,7 @@ func (i *LibpodAPI) LoadImage(call iopodman.VarlinkCall, name, inputFile string,
} }
// Diff ... // Diff ...
func (i *LibpodAPI) Diff(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) Diff(call iopodman.VarlinkCall, name string) error {
var response []iopodman.DiffInfo var response []iopodman.DiffInfo
changes, err := i.Runtime.GetDiff("", name) changes, err := i.Runtime.GetDiff("", name)
if err != nil { if err != nil {
@ -987,7 +987,7 @@ func (i *LibpodAPI) Diff(call iopodman.VarlinkCall, name string) error {
} }
// GetLayersMapWithImageInfo is a development only endpoint to obtain layer information for an image. // GetLayersMapWithImageInfo is a development only endpoint to obtain layer information for an image.
func (i *LibpodAPI) GetLayersMapWithImageInfo(call iopodman.VarlinkCall) error { func (i *VarlinkAPI) GetLayersMapWithImageInfo(call iopodman.VarlinkCall) error {
layerInfo, err := image.GetLayersMapWithImageInfo(i.Runtime.ImageRuntime()) layerInfo, err := image.GetLayersMapWithImageInfo(i.Runtime.ImageRuntime())
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())
@ -1000,7 +1000,7 @@ func (i *LibpodAPI) GetLayersMapWithImageInfo(call iopodman.VarlinkCall) error {
} }
// BuildImageHierarchyMap ... // BuildImageHierarchyMap ...
func (i *LibpodAPI) BuildImageHierarchyMap(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) BuildImageHierarchyMap(call iopodman.VarlinkCall, name string) error {
img, err := i.Runtime.ImageRuntime().NewFromLocal(name) img, err := i.Runtime.ImageRuntime().NewFromLocal(name)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())
@ -1024,7 +1024,7 @@ func (i *LibpodAPI) BuildImageHierarchyMap(call iopodman.VarlinkCall, name strin
} }
// ImageTree returns the image tree string for the provided image name or ID // ImageTree returns the image tree string for the provided image name or ID
func (i *LibpodAPI) ImageTree(call iopodman.VarlinkCall, nameOrID string, whatRequires bool) error { func (i *VarlinkAPI) ImageTree(call iopodman.VarlinkCall, nameOrID string, whatRequires bool) error {
img, err := i.Runtime.ImageRuntime().NewFromLocal(nameOrID) img, err := i.Runtime.ImageRuntime().NewFromLocal(nameOrID)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())

View File

@ -5,7 +5,7 @@ package varlinkapi
import iopodman "github.com/containers/libpod/pkg/varlink" import iopodman "github.com/containers/libpod/pkg/varlink"
// ListContainerMounts ... // ListContainerMounts ...
func (i *LibpodAPI) ListContainerMounts(call iopodman.VarlinkCall) error { func (i *VarlinkAPI) ListContainerMounts(call iopodman.VarlinkCall) error {
mounts := make(map[string]string) mounts := make(map[string]string)
allContainers, err := i.Runtime.GetAllContainers() allContainers, err := i.Runtime.GetAllContainers()
if err != nil { if err != nil {
@ -24,7 +24,7 @@ func (i *LibpodAPI) ListContainerMounts(call iopodman.VarlinkCall) error {
} }
// MountContainer ... // MountContainer ...
func (i *LibpodAPI) MountContainer(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) MountContainer(call iopodman.VarlinkCall, name string) error {
container, err := i.Runtime.LookupContainer(name) container, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())
@ -37,7 +37,7 @@ func (i *LibpodAPI) MountContainer(call iopodman.VarlinkCall, name string) error
} }
// UnmountContainer ... // UnmountContainer ...
func (i *LibpodAPI) UnmountContainer(call iopodman.VarlinkCall, name string, force bool) error { func (i *VarlinkAPI) UnmountContainer(call iopodman.VarlinkCall, name string, force bool) error {
container, err := i.Runtime.LookupContainer(name) container, err := i.Runtime.LookupContainer(name)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())

View File

@ -14,7 +14,7 @@ import (
) )
// CreatePod ... // CreatePod ...
func (i *LibpodAPI) CreatePod(call iopodman.VarlinkCall, create iopodman.PodCreate) error { func (i *VarlinkAPI) CreatePod(call iopodman.VarlinkCall, create iopodman.PodCreate) error {
var options []libpod.PodCreateOption var options []libpod.PodCreateOption
if create.Infra { if create.Infra {
options = append(options, libpod.WithInfraContainer()) options = append(options, libpod.WithInfraContainer())
@ -61,7 +61,7 @@ func (i *LibpodAPI) CreatePod(call iopodman.VarlinkCall, create iopodman.PodCrea
} }
// ListPods ... // ListPods ...
func (i *LibpodAPI) ListPods(call iopodman.VarlinkCall) error { func (i *VarlinkAPI) ListPods(call iopodman.VarlinkCall) error {
var ( var (
listPods []iopodman.ListPodData listPods []iopodman.ListPodData
) )
@ -82,7 +82,7 @@ func (i *LibpodAPI) ListPods(call iopodman.VarlinkCall) error {
} }
// GetPod ... // GetPod ...
func (i *LibpodAPI) GetPod(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) GetPod(call iopodman.VarlinkCall, name string) error {
pod, err := i.Runtime.LookupPod(name) pod, err := i.Runtime.LookupPod(name)
if err != nil { if err != nil {
return call.ReplyPodNotFound(name, err.Error()) return call.ReplyPodNotFound(name, err.Error())
@ -98,7 +98,7 @@ func (i *LibpodAPI) GetPod(call iopodman.VarlinkCall, name string) error {
} }
// GetPodsByStatus returns a slice of pods filtered by a libpod status // GetPodsByStatus returns a slice of pods filtered by a libpod status
func (i *LibpodAPI) GetPodsByStatus(call iopodman.VarlinkCall, statuses []string) error { func (i *VarlinkAPI) GetPodsByStatus(call iopodman.VarlinkCall, statuses []string) error {
filterFuncs := func(p *libpod.Pod) bool { filterFuncs := func(p *libpod.Pod) bool {
state, _ := shared.GetPodStatus(p) state, _ := shared.GetPodStatus(p)
for _, status := range statuses { for _, status := range statuses {
@ -120,7 +120,7 @@ func (i *LibpodAPI) GetPodsByStatus(call iopodman.VarlinkCall, statuses []string
} }
// InspectPod ... // InspectPod ...
func (i *LibpodAPI) InspectPod(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) InspectPod(call iopodman.VarlinkCall, name string) error {
pod, err := i.Runtime.LookupPod(name) pod, err := i.Runtime.LookupPod(name)
if err != nil { if err != nil {
return call.ReplyPodNotFound(name, err.Error()) return call.ReplyPodNotFound(name, err.Error())
@ -137,7 +137,7 @@ func (i *LibpodAPI) InspectPod(call iopodman.VarlinkCall, name string) error {
} }
// StartPod ... // StartPod ...
func (i *LibpodAPI) StartPod(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) StartPod(call iopodman.VarlinkCall, name string) error {
pod, err := i.Runtime.LookupPod(name) pod, err := i.Runtime.LookupPod(name)
if err != nil { if err != nil {
return call.ReplyPodNotFound(name, err.Error()) return call.ReplyPodNotFound(name, err.Error())
@ -158,7 +158,7 @@ func (i *LibpodAPI) StartPod(call iopodman.VarlinkCall, name string) error {
} }
// StopPod ... // StopPod ...
func (i *LibpodAPI) StopPod(call iopodman.VarlinkCall, name string, timeout int64) error { func (i *VarlinkAPI) StopPod(call iopodman.VarlinkCall, name string, timeout int64) error {
pod, err := i.Runtime.LookupPod(name) pod, err := i.Runtime.LookupPod(name)
if err != nil { if err != nil {
return call.ReplyPodNotFound(name, err.Error()) return call.ReplyPodNotFound(name, err.Error())
@ -172,7 +172,7 @@ func (i *LibpodAPI) StopPod(call iopodman.VarlinkCall, name string, timeout int6
} }
// RestartPod ... // RestartPod ...
func (i *LibpodAPI) RestartPod(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) RestartPod(call iopodman.VarlinkCall, name string) error {
pod, err := i.Runtime.LookupPod(name) pod, err := i.Runtime.LookupPod(name)
if err != nil { if err != nil {
return call.ReplyPodNotFound(name, err.Error()) return call.ReplyPodNotFound(name, err.Error())
@ -194,7 +194,7 @@ func (i *LibpodAPI) RestartPod(call iopodman.VarlinkCall, name string) error {
// KillPod kills the running containers in a pod. If you want to use the default SIGTERM signal, // KillPod kills the running containers in a pod. If you want to use the default SIGTERM signal,
// just send a -1 for the signal arg. // just send a -1 for the signal arg.
func (i *LibpodAPI) KillPod(call iopodman.VarlinkCall, name string, signal int64) error { func (i *VarlinkAPI) KillPod(call iopodman.VarlinkCall, name string, signal int64) error {
killSignal := uint(syscall.SIGTERM) killSignal := uint(syscall.SIGTERM)
if signal != -1 { if signal != -1 {
killSignal = uint(signal) killSignal = uint(signal)
@ -213,7 +213,7 @@ func (i *LibpodAPI) KillPod(call iopodman.VarlinkCall, name string, signal int64
} }
// PausePod ... // PausePod ...
func (i *LibpodAPI) PausePod(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) PausePod(call iopodman.VarlinkCall, name string) error {
pod, err := i.Runtime.LookupPod(name) pod, err := i.Runtime.LookupPod(name)
if err != nil { if err != nil {
return call.ReplyPodNotFound(name, err.Error()) return call.ReplyPodNotFound(name, err.Error())
@ -227,7 +227,7 @@ func (i *LibpodAPI) PausePod(call iopodman.VarlinkCall, name string) error {
} }
// UnpausePod ... // UnpausePod ...
func (i *LibpodAPI) UnpausePod(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) UnpausePod(call iopodman.VarlinkCall, name string) error {
pod, err := i.Runtime.LookupPod(name) pod, err := i.Runtime.LookupPod(name)
if err != nil { if err != nil {
return call.ReplyPodNotFound(name, err.Error()) return call.ReplyPodNotFound(name, err.Error())
@ -241,7 +241,7 @@ func (i *LibpodAPI) UnpausePod(call iopodman.VarlinkCall, name string) error {
} }
// RemovePod ... // RemovePod ...
func (i *LibpodAPI) RemovePod(call iopodman.VarlinkCall, name string, force bool) error { func (i *VarlinkAPI) RemovePod(call iopodman.VarlinkCall, name string, force bool) error {
ctx := getContext() ctx := getContext()
pod, err := i.Runtime.LookupPod(name) pod, err := i.Runtime.LookupPod(name)
if err != nil { if err != nil {
@ -255,7 +255,7 @@ func (i *LibpodAPI) RemovePod(call iopodman.VarlinkCall, name string, force bool
} }
// GetPodStats ... // GetPodStats ...
func (i *LibpodAPI) GetPodStats(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) GetPodStats(call iopodman.VarlinkCall, name string) error {
pod, err := i.Runtime.LookupPod(name) pod, err := i.Runtime.LookupPod(name)
if err != nil { if err != nil {
return call.ReplyPodNotFound(name, err.Error()) return call.ReplyPodNotFound(name, err.Error())
@ -291,7 +291,7 @@ func (i *LibpodAPI) GetPodStats(call iopodman.VarlinkCall, name string) error {
} }
// GetPodsByContext returns a slice of pod ids based on all, latest, or a list // GetPodsByContext returns a slice of pod ids based on all, latest, or a list
func (i *LibpodAPI) GetPodsByContext(call iopodman.VarlinkCall, all, latest bool, input []string) error { func (i *VarlinkAPI) GetPodsByContext(call iopodman.VarlinkCall, all, latest bool, input []string) error {
var podids []string var podids []string
pods, err := shortcuts.GetPodsByContext(all, latest, input, i.Runtime) pods, err := shortcuts.GetPodsByContext(all, latest, input, i.Runtime)
@ -305,7 +305,7 @@ func (i *LibpodAPI) GetPodsByContext(call iopodman.VarlinkCall, all, latest bool
} }
// PodStateData returns a container's state data in string format // PodStateData returns a container's state data in string format
func (i *LibpodAPI) PodStateData(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) PodStateData(call iopodman.VarlinkCall, name string) error {
pod, err := i.Runtime.LookupPod(name) pod, err := i.Runtime.LookupPod(name)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())
@ -322,7 +322,7 @@ func (i *LibpodAPI) PodStateData(call iopodman.VarlinkCall, name string) error {
} }
// TopPod provides the top stats for a given or latest pod // TopPod provides the top stats for a given or latest pod
func (i *LibpodAPI) TopPod(call iopodman.VarlinkCall, name string, latest bool, descriptors []string) error { func (i *VarlinkAPI) TopPod(call iopodman.VarlinkCall, name string, latest bool, descriptors []string) error {
var ( var (
pod *libpod.Pod pod *libpod.Pod
err error err error

View File

@ -16,7 +16,7 @@ import (
) )
// GetVersion ... // GetVersion ...
func (i *LibpodAPI) GetVersion(call iopodman.VarlinkCall) error { func (i *VarlinkAPI) GetVersion(call iopodman.VarlinkCall) error {
versionInfo, err := define.GetVersion() versionInfo, err := define.GetVersion()
if err != nil { if err != nil {
return err return err
@ -33,7 +33,7 @@ func (i *LibpodAPI) GetVersion(call iopodman.VarlinkCall) error {
} }
// GetInfo returns details about the podman host and its stores // GetInfo returns details about the podman host and its stores
func (i *LibpodAPI) GetInfo(call iopodman.VarlinkCall) error { func (i *VarlinkAPI) GetInfo(call iopodman.VarlinkCall) error {
versionInfo, err := define.GetVersion() versionInfo, err := define.GetVersion()
if err != nil { if err != nil {
return err return err
@ -106,7 +106,7 @@ func (i *LibpodAPI) GetInfo(call iopodman.VarlinkCall) error {
} }
// GetVersion ... // GetVersion ...
func (i *LibpodAPI) Reset(call iopodman.VarlinkCall) error { func (i *VarlinkAPI) Reset(call iopodman.VarlinkCall) error {
if err := i.Runtime.Reset(context.TODO()); err != nil { if err := i.Runtime.Reset(context.TODO()); err != nil {
logrus.Errorf("Reset Failed: %v", err) logrus.Errorf("Reset Failed: %v", err)
if err := call.ReplyErrorOccurred(err.Error()); err != nil { if err := call.ReplyErrorOccurred(err.Error()); err != nil {

View File

@ -4,7 +4,6 @@ package varlinkapi
import ( import (
"bufio" "bufio"
"fmt"
"io" "io"
"io/ioutil" "io/ioutil"
"os" "os"
@ -14,7 +13,7 @@ import (
) )
// SendFile allows a client to send a file to the varlink server // SendFile allows a client to send a file to the varlink server
func (i *LibpodAPI) SendFile(call iopodman.VarlinkCall, ftype string, length int64) error { func (i *VarlinkAPI) SendFile(call iopodman.VarlinkCall, ftype string, length int64) error {
if !call.WantsUpgrade() { if !call.WantsUpgrade() {
return call.ReplyErrorOccurred("client must use upgraded connection to send files") return call.ReplyErrorOccurred("client must use upgraded connection to send files")
} }
@ -40,14 +39,14 @@ func (i *LibpodAPI) SendFile(call iopodman.VarlinkCall, ftype string, length int
logrus.Debugf("successfully received %s", outputFile.Name()) logrus.Debugf("successfully received %s", outputFile.Name())
// Send an ACK to the client // Send an ACK to the client
call.Call.Writer.WriteString(fmt.Sprintf("%s:", outputFile.Name())) call.Call.Writer.WriteString(outputFile.Name())
call.Call.Writer.Flush() call.Call.Writer.Flush()
return nil return nil
} }
// ReceiveFile allows the varlink server to send a file to a client // ReceiveFile allows the varlink server to send a file to a client
func (i *LibpodAPI) ReceiveFile(call iopodman.VarlinkCall, filepath string, delete bool) error { func (i *VarlinkAPI) ReceiveFile(call iopodman.VarlinkCall, filepath string, delete bool) error {
if !call.WantsUpgrade() { if !call.WantsUpgrade() {
return call.ReplyErrorOccurred("client must use upgraded connection to send files") return call.ReplyErrorOccurred("client must use upgraded connection to send files")
} }

View File

@ -11,7 +11,7 @@ import (
) )
// VolumeCreate creates a libpod volume based on input from a varlink connection // VolumeCreate creates a libpod volume based on input from a varlink connection
func (i *LibpodAPI) VolumeCreate(call iopodman.VarlinkCall, options iopodman.VolumeCreateOpts) error { func (i *VarlinkAPI) VolumeCreate(call iopodman.VarlinkCall, options iopodman.VolumeCreateOpts) error {
var volumeOptions []libpod.VolumeCreateOption var volumeOptions []libpod.VolumeCreateOption
if len(options.VolumeName) > 0 { if len(options.VolumeName) > 0 {
@ -38,7 +38,7 @@ func (i *LibpodAPI) VolumeCreate(call iopodman.VarlinkCall, options iopodman.Vol
} }
// VolumeRemove removes volumes by options.All or options.Volumes // VolumeRemove removes volumes by options.All or options.Volumes
func (i *LibpodAPI) VolumeRemove(call iopodman.VarlinkCall, options iopodman.VolumeRemoveOpts) error { func (i *VarlinkAPI) VolumeRemove(call iopodman.VarlinkCall, options iopodman.VolumeRemoveOpts) error {
success, failed, err := shared.SharedRemoveVolumes(getContext(), i.Runtime, options.Volumes, options.All, options.Force) success, failed, err := shared.SharedRemoveVolumes(getContext(), i.Runtime, options.Volumes, options.All, options.Force)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())
@ -52,7 +52,7 @@ func (i *LibpodAPI) VolumeRemove(call iopodman.VarlinkCall, options iopodman.Vol
} }
// GetVolumes returns all the volumes known to the remote system // GetVolumes returns all the volumes known to the remote system
func (i *LibpodAPI) GetVolumes(call iopodman.VarlinkCall, args []string, all bool) error { func (i *VarlinkAPI) GetVolumes(call iopodman.VarlinkCall, args []string, all bool) error {
var ( var (
err error err error
reply []*libpod.Volume reply []*libpod.Volume
@ -87,7 +87,7 @@ func (i *LibpodAPI) GetVolumes(call iopodman.VarlinkCall, args []string, all boo
} }
// InspectVolume inspects a single volume, returning its JSON as a string. // InspectVolume inspects a single volume, returning its JSON as a string.
func (i *LibpodAPI) InspectVolume(call iopodman.VarlinkCall, name string) error { func (i *VarlinkAPI) InspectVolume(call iopodman.VarlinkCall, name string) error {
vol, err := i.Runtime.LookupVolume(name) vol, err := i.Runtime.LookupVolume(name)
if err != nil { if err != nil {
return call.ReplyErrorOccurred(err.Error()) return call.ReplyErrorOccurred(err.Error())
@ -104,7 +104,7 @@ func (i *LibpodAPI) InspectVolume(call iopodman.VarlinkCall, name string) error
} }
// VolumesPrune removes unused images via a varlink call // VolumesPrune removes unused images via a varlink call
func (i *LibpodAPI) VolumesPrune(call iopodman.VarlinkCall) error { func (i *VarlinkAPI) VolumesPrune(call iopodman.VarlinkCall) error {
var ( var (
prunedErrors []string prunedErrors []string
prunedNames []string prunedNames []string

View File

@ -221,8 +221,8 @@ func PodmanTestCreateUtil(tempDir string, remote bool) *PodmanTestIntegration {
ociRuntime := os.Getenv("OCI_RUNTIME") ociRuntime := os.Getenv("OCI_RUNTIME")
if ociRuntime == "" { if ociRuntime == "" {
var err error var err error
ociRuntime, err = exec.LookPath("runc") ociRuntime, err = exec.LookPath("crun")
// If we cannot find the runc binary, setting to something static as we have no way // If we cannot find the crun binary, setting to something static as we have no way
// to return an error. The tests will fail and point out that the runc binary could // to return an error. The tests will fail and point out that the runc binary could
// not be found nicely. // not be found nicely.
if err != nil { if err != nil {