From ee5b040e31217eec982341138ebcd92c8248fb17 Mon Sep 17 00:00:00 2001 From: Michael Taufen Date: Fri, 17 Nov 2017 10:49:24 -0800 Subject: [PATCH] Add kubeletconfig round trip test --- pkg/kubelet/apis/kubeletconfig/BUILD | 1 + pkg/kubelet/apis/kubeletconfig/fuzzer/BUILD | 32 ++++++ .../apis/kubeletconfig/fuzzer/fuzzer.go | 100 ++++++++++++++++++ pkg/kubelet/apis/kubeletconfig/scheme/BUILD | 13 ++- .../apis/kubeletconfig/scheme/scheme_test.go | 32 ++++++ .../apis/kubeletconfig/v1alpha1/defaults.go | 12 +-- 6 files changed, 183 insertions(+), 7 deletions(-) create mode 100644 pkg/kubelet/apis/kubeletconfig/fuzzer/BUILD create mode 100644 pkg/kubelet/apis/kubeletconfig/fuzzer/fuzzer.go create mode 100644 pkg/kubelet/apis/kubeletconfig/scheme/scheme_test.go diff --git a/pkg/kubelet/apis/kubeletconfig/BUILD b/pkg/kubelet/apis/kubeletconfig/BUILD index 4046a1a9e7..c62439d626 100644 --- a/pkg/kubelet/apis/kubeletconfig/BUILD +++ b/pkg/kubelet/apis/kubeletconfig/BUILD @@ -34,6 +34,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/kubelet/apis/kubeletconfig/fuzzer:all-srcs", "//pkg/kubelet/apis/kubeletconfig/scheme:all-srcs", "//pkg/kubelet/apis/kubeletconfig/v1alpha1:all-srcs", "//pkg/kubelet/apis/kubeletconfig/validation:all-srcs", diff --git a/pkg/kubelet/apis/kubeletconfig/fuzzer/BUILD b/pkg/kubelet/apis/kubeletconfig/fuzzer/BUILD new file mode 100644 index 0000000000..2790330cff --- /dev/null +++ b/pkg/kubelet/apis/kubeletconfig/fuzzer/BUILD @@ -0,0 +1,32 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + importpath = "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/fuzzer", + visibility = ["//visibility:public"], + deps = [ + "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/kubeletconfig/v1alpha1:go_default_library", + "//pkg/kubelet/qos:go_default_library", + "//pkg/kubelet/types:go_default_library", + "//pkg/master/ports:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer: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"], +) diff --git a/pkg/kubelet/apis/kubeletconfig/fuzzer/fuzzer.go b/pkg/kubelet/apis/kubeletconfig/fuzzer/fuzzer.go new file mode 100644 index 0000000000..8fb0ca7ca5 --- /dev/null +++ b/pkg/kubelet/apis/kubeletconfig/fuzzer/fuzzer.go @@ -0,0 +1,100 @@ +/* +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 fuzzer + +import ( + "time" + + "github.com/google/gofuzz" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1alpha1" + "k8s.io/kubernetes/pkg/kubelet/qos" + kubetypes "k8s.io/kubernetes/pkg/kubelet/types" + "k8s.io/kubernetes/pkg/master/ports" +) + +// Funcs returns the fuzzer functions for the kubeletconfig apis. +func Funcs(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{ + // provide non-empty values for fields with defaults, so the defaulter doesn't change values during round-trip + func(obj *kubeletconfig.KubeletConfiguration, c fuzz.Continue) { + c.FuzzNoCustom(obj) + obj.ConfigTrialDuration = &metav1.Duration{Duration: 10 * time.Minute} + obj.Authentication.Anonymous.Enabled = true + obj.Authentication.Webhook.Enabled = false + obj.Authentication.Webhook.CacheTTL = metav1.Duration{Duration: 2 * time.Minute} + obj.Authorization.Mode = kubeletconfig.KubeletAuthorizationModeAlwaysAllow + obj.Authorization.Webhook.CacheAuthorizedTTL = metav1.Duration{Duration: 5 * time.Minute} + obj.Authorization.Webhook.CacheUnauthorizedTTL = metav1.Duration{Duration: 30 * time.Second} + obj.Address = "0.0.0.0" + obj.CAdvisorPort = 4194 + obj.VolumeStatsAggPeriod = metav1.Duration{Duration: time.Minute} + obj.RuntimeRequestTimeout = metav1.Duration{Duration: 2 * time.Minute} + obj.CPUCFSQuota = true + obj.EventBurst = 10 + obj.EventRecordQPS = 5 + obj.EnableControllerAttachDetach = true + obj.EnableDebuggingHandlers = true + obj.EnableServer = true + obj.FileCheckFrequency = metav1.Duration{Duration: 20 * time.Second} + obj.HealthzBindAddress = "127.0.0.1" + obj.HealthzPort = 10248 + obj.HostNetworkSources = []string{kubetypes.AllSource} + obj.HostPIDSources = []string{kubetypes.AllSource} + obj.HostIPCSources = []string{kubetypes.AllSource} + obj.HTTPCheckFrequency = metav1.Duration{Duration: 20 * time.Second} + obj.ImageMinimumGCAge = metav1.Duration{Duration: 2 * time.Minute} + obj.ImageGCHighThresholdPercent = 85 + obj.ImageGCLowThresholdPercent = 80 + obj.MaxOpenFiles = 1000000 + obj.MaxPods = 110 + obj.NodeStatusUpdateFrequency = metav1.Duration{Duration: 10 * time.Second} + obj.CPUManagerPolicy = "none" + obj.CPUManagerReconcilePeriod = obj.NodeStatusUpdateFrequency + obj.OOMScoreAdj = int32(qos.KubeletOOMScoreAdj) + obj.Port = ports.KubeletPort + obj.ReadOnlyPort = ports.KubeletReadOnlyPort + obj.RegistryBurst = 10 + obj.RegistryPullQPS = 5 + obj.ResolverConfig = kubetypes.ResolvConfDefault + obj.SerializeImagePulls = true + obj.StreamingConnectionIdleTimeout = metav1.Duration{Duration: 4 * time.Hour} + obj.SyncFrequency = metav1.Duration{Duration: 1 * time.Minute} + obj.ContentType = "application/vnd.kubernetes.protobuf" + obj.KubeAPIQPS = 5 + obj.KubeAPIBurst = 10 + obj.HairpinMode = v1alpha1.PromiscuousBridge + obj.EvictionHard = map[string]string{ + "memory.available": "100Mi", + "nodefs.available": "10%", + "nodefs.inodesFree": "5%", + "imagefs.available": "15%", + } + obj.EvictionPressureTransitionPeriod = metav1.Duration{Duration: 5 * time.Minute} + obj.MakeIPTablesUtilChains = true + obj.IPTablesMasqueradeBit = v1alpha1.DefaultIPTablesMasqueradeBit + obj.IPTablesDropBit = v1alpha1.DefaultIPTablesDropBit + obj.CgroupsPerQOS = true + obj.CgroupDriver = "cgroupfs" + obj.EnforceNodeAllocatable = v1alpha1.DefaultNodeAllocatableEnforcement + obj.ManifestURLHeader = make(map[string][]string) + }, + } +} diff --git a/pkg/kubelet/apis/kubeletconfig/scheme/BUILD b/pkg/kubelet/apis/kubeletconfig/scheme/BUILD index ae301abded..9bc425ac6b 100644 --- a/pkg/kubelet/apis/kubeletconfig/scheme/BUILD +++ b/pkg/kubelet/apis/kubeletconfig/scheme/BUILD @@ -1,4 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", @@ -26,3 +26,14 @@ filegroup( tags = ["automanaged"], visibility = ["//visibility:public"], ) + +go_test( + name = "go_default_test", + srcs = ["scheme_test.go"], + importpath = "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme", + library = ":go_default_library", + deps = [ + "//pkg/kubelet/apis/kubeletconfig/fuzzer:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", + ], +) diff --git a/pkg/kubelet/apis/kubeletconfig/scheme/scheme_test.go b/pkg/kubelet/apis/kubeletconfig/scheme/scheme_test.go new file mode 100644 index 0000000000..0f59310709 --- /dev/null +++ b/pkg/kubelet/apis/kubeletconfig/scheme/scheme_test.go @@ -0,0 +1,32 @@ +/* +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 scheme + +import ( + "testing" + + "k8s.io/apimachinery/pkg/api/testing/roundtrip" + "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/fuzzer" +) + +func TestRoundTripTypes(t *testing.T) { + scheme, _, err := NewSchemeAndCodecs() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + roundtrip.RoundTripTestForScheme(t, scheme, fuzzer.Funcs) +} diff --git a/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go b/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go index e14cdf3fff..90ac66813b 100644 --- a/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go +++ b/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go @@ -36,14 +36,14 @@ const ( // More details here: https://github.com/kubernetes/kubernetes/issues/50986 AutoDetectCloudProvider = "auto-detect" - defaultIPTablesMasqueradeBit = 14 - defaultIPTablesDropBit = 15 + DefaultIPTablesMasqueradeBit = 14 + DefaultIPTablesDropBit = 15 ) var ( zeroDuration = metav1.Duration{} // Refer to [Node Allocatable](https://git.k8s.io/community/contributors/design-proposals/node/node-allocatable.md) doc for more information. - defaultNodeAllocatableEnforcement = []string{"pods"} + DefaultNodeAllocatableEnforcement = []string{"pods"} ) func addDefaultingFuncs(scheme *kruntime.Scheme) error { @@ -210,11 +210,11 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { obj.MakeIPTablesUtilChains = boolVar(true) } if obj.IPTablesMasqueradeBit == nil { - temp := int32(defaultIPTablesMasqueradeBit) + temp := int32(DefaultIPTablesMasqueradeBit) obj.IPTablesMasqueradeBit = &temp } if obj.IPTablesDropBit == nil { - temp := int32(defaultIPTablesDropBit) + temp := int32(DefaultIPTablesDropBit) obj.IPTablesDropBit = &temp } if obj.CgroupsPerQOS == nil { @@ -225,7 +225,7 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { obj.CgroupDriver = "cgroupfs" } if obj.EnforceNodeAllocatable == nil { - obj.EnforceNodeAllocatable = defaultNodeAllocatableEnforcement + obj.EnforceNodeAllocatable = DefaultNodeAllocatableEnforcement } }