Newer
Older
AnthosCertManager / pkg / util / useragent.go
package util

import (
	"bytes"
	"fmt"
	"strings"
	"unicode"
	"unicode/utf8"

	"k8s.io/apimachinery/pkg/apis/meta/v1/validation"
	"k8s.io/client-go/rest"
)

// RestConfigWithUserAgent returns a copy of the Kubernetes REST config with
// the User Agent set which includes the optional component strings given.
func RestConfigWithUserAgent(restConfig *rest.Config, component ...string) *rest.Config {
	restConfig = rest.CopyConfig(restConfig)
	restConfig.UserAgent = fmt.Sprintf("%s/%s (%s) anthos-cert-manager/%s",
		strings.Join(append([]string{"anthos-cert-manager"}, component...), "-"),
		version(), VersionInfo().Platform, VersionInfo().GitCommit)
	return restConfig
}

// PrefixFromUserAgent takes the characters preceding the first /, quote
// unprintable character and then trim what's beyond the FieldManagerMaxLength
// limit.
// Taken from
// https://github.com/kubernetes/kubernetes/blob/9a75e7b0fd1b567f774a3373be640e19b33e7ef1/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/create.go#L252
func PrefixFromUserAgent(u string) string {
	m := strings.Split(u, "/")[0]
	buf := bytes.NewBuffer(nil)
	for _, r := range m {
		// Ignore non-printable characters
		if !unicode.IsPrint(r) {
			continue
		}
		// Only append if we have room for it
		if buf.Len()+utf8.RuneLen(r) > validation.FieldManagerMaxLength {
			break
		}
		buf.WriteRune(r)
	}
	return buf.String()
}