mirror of
https://github.com/containers/podman.git
synced 2025-06-19 16:33:24 +08:00
Merge pull request #2098 from baude/remote
Add ability to build golang remote client
This commit is contained in:
3
Makefile
3
Makefile
@ -111,6 +111,9 @@ test/goecho/goecho: .gopathok $(wildcard test/goecho/*.go)
|
||||
podman: .gopathok $(PODMAN_VARLINK_DEPENDENCIES)
|
||||
$(GO) build -ldflags '$(LDFLAGS_PODMAN)' -tags "$(BUILDTAGS)" -o bin/$@ $(PROJECT)/cmd/podman
|
||||
|
||||
podman-remote: .gopathok $(PODMAN_VARLINK_DEPENDENCIES)
|
||||
$(GO) build -ldflags '$(LDFLAGS_PODMAN)' -tags "$(BUILDTAGS) remoteclient" -o bin/$@ $(PROJECT)/cmd/podman
|
||||
|
||||
local-cross: $(CROSS_BUILD_TARGETS)
|
||||
|
||||
bin/podman.cross.%: .gopathok
|
||||
|
@ -1,10 +1,10 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/containers/libpod/libpod/adapter"
|
||||
"runtime"
|
||||
|
||||
"github.com/containers/libpod/cmd/podman/formats"
|
||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
||||
"github.com/containers/libpod/libpod"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/urfave/cli"
|
||||
@ -39,18 +39,20 @@ func infoCmd(c *cli.Context) error {
|
||||
}
|
||||
info := map[string]interface{}{}
|
||||
|
||||
runtime, err := libpodruntime.GetRuntime(c)
|
||||
localRuntime, err := adapter.GetRuntime(c)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "could not get runtime")
|
||||
}
|
||||
defer runtime.Shutdown(false)
|
||||
defer localRuntime.Runtime.Shutdown(false)
|
||||
|
||||
infoArr, err := runtime.Info()
|
||||
infoArr, err := localRuntime.Runtime.Info()
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "error getting info")
|
||||
}
|
||||
|
||||
if c.Bool("debug") {
|
||||
// TODO This is no a problem child because we don't know if we should add information
|
||||
// TODO about the client or the backend. Only do for traditional podman for now.
|
||||
if !localRuntime.Remote && c.Bool("debug") {
|
||||
debugInfo := debugInfo(c)
|
||||
infoArr = append(infoArr, libpod.InfoData{Type: "debug", Data: debugInfo})
|
||||
}
|
||||
|
16
libpod/adapter/client.go
Normal file
16
libpod/adapter/client.go
Normal file
@ -0,0 +1,16 @@
|
||||
// +build remoteclient
|
||||
|
||||
package adapter
|
||||
|
||||
import (
|
||||
"github.com/varlink/go/varlink"
|
||||
)
|
||||
|
||||
// Connect provides a varlink connection
|
||||
func (r RemoteRuntime) Connect() (*varlink.Connection, error) {
|
||||
connection, err := varlink.NewConnection("unix:/run/podman/io.podman")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return connection, nil
|
||||
}
|
56
libpod/adapter/info_remote.go
Normal file
56
libpod/adapter/info_remote.go
Normal file
@ -0,0 +1,56 @@
|
||||
// +build remoteclient
|
||||
|
||||
package adapter
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"github.com/containers/libpod/cmd/podman/varlink"
|
||||
"github.com/containers/libpod/libpod"
|
||||
)
|
||||
|
||||
// Info returns information for the host system and its components
|
||||
func (r RemoteRuntime) Info() ([]libpod.InfoData, error) {
|
||||
// TODO the varlink implementation for info should be updated to match the output for regular info
|
||||
var (
|
||||
reply []libpod.InfoData
|
||||
hostInfo map[string]interface{}
|
||||
store map[string]interface{}
|
||||
)
|
||||
|
||||
registries := make(map[string]interface{})
|
||||
insecureRegistries := make(map[string]interface{})
|
||||
conn, err := r.Connect()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer conn.Close()
|
||||
info, err := iopodman.GetInfo().Call(conn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// info.host -> map[string]interface{}
|
||||
h, err := json.Marshal(info.Host)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
json.Unmarshal(h, &hostInfo)
|
||||
|
||||
// info.store -> map[string]interface{}
|
||||
s, err := json.Marshal(info.Store)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
json.Unmarshal(s, &store)
|
||||
|
||||
registries["registries"] = info.Registries
|
||||
insecureRegistries["registries"] = info.Insecure_registries
|
||||
|
||||
// Add everything to the reply
|
||||
reply = append(reply, libpod.InfoData{Type: "host", Data: hostInfo})
|
||||
reply = append(reply, libpod.InfoData{Type: "registries", Data: registries})
|
||||
reply = append(reply, libpod.InfoData{Type: "insecure registries", Data: insecureRegistries})
|
||||
reply = append(reply, libpod.InfoData{Type: "store", Data: store})
|
||||
return reply, nil
|
||||
}
|
26
libpod/adapter/runtime.go
Normal file
26
libpod/adapter/runtime.go
Normal file
@ -0,0 +1,26 @@
|
||||
// +build !remoteclient
|
||||
|
||||
package adapter
|
||||
|
||||
import (
|
||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
||||
"github.com/containers/libpod/libpod"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
// LocalRuntime describes a typical libpod runtime
|
||||
type LocalRuntime struct {
|
||||
Runtime *libpod.Runtime
|
||||
Remote bool
|
||||
}
|
||||
|
||||
// GetRuntime returns a LocalRuntime struct with the actual runtime embedded in it
|
||||
func GetRuntime(c *cli.Context) (*LocalRuntime, error) {
|
||||
runtime, err := libpodruntime.GetRuntime(c)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &LocalRuntime{
|
||||
Runtime: runtime,
|
||||
}, nil
|
||||
}
|
28
libpod/adapter/runtime_remote.go
Normal file
28
libpod/adapter/runtime_remote.go
Normal file
@ -0,0 +1,28 @@
|
||||
// +build remoteclient
|
||||
|
||||
package adapter
|
||||
|
||||
import "github.com/urfave/cli"
|
||||
|
||||
// RemoteRuntime describes a wrapper runtime struct
|
||||
type RemoteRuntime struct{}
|
||||
|
||||
// LocalRuntime describes a typical libpod runtime
|
||||
type LocalRuntime struct {
|
||||
Runtime *RemoteRuntime
|
||||
Remote bool
|
||||
}
|
||||
|
||||
// GetRuntime returns a LocalRuntime struct with the actual runtime embedded in it
|
||||
func GetRuntime(c *cli.Context) (*LocalRuntime, error) {
|
||||
runtime := RemoteRuntime{}
|
||||
return &LocalRuntime{
|
||||
Runtime: &runtime,
|
||||
Remote: true,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Shutdown is a bogus wrapper for compat with the libpod runtime
|
||||
func (r RemoteRuntime) Shutdown(force bool) error {
|
||||
return nil
|
||||
}
|
@ -102,6 +102,5 @@ func (i *LibpodAPI) GetInfo(call iopodman.VarlinkCall) error {
|
||||
podmanInfo.Podman = pmaninfo
|
||||
podmanInfo.Registries = registries
|
||||
podmanInfo.Insecure_registries = insecureRegistries
|
||||
|
||||
return call.ReplyGetInfo(podmanInfo)
|
||||
}
|
||||
|
Reference in New Issue
Block a user