From 239adeb8640a856e148835b0519740d8179a0e08 Mon Sep 17 00:00:00 2001 From: Thorsten Klein Date: Wed, 7 Apr 2021 19:20:58 +0200 Subject: [PATCH] [Feature] Runtime Info (#553) --- cmd/root.go | 18 ++++++++++ pkg/runtimes/docker/info.go | 72 +++++++++++++++++++++++++++++++++++++ pkg/runtimes/runtime.go | 2 ++ pkg/runtimes/types/types.go | 34 ++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 pkg/runtimes/docker/info.go create mode 100644 pkg/runtimes/types/types.go diff --git a/cmd/root.go b/cmd/root.go index 2f3f1fb6..a8522364 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -30,6 +30,7 @@ import ( "strings" "github.com/spf13/cobra" + "gopkg.in/yaml.v2" rt "runtime" @@ -123,6 +124,23 @@ func init() { }, }) + rootCmd.AddCommand(&cobra.Command{ + Use: "runtime-info", + Short: "Show runtime information", + Long: "Show some information about the runtime environment (e.g. docker info)", + Run: func(cmd *cobra.Command, args []string) { + info, err := runtimes.SelectedRuntime.Info() + if err != nil { + log.Fatalln(err) + } + err = yaml.NewEncoder(os.Stdout).Encode(info) + if err != nil { + log.Fatalln(err) + } + }, + Hidden: true, + }) + // Init cobra.OnInitialize(initLogging, initRuntime) } diff --git a/pkg/runtimes/docker/info.go b/pkg/runtimes/docker/info.go new file mode 100644 index 00000000..3db973c5 --- /dev/null +++ b/pkg/runtimes/docker/info.go @@ -0,0 +1,72 @@ +/* +Copyright © 2020 The k3d Author(s) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +package docker + +import ( + "context" + "strings" + + runtimeTypes "github.com/rancher/k3d/v4/pkg/runtimes/types" + log "github.com/sirupsen/logrus" +) + +func (d Docker) Info() (*runtimeTypes.RuntimeInfo, error) { + // create docker client + docker, err := GetDockerClient() + if err != nil { + log.Errorln("Failed to create docker client") + return nil, err + } + defer docker.Close() + + info, err := docker.Info(context.Background()) + if err != nil { + return nil, err + } + + runtimeInfo := runtimeTypes.RuntimeInfo{ + Name: d.ID(), + Endpoint: d.GetRuntimePath(), + Version: info.ServerVersion, + OS: info.OperatingSystem, + OSType: info.OSType, + Arch: info.Architecture, + CgroupVersion: info.CgroupVersion, + CgroupDriver: info.CgroupDriver, + Filesystem: "UNKNOWN", + } + + // Get the backing filesystem for the storage driver + // This is not embedded nicely in a struct or map, so we have to do some string inspection + for i := range info.DriverStatus { + for j := range info.DriverStatus[i] { + if strings.Contains(info.DriverStatus[i][j], "Backing Filesystem") { + if len(info.DriverStatus[i]) >= j+2 { + runtimeInfo.Filesystem = info.DriverStatus[i][j+1] + } + } + } + } + + return &runtimeInfo, nil +} diff --git a/pkg/runtimes/runtime.go b/pkg/runtimes/runtime.go index 7e6ad9ad..e691439c 100644 --- a/pkg/runtimes/runtime.go +++ b/pkg/runtimes/runtime.go @@ -30,6 +30,7 @@ import ( "time" "github.com/rancher/k3d/v4/pkg/runtimes/docker" + runtimeTypes "github.com/rancher/k3d/v4/pkg/runtimes/types" k3d "github.com/rancher/k3d/v4/pkg/types" ) @@ -72,6 +73,7 @@ type Runtime interface { GetHostIP(context.Context, string) (net.IP, error) ConnectNodeToNetwork(context.Context, *k3d.Node, string) error // @param context, node, network name DisconnectNodeFromNetwork(context.Context, *k3d.Node, string) error // @param context, node, network name + Info() (*runtimeTypes.RuntimeInfo, error) } // GetRuntime checks, if a given name is represented by an implemented k3d runtime and returns it diff --git a/pkg/runtimes/types/types.go b/pkg/runtimes/types/types.go new file mode 100644 index 00000000..fb8606dc --- /dev/null +++ b/pkg/runtimes/types/types.go @@ -0,0 +1,34 @@ +/* +Copyright © 2020 The k3d Author(s) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +package types + +type RuntimeInfo struct { + Name string + Endpoint string `yaml:",omitempty" json:",omitempty"` + Version string `yaml:",omitempty" json:",omitempty"` + OSType string `yaml:",omitempty" json:",omitempty"` + OS string `yaml:",omitempty" json:",omitempty"` + Arch string `yaml:",omitempty" json:",omitempty"` + CgroupVersion string `yaml:",omitempty" json:",omitempty"` + CgroupDriver string `yaml:",omitempty" json:",omitempty"` + Filesystem string `yaml:",omitempty" json:",omitempty"` +}