mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 03:41:45 +00:00
Merge pull request #55143 from feiskyer/version
Automatic merge from submit-queue (batch tested with PRs 56115, 55143, 56179). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. Use GetVersion() API instead of ver command **What this PR does / why we need it**: Should use GetVersion vs Shelling out to ver. **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Fixes #55083 **Special notes for your reviewer**: **Release note**: ```release-note NONE ```
This commit is contained in:
commit
d09f679459
@ -25,6 +25,7 @@ go_library(
|
|||||||
"@io_bazel_rules_go//go/platform:windows_amd64": [
|
"@io_bazel_rules_go//go/platform:windows_amd64": [
|
||||||
"perfcounter_nodestats.go",
|
"perfcounter_nodestats.go",
|
||||||
"perfcounters.go",
|
"perfcounters.go",
|
||||||
|
"version.go",
|
||||||
],
|
],
|
||||||
"//conditions:default": [],
|
"//conditions:default": [],
|
||||||
}),
|
}),
|
||||||
@ -36,6 +37,7 @@ go_library(
|
|||||||
"@io_bazel_rules_go//go/platform:windows_amd64": [
|
"@io_bazel_rules_go//go/platform:windows_amd64": [
|
||||||
"//vendor/github.com/JeffAshton/win_pdh:go_default_library",
|
"//vendor/github.com/JeffAshton/win_pdh:go_default_library",
|
||||||
"//vendor/github.com/golang/glog:go_default_library",
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
|
"//vendor/golang.org/x/sys/windows:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
],
|
],
|
||||||
"//conditions:default": [],
|
"//conditions:default": [],
|
||||||
|
@ -21,9 +21,7 @@ package winstats
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
@ -57,13 +55,16 @@ func (p *perfCounterNodeStatsClient) startMonitoring() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
version, err := exec.Command("cmd", "/C", "ver").Output()
|
kernelVersion, err := getKernelVersion()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
osImageVersion, err := getOSImageVersion()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
osImageVersion := strings.TrimSpace(string(version))
|
|
||||||
kernelVersion := extractVersionNumber(osImageVersion)
|
|
||||||
p.nodeInfo = nodeInfo{
|
p.nodeInfo = nodeInfo{
|
||||||
kernelVersion: kernelVersion,
|
kernelVersion: kernelVersion,
|
||||||
osImageVersion: osImageVersion,
|
osImageVersion: osImageVersion,
|
||||||
|
96
pkg/kubelet/winstats/version.go
Normal file
96
pkg/kubelet/winstats/version.go
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
// +build windows
|
||||||
|
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package winstats
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
|
)
|
||||||
|
|
||||||
|
// getCurrentVersionVal gets value of speficied key from registry.
|
||||||
|
func getCurrentVersionVal(key string) (string, error) {
|
||||||
|
var h windows.Handle
|
||||||
|
if err := windows.RegOpenKeyEx(windows.HKEY_LOCAL_MACHINE,
|
||||||
|
windows.StringToUTF16Ptr(`SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\`),
|
||||||
|
0,
|
||||||
|
windows.KEY_READ,
|
||||||
|
&h); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer windows.RegCloseKey(h)
|
||||||
|
|
||||||
|
var buf [128]uint16
|
||||||
|
var typ uint32
|
||||||
|
n := uint32(len(buf) * int(unsafe.Sizeof(buf[0]))) // api expects array of bytes, not uint16
|
||||||
|
if err := windows.RegQueryValueEx(h,
|
||||||
|
windows.StringToUTF16Ptr(key),
|
||||||
|
nil,
|
||||||
|
&typ,
|
||||||
|
(*byte)(unsafe.Pointer(&buf[0])),
|
||||||
|
&n); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return windows.UTF16ToString(buf[:]), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getVersionRevision gets revision from UBR registry.
|
||||||
|
func getVersionRevision() (uint16, error) {
|
||||||
|
revisionString, err := getCurrentVersionVal("UBR")
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
revision, err := windows.UTF16FromString(revisionString)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return revision[0], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getKernelVersion gets the version of windows kernel.
|
||||||
|
func getKernelVersion() (string, error) {
|
||||||
|
ver, err := windows.GetVersion()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
revision, err := getVersionRevision()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
major := ver & 0xFF
|
||||||
|
minor := (ver >> 8) & 0xFF
|
||||||
|
build := (ver >> 16) & 0xFFFF
|
||||||
|
return fmt.Sprintf("%d.%d.%05d.%d\n", major, minor, build, revision), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getOSImageVersion gets the osImage name and version.
|
||||||
|
func getOSImageVersion() (string, error) {
|
||||||
|
productName, err := getCurrentVersionVal("ProductName")
|
||||||
|
if err != nil {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return productName, nil
|
||||||
|
}
|
@ -18,7 +18,6 @@ limitations under the License.
|
|||||||
package winstats
|
package winstats
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"regexp"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
cadvisorapi "github.com/google/cadvisor/info/v1"
|
cadvisorapi "github.com/google/cadvisor/info/v1"
|
||||||
@ -135,11 +134,3 @@ func (c *statsClient) createRootContainerInfo() (*cadvisorapiv2.ContainerInfo, e
|
|||||||
|
|
||||||
return &rootInfo, nil
|
return &rootInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// extractVersionNumber gets the version number from the full version string on Windows
|
|
||||||
// e.g. extracts "10.0.14393" from "Microsoft Windows [Version 10.0.14393]"
|
|
||||||
func extractVersionNumber(fullVersion string) string {
|
|
||||||
re := regexp.MustCompile("[^0-9.]")
|
|
||||||
version := re.ReplaceAllString(fullVersion, "")
|
|
||||||
return version
|
|
||||||
}
|
|
||||||
|
@ -116,13 +116,6 @@ func TestWinVersionInfo(t *testing.T) {
|
|||||||
KernelVersion: "v42"})
|
KernelVersion: "v42"})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestExtractVersionNumber(t *testing.T) {
|
|
||||||
fullVersion := "Microsoft Windows [Version 10.0.14393]"
|
|
||||||
versionNumber := extractVersionNumber(fullVersion)
|
|
||||||
expected := "10.0.14393"
|
|
||||||
assert.Equal(t, expected, versionNumber)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getClient(t *testing.T) Client {
|
func getClient(t *testing.T) Client {
|
||||||
f := fakeWinNodeStatsClient{}
|
f := fakeWinNodeStatsClient{}
|
||||||
c, err := newClient(f)
|
c, err := newClient(f)
|
||||||
|
Loading…
Reference in New Issue
Block a user