
Service has had a problem since forever: - User creates a service type=LoadBalancer - We silently allocate them a NodePort - User changes type to ClusterIP - We fail the operation because they did not clear NodePort They never asked for or used the NodePort! Dual-stack introduced some dependent fields that get auto-wiped on updates. This carries it further. If you squint, you can see Service as a big, messy discriminated union, with type as the discriminator. Ignoring fields for non-selected union-modes seems right. This introduces the potential for an apply loop. Specifically, we will accept YAML that we did not previously accept. Apply could see the field in local YAML and not in the server and repeatedly try to patch it in. But since that YAML is currently an error, it seems like a very low risk. Almost nobody actually specifies their own NodePort values. To mitigate this somewhat, we only auto-wipe on updates. The same YAML would fail to create. This is a little inconsistent. We could auto-wipe on create, too, at the risk of more potential impact. To do this properly, we need to know the old and new values, which means we can not do it in defaulting or conversion. So we do it in strategy. This change also adds unit tests and updates e2e tests to rely on and verify this behavior.
73 lines
2.7 KiB
Python
73 lines
2.7 KiB
Python
package(default_visibility = ["//visibility:public"])
|
|
|
|
load(
|
|
"@io_bazel_rules_go//go:def.bzl",
|
|
"go_library",
|
|
"go_test",
|
|
)
|
|
|
|
go_library(
|
|
name = "go_default_library",
|
|
srcs = [
|
|
"doc.go",
|
|
"proxy.go",
|
|
"strategy.go",
|
|
],
|
|
importpath = "k8s.io/kubernetes/pkg/registry/core/service",
|
|
deps = [
|
|
"//pkg/api/legacyscheme:go_default_library",
|
|
"//pkg/apis/core:go_default_library",
|
|
"//pkg/apis/core/validation:go_default_library",
|
|
"//pkg/capabilities:go_default_library",
|
|
"//pkg/features:go_default_library",
|
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
|
"//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library",
|
|
"//staging/src/k8s.io/apimachinery/pkg/util/proxy:go_default_library",
|
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
|
"//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library",
|
|
"//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library",
|
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
|
"//vendor/k8s.io/utils/net:go_default_library",
|
|
],
|
|
)
|
|
|
|
go_test(
|
|
name = "go_default_test",
|
|
srcs = ["strategy_test.go"],
|
|
embed = [":go_default_library"],
|
|
deps = [
|
|
"//pkg/apis/core:go_default_library",
|
|
"//pkg/apis/core/install:go_default_library",
|
|
"//pkg/features: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",
|
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
|
"//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library",
|
|
"//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
|
|
"//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
|
|
"//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library",
|
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
|
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
|
|
],
|
|
)
|
|
|
|
filegroup(
|
|
name = "package-srcs",
|
|
srcs = glob(["**"]),
|
|
tags = ["automanaged"],
|
|
visibility = ["//visibility:private"],
|
|
)
|
|
|
|
filegroup(
|
|
name = "all-srcs",
|
|
srcs = [
|
|
":package-srcs",
|
|
"//pkg/registry/core/service/allocator:all-srcs",
|
|
"//pkg/registry/core/service/ipallocator:all-srcs",
|
|
"//pkg/registry/core/service/portallocator:all-srcs",
|
|
"//pkg/registry/core/service/storage:all-srcs",
|
|
],
|
|
tags = ["automanaged"],
|
|
)
|