From d221148121aee71bed30ef3dc92ee518d53636b9 Mon Sep 17 00:00:00 2001 From: Ed Bartosh Date: Thu, 27 Jun 2019 16:28:08 +0300 Subject: [PATCH] kubeadm: get rid of dependency on pkg/util/node Created local copy of GetHostname API to avoid dependency to pkg/util/node. --- cmd/kubeadm/.import-restrictions | 1 - cmd/kubeadm/app/phases/kubelet/BUILD | 1 - cmd/kubeadm/app/phases/kubelet/flags.go | 3 +- cmd/kubeadm/app/phases/markcontrolplane/BUILD | 2 +- .../markcontrolplane/markcontrolplane_test.go | 4 +- cmd/kubeadm/app/util/BUILD | 2 + cmd/kubeadm/app/util/config/BUILD | 1 - .../app/util/config/initconfiguration.go | 3 +- cmd/kubeadm/app/util/net.go | 46 ++++++++++++ cmd/kubeadm/app/util/net_test.go | 71 +++++++++++++++++++ 10 files changed, 124 insertions(+), 10 deletions(-) create mode 100644 cmd/kubeadm/app/util/net.go create mode 100644 cmd/kubeadm/app/util/net_test.go diff --git a/cmd/kubeadm/.import-restrictions b/cmd/kubeadm/.import-restrictions index fb64dbebd89..2e7ff4019a5 100644 --- a/cmd/kubeadm/.import-restrictions +++ b/cmd/kubeadm/.import-restrictions @@ -82,7 +82,6 @@ "k8s.io/kubernetes/pkg/util/iptables", "k8s.io/kubernetes/pkg/util/ipvs", "k8s.io/kubernetes/pkg/util/metrics", - "k8s.io/kubernetes/pkg/util/node", "k8s.io/kubernetes/pkg/util/parsers", "k8s.io/kubernetes/pkg/util/procfs", "k8s.io/kubernetes/pkg/util/sysctl", diff --git a/cmd/kubeadm/app/phases/kubelet/BUILD b/cmd/kubeadm/app/phases/kubelet/BUILD index e1aed46e89d..92c9815da05 100644 --- a/cmd/kubeadm/app/phases/kubelet/BUILD +++ b/cmd/kubeadm/app/phases/kubelet/BUILD @@ -19,7 +19,6 @@ go_library( "//cmd/kubeadm/app/util/apiclient:go_default_library", "//cmd/kubeadm/app/util/initsystem:go_default_library", "//pkg/kubelet/apis/config:go_default_library", - "//pkg/util/node:go_default_library", "//pkg/util/procfs:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/rbac/v1:go_default_library", diff --git a/cmd/kubeadm/app/phases/kubelet/flags.go b/cmd/kubeadm/app/phases/kubelet/flags.go index 27c2a9948cc..189f7aa8ba9 100644 --- a/cmd/kubeadm/app/phases/kubelet/flags.go +++ b/cmd/kubeadm/app/phases/kubelet/flags.go @@ -29,7 +29,6 @@ import ( "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/images" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" - nodeutil "k8s.io/kubernetes/pkg/util/node" "k8s.io/kubernetes/pkg/util/procfs" utilsexec "k8s.io/utils/exec" ) @@ -47,7 +46,7 @@ type kubeletFlagsOpts struct { // WriteKubeletDynamicEnvFile writes an environment file with dynamic flags to the kubelet. // Used at "kubeadm init" and "kubeadm join" time. func WriteKubeletDynamicEnvFile(cfg *kubeadmapi.ClusterConfiguration, nodeReg *kubeadmapi.NodeRegistrationOptions, registerTaintsUsingFlags bool, kubeletDir string) error { - hostName, err := nodeutil.GetHostname("") + hostName, err := kubeadmutil.GetHostname("") if err != nil { return err } diff --git a/cmd/kubeadm/app/phases/markcontrolplane/BUILD b/cmd/kubeadm/app/phases/markcontrolplane/BUILD index 9c42626dd89..375e65252fb 100644 --- a/cmd/kubeadm/app/phases/markcontrolplane/BUILD +++ b/cmd/kubeadm/app/phases/markcontrolplane/BUILD @@ -12,7 +12,7 @@ go_test( embed = [":go_default_library"], deps = [ "//cmd/kubeadm/app/constants:go_default_library", - "//pkg/util/node:go_default_library", + "//cmd/kubeadm/app/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", diff --git a/cmd/kubeadm/app/phases/markcontrolplane/markcontrolplane_test.go b/cmd/kubeadm/app/phases/markcontrolplane/markcontrolplane_test.go index 3d897e42f19..202a2b86a86 100644 --- a/cmd/kubeadm/app/phases/markcontrolplane/markcontrolplane_test.go +++ b/cmd/kubeadm/app/phases/markcontrolplane/markcontrolplane_test.go @@ -29,7 +29,7 @@ import ( clientset "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" - "k8s.io/kubernetes/pkg/util/node" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" ) func TestMarkControlPlane(t *testing.T) { @@ -108,7 +108,7 @@ func TestMarkControlPlane(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - hostname, err := node.GetHostname("") + hostname, err := kubeadmutil.GetHostname("") if err != nil { t.Fatalf("MarkControlPlane(%s): unexpected error: %v", tc.name, err) } diff --git a/cmd/kubeadm/app/util/BUILD b/cmd/kubeadm/app/util/BUILD index 4f21d0d31a4..001ed73ca6b 100644 --- a/cmd/kubeadm/app/util/BUILD +++ b/cmd/kubeadm/app/util/BUILD @@ -11,6 +11,7 @@ go_library( "endpoint.go", "error.go", "marshal.go", + "net.go", "template.go", "version.go", ], @@ -44,6 +45,7 @@ go_test( "endpoint_test.go", "error_test.go", "marshal_test.go", + "net_test.go", "template_test.go", "version_test.go", ], diff --git a/cmd/kubeadm/app/util/config/BUILD b/cmd/kubeadm/app/util/config/BUILD index 057efa63bf1..584d183956f 100644 --- a/cmd/kubeadm/app/util/config/BUILD +++ b/cmd/kubeadm/app/util/config/BUILD @@ -26,7 +26,6 @@ go_library( "//cmd/kubeadm/app/util/apiclient:go_default_library", "//cmd/kubeadm/app/util/config/strict:go_default_library", "//cmd/kubeadm/app/util/runtime:go_default_library", - "//pkg/util/node:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/cmd/kubeadm/app/util/config/initconfiguration.go b/cmd/kubeadm/app/util/config/initconfiguration.go index c0c4675a64f..57c2549f6a4 100644 --- a/cmd/kubeadm/app/util/config/initconfiguration.go +++ b/cmd/kubeadm/app/util/config/initconfiguration.go @@ -39,7 +39,6 @@ import ( kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" "k8s.io/kubernetes/cmd/kubeadm/app/util/config/strict" kubeadmruntime "k8s.io/kubernetes/cmd/kubeadm/app/util/runtime" - nodeutil "k8s.io/kubernetes/pkg/util/node" ) // SetInitDynamicDefaults checks and sets configuration values for the InitConfiguration object @@ -85,7 +84,7 @@ func SetBootstrapTokensDynamicDefaults(cfg *[]kubeadmapi.BootstrapToken) error { // SetNodeRegistrationDynamicDefaults checks and sets configuration values for the NodeRegistration object func SetNodeRegistrationDynamicDefaults(cfg *kubeadmapi.NodeRegistrationOptions, ControlPlaneTaint bool) error { var err error - cfg.Name, err = nodeutil.GetHostname(cfg.Name) + cfg.Name, err = kubeadmutil.GetHostname(cfg.Name) if err != nil { return err } diff --git a/cmd/kubeadm/app/util/net.go b/cmd/kubeadm/app/util/net.go new file mode 100644 index 00000000000..54ebcb690b9 --- /dev/null +++ b/cmd/kubeadm/app/util/net.go @@ -0,0 +1,46 @@ +/* +Copyright 2015 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 util + +import ( + "os" + "strings" + + "github.com/pkg/errors" +) + +// GetHostname returns OS's hostname if 'hostnameOverride' is empty; otherwise, return 'hostnameOverride' +// NOTE: This function copied from pkg/util/node package to avoid external kubeadm dependency +func GetHostname(hostnameOverride string) (string, error) { + hostName := hostnameOverride + if len(hostName) == 0 { + nodeName, err := os.Hostname() + if err != nil { + return "", errors.Wrap(err, "couldn't determine hostname") + } + hostName = nodeName + } + + // Trim whitespaces first to avoid getting an empty hostname + // For linux, the hostname is read from file /proc/sys/kernel/hostname directly + hostName = strings.TrimSpace(hostName) + if len(hostName) == 0 { + return "", errors.New("empty hostname is invalid") + } + + return strings.ToLower(hostName), nil +} diff --git a/cmd/kubeadm/app/util/net_test.go b/cmd/kubeadm/app/util/net_test.go new file mode 100644 index 00000000000..ac2e3bb1bce --- /dev/null +++ b/cmd/kubeadm/app/util/net_test.go @@ -0,0 +1,71 @@ +/* +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 util + +import ( + "errors" + "os" + "testing" +) + +func TestGetHostname(t *testing.T) { + hostname, err := os.Hostname() + + testCases := []struct { + desc string + hostname string + result string + expectedErr error + }{ + { + desc: "overridden hostname", + hostname: "overridden", + result: "overridden", + expectedErr: nil, + }, + { + desc: "hostname contains only spaces", + hostname: " ", + result: "", + expectedErr: errors.New("empty hostname is invalid"), + }, + { + desc: "empty parameter", + hostname: "", + result: hostname, + expectedErr: err, + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + result, err := GetHostname(tc.hostname) + + if err != nil && tc.expectedErr == nil { + t.Errorf("unexpected error: %v", err) + } + + if err == nil && tc.expectedErr != nil { + t.Errorf("expected error %v, got nil", tc.expectedErr) + } + + if tc.result != result { + t.Errorf("unexpected result: %s, expected: %s", result, tc.result) + } + }) + } +}