Skip to content

Commit

Permalink
feat(cli): add --client flag to kargo version
Browse files Browse the repository at this point in the history
This adds support for supplying a `--client` flag to `kargo version`,
which avoids the command from attempting to collect version information
from the API server.

```console
$ kargo version --client
Client Version: devel+unknown.dirty
```

In addition, the order of collecting information has been adjusted to
allow partial information to be printed when the API server can not
be reached before returning an error.

```console
$ kargo version
Client Version: devel+unknown.dirty
Error: get version info from server: unavailable: dial tcp [::1]:30081: connect: connection refused

$ kargo version --output yaml
apiVersion: kargo.akuity.io/v1alpha1
cli:
  buildTime: "2024-02-22T11:18:51Z"
  compiler: gc
  gitTreeDirty: true
  goVersion: go1.21.3
  platform: linux/amd64
  version: devel+unknown.dirty
kind: ComponentVersions
Error: get version info from server: unavailable: dial tcp [::1]:30081: connect: connection refused
```

However, in case `--output` is provided and the printer itself runs
into an issue, this error takes precedence.

```console
$ kargo version --output go-template --template '{{ .cli.version }'
Error: new printer: error parsing template {{ .cli.version }, template: output:1: unexpected "}" in operand
```

Signed-off-by: Hidde Beydals <hidde@hhh.computer>
  • Loading branch information
hiddeco committed Feb 22, 2024
1 parent bc55b39 commit 9c639dd
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 20 deletions.
59 changes: 39 additions & 20 deletions cmd/cli/version.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"context"
"encoding/json"
"fmt"

Expand Down Expand Up @@ -29,32 +30,24 @@ func newVersionCommand(
Use: "version",
RunE: func(cmd *cobra.Command, args []string) error {
ctx := cmd.Context()
printToStdout := ptr.Deref(opt.PrintFlags.OutputFormat, "") == ""

cliVersion := typesv1alpha1.ToVersionProto(versionpkg.GetVersion())
if printToStdout {
fmt.Println("Client Version:", cliVersion.GetVersion())
}

var serverVersion *svcv1alpha1.VersionInfo
if !opt.UseLocalServer {
if cfg.APIAddress != "" && cfg.BearerToken != "" {
kargoSvcCli, err := client.GetClientFromConfig(ctx, cfg, opt)
if err != nil {
return errors.Wrap(err, "get client from config")
}
resp, err := kargoSvcCli.GetVersionInfo(
ctx,
connect.NewRequest(&svcv1alpha1.GetVersionInfoRequest{}),
)
if err != nil {
return errors.Wrap(err, "get version info from server")
}
serverVersion = resp.Msg.GetVersionInfo()
}
var serverErr error
if !opt.UseLocalServer && !opt.ClientVersionOnly {
serverVersion, serverErr = getServerVersion(ctx, cfg, opt)
}
cliVersion := typesv1alpha1.ToVersionProto(versionpkg.GetVersion())

if ptr.Deref(opt.PrintFlags.OutputFormat, "") == "" {
fmt.Println("Client Version:", cliVersion.GetVersion())
if printToStdout {
if serverVersion != nil {
fmt.Println("Server Version:", serverVersion.GetVersion())
}
return nil
return serverErr
}

printer, err := opt.PrintFlags.ToPrinter()
Expand All @@ -68,14 +61,40 @@ func newVersionCommand(
if err != nil {
return errors.Wrap(err, "map component versions to runtime object")
}
return printer.PrintObj(obj, opt.IOStreams.Out)

if err := printer.PrintObj(obj, opt.IOStreams.Out); err != nil {
return errors.Wrap(err, "printing object")
}
return serverErr
},
}

opt.PrintFlags.AddFlags(cmd)
option.InsecureTLS(cmd.PersistentFlags(), opt)
option.ClientVersion(cmd.PersistentFlags(), opt)
return cmd
}

func getServerVersion(ctx context.Context, cfg config.CLIConfig, opt *option.Option) (*svcv1alpha1.VersionInfo, error) {
if cfg.APIAddress == "" || cfg.BearerToken == "" {
return nil, nil
}

kargoSvcCli, err := client.GetClientFromConfig(ctx, cfg, opt)
if err != nil {
return nil, errors.Wrap(err, "get client from config")
}
resp, err := kargoSvcCli.GetVersionInfo(
ctx,
connect.NewRequest(&svcv1alpha1.GetVersionInfoRequest{}),
)
if err != nil {
return nil, errors.Wrap(err, "get version info from server")
}

return resp.Msg.GetVersionInfo(), nil
}

func componentVersionsToRuntimeObject(v *svcv1alpha1.ComponentVersions) (runtime.Object, error) {
data, err := protojson.Marshal(v)
if err != nil {
Expand Down
4 changes: 4 additions & 0 deletions internal/cli/option/flag.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ func LocalServer(fs *pflag.FlagSet, opt *Option) {
fs.BoolVar(&opt.UseLocalServer, "local-server", false, "Use local server")
}

func ClientVersion(fs *pflag.FlagSet, opt *Option) {
fs.BoolVar(&opt.ClientVersionOnly, "client", false, "If true, shows client version only (no server required)")
}

func Project(fs *pflag.FlagSet, opt *Option, defaultProject string) {
fs.StringVarP(&opt.Project, "project", "p", defaultProject, "Project")
}
Expand Down
2 changes: 2 additions & 0 deletions internal/cli/option/option.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ type Option struct {
LocalServerAddress string
UseLocalServer bool

ClientVersionOnly bool

Project string

IOStreams *genericclioptions.IOStreams
Expand Down

0 comments on commit 9c639dd

Please sign in to comment.