aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/podman/system/version.go70
-rw-r--r--libpod/define/version.go2
-rw-r--r--pkg/api/handlers/compat/version.go3
-rw-r--r--pkg/api/handlers/types.go4
-rw-r--r--pkg/api/server/register_version.go21
-rw-r--r--pkg/api/server/swagger.go9
-rw-r--r--pkg/bindings/system/system.go38
-rw-r--r--pkg/domain/entities/engine_container.go1
-rw-r--r--pkg/domain/entities/system.go14
-rw-r--r--pkg/domain/infra/abi/system.go10
-rw-r--r--pkg/domain/infra/tunnel/system.go4
11 files changed, 118 insertions, 58 deletions
diff --git a/cmd/podman/system/version.go b/cmd/podman/system/version.go
index 065eef309..50bd81368 100644
--- a/cmd/podman/system/version.go
+++ b/cmd/podman/system/version.go
@@ -8,12 +8,10 @@ import (
"text/tabwriter"
"time"
- "github.com/containers/buildah/pkg/formats"
"github.com/containers/libpod/cmd/podman/registry"
"github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/domain/entities"
- "github.com/pkg/errors"
"github.com/spf13/cobra"
)
@@ -23,18 +21,10 @@ var (
Args: validate.NoArgs,
Short: "Display the Podman Version Information",
RunE: version,
- Annotations: map[string]string{
- registry.ParentNSRequired: "",
- },
}
versionFormat string
)
-type versionStruct struct {
- Client define.Version
- Server define.Version
-}
-
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
@@ -45,68 +35,44 @@ func init() {
}
func version(cmd *cobra.Command, args []string) error {
- var (
- v versionStruct
- err error
- )
- v.Client, err = define.GetVersion()
+ versions, err := registry.ContainerEngine().Version(registry.Context())
if err != nil {
- return errors.Wrapf(err, "unable to determine version")
+ return err
}
- // TODO we need to discuss how to implement
- // this more. current endpoints dont have a
- // version endpoint. maybe we use info?
- // if remote {
- // v.Server, err = getRemoteVersion(c)
- // if err != nil {
- // return err
- // }
- // } else {
- v.Server = v.Client
- // }
- versionOutputFormat := versionFormat
- if versionOutputFormat != "" {
- if strings.Join(strings.Fields(versionOutputFormat), "") == "{{json.}}" {
- versionOutputFormat = formats.JSONString
+ switch {
+ case versionFormat == "json", versionFormat == "{{ json .}}":
+ s, err := json.MarshalToString(versions)
+ if err != nil {
+ return err
}
- var out formats.Writer
- switch versionOutputFormat {
- case formats.JSONString:
- out = formats.JSONStruct{Output: v}
- return out.Out()
- default:
- out = formats.StdoutTemplate{Output: v, Template: versionOutputFormat}
- err := out.Out()
- if err != nil {
- // On Failure, assume user is using older version of podman version --format and check client
- out = formats.StdoutTemplate{Output: v.Client, Template: versionOutputFormat}
- if err1 := out.Out(); err1 != nil {
- return err
- }
- }
+ _, err = io.WriteString(os.Stdout, s)
+ return err
+ case cmd.Flag("format").Changed:
+ if !strings.HasSuffix(versionFormat, "\n") {
+ versionFormat += "\n"
}
- return nil
}
+
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
defer w.Flush()
- if registry.IsRemote() {
+ if versions.Server != nil {
if _, err := fmt.Fprintf(w, "Client:\n"); err != nil {
return err
}
- formatVersion(w, v.Client)
+ formatVersion(w, versions.Client)
if _, err := fmt.Fprintf(w, "\nServer:\n"); err != nil {
return err
}
- formatVersion(w, v.Server)
+ formatVersion(w, versions.Server)
} else {
- formatVersion(w, v.Client)
+ formatVersion(w, versions.Client)
}
return nil
}
-func formatVersion(writer io.Writer, version define.Version) {
+func formatVersion(writer io.Writer, version *define.Version) {
fmt.Fprintf(writer, "Version:\t%s\n", version.Version)
fmt.Fprintf(writer, "RemoteAPI Version:\t%d\n", version.RemoteAPIVersion)
fmt.Fprintf(writer, "Go Version:\t%s\n", version.GoVersion)
diff --git a/libpod/define/version.go b/libpod/define/version.go
index 0f9f49050..954cd00f1 100644
--- a/libpod/define/version.go
+++ b/libpod/define/version.go
@@ -17,7 +17,7 @@ var (
buildInfo string
)
-//Version is an output struct for varlink
+// Version is an output struct for varlink
type Version struct {
RemoteAPIVersion int64
Version string
diff --git a/pkg/api/handlers/compat/version.go b/pkg/api/handlers/compat/version.go
index 35a95b562..8786f1d5b 100644
--- a/pkg/api/handlers/compat/version.go
+++ b/pkg/api/handlers/compat/version.go
@@ -10,6 +10,7 @@ import (
"github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/api/handlers"
"github.com/containers/libpod/pkg/api/handlers/utils"
+ "github.com/containers/libpod/pkg/domain/entities"
docker "github.com/docker/docker/api/types"
"github.com/pkg/errors"
)
@@ -46,7 +47,7 @@ func VersionHandler(w http.ResponseWriter, r *http.Request) {
},
}}
- utils.WriteResponse(w, http.StatusOK, handlers.Version{Version: docker.Version{
+ utils.WriteResponse(w, http.StatusOK, entities.ComponentVersion{Version: docker.Version{
Platform: struct {
Name string
}{
diff --git a/pkg/api/handlers/types.go b/pkg/api/handlers/types.go
index a7abf59c0..2075d29df 100644
--- a/pkg/api/handlers/types.go
+++ b/pkg/api/handlers/types.go
@@ -71,10 +71,6 @@ type Container struct {
docker.ContainerCreateConfig
}
-type Version struct {
- docker.Version
-}
-
type DiskUsage struct {
docker.DiskUsage
}
diff --git a/pkg/api/server/register_version.go b/pkg/api/server/register_version.go
index 25cacbc61..30289ffe3 100644
--- a/pkg/api/server/register_version.go
+++ b/pkg/api/server/register_version.go
@@ -8,7 +8,28 @@ import (
)
func (s *APIServer) registerVersionHandlers(r *mux.Router) error {
+ // swagger:operation GET /version compat CompatSystemVersion
+ // ---
+ // summary: Component Version information
+ // tags:
+ // - system (compat)
+ // produces:
+ // - application/json
+ // responses:
+ // 200:
+ // $ref: "#/responses/Version"
r.Handle("/version", s.APIHandler(compat.VersionHandler)).Methods(http.MethodGet)
r.Handle(VersionedPath("/version"), s.APIHandler(compat.VersionHandler)).Methods(http.MethodGet)
+ // swagger:operation GET /libpod/version libpod SystemVersion
+ // ---
+ // summary: Component Version information
+ // tags:
+ // - system
+ // produces:
+ // - application/json
+ // responses:
+ // 200:
+ // $ref: "#/responses/Version"
+ r.Handle(VersionedPath("/libpod/version"), s.APIHandler(compat.VersionHandler)).Methods(http.MethodGet)
return nil
}
diff --git a/pkg/api/server/swagger.go b/pkg/api/server/swagger.go
index 75dcc71a6..e47f2cc2f 100644
--- a/pkg/api/server/swagger.go
+++ b/pkg/api/server/swagger.go
@@ -181,3 +181,12 @@ type swagHealthCheckRunResponse struct {
define.HealthCheckResults
}
}
+
+// Version
+// swagger:response Version
+type swagVersion struct {
+ // in:body
+ Body struct {
+ entities.SystemVersionReport
+ }
+}
diff --git a/pkg/bindings/system/system.go b/pkg/bindings/system/system.go
index df6b529de..caef6af6f 100644
--- a/pkg/bindings/system/system.go
+++ b/pkg/bindings/system/system.go
@@ -3,11 +3,14 @@ package system
import (
"context"
"encoding/json"
+ "fmt"
"io"
"net/http"
"net/url"
"strconv"
+ "time"
+ "github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/bindings"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/pkg/errors"
@@ -83,3 +86,38 @@ func Prune(ctx context.Context, all, volumes *bool) (*entities.SystemPruneReport
}
return &report, response.Process(&report)
}
+
+func Version(ctx context.Context) (*entities.SystemVersionReport, error) {
+ var report entities.SystemVersionReport
+ var component entities.ComponentVersion
+
+ version, err := define.GetVersion()
+ if err != nil {
+ return nil, err
+ }
+ report.Client = &version
+
+ conn, err := bindings.GetClient(ctx)
+ if err != nil {
+ return nil, err
+ }
+ response, err := conn.DoRequest(nil, http.MethodGet, "/version", nil)
+ if err != nil {
+ return nil, err
+ }
+
+ if err = response.Process(&component); err != nil {
+ return nil, err
+ }
+ f, _ := strconv.ParseFloat(component.APIVersion, 64)
+ b, _ := time.Parse(time.RFC3339, component.BuildTime)
+ report.Server = &define.Version{
+ RemoteAPIVersion: int64(f),
+ Version: component.Version.Version,
+ GoVersion: component.GoVersion,
+ GitCommit: component.GitCommit,
+ Built: b.Unix(),
+ OsArch: fmt.Sprintf("%s/%s", component.Os, component.Arch),
+ }
+ return &report, err
+}
diff --git a/pkg/domain/entities/engine_container.go b/pkg/domain/entities/engine_container.go
index bb13794bd..719ac3f9e 100644
--- a/pkg/domain/entities/engine_container.go
+++ b/pkg/domain/entities/engine_container.go
@@ -73,6 +73,7 @@ type ContainerEngine interface {
SystemDf(ctx context.Context, options SystemDfOptions) (*SystemDfReport, error)
Unshare(ctx context.Context, args []string) error
VarlinkService(ctx context.Context, opts ServiceOptions) error
+ Version(ctx context.Context) (*SystemVersionReport, error)
VolumeCreate(ctx context.Context, opts VolumeCreateOptions) (*IdOrNameResponse, error)
VolumeInspect(ctx context.Context, namesOrIds []string, opts VolumeInspectOptions) ([]*VolumeInspectReport, error)
VolumeList(ctx context.Context, opts VolumeListOptions) ([]*VolumeListReport, error)
diff --git a/pkg/domain/entities/system.go b/pkg/domain/entities/system.go
index c62f40025..5e4760d12 100644
--- a/pkg/domain/entities/system.go
+++ b/pkg/domain/entities/system.go
@@ -3,6 +3,8 @@ package entities
import (
"time"
+ "github.com/containers/libpod/libpod/define"
+ "github.com/docker/docker/api/types"
"github.com/spf13/cobra"
)
@@ -83,3 +85,15 @@ type SystemDfVolumeReport struct {
type SystemResetOptions struct {
Force bool
}
+
+// SystemVersionReport describes version information about the running Podman service
+type SystemVersionReport struct {
+ // Always populated
+ Client *define.Version `json:",omitempty"`
+ // May be populated, when in tunnel mode
+ Server *define.Version `json:",omitempty"`
+}
+
+type ComponentVersion struct {
+ types.Version
+}
diff --git a/pkg/domain/infra/abi/system.go b/pkg/domain/infra/abi/system.go
index fc92da1b2..d701d65de 100644
--- a/pkg/domain/infra/abi/system.go
+++ b/pkg/domain/infra/abi/system.go
@@ -407,3 +407,13 @@ func (ic *ContainerEngine) Unshare(ctx context.Context, args []string) error {
cmd.Stderr = os.Stderr
return cmd.Run()
}
+
+func (ic ContainerEngine) Version(ctx context.Context) (*entities.SystemVersionReport, error) {
+ var report entities.SystemVersionReport
+ v, err := define.GetVersion()
+ if err != nil {
+ return nil, err
+ }
+ report.Client = &v
+ return &report, err
+}
diff --git a/pkg/domain/infra/tunnel/system.go b/pkg/domain/infra/tunnel/system.go
index d00795741..dafada805 100644
--- a/pkg/domain/infra/tunnel/system.go
+++ b/pkg/domain/infra/tunnel/system.go
@@ -34,3 +34,7 @@ func (ic *ContainerEngine) SystemDf(ctx context.Context, options entities.System
func (ic *ContainerEngine) Unshare(ctx context.Context, args []string) error {
return errors.New("unshare is not supported on remote clients")
}
+
+func (ic ContainerEngine) Version(ctx context.Context) (*entities.SystemVersionReport, error) {
+ return system.Version(ic.ClientCxt)
+}