mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-22 19:31:44 +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": [
|
||||
"perfcounter_nodestats.go",
|
||||
"perfcounters.go",
|
||||
"version.go",
|
||||
],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
@ -36,6 +37,7 @@ go_library(
|
||||
"@io_bazel_rules_go//go/platform:windows_amd64": [
|
||||
"//vendor/github.com/JeffAshton/win_pdh: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",
|
||||
],
|
||||
"//conditions:default": [],
|
||||
|
@ -21,9 +21,7 @@ package winstats
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"os/exec"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync"
|
||||
"syscall"
|
||||
"time"
|
||||
@ -57,13 +55,16 @@ func (p *perfCounterNodeStatsClient) startMonitoring() error {
|
||||
return err
|
||||
}
|
||||
|
||||
version, err := exec.Command("cmd", "/C", "ver").Output()
|
||||
kernelVersion, err := getKernelVersion()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
osImageVersion, err := getOSImageVersion()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
osImageVersion := strings.TrimSpace(string(version))
|
||||
kernelVersion := extractVersionNumber(osImageVersion)
|
||||
p.nodeInfo = nodeInfo{
|
||||
kernelVersion: kernelVersion,
|
||||
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
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"time"
|
||||
|
||||
cadvisorapi "github.com/google/cadvisor/info/v1"
|
||||
@ -135,11 +134,3 @@ func (c *statsClient) createRootContainerInfo() (*cadvisorapiv2.ContainerInfo, e
|
||||
|
||||
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"})
|
||||
}
|
||||
|
||||
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 {
|
||||
f := fakeWinNodeStatsClient{}
|
||||
c, err := newClient(f)
|
||||
|
Loading…
Reference in New Issue
Block a user