Merge pull request #69 from jrnt30/user-agent

Adding in customized user-agent
This commit is contained in:
Andy Goldstein
2017-09-19 09:51:57 -07:00
committed by GitHub
7 changed files with 114 additions and 8 deletions

View File

@@ -19,6 +19,8 @@ limitations under the License.
// worrying about introducing circular dependencies.
package buildinfo
import "fmt"
var (
// Version is the current version of Ark, set by the go linker's -X flag at build time.
Version string
@@ -34,3 +36,11 @@ var (
// time.
GitTreeState string
)
// FormattedGitSHA renders the Git SHA with an indicator of the tree state.
func FormattedGitSHA() string {
if GitTreeState != "clean" {
return fmt.Sprintf("%s-%s", GitSHA, GitTreeState)
}
return GitSHA
}

View File

@@ -0,0 +1,38 @@
package buildinfo
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestFormattedGitSHA(t *testing.T) {
tests := []struct {
name string
sha string
state string
expected string
}{
{
"Clean git state has no suffix",
"abc123",
"clean",
"abc123",
},
{
"Dirty git status includes suffix",
"abc123",
"dirty",
"abc123-dirty",
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
GitSHA = test.sha
GitTreeState = test.state
assert.Equal(t, FormattedGitSHA(), test.expected)
})
}
}

View File

@@ -17,18 +17,38 @@ limitations under the License.
package client
import (
"fmt"
"runtime"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"github.com/heptio/ark/pkg/buildinfo"
)
// Config returns a *rest.Config, using either the kubeconfig (if specified) or an in-cluster
// configuration.
func Config(kubeconfig string) (*rest.Config, error) {
func Config(kubeconfig, baseName string) (*rest.Config, error) {
loader := clientcmd.NewDefaultClientConfigLoadingRules()
loader.ExplicitPath = kubeconfig
clientConfig, err := clientcmd.BuildConfigFromKubeconfigGetter("", loader.Load)
if err != nil {
return nil, err
}
clientConfig.UserAgent = buildUserAgent(
baseName,
buildinfo.Version,
buildinfo.FormattedGitSHA(),
runtime.GOOS,
runtime.GOARCH,
)
return clientConfig, nil
}
// buildUserAgent builds a User-Agent string from given args.
func buildUserAgent(command, version, formattedSha, os, arch string) string {
return fmt.Sprintf(
"%s/%s (%s/%s) %s", command, version, os, arch, formattedSha)
}

36
pkg/client/client_test.go Normal file
View File

@@ -0,0 +1,36 @@
package client
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestBuildUserAgent(t *testing.T) {
tests := []struct {
name string
command string
os string
arch string
gitSha string
version string
expected string
}{
{
name: "Test general interpolation in correct order",
command: "ark",
os: "darwin",
arch: "amd64",
gitSha: "abc123",
version: "v0.1.1",
expected: "ark/v0.1.1 (darwin/amd64) abc123",
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
resp := buildUserAgent(test.command, test.version, test.gitSha, test.os, test.arch)
assert.Equal(t, resp, test.expected)
})
}
}

View File

@@ -34,12 +34,14 @@ type Factory interface {
type factory struct {
flags *pflag.FlagSet
kubeconfig string
baseName string
}
// NewFactory returns a Factory.
func NewFactory() Factory {
func NewFactory(baseName string) Factory {
f := &factory{
flags: pflag.NewFlagSet("", pflag.ContinueOnError),
flags: pflag.NewFlagSet("", pflag.ContinueOnError),
baseName: baseName,
}
f.flags.StringVar(&f.kubeconfig, "kubeconfig", "", "Path to the kubeconfig file to use to talk to the Kubernetes apiserver. If unset, try the environment variable KUBECONFIG, as well as in-cluster configuration")
@@ -51,7 +53,7 @@ func (f *factory) BindFlags(flags *pflag.FlagSet) {
}
func (f *factory) Client() (clientset.Interface, error) {
clientConfig, err := Config(f.kubeconfig)
clientConfig, err := Config(f.kubeconfig, f.baseName)
if err != nil {
return nil, err
}

View File

@@ -39,7 +39,7 @@ and operationally robust way to back up your application state and
associated data.`,
}
f := client.NewFactory()
f := client.NewFactory(name)
f.BindFlags(c.PersistentFlags())
c.AddCommand(

View File

@@ -65,7 +65,7 @@ func NewCommand() *cobra.Command {
Short: "Run the ark server",
Long: "Run the ark server",
Run: func(c *cobra.Command, args []string) {
s, err := newServer(kubeconfig)
s, err := newServer(kubeconfig, fmt.Sprintf("%s-%s", c.Parent().Name(), c.Name()))
cmd.CheckError(err)
cmd.CheckError(s.run())
@@ -89,8 +89,8 @@ type server struct {
cancelFunc context.CancelFunc
}
func newServer(kubeconfig string) (*server, error) {
clientConfig, err := client.Config(kubeconfig)
func newServer(kubeconfig, baseName string) (*server, error) {
clientConfig, err := client.Config(kubeconfig, baseName)
if err != nil {
return nil, err
}