move version logic directly into the component-base, to simplify legacyregistry logic

add version to vendor

move version into component-base top-level

update bazel build files

fix import
This commit is contained in:
Han Kang 2019-08-14 13:20:38 -07:00
parent d951d19ec4
commit b037203082
19 changed files with 291 additions and 347 deletions

View File

@ -161,6 +161,7 @@ kube::version::ldflags() {
"-X '${KUBE_GO_PACKAGE}/vendor/k8s.io/client-go/pkg/version.${key}=${val}'"
"-X '${KUBE_GO_PACKAGE}/vendor/k8s.io/kubectl/pkg/version.${key}=${val}'"
"-X '${KUBE_GO_PACKAGE}/cmd/kubeadm/app/version.${key}=${val}'"
"-X '${KUBE_GO_PACKAGE}/vendor/k8s.io/component-base/version.${key}=${val}'"
)
}

View File

@ -15,6 +15,7 @@ filegroup(
"//staging/src/k8s.io/component-base/featuregate:all-srcs",
"//staging/src/k8s.io/component-base/logs:all-srcs",
"//staging/src/k8s.io/component-base/metrics:all-srcs",
"//staging/src/k8s.io/component-base/version:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],

View File

@ -5,6 +5,7 @@ load(
"go_library",
"go_test",
)
load("//staging/src/k8s.io/component-base/version:def.bzl", "version_x_defs")
go_library(
name = "go_default_library",
@ -17,6 +18,7 @@ go_library(
"processstarttime.go",
"registry.go",
"summary.go",
"version.go",
"version_parser.go",
"wrappers.go",
],
@ -24,6 +26,7 @@ go_library(
importpath = "k8s.io/component-base/metrics",
deps = [
"//staging/src/k8s.io/apimachinery/pkg/version:go_default_library",
"//staging/src/k8s.io/component-base/version:go_default_library",
"//vendor/github.com/blang/semver:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
"//vendor/github.com/prometheus/client_model/go:go_default_library",

View File

@ -72,7 +72,7 @@ func TestCounter(t *testing.T) {
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(apimachineryversion.Info{
registry := newKubeRegistry(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
@ -184,7 +184,7 @@ func TestCounterVec(t *testing.T) {
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(apimachineryversion.Info{
registry := newKubeRegistry(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",

View File

@ -73,7 +73,7 @@ func TestGauge(t *testing.T) {
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(apimachineryversion.Info{
registry := newKubeRegistry(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
@ -169,7 +169,7 @@ func TestGaugeVec(t *testing.T) {
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(apimachineryversion.Info{
registry := newKubeRegistry(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",

View File

@ -77,7 +77,7 @@ func TestHistogram(t *testing.T) {
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(apimachineryversion.Info{
registry := newKubeRegistry(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
@ -177,7 +177,7 @@ func TestHistogramVec(t *testing.T) {
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(apimachineryversion.Info{
registry := newKubeRegistry(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",

View File

@ -1,6 +1,6 @@
package(default_visibility = ["//visibility:public"])
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
name = "go_default_library",
@ -8,11 +8,9 @@ go_library(
importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/metrics/legacyregistry",
importpath = "k8s.io/component-base/metrics/legacyregistry",
deps = [
"//staging/src/k8s.io/apimachinery/pkg/version:go_default_library",
"//staging/src/k8s.io/component-base/metrics:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus/promhttp:go_default_library",
"//vendor/github.com/prometheus/client_model/go:go_default_library",
],
)
@ -28,16 +26,3 @@ filegroup(
srcs = [":package-srcs"],
tags = ["automanaged"],
)
go_test(
name = "go_default_test",
srcs = ["registry_test.go"],
embed = [":go_default_library"],
deps = [
"//staging/src/k8s.io/apimachinery/pkg/version:go_default_library",
"//staging/src/k8s.io/component-base/metrics:go_default_library",
"//vendor/github.com/blang/semver:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
"//vendor/github.com/stretchr/testify/assert:go_default_library",
],
)

View File

@ -17,112 +17,69 @@ limitations under the License.
package legacyregistry
import (
"fmt"
"net/http"
"reflect"
"sync"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
dto "github.com/prometheus/client_model/go"
apimachineryversion "k8s.io/apimachinery/pkg/version"
"k8s.io/component-base/metrics"
"net/http"
)
var (
globalRegistryFactory = metricsRegistryFactory{
registerQueue: make([]metrics.Registerable, 0),
mustRegisterQueue: make([]metrics.Registerable, 0),
globalRegistry: noopRegistry{},
}
defaultRegistry = metrics.NewKubeRegistry()
// DefaultGatherer exposes the global registry gatherer
DefaultGatherer prometheus.Gatherer = defaultRegistry
)
type noopRegistry struct{}
func (noopRegistry) Register(metrics.Registerable) error { return nil }
func (noopRegistry) MustRegister(...metrics.Registerable) {}
func (noopRegistry) RawRegister(prometheus.Collector) error { return nil }
func (noopRegistry) RawMustRegister(...prometheus.Collector) {}
func (noopRegistry) Unregister(metrics.Registerable) bool { return true }
func (noopRegistry) Gather() ([]*dto.MetricFamily, error) { return nil, nil }
type metricsRegistryFactory struct {
globalRegistry metrics.KubeRegistry
kubeVersion *apimachineryversion.Info
registrationLock sync.Mutex
registerQueue []metrics.Registerable
mustRegisterQueue []metrics.Registerable
func init() {
RawMustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}))
RawMustRegister(prometheus.NewGoCollector())
}
// HandlerForGlobalRegistry returns a http handler for the global registry. This
// allows us to return a handler for the global registry without having to expose
// the global registry itself directly.
func HandlerForGlobalRegistry(opts promhttp.HandlerOpts) http.Handler {
return promhttp.HandlerFor(globalRegistryFactory.globalRegistry, opts)
// Handler returns an HTTP handler for the DefaultGatherer. It is
// already instrumented with InstrumentHandler (using "prometheus" as handler
// name).
//
// Deprecated: Please note the issues described in the doc comment of
// InstrumentHandler. You might want to consider using promhttp.Handler instead.
func Handler() http.Handler {
return prometheus.InstrumentHandler("prometheus", promhttp.HandlerFor(defaultRegistry, promhttp.HandlerOpts{}))
}
// SetRegistryFactoryVersion sets the kubernetes version information for all
// subsequent metrics registry initializations. Only the first call has an effect.
// If a version is not set, then metrics registry creation will no-opt
func SetRegistryFactoryVersion(ver apimachineryversion.Info) []error {
globalRegistryFactory.registrationLock.Lock()
defer globalRegistryFactory.registrationLock.Unlock()
if globalRegistryFactory.kubeVersion != nil {
if globalRegistryFactory.kubeVersion.String() != ver.String() {
panic(fmt.Sprintf("Cannot load a global registry more than once, had %s tried to load %s",
globalRegistryFactory.kubeVersion.String(),
ver.String()))
}
return nil
}
registrationErrs := make([]error, 0)
preloadedMetrics := []prometheus.Collector{
prometheus.NewGoCollector(),
prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}),
}
globalRegistryFactory.globalRegistry = metrics.NewKubeRegistry(ver)
globalRegistryFactory.globalRegistry.RawMustRegister(preloadedMetrics...)
globalRegistryFactory.kubeVersion = &ver
for _, c := range globalRegistryFactory.registerQueue {
err := globalRegistryFactory.globalRegistry.Register(c)
if err != nil {
registrationErrs = append(registrationErrs, err)
}
}
for _, c := range globalRegistryFactory.mustRegisterQueue {
globalRegistryFactory.globalRegistry.MustRegister(c)
}
return registrationErrs
}
// Register registers a collectable metric, but it uses a global registry. Registration is deferred
// until the global registry has a version to use.
// Register registers a collectable metric but uses the global registry
func Register(c metrics.Registerable) error {
globalRegistryFactory.registrationLock.Lock()
defer globalRegistryFactory.registrationLock.Unlock()
if reflect.DeepEqual(globalRegistryFactory.globalRegistry, noopRegistry{}) {
globalRegistryFactory.registerQueue = append(globalRegistryFactory.registerQueue, c)
return nil
}
return globalRegistryFactory.globalRegistry.Register(c)
err := defaultRegistry.Register(c)
// sideload global prom registry as fallback
prometheus.Register(c)
return err
}
// MustRegister works like Register but registers any number of
// Collectors and panics upon the first registration that causes an
// error. Registration is deferred until the global registry has a version to use.
// MustRegister registers registerable metrics but uses the global registry.
func MustRegister(cs ...metrics.Registerable) {
globalRegistryFactory.registrationLock.Lock()
defer globalRegistryFactory.registrationLock.Unlock()
if reflect.DeepEqual(globalRegistryFactory.globalRegistry, noopRegistry{}) {
for _, c := range cs {
globalRegistryFactory.mustRegisterQueue = append(globalRegistryFactory.mustRegisterQueue, c)
}
return
defaultRegistry.MustRegister(cs...)
// sideload global prom registry as fallback
for _, c := range cs {
prometheus.Register(c)
}
globalRegistryFactory.globalRegistry.MustRegister(cs...)
return
}
// RawMustRegister registers prometheus collectors but uses the global registry, this
// bypasses the metric stability framework
//
// Deprecated
func RawMustRegister(cs ...prometheus.Collector) {
defaultRegistry.RawMustRegister(cs...)
// sideload global prom registry as fallback
for _, c := range cs {
prometheus.Register(c)
}
}
// RawRegister registers a prometheus collector but uses the global registry, this
// bypasses the metric stability framework
//
// Deprecated
func RawRegister(c prometheus.Collector) error {
err := defaultRegistry.RawRegister(c)
// sideload global prom registry as fallback
prometheus.Register(c)
return err
}

View File

@ -1,225 +0,0 @@
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package legacyregistry
import (
"github.com/blang/semver"
"github.com/prometheus/client_golang/prometheus"
"github.com/stretchr/testify/assert"
"k8s.io/component-base/metrics"
"testing"
apimachineryversion "k8s.io/apimachinery/pkg/version"
)
func init() {
SetRegistryFactoryVersion(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
})
}
var (
alphaCounter = metrics.NewCounter(
&metrics.CounterOpts{
Namespace: "some_namespace",
Name: "test_counter_name",
Subsystem: "subsystem",
StabilityLevel: metrics.ALPHA,
Help: "counter help",
},
)
alphaDeprecatedCounter = metrics.NewCounter(
&metrics.CounterOpts{
Namespace: "some_namespace",
Name: "test_alpha_dep_counter",
Subsystem: "subsystem",
StabilityLevel: metrics.ALPHA,
Help: "counter help",
DeprecatedVersion: "1.15.0",
},
)
alphaHiddenCounter = metrics.NewCounter(
&metrics.CounterOpts{
Namespace: "some_namespace",
Name: "test_alpha_hidden_counter",
Subsystem: "subsystem",
StabilityLevel: metrics.ALPHA,
Help: "counter help",
DeprecatedVersion: "1.14.0",
},
)
)
func TestRegister(t *testing.T) {
var tests = []struct {
desc string
metrics []*metrics.Counter
registryVersion *semver.Version
expectedErrors []error
expectedIsCreatedValues []bool
expectedIsDeprecated []bool
expectedIsHidden []bool
}{
{
desc: "test registering same metric multiple times",
metrics: []*metrics.Counter{alphaCounter, alphaCounter},
expectedErrors: []error{nil, prometheus.AlreadyRegisteredError{}},
expectedIsCreatedValues: []bool{true, true},
expectedIsDeprecated: []bool{false, false},
expectedIsHidden: []bool{false, false},
},
}
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
//t.Errorf("len %v - %v\n", len(test.metrics), len(test.expectedErrors))
for i, m := range test.metrics {
//t.Errorf("m %v\n", m)
err := Register(m)
if err != test.expectedErrors[i] && err.Error() != test.expectedErrors[i].Error() {
t.Errorf("Got unexpected error %v, wanted %v", err, test.expectedErrors[i])
}
if m.IsCreated() != test.expectedIsCreatedValues[i] {
t.Errorf("Got isCreated == %v, wanted isCreated to be %v", m.IsCreated(), test.expectedIsCreatedValues[i])
}
if m.IsDeprecated() != test.expectedIsDeprecated[i] {
t.Errorf("Got IsDeprecated == %v, wanted IsDeprecated to be %v", m.IsDeprecated(), test.expectedIsDeprecated[i])
}
if m.IsHidden() != test.expectedIsHidden[i] {
t.Errorf("Got IsHidden == %v, wanted IsHidden to be %v", m.IsHidden(), test.expectedIsDeprecated[i])
}
}
})
}
}
func TestMustRegister(t *testing.T) {
var tests = []struct {
desc string
metrics []*metrics.Counter
registryVersion *semver.Version
expectedPanics []bool
}{
{
desc: "test must registering same deprecated metric",
metrics: []*metrics.Counter{alphaDeprecatedCounter, alphaDeprecatedCounter},
expectedPanics: []bool{false, true},
},
{
desc: "test alpha hidden metric",
metrics: []*metrics.Counter{alphaHiddenCounter},
expectedPanics: []bool{false},
},
}
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
for i, m := range test.metrics {
if test.expectedPanics[i] {
assert.Panics(t,
func() { MustRegister(m) },
"Did not panic even though we expected it.")
} else {
MustRegister(m)
}
}
})
}
}
func TestDeferredRegister(t *testing.T) {
// reset the global registry for this test.
globalRegistryFactory = metricsRegistryFactory{
registerQueue: make([]metrics.Registerable, 0),
mustRegisterQueue: make([]metrics.Registerable, 0),
globalRegistry: noopRegistry{},
}
var err error
err = Register(alphaDeprecatedCounter)
if err != nil {
t.Errorf("Got err == %v, expected no error", err)
}
err = Register(alphaDeprecatedCounter)
if err != nil {
t.Errorf("Got err == %v, expected no error", err)
}
// set the global registry version
errs := SetRegistryFactoryVersion(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
})
if len(errs) != 1 {
t.Errorf("Got %d errs, expected 1", len(errs))
for _, err := range errs {
t.Logf("\t Got %v", err)
}
}
}
func TestDeferredMustRegister(t *testing.T) {
// reset the global registry for this test.
globalRegistryFactory = metricsRegistryFactory{
registerQueue: make([]metrics.Registerable, 0),
mustRegisterQueue: make([]metrics.Registerable, 0),
globalRegistry: noopRegistry{},
}
MustRegister(alphaDeprecatedCounter)
MustRegister(alphaDeprecatedCounter)
assert.Panics(t,
func() {
SetRegistryFactoryVersion(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
})
},
"Did not panic even though we expected it.")
}
func TestPreloadedMetrics(t *testing.T) {
// reset the global registry for this test.
globalRegistryFactory = metricsRegistryFactory{
registerQueue: make([]metrics.Registerable, 0),
mustRegisterQueue: make([]metrics.Registerable, 0),
}
SetRegistryFactoryVersion(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
})
// partial list of some preregistered metrics we expect
expectedMetricNames := []string{"go_gc_duration_seconds", "process_start_time_seconds"}
mf, err := globalRegistryFactory.globalRegistry.Gather()
if err != nil {
t.Errorf("Got unexpected error %v ", err)
}
metricNames := map[string]struct{}{}
for _, f := range mf {
metricNames[f.GetName()] = struct{}{}
}
for _, expectedMetric := range expectedMetricNames {
if _, ok := metricNames[expectedMetric]; !ok {
t.Errorf("Expected %v to be preregistered", expectedMetric)
}
}
}

View File

@ -25,6 +25,7 @@ import (
dto "github.com/prometheus/client_model/go"
apimachineryversion "k8s.io/apimachinery/pkg/version"
"k8s.io/component-base/version"
)
var (
@ -139,11 +140,22 @@ func (kr *kubeRegistry) Gather() ([]*dto.MetricFamily, error) {
return kr.PromRegistry.Gather()
}
// NewKubeRegistry creates a new vanilla Registry without any Collectors
// pre-registered.
func NewKubeRegistry(v apimachineryversion.Info) KubeRegistry {
return &kubeRegistry{
func newKubeRegistry(v apimachineryversion.Info) *kubeRegistry {
r := &kubeRegistry{
PromRegistry: prometheus.NewRegistry(),
version: parseVersion(v),
}
return r
}
func registerMetadataMetrics(r *kubeRegistry) {
RegisterBuildInfo(r)
}
// NewKubeRegistry creates a new vanilla Registry without any Collectors
// pre-registered.
func NewKubeRegistry() KubeRegistry {
r := newKubeRegistry(version.Get())
registerMetadataMetrics(r)
return r
}

View File

@ -109,7 +109,7 @@ func TestRegister(t *testing.T) {
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(apimachineryversion.Info{
registry := newKubeRegistry(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
@ -180,7 +180,7 @@ func TestMustRegister(t *testing.T) {
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(apimachineryversion.Info{
registry := newKubeRegistry(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
@ -199,7 +199,7 @@ func TestMustRegister(t *testing.T) {
}
func TestShowHiddenMetric(t *testing.T) {
registry := NewKubeRegistry(apimachineryversion.Info{
registry := newKubeRegistry(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",

View File

@ -75,7 +75,7 @@ func TestSummary(t *testing.T) {
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(apimachineryversion.Info{
registry := newKubeRegistry(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",
@ -172,7 +172,7 @@ func TestSummaryVec(t *testing.T) {
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
registry := NewKubeRegistry(apimachineryversion.Info{
registry := newKubeRegistry(apimachineryversion.Info{
Major: "1",
Minor: "15",
GitVersion: "v1.15.0-alpha-1.12345",

View File

@ -0,0 +1,37 @@
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package metrics
import "k8s.io/component-base/version"
var (
buildInfo = NewGaugeVec(
&GaugeOpts{
Name: "kubernetes_build_info",
Help: "A metric with a constant '1' value labeled by major, minor, git version, git commit, git tree state, build date, Go version, and compiler from which Kubernetes was built, and platform on which it is running.",
StabilityLevel: ALPHA,
},
[]string{"major", "minor", "gitVersion", "gitCommit", "gitTreeState", "buildDate", "goVersion", "compiler", "platform"},
)
)
// RegisterBuildInfo registers the build and version info in a metadata metric in prometheus
func RegisterBuildInfo(r KubeRegistry) {
info := version.Get()
buildInfo.WithLabelValues(info.Major, info.Minor, info.GitVersion, info.GitCommit, info.GitTreeState, info.BuildDate, info.GoVersion, info.Compiler, info.Platform).Set(1)
r.MustRegister(buildInfo)
}

View File

@ -0,0 +1 @@
base.go export-subst

View File

@ -0,0 +1,27 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = [
"base.go",
"version.go",
],
importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/version",
importpath = "k8s.io/component-base/version",
visibility = ["//visibility:public"],
deps = ["//staging/src/k8s.io/apimachinery/pkg/version:go_default_library"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@ -0,0 +1,63 @@
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package version
// Base version information.
//
// This is the fallback data used when version information from git is not
// provided via go ldflags. It provides an approximation of the Kubernetes
// version for ad-hoc builds (e.g. `go build`) that cannot get the version
// information from git.
//
// If you are looking at these fields in the git tree, they look
// strange. They are modified on the fly by the build process. The
// in-tree values are dummy values used for "git archive", which also
// works for GitHub tar downloads.
//
// When releasing a new Kubernetes version, this file is updated by
// build/mark_new_version.sh to reflect the new version, and then a
// git annotated tag (using format vX.Y where X == Major version and Y
// == Minor version) is created to point to the commit that updates
// pkg/version/base.go
var (
// TODO: Deprecate gitMajor and gitMinor, use only gitVersion
// instead. First step in deprecation, keep the fields but make
// them irrelevant. (Next we'll take it out, which may muck with
// scripts consuming the kubectl version output - but most of
// these should be looking at gitVersion already anyways.)
gitMajor string // major version, always numeric
gitMinor string // minor version, numeric possibly followed by "+"
// semantic version, derived by build scripts (see
// https://github.com/kubernetes/community/blob/master/contributors/design-proposals/release/versioning.md
// for a detailed discussion of this field)
//
// TODO: This field is still called "gitVersion" for legacy
// reasons. For prerelease versions, the build metadata on the
// semantic version is a git hash, but the version itself is no
// longer the direct output of "git describe", but a slight
// translation to be semver compliant.
// NOTE: The $Format strings are replaced during 'git archive' thanks to the
// companion .gitattributes file containing 'export-subst' in this same
// directory. See also https://git-scm.com/docs/gitattributes
gitVersion = "v0.0.0-master+$Format:%h$"
gitCommit = "$Format:%H$" // sha1 from git, output of $(git rev-parse HEAD)
gitTreeState = "" // state of git tree, either "clean" or "dirty"
buildDate = "1970-01-01T00:00:00Z" // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ')
)

View File

@ -0,0 +1,39 @@
# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Implements hack/lib/version.sh's kube::version::ldflags() for Bazel.
def version_x_defs():
# This should match the list of packages in kube::version::ldflag
stamp_pkgs = [
"k8s.io/kubernetes/pkg/version",
"k8s.io/kubernetes/vendor/k8s.io/component-base/version",
]
# This should match the list of vars in kube::version::ldflags
# It should also match the list of vars set in hack/print-workspace-status.sh.
stamp_vars = [
"buildDate",
"gitCommit",
"gitMajor",
"gitMinor",
"gitTreeState",
"gitVersion",
]
# Generate the cross-product.
x_defs = {}
for pkg in stamp_pkgs:
for var in stamp_vars:
x_defs["%s.%s" % (pkg, var)] = "{%s}" % var
return x_defs

View File

@ -0,0 +1,42 @@
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package version
import (
"fmt"
"runtime"
apimachineryversion "k8s.io/apimachinery/pkg/version"
)
// Get returns the overall codebase version. It's for detecting
// what code a binary was built from.
func Get() apimachineryversion.Info {
// These variables typically come from -ldflags settings and in
// their absence fallback to the settings in ./base.go
return apimachineryversion.Info{
Major: gitMajor,
Minor: gitMinor,
GitVersion: gitVersion,
GitCommit: gitCommit,
GitTreeState: gitTreeState,
BuildDate: buildDate,
GoVersion: runtime.Version(),
Compiler: runtime.Compiler,
Platform: fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH),
}
}

1
vendor/modules.txt vendored
View File

@ -1620,6 +1620,7 @@ k8s.io/component-base/featuregate
k8s.io/component-base/featuregate/testing
k8s.io/component-base/logs
k8s.io/component-base/metrics
k8s.io/component-base/version
# k8s.io/cri-api v0.0.0 => ./staging/src/k8s.io/cri-api
k8s.io/cri-api/pkg/apis
k8s.io/cri-api/pkg/apis/runtime/v1alpha2